global _start ; constants SYS_WRITE equ 1 SYS_SOCKET equ 41 SYS_CONNECT equ 42 SYS_SHUTDOWN equ 48 SYS_FCNTL equ 72 SYS_EXIT equ 60 AF_UNIX equ 1 SOCK_STREAM equ 1 F_GETFL equ 3 F_SETFL equ 4 O_NONBLOCK equ 2048 SHUT_RDWR equ 2 SECTION .data server_path db "eagain.sock", 0x00 server_path_len equ $ - server_path sockaddr_size equ 2 + 108 ; $ man 7 unix SECTION .bss sockaddr resb sockaddr_size spam resb 0xffff SECTION .text _start: mov rax, SYS_SOCKET mov rdi, AF_UNIX mov rsi, SOCK_STREAM mov rdx, 0 syscall mov r15, rax call nonblocking call make_sockaddr mov rax, SYS_CONNECT mov rdi, r15 mov rsi, sockaddr mov rdx, sockaddr_size syscall loop: mov rax, SYS_WRITE mov rdi, r15 mov rsi, spam mov rdx, 0xffff syscall cmp rax, 0 jge loop mov rax, SYS_EXIT mov rdi, 1 syscall nonblocking: mov r10, rax mov rax, SYS_FCNTL mov rdi, r10 mov rsi, F_GETFL syscall mov r11, rax xor r11, O_NONBLOCK mov rax, SYS_FCNTL mov rdi, r10 mov rsi, F_SETFL mov rdx, r11 syscall ret make_sockaddr: mov word [sockaddr], AF_UNIX mov rax, 0 make_sockaddr__copy_server_path: cmp rax, server_path_len jge return mov r10, [server_path + rax] mov [sockaddr + rax + 2], r10 add rax, 8 jmp make_sockaddr__copy_server_path return: ret