echo then close connection

This commit is contained in:
root 2025-05-11 08:22:07 +00:00
parent 60e9bcf95c
commit d54596514c
2 changed files with 83 additions and 7 deletions

50
main.s
View file

@ -26,6 +26,8 @@ SHUT_RDWR equ 2
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

36
readline.s Normal file
View file

@ -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