.code64 #include #include #define STDIN 0 #define STDOUT 1 #define STDERR 2 #define PF_INET 2 #define AF_INET PF_INET #define SOCK_STREAM 1 #define PORT 20335 .data greeting: .ascii "Socket test!\n" .set greeting_len, .-greeting bye: .ascii "Sockets tested!\n" .set bye_len, .-bye errstr: .ascii "Error happened\n" .set errstr_len, .-errstr s: .quad 0 true_val: .quad 1 .set true_val_len, .-true_val myaddr: .hword AF_INET port: .byte (PORT >> 8) & 0xFF, (PORT & 0xFF) addr: .byte 0, 0, 0, 0 .set myaddr_len, 16 .extern passthru .extern write_buf .text .global _start _start: movq $STDERR, %rdi movq $greeting, %rsi movq $greeting_len, %rdx call write_buf movq $__NR_socket, %rax movq $PF_INET, %rdi movq $SOCK_STREAM, %rsi movq $0, %rdx syscall cmp $-1, %rax jz error movq %rax, s movq $__NR_setsockopt, %rax movq s, %rdi movq $SOL_SOCKET, %rsi movq $SO_REUSEADDR, %rdx movq $true_val, %r10 movq $true_val_len, %r8 syscall test %rax, %rax jnz error movq $__NR_bind, %rax movq s, %rdi movq $myaddr, %rsi movq $myaddr_len, %rdx syscall test %rax, %rax jnz error movq $__NR_listen, %rax movq s, %rdi movq $8, %rsi syscall test %rax, %rax jnz error movq $__NR_accept, %rax movq s, %rdi movq $0, %rsi movq $0, %rdx movq $0, %r10 syscall cmp $-1, %rax jz error test %rax, %rax jz error movq %rax, %rdi movq $STDOUT, %rsi call passthru movq $STDERR, %rdi movq $bye, %rsi movq $bye_len, %rdx call write_buf exit: movq $__NR_close, %rax movq s, %rdi syscall _exit: movq $__NR_exit, %rax movq $0, %rdi syscall movq $0, 0 error: movq $__NR_write, %rax movq $STDERR, %rdi movq $errstr, %rsi movq $errstr_len, %rdx syscall jmp _exit