-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver-linux.asm
170 lines (147 loc) · 3.33 KB
/
server-linux.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
default rel
global _start
; SYSCALLS
%define SYS_exit 60
%define SYS_write 1
%define SYS_socket 41
%define SYS_bind 49
%define SYS_listen 50
%define SYS_accept 43
%define SYS_read 0
%define SYS_close 3
%define SYS_setsockopt 54
; SOCKET PARAMS
%define AF_INET 2
%define SOCK_STREAM 1
%define SOL_SOCKET 0xffff
%define SO_REUSEADDR 0x0004
%define SO_REUSEPORT 0x0200
; FILE DESCRIPTORS
%define STDOUT 1
%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
_start:
sub rsp, 12
info "Starting Webserver..."
; ========== CREATE SOCKET =============
info "Creating socket"
mov rax, SYS_socket
mov rdi, AF_INET
mov rsi, SOCK_STREAM
mov rdx, 0
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
; Print client message
info "Received Connection"
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 AF_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;",10,10
db "<h1>Hello World!</h1>"
client_response_msg_len: equ $ - client_response_msg