say goodbye to clients then close socket

This commit is contained in:
root 2025-05-07 14:20:06 +00:00
parent 1cf28e9565
commit f096cb00e7
3 changed files with 53 additions and 19 deletions

View file

@ -14,4 +14,5 @@ void main() {
printf("sizeof(short) %d\n", sizeof(short)); printf("sizeof(short) %d\n", sizeof(short));
printf("POLLIN %d\n", POLLIN); printf("POLLIN %d\n", POLLIN);
printf("POLLOUT %d\n", POLLOUT); printf("POLLOUT %d\n", POLLOUT);
printf("SHUT_RDWR %d\n", SHUT_RDWR);
} }

44
main.s
View file

@ -3,10 +3,12 @@ global _start
; constants ; constants
SYS_READ equ 0 SYS_READ equ 0
SYS_WRITE equ 1 SYS_WRITE equ 1
SYS_CLOSE equ 3
SYS_POLL equ 7 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
SYS_SHUTDOWN equ 48
SYS_BIND equ 49 SYS_BIND equ 49
SYS_LISTEN equ 50 SYS_LISTEN equ 50
SYS_EXIT equ 60 SYS_EXIT equ 60
@ -20,6 +22,7 @@ F_SETFL equ 4
O_NONBLOCK equ 2048 O_NONBLOCK equ 2048
POLLIN equ 1 POLLIN equ 1
POLLOUT equ 4 POLLOUT equ 4
SHUT_RDWR equ 2
pollfd_size equ 4 + 2 + 2 ; $ man 2 poll pollfd_size equ 4 + 2 + 2 ; $ man 2 poll
pollfds_capacity equ 100 pollfds_capacity equ 100
@ -28,6 +31,8 @@ SECTION .data
server_path db "server.sock", 0x00 server_path db "server.sock", 0x00
server_path_len equ $ - server_path server_path_len equ $ - server_path
sockaddr_size equ 2 + 108 ; $ man 7 unix sockaddr_size equ 2 + 108 ; $ man 7 unix
goodbye db "goodbye", 0x0a
goodbye_len equ $ - goodbye
SECTION .bss SECTION .bss
sockaddr resb sockaddr_size sockaddr resb sockaddr_size
@ -36,8 +41,11 @@ pollfds_len resb 8
SECTION .text SECTION .text
return:
ret
%include "server.s" %include "server.s"
;%include "pollfds_remove.s" %include "pollfds_remove.s"
_start: _start:
call make_server call make_server
@ -71,17 +79,44 @@ pollfds__scan__loop:
jmp pollfds__scan__loop jmp pollfds__scan__loop
pollfds__scan__found: pollfds__scan__found:
mov r14, 0
mov r14d, [pollfds + r15 * pollfd_size] mov r14d, [pollfds + r15 * pollfd_size]
cmp r14d, edi cmp r14d, edi
je pollfds__scan__found__server je pollfds__scan__found__server
pollfds__scan__found__client: pollfds__scan__found__client:
jmp exit push rdi
mov rax, SYS_WRITE
mov rdi, 0
mov edi, r14d
mov rsi, goodbye
mov rdx, goodbye_len
syscall
cmp rax, 0
jl exit
mov rax, SYS_SHUTDOWN
mov rdi, 0
mov edi, r14d
mov rsi, SHUT_RDWR
syscall
mov rax, SYS_CLOSE
mov rdi, 0
mov edi, r14d
syscall
mov rdi, r14
call pollfds__remove
pop rdi
jmp pollfds__scan__loop jmp pollfds__scan__loop
pollfds__scan__found__server: pollfds__scan__found__server:
mov rax, SYS_ACCEPT
push rdi push rdi
mov rax, SYS_ACCEPT
mov rsi, 0 mov rsi, 0
mov rdx, 0 mov rdx, 0
syscall syscall
@ -106,9 +141,6 @@ pollfds__append:
mov [pollfds_len], r10 mov [pollfds_len], r10
ret ret
return:
ret
exit: exit:
mov rax, SYS_EXIT mov rax, SYS_EXIT
mov rdi, 0 mov rdi, 0

View file

@ -1,32 +1,33 @@
; Returns new array length in rax ; rdi - fd
; edi - fd
pollfds__remove: pollfds__remove:
mov r10d, edi mov rax, [pollfds_len]
mov rdi, [pollfds_len] mov rsi, 0
call pollfds__remove__loop
mov [pollfds_len], rax
ret
; Variables: ; Variables:
; rdi - array length ; rax - array length
; rdi - fd
; rsi - array index ; rsi - array index
; r10d - fd
; r11d - pollfds[rdi].fd ; r11d - pollfds[rdi].fd
pollfds__remove__loop: pollfds__remove__loop:
cmp rsi, rdi cmp rsi, rax
jge return ; fd was not found jge return ; fd was not found
mov r11d, [pollfds + rsi * pollfd_size] mov r11d, [pollfds + rsi * pollfd_size]
add rsi, 1 add rsi, 1
cmp r11d, r10d cmp r11d, edi
jne pollfds__remove__loop jne pollfds__remove__loop
sub rsi, 1 sub rsi, 1
; Returns new array length in rax ; rax - array length
; rdi - array length
; rsi - array index to remove ; rsi - array index to remove
pollfds__remove_index: pollfds__remove_index:
cmp rdi, 1 cmp rax, 1
jle pollfds__clear jle pollfds__clear
mov r10d, [pollfds + (rdi - 1) * pollfd_size] mov r10d, [pollfds + (rax - 1) * pollfd_size]
mov [pollfds + rsi * pollfd_size], r10d mov [pollfds + rsi * pollfd_size], r10d
sub rdi, 1 sub rax, 1
ret ret
; Returns new array length in rax ; Returns new array length in rax