echo then close connection
This commit is contained in:
parent
60e9bcf95c
commit
d54596514c
2 changed files with 83 additions and 7 deletions
54
main.s
54
main.s
|
@ -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
36
readline.s
Normal 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
|
Loading…
Add table
Add a link
Reference in a new issue