poll(2) on the server socket; pollfds array
This commit is contained in:
parent
5c129207ae
commit
08f4db4d2b
3 changed files with 77 additions and 7 deletions
|
@ -1,6 +1,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <poll.h>
|
||||||
|
|
||||||
// printf("x %d\n", x);
|
// printf("x %d\n", x);
|
||||||
void main() {
|
void main() {
|
||||||
|
@ -11,4 +12,6 @@ void main() {
|
||||||
printf("O_NONBLOCK %d\n", O_NONBLOCK);
|
printf("O_NONBLOCK %d\n", O_NONBLOCK);
|
||||||
printf("sizeof(int) %d\n", sizeof(int));
|
printf("sizeof(int) %d\n", sizeof(int));
|
||||||
printf("sizeof(short) %d\n", sizeof(short));
|
printf("sizeof(short) %d\n", sizeof(short));
|
||||||
|
printf("POLLIN %d\n", POLLIN);
|
||||||
|
printf("POLLOUT %d\n", POLLOUT);
|
||||||
}
|
}
|
||||||
|
|
79
hello.s
79
hello.s
|
@ -3,6 +3,7 @@ global _start
|
||||||
; constants
|
; constants
|
||||||
SYS_READ equ 0
|
SYS_READ equ 0
|
||||||
SYS_WRITE equ 1
|
SYS_WRITE equ 1
|
||||||
|
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
|
||||||
|
@ -17,16 +18,22 @@ SOCK_STREAM equ 1
|
||||||
F_GETFL equ 3
|
F_GETFL equ 3
|
||||||
F_SETFL equ 4
|
F_SETFL equ 4
|
||||||
O_NONBLOCK equ 2048
|
O_NONBLOCK equ 2048
|
||||||
|
POLLIN equ 1
|
||||||
|
POLLOUT equ 4
|
||||||
|
|
||||||
|
pollfd_size equ 4 + 2 + 2 ; $ man 2 poll
|
||||||
|
pollfds_capacity equ 100
|
||||||
|
|
||||||
SECTION .data
|
SECTION .data
|
||||||
hello db "Hello world!", 0x0a
|
hello db "Hello world!", 0x0a
|
||||||
hello_len equ $ - hello
|
hello_len equ $ - hello
|
||||||
server_path db "server.sock", 0x00
|
server_path db "server.sock", 0x00
|
||||||
server_path_len equ $ - hello
|
server_path_len equ $ - hello
|
||||||
sockaddr_len equ 110 ; $ man 7 unix
|
sockaddr_size equ 2 + 108 ; $ man 7 unix
|
||||||
|
|
||||||
SECTION .bss
|
SECTION .bss
|
||||||
sockaddr resb sockaddr_len
|
sockaddr resb sockaddr_size
|
||||||
|
pollfds resb pollfd_size * pollfds_capacity
|
||||||
|
|
||||||
SECTION .text
|
SECTION .text
|
||||||
|
|
||||||
|
@ -38,9 +45,20 @@ _start:
|
||||||
syscall
|
syscall
|
||||||
|
|
||||||
call make_server
|
call make_server
|
||||||
push rax
|
mov rbx, 0 ; pollfd array length
|
||||||
call accept
|
mov ebp, eax ; server fd
|
||||||
pop r10
|
|
||||||
|
mov rax, rbx
|
||||||
|
mov edi, ebp
|
||||||
|
mov si, POLLIN
|
||||||
|
call pollfds__append
|
||||||
|
mov rbx, rax
|
||||||
|
|
||||||
|
mov rax, SYS_POLL
|
||||||
|
mov rdi, pollfds
|
||||||
|
mov rsi, rbx
|
||||||
|
mov rdx, 5000
|
||||||
|
syscall
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
mov rax, SYS_EXIT
|
mov rax, SYS_EXIT
|
||||||
|
@ -55,6 +73,55 @@ accept:
|
||||||
syscall
|
syscall
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
; rax - array length
|
||||||
|
; edi - fd
|
||||||
|
; si - events
|
||||||
|
; Returns new array length in rax
|
||||||
|
pollfds__append:
|
||||||
|
mov [pollfds + rax], edi
|
||||||
|
mov [pollfds + rax + 4], si
|
||||||
|
add rax, 1
|
||||||
|
ret
|
||||||
|
|
||||||
|
; Returns new array length in rax
|
||||||
|
; rax - array length
|
||||||
|
; edi - fd
|
||||||
|
pollfds__remove:
|
||||||
|
mov r10d, edi
|
||||||
|
mov rdi, 0
|
||||||
|
|
||||||
|
; Variables:
|
||||||
|
; rax - array length
|
||||||
|
; rdi - array index
|
||||||
|
; r10d - fd
|
||||||
|
; r11d - pollfds[rdi].fd
|
||||||
|
pollfds__remove__loop:
|
||||||
|
cmp rdi, rax
|
||||||
|
jge return ; fd was not found
|
||||||
|
mov r11d, [pollfds + rdi * pollfd_size]
|
||||||
|
add rdi, 1
|
||||||
|
cmp r11d, r10d
|
||||||
|
jne pollfds__remove__loop
|
||||||
|
sub rdi, 1
|
||||||
|
|
||||||
|
; Returns new array length in rax
|
||||||
|
; rax - array length
|
||||||
|
; rdi - array index to remove
|
||||||
|
pollfds__remove_index:
|
||||||
|
cmp rax, 1
|
||||||
|
jle pollfds__clear
|
||||||
|
mov r10d, [pollfds + (rax - 1) * pollfd_size]
|
||||||
|
mov [pollfds + rdi * pollfd_size], r10d
|
||||||
|
sub rax, 1
|
||||||
|
ret
|
||||||
|
|
||||||
|
; Returns new array length in rax
|
||||||
|
; rax - array length
|
||||||
|
pollfds__clear:
|
||||||
|
mov rax, 0
|
||||||
|
ret
|
||||||
|
|
||||||
|
; Returns (in rax) the server's file descriptor
|
||||||
make_server:
|
make_server:
|
||||||
mov rax, SYS_UNLINK
|
mov rax, SYS_UNLINK
|
||||||
mov rdi, server_path
|
mov rdi, server_path
|
||||||
|
@ -74,7 +141,7 @@ make_server:
|
||||||
mov rax, SYS_BIND
|
mov rax, SYS_BIND
|
||||||
mov rdi, r10
|
mov rdi, r10
|
||||||
mov rsi, sockaddr
|
mov rsi, sockaddr
|
||||||
mov rdx, sockaddr_len
|
mov rdx, sockaddr_size
|
||||||
syscall
|
syscall
|
||||||
|
|
||||||
mov rax, SYS_LISTEN
|
mov rax, SYS_LISTEN
|
||||||
|
|
2
makefile
2
makefile
|
@ -1,3 +1,3 @@
|
||||||
main:
|
main:
|
||||||
nasm -f elf64 -o hello.o hello.s
|
nasm -g -f elf64 -o hello.o hello.s
|
||||||
ld -o hello hello.o
|
ld -o hello hello.o
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue