global _start ; constants SYS_READ equ 0 SYS_WRITE equ 1 SYS_SENDFILE equ 40 SYS_SOCKET equ 41 SYS_ACCEPT equ 43 SYS_BIND equ 49 SYS_LISTEN equ 50 SYS_EXIT equ 60 SYS_FCNTL equ 72 SYS_UNLINK equ 87 STDOUT equ 1 AF_UNIX equ 1 SOCK_STREAM equ 1 F_GETFL equ 3 F_SETFL equ 4 O_NONBLOCK equ 2048 SECTION .data hello db "Hello world!", 0x0a hello_len equ $ - hello server_path db "server.sock", 0x00 server_path_len equ $ - hello sockaddr_len equ 110 ; $ man 7 unix SECTION .bss sockaddr resb sockaddr_len SECTION .text _start: mov rax, SYS_WRITE mov rdi, STDOUT mov rsi, hello mov rdx, hello_len syscall call make_server push rax call accept pop r10 exit: mov rax, SYS_EXIT mov rdi, 0 syscall accept: mov rdi, rax mov rax, SYS_ACCEPT mov rsi, 0 mov rdx, 0 syscall ret make_server: mov rax, SYS_UNLINK mov rdi, server_path syscall mov rax, SYS_SOCKET mov rdi, AF_UNIX mov rsi, SOCK_STREAM mov rdx, 0 syscall push rax call nonblocking call make_sockaddr pop r10 mov rax, SYS_BIND mov rdi, r10 mov rsi, sockaddr mov rdx, sockaddr_len syscall mov rax, SYS_LISTEN mov rdi, r10 mov rsi, 100 syscall mov rax, r10 ret nonblocking: mov r10, rax mov rax, SYS_FCNTL mov rdi, r10 mov rsi, F_GETFL syscall mov r11, rax xor r11, O_NONBLOCK mov rax, SYS_FCNTL mov rdi, r10 mov rsi, F_SETFL mov rdx, r11 syscall ret make_sockaddr: mov word [sockaddr], AF_UNIX mov rax, 0 make_sockaddr__copy_server_path: cmp rax, server_path_len jge return mov r10, [rax+server_path] add rax, 2 mov [rax+sockaddr], r10 sub rax, 1 jmp make_sockaddr__copy_server_path return: ret