Skip to content

Instantly share code, notes, and snippets.

@datfooldive
Created November 18, 2025 17:41
Show Gist options
  • Select an option

  • Save datfooldive/d866b956c8a98e91dc4c035f2022a358 to your computer and use it in GitHub Desktop.

Select an option

Save datfooldive/d866b956c8a98e91dc4c035f2022a358 to your computer and use it in GitHub Desktop.
#define SYS_SOCKET 41
#define SYS_BIND 49
#define SYS_LISTEN 50
#define SYS_ACCEPT 43
#define SYS_WRITE 1
#define SYS_CLOSE 3
#define AF_INET 2
#define SOCK_STREAM 1
#define IPPROTO_TCP 6
#define LISTENQ 10
#define SERVER_PORT_HOST 8080
typedef unsigned short sa_family_t;
typedef unsigned short in_port_t;
typedef unsigned int in_addr_t;
struct in_addr {
in_addr_t s_addr;
};
struct sockaddr_in {
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};
long syscall_wrapper(long sys_num, long arg1, long arg2, long arg3, long arg4, long arg5, long arg6) {
long result;
__asm__ volatile (
"syscall"
: "=a" (result)
: "a" (sys_num),
"D" (arg1),
"S" (arg2),
"d" (arg3),
"r" (arg4),
"r" (arg5),
"r" (arg6)
: "rcx", "r11", "memory"
);
return result;
}
long sys_socket(int domain, int type, int protocol) {
return syscall_wrapper(SYS_SOCKET, domain, type, protocol, 0, 0, 0);
}
long sys_bind(int sockfd, const struct sockaddr_in *addr, unsigned int addrlen) {
return syscall_wrapper(SYS_BIND, sockfd, (long)addr, addrlen, 0, 0, 0);
}
long sys_listen(int sockfd, int backlog) {
return syscall_wrapper(SYS_LISTEN, sockfd, backlog, 0, 0, 0, 0);
}
long sys_accept(int sockfd, struct sockaddr_in *addr, unsigned int *addrlen) {
return syscall_wrapper(SYS_ACCEPT, sockfd, (long)addr, (long)addrlen, 0, 0, 0);
}
long sys_write(int fd, const char *buf, unsigned long count) {
return syscall_wrapper(SYS_WRITE, fd, (long)buf, count, 0, 0, 0);
}
void sys_close(int fd) {
syscall_wrapper(SYS_CLOSE, fd, 0, 0, 0, 0, 0);
}
unsigned short htons_manual(unsigned short val) {
return (val << 8) | (val >> 8);
}
const char HTTP_RESPONSE[] =
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/plain\r\n"
"Content-Length: 26\r\n"
"\r\n"
"Hello from pure C/ASM!\n";
const unsigned long RESPONSE_LEN = 111;
int main() {
long listen_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
unsigned int client_len;
listen_fd = sys_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listen_fd < 0) {
return 1;
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons_manual(SERVER_PORT_HOST);
server_addr.sin_addr.s_addr = 0x00000000;
long bind_res = sys_bind(listen_fd, &server_addr, sizeof(struct sockaddr_in));
if (bind_res < 0) {
return 2;
}
long listen_res = sys_listen(listen_fd, LISTENQ);
if (listen_res < 0) {
return 3;
}
client_len = sizeof(struct sockaddr_in);
client_fd = sys_accept(listen_fd, &client_addr, &client_len);
if (client_fd >= 0) {
sys_write(client_fd, HTTP_RESPONSE, RESPONSE_LEN);
sys_close(client_fd);
}
sys_close(listen_fd);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment