Created
November 18, 2025 17:41
-
-
Save datfooldive/d866b956c8a98e91dc4c035f2022a358 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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