Merge branch 'net-dev'. See body of commit for details.
[akaros.git] / tools / syscall_server.h
1 #include <stdio.h>
2 #include <fcntl.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5 #include <errno.h>
6 #include <sys/stat.h>
7 #include <string.h>
8 #include <sys/socket.h>
9 #include <netinet/in.h>
10
11 // Todo: review the laundry list of includes.
12
13 // Backlog for the listen() call.
14 #define BACKLOG_LEN 16
15
16 #define LISTEN_PORT 12345
17 #define SERVER_IP "128.32.35.43"
18
19 #define OPEN_ID         0
20 #define CLOSE_ID        1
21 #define READ_ID         2
22 #define WRITE_ID        3
23 #define LINK_ID         4
24 #define UNLINK_ID       5
25 #define LSEEK_ID        6
26 #define FSTAT_ID        7
27 #define ISATTY_ID       8
28 #define STAT_ID         9
29 #define NUM_CALLS       10
30
31 // New errno we want to define if a channel error occurs
32 // Not yet fully implimented
33 #define ECHANNEL -999
34
35 // Value to send across the channel as a function return value in the event of server side termination
36 // Note yet fully implimented
37 #define CONNECTION_TERMINATED -2
38
39 // Macros for the read_from_channel function
40 #define PEEK    1
41 #define NO_PEEK 0
42
43 // Should refactor this next typedef. Just leave it as type int.
44 typedef int syscall_id_t;
45
46 // ALL STRUCTS MUST BE PADDED TO THE SAME SIZE.
47 // Basically, to make IVY annotation possible with as few TC's as possible
48 // We do some ugly things with unions, which results in us needing this padding
49 typedef struct open_subheader {
50         uint32_t flags;
51         uint32_t mode;
52         uint32_t len;
53         char buf[0];
54 } open_subheader_t;
55
56 typedef struct close_subheader {
57         uint32_t fd;
58         uint32_t FILL1;
59         uint32_t FILL2;
60 } close_subheader_t;
61
62 typedef struct read_subheader {
63         uint32_t fd;
64         uint32_t len;
65         uint32_t FILL1;
66 } read_subheader_t;
67
68 typedef struct write_subheader {
69         uint32_t fd;
70         uint32_t len;
71         uint32_t FILL1;
72         char buf[0];
73 } write_subheader_t;
74
75 typedef struct lseek_subheader {
76         uint32_t fd;
77         uint32_t ptr;
78         uint32_t dir;
79 } lseek_subheader_t;
80
81 typedef struct isatty_subheader {
82         uint32_t fd;
83         uint32_t FILL1;
84         uint32_t FILL2;
85 } isatty_subheader_t;
86
87 typedef struct link_subheader {
88         uint32_t old_len;
89         uint32_t new_len;
90         uint32_t FILL1;
91         char buf[0];
92 } link_subheader_t;
93
94 typedef struct unlink_subheader {
95         uint32_t len;
96         uint32_t FILL1;
97         uint32_t FILL2;
98         char buf[0];
99 } unlink_subheader_t;
100
101 typedef struct fstat_subheader {
102         uint32_t fd;
103         uint32_t FILL1;
104         uint32_t FILL2;
105 } fstat_subheader_t;
106
107 typedef struct stat_subheader {
108         uint32_t len;
109         uint32_t FILL1;
110         uint32_t FILL2;
111         char buf[0];
112 } stat_subheader_t;
113
114 typedef struct backend_msg {
115         syscall_id_t id;
116         union {
117                 open_subheader_t open;
118                 close_subheader_t close;
119                 read_subheader_t read;
120                 write_subheader_t write;
121                 lseek_subheader_t lseek;
122                 isatty_subheader_t isatty;
123                 link_subheader_t link;
124                 unlink_subheader_t unlink;
125                 fstat_subheader_t fstat;
126                 stat_subheader_t stat;  
127         } subheader;
128 } msg_t;
129
130 typedef struct response {
131         int32_t ret;
132         uint32_t err;
133         struct stat st;
134         char buf[0];
135 } response_t;
136
137 #undef errno
138 extern int errno;
139
140 response_t* handle_open(msg_t * msg);
141 response_t* handle_close(msg_t * msg);
142 response_t* handle_read(msg_t * msg);
143 response_t* handle_write(msg_t * msg);
144 response_t* handle_lseek(msg_t * msg);
145 response_t* handle_isatty(msg_t * msg);
146 response_t* handle_unlink(msg_t * msg);
147 response_t* handle_link(msg_t * msg);
148 response_t* handle_stat(msg_t * msg);
149 response_t* handle_fstat(msg_t * msg);
150
151 int listen_for_connections();
152 int setup_data_connection(int data_port);
153 void process_connections(int fd);
154 int read_from_socket(char* buf, int socket, int len, int peek);
155 int read_header_from_socket(msg_t* msg, int socket);
156 int read_buffer_from_socket(char* buf, int socket, int len);
157 void send_error(int fd);