diff --git a/eagain.s b/eagain.s
new file mode 100644
index 0000000..07f7311
--- /dev/null
+++ b/eagain.s
@@ -0,0 +1,92 @@
+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