From 08f4db4d2b29f8132fd05e8d38122cc81b1f6d82 Mon Sep 17 00:00:00 2001 From: root <> Date: Wed, 7 May 2025 10:29:21 +0000 Subject: [PATCH] poll(2) on the server socket; pollfds array --- constants.c | 3 ++ hello.s | 79 +++++++++++++++++++++++++++++++++++++++++++++++++---- makefile | 2 +- 3 files changed, 77 insertions(+), 7 deletions(-) diff --git a/constants.c b/constants.c index 9f9db6e..cc8ec0b 100644 --- a/constants.c +++ b/constants.c @@ -1,6 +1,7 @@ #include #include #include +#include // printf("x %d\n", x); void main() { @@ -11,4 +12,6 @@ void main() { printf("O_NONBLOCK %d\n", O_NONBLOCK); printf("sizeof(int) %d\n", sizeof(int)); printf("sizeof(short) %d\n", sizeof(short)); + printf("POLLIN %d\n", POLLIN); + printf("POLLOUT %d\n", POLLOUT); } diff --git a/hello.s b/hello.s index 6ab1bde..091ea49 100644 --- a/hello.s +++ b/hello.s @@ -3,6 +3,7 @@ global _start ; constants SYS_READ equ 0 SYS_WRITE equ 1 +SYS_POLL equ 7 SYS_SENDFILE equ 40 SYS_SOCKET equ 41 SYS_ACCEPT equ 43 @@ -17,16 +18,22 @@ SOCK_STREAM equ 1 F_GETFL equ 3 F_SETFL equ 4 O_NONBLOCK equ 2048 +POLLIN equ 1 +POLLOUT equ 4 + +pollfd_size equ 4 + 2 + 2 ; $ man 2 poll +pollfds_capacity equ 100 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 +sockaddr_size equ 2 + 108 ; $ man 7 unix SECTION .bss -sockaddr resb sockaddr_len +sockaddr resb sockaddr_size +pollfds resb pollfd_size * pollfds_capacity SECTION .text @@ -38,9 +45,20 @@ _start: syscall call make_server - push rax - call accept - pop r10 + mov rbx, 0 ; pollfd array length + mov ebp, eax ; server fd + + mov rax, rbx + mov edi, ebp + mov si, POLLIN + call pollfds__append + mov rbx, rax + + mov rax, SYS_POLL + mov rdi, pollfds + mov rsi, rbx + mov rdx, 5000 + syscall exit: mov rax, SYS_EXIT @@ -55,6 +73,55 @@ accept: syscall ret +; rax - array length +; edi - fd +; si - events +; Returns new array length in rax +pollfds__append: + mov [pollfds + rax], edi + mov [pollfds + rax + 4], si + add rax, 1 + ret + +; Returns new array length in rax +; rax - array length +; edi - fd +pollfds__remove: + mov r10d, edi + mov rdi, 0 + +; Variables: +; rax - array length +; rdi - array index +; r10d - fd +; r11d - pollfds[rdi].fd +pollfds__remove__loop: + cmp rdi, rax + jge return ; fd was not found + mov r11d, [pollfds + rdi * pollfd_size] + add rdi, 1 + cmp r11d, r10d + jne pollfds__remove__loop + sub rdi, 1 + +; Returns new array length in rax +; rax - array length +; rdi - array index to remove +pollfds__remove_index: + cmp rax, 1 + jle pollfds__clear + mov r10d, [pollfds + (rax - 1) * pollfd_size] + mov [pollfds + rdi * pollfd_size], r10d + sub rax, 1 + ret + +; Returns new array length in rax +; rax - array length +pollfds__clear: + mov rax, 0 + ret + +; Returns (in rax) the server's file descriptor make_server: mov rax, SYS_UNLINK mov rdi, server_path @@ -74,7 +141,7 @@ make_server: mov rax, SYS_BIND mov rdi, r10 mov rsi, sockaddr - mov rdx, sockaddr_len + mov rdx, sockaddr_size syscall mov rax, SYS_LISTEN diff --git a/makefile b/makefile index 4ec5593..d03c95d 100644 --- a/makefile +++ b/makefile @@ -1,3 +1,3 @@ main: - nasm -f elf64 -o hello.o hello.s + nasm -g -f elf64 -o hello.o hello.s ld -o hello hello.o