global _start ; constants SYS_READ equ 0 SYS_WRITE equ 1 SYS_POLL equ 7 SYS_SENDFILE equ 40 SYS_SOCKET equ 41 SYS_ACCEPT equ 43 SYS_BIND equ 49 SYS_LISTEN equ 50 SYS_EXIT equ 60 SYS_FCNTL equ 72 SYS_UNLINK equ 87 STDOUT equ 1 AF_UNIX equ 1 SOCK_STREAM equ 1 F_GETFL equ 3 F_SETFL equ 4 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 server_path db "server.sock", 0x00 server_path_len equ $ - server_path sockaddr_size equ 2 + 108 ; $ man 7 unix SECTION .bss sockaddr resb sockaddr_size pollfds resb pollfd_size * pollfds_capacity pollfds_len resb 8 SECTION .text %include "server.s" ;%include "pollfds_remove.s" _start: call make_server mov rbx, rax ; server fd mov rdi, rax mov rsi, POLLIN call pollfds__append poll: mov rax, SYS_POLL mov rdi, pollfds mov rsi, [pollfds_len] mov rdx, 5000 syscall cmp rax, 0 je poll jl exit mov rdi, rbx ; rdi - server fd pollfds__scan: mov r15, 0 pollfds__scan__loop: cmp r15, [pollfds_len] jge poll mov r10w, [pollfds + r15 * pollfd_size + 6] cmp r10w, 0 jne pollfds__scan__found add r15, 1 jmp pollfds__scan__loop pollfds__scan__found: mov r14d, [pollfds + r15 * pollfd_size] cmp r14d, edi je pollfds__scan__found__server pollfds__scan__found__client: jmp exit jmp pollfds__scan__loop pollfds__scan__found__server: mov rax, SYS_ACCEPT push rdi mov rsi, 0 mov rdx, 0 syscall cmp rax, 0 jl exit mov rdi, rax mov si, POLLIN | POLLOUT call pollfds__append pop rdi add r15, 1 jmp pollfds__scan__loop ; edi - fd ; si - events pollfds__append: 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 return: ret exit: mov rax, SYS_EXIT mov rdi, 0 syscall