loop pollfds: only checking server for now

This commit is contained in:
root 2025-05-07 13:35:04 +00:00
parent 9f3d59cf15
commit 72b9f421e1
3 changed files with 100 additions and 75 deletions

129
main.s
View file

@ -30,94 +30,85 @@ server_path_len equ $ - server_path
sockaddr_size equ 2 + 108 ; $ man 7 unix
SECTION .bss
sockaddr resb sockaddr_size
pollfds resb pollfd_size * pollfds_capacity
sockaddr resb sockaddr_size
pollfds resb pollfd_size * pollfds_capacity
pollfds_len resb 8
SECTION .text
%include "server.s"
;%include "pollfds_remove.s"
_start:
call make_server
mov rbx, 0 ; pollfd array length
mov ebp, eax ; server fd
mov rax, rbx
mov edi, ebp
mov si, POLLIN
mov rbx, rax ; server fd
mov rdi, rax
mov rsi, POLLIN
call pollfds__append
mov rbx, rax
poll:
mov rax, SYS_POLL
mov rdi, pollfds
mov rsi, rbx
mov rsi, [pollfds_len]
mov rdx, 5000
syscall
cmp rax, 0
je poll
jl exit
mov rdi, rbx
; rdi - server fd
pollfds__scan:
mov r15, 0
pollfds__scan__loop:
cmp r15, [pollfds_len]
jge return
mov r10w, [pollfds + r15 * pollfd_size + 6]
cmp r10w, 0
jne pollfds__scan__found
add r15, 1
jmp pollfds__scan__loop
pollfds__scan__found:
mov r14d, [pollfds + r15 * pollfd_size]
cmp r14d, edi
je pollfds__scan__found__server
pollfds__scan__found__client:
jmp exit
jmp pollfds__scan__loop
pollfds__scan__found__server:
mov rax, SYS_ACCEPT
push rdi
mov rsi, 0
mov rdx, 0
syscall
cmp rax, 0
jl exit
mov rdi, rax
mov si, POLLIN | POLLOUT
call pollfds__append
pop rdi
jmp pollfds__scan__loop
; edi - fd
; si - events
pollfds__append:
mov r10, [pollfds_len]
mov [pollfds + r10 * pollfd_size], edi
mov [pollfds + r10 * pollfd_size + 4], si
add r10, 1
mov [pollfds_len], r10
ret
return:
ret
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
; 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
return:
ret