1+ fun syscall1(id: i64) -> i64 {
2+ var ret_val: i64;
3+ asm {
4+ "syscall"
5+ in("rax") id
6+ out("rax") ret_val
7+ }
8+ return ret_val;
9+ }
10+
11+ fun syscall2(id: i64, arg1: i64) -> i64 {
12+ var ret_val: i64;
13+ asm {
14+ "syscall"
15+ in("rax") id
16+ in("rdi") arg1
17+ out("rax") ret_val
18+ }
19+ return ret_val;
20+ }
21+
22+ fun syscall3(id: i64, arg1: i64, arg2: i64) -> i64 {
23+ var ret_val: i64;
24+ asm {
25+ "syscall"
26+ in("rax") id
27+ in("rdi") arg1
28+ in("rsi") arg2
29+ out("rax") ret_val
30+ }
31+ return ret_val;
32+ }
33+
34+ fun syscall4(id: i64, arg1: i64, arg2: i64, arg3: i64) -> i64 {
35+ var ret_val: i64;
36+ asm {
37+ "syscall"
38+ in("rax") id
39+ in("rdi") arg1
40+ in("rsi") arg2
41+ in("rdx") arg3
42+ out("rax") ret_val
43+ }
44+ return ret_val;
45+ }
46+
47+ fun _socket_create() -> i32 {
48+ return syscall4(41, 2, 1, 0);
49+ }
50+
51+ fun _socket_bind(sockfd: i32, ip_addr: i32, port: i16) -> i32 {
52+ asm {
53+ out("rax") result
54+ in("rdi") sockfd
55+ }
56+ return result;
57+ }
58+
59+ fun _socket_listen(sockfd: i32, backlog: i32) -> i32 {
60+ return syscall3(50, sockfd, backlog);
61+ }
62+
63+ fun _socket_close(sockfd: i32) {
64+ syscall2(3, sockfd);
65+ }
66+
67+ fun new_server(ip_str: str, port: i16) -> ptr<i32> {
68+ var sockfd: i32 = _socket_create();
69+ if (sockfd < 0) {
70+ println("Error: Failed to create socket.");
71+ return 0;
72+ }
73+
74+ if (_socket_bind(sockfd, 0, port) < 0) {
75+ println("Error: Failed to bind socket.");
76+ _socket_close(sockfd);
77+ return 0;
78+ }
79+
80+ return sockfd;
81+ }
82+
83+ fun listen(server_fd: i32, backlog: i32) -> i32 {
84+ if (_socket_listen(server_fd, backlog) < 0) {
85+ println("Error: Failed to listen on socket.");
86+ return -1;
87+ }
88+ println("Server is listening...");
89+ return server_fd;
90+ }
91+
92+ fun start(server_fd: i32) {
93+ println("Server accepting connections...");
94+
95+ while (true) {
96+ var client_fd: i32 = syscall3(43, server_fd, 0);
97+
98+ if (client_fd < 0) {
99+ println("Error: Failed to accept connection.");
100+ continue;
101+ }
102+
103+ println("Client connected! fd: {}", client_fd);
104+
105+ var response: str = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nWelcome to the Wave HTTP Server!";
106+
107+ syscall4(1, client_fd, response, 82);
108+
109+ _socket_close(client_fd);
110+ println("Client disconnected.");
111+ }
112+ }
113+
114+
115+ fun main() {
116+ println("--- Wave HTTP Server Application ---");
117+
118+ var server_instance: i32 = new_server("0.0.0.0", 8080)
119+ .listen(10);
120+
121+ if (server_instance >= 0) {
122+ server_instance.start();
123+ } else {
124+ println("Server failed to start.");
125+ }
126+ }
0 commit comments