poll(2) on the server socket; pollfds array

This commit is contained in:
root 2025-05-07 10:29:21 +00:00
parent 5c129207ae
commit 08f4db4d2b
3 changed files with 77 additions and 7 deletions

View file

@ -1,6 +1,7 @@
#include <stdio.h> #include <stdio.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <fcntl.h> #include <fcntl.h>
#include <poll.h>
// printf("x %d\n", x); // printf("x %d\n", x);
void main() { void main() {
@ -11,4 +12,6 @@ void main() {
printf("O_NONBLOCK %d\n", O_NONBLOCK); printf("O_NONBLOCK %d\n", O_NONBLOCK);
printf("sizeof(int) %d\n", sizeof(int)); printf("sizeof(int) %d\n", sizeof(int));
printf("sizeof(short) %d\n", sizeof(short)); printf("sizeof(short) %d\n", sizeof(short));
printf("POLLIN %d\n", POLLIN);
printf("POLLOUT %d\n", POLLOUT);
} }

79
hello.s
View file

@ -3,6 +3,7 @@ global _start
; constants ; constants
SYS_READ equ 0 SYS_READ equ 0
SYS_WRITE equ 1 SYS_WRITE equ 1
SYS_POLL equ 7
SYS_SENDFILE equ 40 SYS_SENDFILE equ 40
SYS_SOCKET equ 41 SYS_SOCKET equ 41
SYS_ACCEPT equ 43 SYS_ACCEPT equ 43
@ -17,16 +18,22 @@ SOCK_STREAM equ 1
F_GETFL equ 3 F_GETFL equ 3
F_SETFL equ 4 F_SETFL equ 4
O_NONBLOCK equ 2048 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 SECTION .data
hello db "Hello world!", 0x0a hello db "Hello world!", 0x0a
hello_len equ $ - hello hello_len equ $ - hello
server_path db "server.sock", 0x00 server_path db "server.sock", 0x00
server_path_len equ $ - hello server_path_len equ $ - hello
sockaddr_len equ 110 ; $ man 7 unix sockaddr_size equ 2 + 108 ; $ man 7 unix
SECTION .bss SECTION .bss
sockaddr resb sockaddr_len sockaddr resb sockaddr_size
pollfds resb pollfd_size * pollfds_capacity
SECTION .text SECTION .text
@ -38,9 +45,20 @@ _start:
syscall syscall
call make_server call make_server
push rax mov rbx, 0 ; pollfd array length
call accept mov ebp, eax ; server fd
pop r10
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: exit:
mov rax, SYS_EXIT mov rax, SYS_EXIT
@ -55,6 +73,55 @@ accept:
syscall syscall
ret 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: make_server:
mov rax, SYS_UNLINK mov rax, SYS_UNLINK
mov rdi, server_path mov rdi, server_path
@ -74,7 +141,7 @@ make_server:
mov rax, SYS_BIND mov rax, SYS_BIND
mov rdi, r10 mov rdi, r10
mov rsi, sockaddr mov rsi, sockaddr
mov rdx, sockaddr_len mov rdx, sockaddr_size
syscall syscall
mov rax, SYS_LISTEN mov rax, SYS_LISTEN

View file

@ -1,3 +1,3 @@
main: main:
nasm -f elf64 -o hello.o hello.s nasm -g -f elf64 -o hello.o hello.s
ld -o hello hello.o ld -o hello hello.o