120 lines
1.9 KiB
ArmAsm
120 lines
1.9 KiB
ArmAsm
global _start
|
|
|
|
; constants
|
|
SYS_READ equ 0
|
|
SYS_WRITE equ 1
|
|
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
|
|
|
|
SECTION .data
|
|
hello db "Hello world!", 0x0a
|
|
hello_len equ $ - hello
|
|
server_path db "server.sock", 0x00
|
|
server_path_len equ $ - hello
|
|
sockaddr_len equ 110 ; $ man 7 unix
|
|
|
|
SECTION .bss
|
|
sockaddr resb sockaddr_len
|
|
|
|
SECTION .text
|
|
|
|
_start:
|
|
mov rax, SYS_WRITE
|
|
mov rdi, STDOUT
|
|
mov rsi, hello
|
|
mov rdx, hello_len
|
|
syscall
|
|
|
|
call make_server
|
|
push rax
|
|
call accept
|
|
pop r10
|
|
|
|
exit:
|
|
mov rax, SYS_EXIT
|
|
mov rdi, 0
|
|
syscall
|
|
|
|
accept:
|
|
mov rdi, rax
|
|
mov rax, SYS_ACCEPT
|
|
mov rsi, 0
|
|
mov rdx, 0
|
|
syscall
|
|
ret
|
|
|
|
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_len
|
|
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
|
|
|
|
return:
|
|
ret
|