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

54
main.s
View file

@ -24,8 +24,10 @@ POLLIN equ 1
POLLOUT equ 4 POLLOUT equ 4
SHUT_RDWR equ 2 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
client_size equ 1 + 256 + 256 ; state, line buffer, uri
clients_capacity equ pollfds_capacity - 1
SECTION .data SECTION .data
server_path db "server.sock", 0x00 server_path db "server.sock", 0x00
@ -33,15 +35,18 @@ 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 db "goodbye", 0x0a
goodbye_len equ $ - goodbye goodbye_len equ $ - goodbye
pollfds_len dq 0
clients_len dq 0
SECTION .bss SECTION .bss
sockaddr resb sockaddr_size sockaddr resb sockaddr_size
pollfds resb pollfd_size * pollfds_capacity pollfds resb pollfd_size * pollfds_capacity
pollfds_len resb 8 clients resb (4 + client_size) * clients_capacity
SECTION .text SECTION .text
%include "server.s" %include "server.s"
%include "readline.s"
_start: _start:
call make_server call make_server
@ -84,11 +89,27 @@ pollfds__scan__found__client:
; TODO check r10w, incl for POLLNVAL & POLLERR ; TODO check r10w, incl for POLLNVAL & POLLERR
push rdi 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 rax, SYS_WRITE
mov rdi, 0 mov rdi, r14
mov edi, r14d mov rsi, r12
mov rsi, goodbye
mov rdx, goodbye_len
syscall syscall
cmp rax, 0 cmp rax, 0
jl exit ; TODO handle this gracefully jl exit ; TODO handle this gracefully
@ -132,6 +153,7 @@ pollfds__scan__found__server:
; edi - fd ; edi - fd
; si - events ; si - events
pollfds__append: pollfds__append:
; TODO check against pollfds_capacity
mov r10, [pollfds_len] mov r10, [pollfds_len]
mov [pollfds + r10 * pollfd_size], edi mov [pollfds + r10 * pollfd_size], edi
mov [pollfds + r10 * pollfd_size + 4], si mov [pollfds + r10 * pollfd_size + 4], si
@ -157,6 +179,24 @@ pollfds__clear:
mov [pollfds_len], r10 mov [pollfds_len], r10
ret 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: return:
ret 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