; Returns (in rax) the server's file descriptor
make_server:
    mov rax, SYS_UNLINK
    mov rdi, server_path
    syscall

    mov rax, SYS_SOCKET
    mov rdi, AF_UNIX
    mov rsi, SOCK_STREAM
    mov rdx, 0
    syscall
    push rax

    call nonblocking
    call make_sockaddr
    pop r10

    mov rax, SYS_BIND
    mov rdi, r10
    mov rsi, sockaddr
    mov rdx, sockaddr_size
    syscall

    mov rax, SYS_LISTEN
    mov rdi, r10
    mov rsi, 100
    syscall

    mov rax, r10
    ret

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