diff --git a/constants.c b/constants.c index 9b69143..b6461aa 100644 --- a/constants.c +++ b/constants.c @@ -8,4 +8,5 @@ void main() { printf("SOCK_STREAM %d\n", SOCK_STREAM); printf("F_GETFL %d\n", F_GETFL); printf("F_SETFL %d\n", F_SETFL); + printf("O_NONBLOCK %d\n", O_NONBLOCK); } diff --git a/hello.s b/hello.s index f3a8181..62c7279 100644 --- a/hello.s +++ b/hello.s @@ -9,10 +9,14 @@ 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 @@ -33,6 +37,24 @@ _start: 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 @@ -45,6 +67,7 @@ make_server: syscall push rax + call nonblocking call make_sockaddr pop r10 @@ -59,18 +82,28 @@ make_server: mov rsi, 100 syscall - mov rax, SYS_ACCEPT - mov rdi, r10 - mov rsi, 0 - mov rdx, 0 - syscall - push rax + mov rax, r10 + ret -exit: - mov rax, SYS_EXIT - pop rdi +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