echo server, multiple clients, lines <256 bytes
This commit is contained in:
parent
d54596514c
commit
29f54ba779
6 changed files with 304 additions and 112 deletions
192
main.s
192
main.s
|
@ -22,11 +22,19 @@ F_SETFL equ 4
|
|||
O_NONBLOCK equ 2048
|
||||
POLLIN equ 1
|
||||
POLLOUT equ 4
|
||||
POLLERR equ 8
|
||||
POLLNVAL equ 32
|
||||
; TODO(?) POLLPRI: see poll(2), tcp(7)
|
||||
SHUT_RDWR equ 2
|
||||
|
||||
;STATE_READING equ 0
|
||||
;STATE_WRITING equ 1
|
||||
|
||||
pollfd_size equ 4 + 2 + 2 ; $ man 2 poll
|
||||
pollfds_capacity equ 100
|
||||
client_size equ 1 + 256 + 256 ; state, line buffer, uri
|
||||
|
||||
; fd, state, line_len, buffer_len, uri_len, buffer, uri
|
||||
client_size equ 4 + 4 + 255 + 255
|
||||
clients_capacity equ pollfds_capacity - 1
|
||||
|
||||
SECTION .data
|
||||
|
@ -47,11 +55,14 @@ SECTION .text
|
|||
|
||||
%include "server.s"
|
||||
%include "readline.s"
|
||||
%include "clients.s"
|
||||
%include "pollfds.s"
|
||||
%include "client.s"
|
||||
|
||||
_start:
|
||||
call make_server
|
||||
mov rbx, rax ; server fd
|
||||
mov rdi, rax
|
||||
mov rdi, rbx
|
||||
mov rsi, POLLIN
|
||||
call pollfds__append
|
||||
|
||||
|
@ -63,144 +74,113 @@ poll:
|
|||
syscall
|
||||
cmp rax, 0
|
||||
je poll
|
||||
jl exit ; TODO handle this gracefully
|
||||
mov rdi, rbx
|
||||
jl exit ; poll(2) returned error TODO
|
||||
|
||||
; rdi - server fd
|
||||
pollfds__scan:
|
||||
scan:
|
||||
mov r15, 0
|
||||
|
||||
pollfds__scan__loop:
|
||||
; Variables:
|
||||
; r15 - pollfds index
|
||||
; r14w - poll(2) revents
|
||||
; r13d - fd
|
||||
; r12 - client memory address
|
||||
scan__loop:
|
||||
cmp r15, [pollfds_len]
|
||||
jge poll
|
||||
mov r10w, [pollfds + r15 * pollfd_size + 6]
|
||||
cmp r10w, 0
|
||||
jne pollfds__scan__found
|
||||
mov r14w, [pollfds + r15 * pollfd_size + 6]
|
||||
cmp r14w, 0
|
||||
jne scan__found
|
||||
add r15, 1
|
||||
jmp pollfds__scan__loop
|
||||
jmp scan__loop
|
||||
|
||||
pollfds__scan__found:
|
||||
mov r14, 0
|
||||
mov r14d, [pollfds + r15 * pollfd_size]
|
||||
cmp r14d, edi
|
||||
je pollfds__scan__found__server
|
||||
scan__found:
|
||||
mov r13, 0
|
||||
mov r13d, [pollfds + r15 * pollfd_size]
|
||||
cmp r13d, ebx
|
||||
je scan__found__server
|
||||
|
||||
pollfds__scan__found__client:
|
||||
; TODO check r10w, incl for POLLNVAL & POLLERR
|
||||
push rdi
|
||||
scan__found__client:
|
||||
mov rdi, r13
|
||||
call clients__search
|
||||
mov r12, rax
|
||||
cmp r12, 0
|
||||
jl _client__not_stored
|
||||
|
||||
mov rdi, r14
|
||||
call clients__append
|
||||
mov r10w, r14w
|
||||
and r10w, POLLERR | POLLNVAL
|
||||
cmp r10w, 0
|
||||
jne _client__error
|
||||
|
||||
mov r12, [clients_len]
|
||||
add r12, -1
|
||||
imul r12, client_size
|
||||
add r12, clients
|
||||
add r12, 4
|
||||
mov r10w, r14w
|
||||
and r10w, POLLIN
|
||||
cmp r10w, 0
|
||||
jne _client__pollin
|
||||
|
||||
mov rdi, r14
|
||||
mov rsi, r12
|
||||
mov rdx, 256
|
||||
call readline
|
||||
cmp rax, 0 ; TODO
|
||||
jl exit
|
||||
;push rax ; TODO
|
||||
mov r10w, r14w
|
||||
and r10w, POLLOUT
|
||||
cmp r10w, 0
|
||||
jne _client__pollout
|
||||
|
||||
mov rdx, rax
|
||||
mov rax, SYS_WRITE
|
||||
mov rdi, r14
|
||||
mov rsi, r12
|
||||
syscall
|
||||
cmp rax, 0
|
||||
jl exit ; TODO handle this gracefully
|
||||
; TODO what did poll(2) detect in this case?
|
||||
add r15, 1
|
||||
jmp scan__loop
|
||||
|
||||
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
|
||||
_client__error:
|
||||
mov rdi, r12
|
||||
call clients__remove
|
||||
|
||||
_client__not_stored:
|
||||
mov rdi, r13
|
||||
call client__shutdown_close
|
||||
mov rdi, r15
|
||||
call pollfds__remove
|
||||
jmp scan__loop
|
||||
|
||||
pop rdi
|
||||
jmp pollfds__scan__loop
|
||||
_client__pollin:
|
||||
mov rdi, r13
|
||||
mov rsi, r12
|
||||
mov rdx, r15
|
||||
call client__pollin
|
||||
cmp rax, 0
|
||||
jle _client__error
|
||||
add r15, rax
|
||||
jmp scan__loop
|
||||
|
||||
pollfds__scan__found__server:
|
||||
; TODO check r10w, incl for POLLNVAL & POLLERR
|
||||
push rdi
|
||||
_client__pollout:
|
||||
mov rdi, r13
|
||||
mov rsi, r12
|
||||
mov rdx, r15
|
||||
call client__pollout
|
||||
add r15, 1
|
||||
jmp scan__loop
|
||||
|
||||
scan__found__server:
|
||||
cmp r14w, POLLIN
|
||||
jne exit
|
||||
|
||||
mov rax, SYS_ACCEPT
|
||||
mov rdi, r13
|
||||
mov rsi, 0
|
||||
mov rdx, 0
|
||||
syscall
|
||||
cmp rax, 0
|
||||
jl exit ; TODO handle this gracefully
|
||||
jl exit ; accept(2) returned error TODO
|
||||
|
||||
mov rdi, rax
|
||||
mov si, POLLIN | POLLOUT
|
||||
push rdi
|
||||
mov si, POLLIN
|
||||
call pollfds__append
|
||||
|
||||
pop rdi
|
||||
call clients__append
|
||||
|
||||
add r15, 1
|
||||
jmp pollfds__scan__loop
|
||||
|
||||
; 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
|
||||
add r10, 1
|
||||
mov [pollfds_len], r10
|
||||
ret
|
||||
|
||||
; rdi - pollfds array index to remove
|
||||
pollfds__remove:
|
||||
mov r11, [pollfds_len]
|
||||
cmp rdi, r10
|
||||
jge return ; XXX index out of bounds, do some other error?
|
||||
cmp r11, 1
|
||||
jle pollfds__clear
|
||||
mov r10, [pollfds + (r11 - 1) * pollfd_size]
|
||||
mov [pollfds + rdi * pollfd_size], r10
|
||||
sub r11, 1
|
||||
mov [pollfds_len], r11
|
||||
ret
|
||||
|
||||
pollfds__clear:
|
||||
mov r10, 0
|
||||
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
|
||||
jmp scan__loop
|
||||
|
||||
return:
|
||||
ret
|
||||
|
||||
exit:
|
||||
mov rax, SYS_EXIT
|
||||
mov rdi, 0
|
||||
mov rdi, 255
|
||||
syscall
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue