From f096cb00e7913173d9645d4424751fd6a8a58ba1 Mon Sep 17 00:00:00 2001 From: root <> Date: Wed, 7 May 2025 14:20:06 +0000 Subject: [PATCH] say goodbye to clients then close socket --- constants.c | 1 + main.s | 44 ++++++++++++++++++++++++++----- poll_remove.s => pollfds_remove.s | 27 ++++++++++--------- 3 files changed, 53 insertions(+), 19 deletions(-) rename poll_remove.s => pollfds_remove.s (60%) diff --git a/constants.c b/constants.c index cc8ec0b..2e7aab3 100644 --- a/constants.c +++ b/constants.c @@ -14,4 +14,5 @@ void main() { printf("sizeof(short) %d\n", sizeof(short)); printf("POLLIN %d\n", POLLIN); printf("POLLOUT %d\n", POLLOUT); + printf("SHUT_RDWR %d\n", SHUT_RDWR); } diff --git a/main.s b/main.s index 974f397..5b13b5d 100644 --- a/main.s +++ b/main.s @@ -3,10 +3,12 @@ global _start ; constants SYS_READ equ 0 SYS_WRITE equ 1 +SYS_CLOSE equ 3 SYS_POLL equ 7 SYS_SENDFILE equ 40 SYS_SOCKET equ 41 SYS_ACCEPT equ 43 +SYS_SHUTDOWN equ 48 SYS_BIND equ 49 SYS_LISTEN equ 50 SYS_EXIT equ 60 @@ -20,6 +22,7 @@ F_SETFL equ 4 O_NONBLOCK equ 2048 POLLIN equ 1 POLLOUT equ 4 +SHUT_RDWR equ 2 pollfd_size equ 4 + 2 + 2 ; $ man 2 poll pollfds_capacity equ 100 @@ -28,6 +31,8 @@ SECTION .data server_path db "server.sock", 0x00 server_path_len equ $ - server_path sockaddr_size equ 2 + 108 ; $ man 7 unix +goodbye db "goodbye", 0x0a +goodbye_len equ $ - goodbye SECTION .bss sockaddr resb sockaddr_size @@ -36,8 +41,11 @@ pollfds_len resb 8 SECTION .text +return: + ret + %include "server.s" -;%include "pollfds_remove.s" +%include "pollfds_remove.s" _start: call make_server @@ -71,17 +79,44 @@ pollfds__scan__loop: jmp pollfds__scan__loop pollfds__scan__found: + mov r14, 0 mov r14d, [pollfds + r15 * pollfd_size] cmp r14d, edi je pollfds__scan__found__server 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 pollfds__scan__found__server: - mov rax, SYS_ACCEPT push rdi + + mov rax, SYS_ACCEPT mov rsi, 0 mov rdx, 0 syscall @@ -106,9 +141,6 @@ pollfds__append: mov [pollfds_len], r10 ret -return: - ret - exit: mov rax, SYS_EXIT mov rdi, 0 diff --git a/poll_remove.s b/pollfds_remove.s similarity index 60% rename from poll_remove.s rename to pollfds_remove.s index 477dd81..9ccdc97 100644 --- a/poll_remove.s +++ b/pollfds_remove.s @@ -1,32 +1,33 @@ -; Returns new array length in rax -; edi - fd +; rdi - fd pollfds__remove: - mov r10d, edi - mov rdi, [pollfds_len] + mov rax, [pollfds_len] + mov rsi, 0 + call pollfds__remove__loop + mov [pollfds_len], rax + ret ; Variables: -; rdi - array length +; rax - array length +; rdi - fd ; rsi - array index -; r10d - fd ; r11d - pollfds[rdi].fd pollfds__remove__loop: - cmp rsi, rdi + cmp rsi, rax jge return ; fd was not found mov r11d, [pollfds + rsi * pollfd_size] add rsi, 1 - cmp r11d, r10d + cmp r11d, edi jne pollfds__remove__loop sub rsi, 1 -; Returns new array length in rax -; rdi - array length +; rax - array length ; rsi - array index to remove pollfds__remove_index: - cmp rdi, 1 + cmp rax, 1 jle pollfds__clear - mov r10d, [pollfds + (rdi - 1) * pollfd_size] + mov r10d, [pollfds + (rax - 1) * pollfd_size] mov [pollfds + rsi * pollfd_size], r10d - sub rdi, 1 + sub rax, 1 ret ; Returns new array length in rax