-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver-osx.asm
184 lines (158 loc) · 3.69 KB
/
server-osx.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
default rel
global _main
; SYSCALLS
%define SYS_exit 0x2000001
%define SYS_write 0x2000004
%define SYS_socket 0x2000061
%define SYS_bind 0x2000068
%define SYS_listen 0x200006a
%define SYS_accept 0x200001e
%define SYS_read 0x2000003
%define SYS_close 0x2000006
%define SYS_setsockopt 0x2000069
; SOCKET PARAMS
%define PF_INET 2
%define SOCK_STREAM 1
%define SOL_SOCKET 0xffff
%define SO_REUSEADDR 0x0004
%define SO_REUSEPORT 0x0200
; FILE DESCRIPTORS
%define STDOUT 1
; CLIENT MSG OPTS
%define MSG_LEN 1024
%macro write 3
mov rax, SYS_write
mov rdi, %1
mov rsi, %2
mov rdx, %3
syscall
%endmacro
%macro print 2
jmp %%code
%%str: db %2
%%str_len: equ $ - %%str
%%code:
mov rax, SYS_write
mov rdi, %1
mov rsi, %%str
mov rdx, %%str_len
syscall
%endmacro
%macro log 1
%strcat log_msg %1,`\n`
print STDOUT,log_msg
%endmacro
%macro info 1
%strcat log_msg "INFO: ",%1
log log_msg
%endmacro
%macro error 1
%strcat log_msg "ERROR: ",%1
log log_msg
%endmacro
%macro exit 1
mov rax, SYS_exit
mov rdi, %1
syscall
%endmacro
section .text
_main:
sub rsp, 12
info "Starting Webserver..."
; ========== CREATE SOCKET =============
info "Creating socket"
mov rax, SYS_socket
mov rdi, PF_INET
mov rsi, SOCK_STREAM
syscall
mov [socket_fd], rax
; check error
jc .error
info "Socket created"
; Enable address and port reuse for socket
mov rax, SYS_setsockopt
mov rdi, [socket_fd]
mov rsi, SOL_SOCKET
mov rdx, SO_REUSEADDR
mov rcx, enable
mov r8, size_int
syscall
mov rax, SYS_setsockopt
mov rdi, [socket_fd]
mov rsi, SOL_SOCKET
mov rdx, SO_REUSEPORT
mov rcx, enable
mov r8, size_int
syscall
; ======================================
; ========== BIND SOCKET =============
info "Binding Socket"
mov rax, SYS_bind
mov rdi, [socket_fd]
mov rsi, sin_struct
mov rdx, sin_len
syscall
jc .error
; ======================================
; ========== LISTEN SOCKET =============
info "Listening Socket"
mov rax, SYS_listen
mov rdi, [socket_fd]
mov rsi, 10 ; TODO buf size limit
mov rdx, 0
syscall
jc .error
info "Server listening on http://localhost:8080"
; ======================================
.accept:
; ========== ACCEPT SOCKET =============
mov rax, SYS_accept
mov rdi, [socket_fd]
mov rsi, 0
mov rdx, 0
syscall
mov [client_fd], rax
jc .error
; Read client message
mov rax, SYS_read
mov rdi, [client_fd]
mov rsi, client_msg
mov rdx, MSG_LEN
syscall
jc .error
; Print client message
info "Received message"
write STDOUT, client_msg, MSG_LEN
jc .error
; Respond client
write [client_fd], client_response_msg, client_response_msg_len
; Close connection
mov rax, SYS_close
mov rdi, [client_fd]
syscall
jc .error
; Accept loop
jmp .accept
; ======================================
exit 0
.error:
error "Error happened, exitting..."
exit 1
section .data
; servaddr_in socket struct
enable: dd 1
size_int: equ $ - enable
socket_fd: dq 0
sin_struct: dw PF_INET
sin_port: dw 36895 ; 8080
sin_addr: dd 0
sin_zero: dq 0
sin_len: equ $ - sin_struct
; client socket
client_fd: dq 0
client_response_msg: db "HTTP/1.1 200",10
db "Content-Type: text/html; charset=UTF-8",10,10
db "<h1>Hello from <span style='color:red'> Assembly</span></h1>"
client_response_msg_len: equ $ - client_response_msg
section .bss
client_msg: resb MSG_LEN