From d54596514c30343305b7cc4b8be36c712d536e7a Mon Sep 17 00:00:00 2001 From: root <> Date: Sun, 11 May 2025 08:22:07 +0000 Subject: [PATCH] echo then close connection --- main.s | 54 +++++++++++++++++++++++++++++++++++++++++++++++------- readline.s | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 7 deletions(-) create mode 100644 readline.s diff --git a/main.s b/main.s index 881a3d5..8905309 100644 --- a/main.s +++ b/main.s @@ -24,8 +24,10 @@ POLLIN equ 1 POLLOUT equ 4 SHUT_RDWR equ 2 -pollfd_size equ 4 + 2 + 2 ; $ man 2 poll -pollfds_capacity equ 100 +pollfd_size equ 4 + 2 + 2 ; $ man 2 poll +pollfds_capacity equ 100 +client_size equ 1 + 256 + 256 ; state, line buffer, uri +clients_capacity equ pollfds_capacity - 1 SECTION .data server_path db "server.sock", 0x00 @@ -33,15 +35,18 @@ server_path_len equ $ - server_path sockaddr_size equ 2 + 108 ; $ man 7 unix goodbye db "goodbye", 0x0a goodbye_len equ $ - goodbye +pollfds_len dq 0 +clients_len dq 0 SECTION .bss sockaddr resb sockaddr_size pollfds resb pollfd_size * pollfds_capacity -pollfds_len resb 8 +clients resb (4 + client_size) * clients_capacity SECTION .text %include "server.s" +%include "readline.s" _start: call make_server @@ -84,11 +89,27 @@ pollfds__scan__found__client: ; TODO check r10w, incl for POLLNVAL & POLLERR push rdi + mov rdi, r14 + call clients__append + + mov r12, [clients_len] + add r12, -1 + imul r12, client_size + add r12, clients + add r12, 4 + + mov rdi, r14 + mov rsi, r12 + mov rdx, 256 + call readline + cmp rax, 0 ; TODO + jl exit + ;push rax ; TODO + + mov rdx, rax mov rax, SYS_WRITE - mov rdi, 0 - mov edi, r14d - mov rsi, goodbye - mov rdx, goodbye_len + mov rdi, r14 + mov rsi, r12 syscall cmp rax, 0 jl exit ; TODO handle this gracefully @@ -132,6 +153,7 @@ pollfds__scan__found__server: ; edi - fd ; si - events pollfds__append: + ; TODO check against pollfds_capacity mov r10, [pollfds_len] mov [pollfds + r10 * pollfd_size], edi mov [pollfds + r10 * pollfd_size + 4], si @@ -157,6 +179,24 @@ pollfds__clear: mov [pollfds_len], r10 ret +; esi - fd +clients__append: + ; TODO check against client_capacity + mov r10, [clients_len] + imul r10, client_size + add r10, clients + mov [r10], esi + add r10, 4 + mov r8b, 0 + mov r11, 0 + +clients__append__init: + cmp r11, client_size + jge return + mov [r10 + r11], r8b + add r11, 1 + jmp clients__append__init + return: ret diff --git a/readline.s b/readline.s new file mode 100644 index 0000000..aba4769 --- /dev/null +++ b/readline.s @@ -0,0 +1,36 @@ +; Returns length in rax +; Errors (in rax): +; -1024 - line too long +; other negative - error from read(2) +; Arguments: +; rdi - fd +; rsi - buffer +; rdx - max length +readline: + push rdi + push rsi + push rdx + mov rax, SYS_READ + syscall + pop rdx + pop rsi + pop rdi + cmp rax, 0 + jl return + mov r10, 0 + +readline__scan: + cmp r10, rax + jge readline__overflow + mov r11b, [rsi + r10] + add r10, 1 + cmp r11b, 0x0a ; '\n' + jne readline__scan + +readline__return: + mov rax, r10 + ret + +readline__overflow: + mov rax, -1024 + ret