say goodbye to clients then close socket
This commit is contained in:
parent
1cf28e9565
commit
f096cb00e7
3 changed files with 53 additions and 19 deletions
|
@ -14,4 +14,5 @@ void main() {
|
||||||
printf("sizeof(short) %d\n", sizeof(short));
|
printf("sizeof(short) %d\n", sizeof(short));
|
||||||
printf("POLLIN %d\n", POLLIN);
|
printf("POLLIN %d\n", POLLIN);
|
||||||
printf("POLLOUT %d\n", POLLOUT);
|
printf("POLLOUT %d\n", POLLOUT);
|
||||||
|
printf("SHUT_RDWR %d\n", SHUT_RDWR);
|
||||||
}
|
}
|
||||||
|
|
44
main.s
44
main.s
|
@ -3,10 +3,12 @@ global _start
|
||||||
; constants
|
; constants
|
||||||
SYS_READ equ 0
|
SYS_READ equ 0
|
||||||
SYS_WRITE equ 1
|
SYS_WRITE equ 1
|
||||||
|
SYS_CLOSE equ 3
|
||||||
SYS_POLL equ 7
|
SYS_POLL equ 7
|
||||||
SYS_SENDFILE equ 40
|
SYS_SENDFILE equ 40
|
||||||
SYS_SOCKET equ 41
|
SYS_SOCKET equ 41
|
||||||
SYS_ACCEPT equ 43
|
SYS_ACCEPT equ 43
|
||||||
|
SYS_SHUTDOWN equ 48
|
||||||
SYS_BIND equ 49
|
SYS_BIND equ 49
|
||||||
SYS_LISTEN equ 50
|
SYS_LISTEN equ 50
|
||||||
SYS_EXIT equ 60
|
SYS_EXIT equ 60
|
||||||
|
@ -20,6 +22,7 @@ F_SETFL equ 4
|
||||||
O_NONBLOCK equ 2048
|
O_NONBLOCK equ 2048
|
||||||
POLLIN equ 1
|
POLLIN equ 1
|
||||||
POLLOUT equ 4
|
POLLOUT equ 4
|
||||||
|
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
|
||||||
|
@ -28,6 +31,8 @@ SECTION .data
|
||||||
server_path db "server.sock", 0x00
|
server_path db "server.sock", 0x00
|
||||||
server_path_len equ $ - server_path
|
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_len equ $ - goodbye
|
||||||
|
|
||||||
SECTION .bss
|
SECTION .bss
|
||||||
sockaddr resb sockaddr_size
|
sockaddr resb sockaddr_size
|
||||||
|
@ -36,8 +41,11 @@ pollfds_len resb 8
|
||||||
|
|
||||||
SECTION .text
|
SECTION .text
|
||||||
|
|
||||||
|
return:
|
||||||
|
ret
|
||||||
|
|
||||||
%include "server.s"
|
%include "server.s"
|
||||||
;%include "pollfds_remove.s"
|
%include "pollfds_remove.s"
|
||||||
|
|
||||||
_start:
|
_start:
|
||||||
call make_server
|
call make_server
|
||||||
|
@ -71,17 +79,44 @@ pollfds__scan__loop:
|
||||||
jmp pollfds__scan__loop
|
jmp pollfds__scan__loop
|
||||||
|
|
||||||
pollfds__scan__found:
|
pollfds__scan__found:
|
||||||
|
mov r14, 0
|
||||||
mov r14d, [pollfds + r15 * pollfd_size]
|
mov r14d, [pollfds + r15 * pollfd_size]
|
||||||
cmp r14d, edi
|
cmp r14d, edi
|
||||||
je pollfds__scan__found__server
|
je pollfds__scan__found__server
|
||||||
|
|
||||||
pollfds__scan__found__client:
|
pollfds__scan__found__client:
|
||||||
jmp exit
|
push rdi
|
||||||
|
|
||||||
|
mov rax, SYS_WRITE
|
||||||
|
mov rdi, 0
|
||||||
|
mov edi, r14d
|
||||||
|
mov rsi, goodbye
|
||||||
|
mov rdx, goodbye_len
|
||||||
|
syscall
|
||||||
|
cmp rax, 0
|
||||||
|
jl exit
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
mov rdi, r14
|
||||||
|
call pollfds__remove
|
||||||
|
|
||||||
|
pop rdi
|
||||||
jmp pollfds__scan__loop
|
jmp pollfds__scan__loop
|
||||||
|
|
||||||
pollfds__scan__found__server:
|
pollfds__scan__found__server:
|
||||||
mov rax, SYS_ACCEPT
|
|
||||||
push rdi
|
push rdi
|
||||||
|
|
||||||
|
mov rax, SYS_ACCEPT
|
||||||
mov rsi, 0
|
mov rsi, 0
|
||||||
mov rdx, 0
|
mov rdx, 0
|
||||||
syscall
|
syscall
|
||||||
|
@ -106,9 +141,6 @@ pollfds__append:
|
||||||
mov [pollfds_len], r10
|
mov [pollfds_len], r10
|
||||||
ret
|
ret
|
||||||
|
|
||||||
return:
|
|
||||||
ret
|
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
mov rax, SYS_EXIT
|
mov rax, SYS_EXIT
|
||||||
mov rdi, 0
|
mov rdi, 0
|
||||||
|
|
|
@ -1,32 +1,33 @@
|
||||||
; Returns new array length in rax
|
; rdi - fd
|
||||||
; edi - fd
|
|
||||||
pollfds__remove:
|
pollfds__remove:
|
||||||
mov r10d, edi
|
mov rax, [pollfds_len]
|
||||||
mov rdi, [pollfds_len]
|
mov rsi, 0
|
||||||
|
call pollfds__remove__loop
|
||||||
|
mov [pollfds_len], rax
|
||||||
|
ret
|
||||||
|
|
||||||
; Variables:
|
; Variables:
|
||||||
; rdi - array length
|
; rax - array length
|
||||||
|
; rdi - fd
|
||||||
; rsi - array index
|
; rsi - array index
|
||||||
; r10d - fd
|
|
||||||
; r11d - pollfds[rdi].fd
|
; r11d - pollfds[rdi].fd
|
||||||
pollfds__remove__loop:
|
pollfds__remove__loop:
|
||||||
cmp rsi, rdi
|
cmp rsi, rax
|
||||||
jge return ; fd was not found
|
jge return ; fd was not found
|
||||||
mov r11d, [pollfds + rsi * pollfd_size]
|
mov r11d, [pollfds + rsi * pollfd_size]
|
||||||
add rsi, 1
|
add rsi, 1
|
||||||
cmp r11d, r10d
|
cmp r11d, edi
|
||||||
jne pollfds__remove__loop
|
jne pollfds__remove__loop
|
||||||
sub rsi, 1
|
sub rsi, 1
|
||||||
|
|
||||||
; Returns new array length in rax
|
; rax - array length
|
||||||
; rdi - array length
|
|
||||||
; rsi - array index to remove
|
; rsi - array index to remove
|
||||||
pollfds__remove_index:
|
pollfds__remove_index:
|
||||||
cmp rdi, 1
|
cmp rax, 1
|
||||||
jle pollfds__clear
|
jle pollfds__clear
|
||||||
mov r10d, [pollfds + (rdi - 1) * pollfd_size]
|
mov r10d, [pollfds + (rax - 1) * pollfd_size]
|
||||||
mov [pollfds + rsi * pollfd_size], r10d
|
mov [pollfds + rsi * pollfd_size], r10d
|
||||||
sub rdi, 1
|
sub rax, 1
|
||||||
ret
|
ret
|
||||||
|
|
||||||
; Returns new array length in rax
|
; Returns new array length in rax
|
Loading…
Add table
Add a link
Reference in a new issue