| #ifndef SERIAL_SERVER_H | 
 | #define SERIAL_SERVER_H | 
 |  | 
 | #include <stdint.h> | 
 | #include <sys/stat.h> | 
 | #include <newlib_trans.h> | 
 |  | 
 | #define SANDBOX_DIR "sandbox/" | 
 |  | 
 | #define OPEN_ID			0 | 
 | #define CLOSE_ID		1 | 
 | #define READ_ID			2 | 
 | #define WRITE_ID		3 | 
 | #define LINK_ID			4 | 
 | #define UNLINK_ID		5 | 
 | #define LSEEK_ID		6 | 
 | #define FSTAT_ID		7 | 
 | #define ISATTY_ID		8 | 
 | #define STAT_ID			9 | 
 | #define NUM_SYSCALLS	10 | 
 |  | 
 | typedef uint32_t syscall_id_t; | 
 |  | 
 | typedef struct open_subheader { | 
 | 	uint32_t flags; | 
 | 	uint32_t mode; | 
 | 	uint32_t len; | 
 | } open_subheader_t; | 
 |  | 
 | typedef struct close_subheader { | 
 | 	uint32_t fd; | 
 | 	uint32_t FILL1; | 
 | 	uint32_t FILL2; | 
 | } close_subheader_t; | 
 |  | 
 | typedef struct read_subheader { | 
 | 	uint32_t fd; | 
 | 	uint32_t len; | 
 | 	uint32_t FILL1; | 
 | } read_subheader_t; | 
 |  | 
 | typedef struct write_subheader { | 
 | 	uint32_t fd; | 
 | 	uint32_t len; | 
 | 	uint32_t FILL1; | 
 | } write_subheader_t; | 
 |  | 
 | typedef struct lseek_subheader { | 
 | 	uint32_t fd; | 
 | 	uint32_t ptr; | 
 | 	uint32_t dir; | 
 | } lseek_subheader_t; | 
 |  | 
 | typedef struct isatty_subheader { | 
 | 	uint32_t fd; | 
 | 	uint32_t FILL1; | 
 | 	uint32_t FILL2; | 
 | } isatty_subheader_t; | 
 |  | 
 | typedef struct link_subheader { | 
 | 	uint32_t old_len; | 
 | 	uint32_t new_len; | 
 | 	uint32_t FILL1; | 
 | } link_subheader_t; | 
 |  | 
 | typedef struct unlink_subheader { | 
 | 	uint32_t len; | 
 | 	uint32_t FILL1; | 
 | 	uint32_t FILL2; | 
 | } unlink_subheader_t; | 
 |  | 
 | typedef struct fstat_subheader { | 
 | 	uint32_t fd; | 
 | 	uint32_t FILL1; | 
 | 	uint32_t FILL2; | 
 | } fstat_subheader_t; | 
 |  | 
 | typedef struct stat_subheader { | 
 | 	uint32_t len; | 
 | 	uint32_t FILL1; | 
 | 	uint32_t FILL2; | 
 | } stat_subheader_t; | 
 |  | 
 | typedef struct syscall_req_header { | 
 | 	syscall_id_t id; | 
 | 	union { | 
 | 		open_subheader_t open; | 
 | 		close_subheader_t close; | 
 | 		read_subheader_t read; | 
 | 		write_subheader_t write; | 
 | 		lseek_subheader_t lseek; | 
 | 		isatty_subheader_t isatty; | 
 | 		link_subheader_t link; | 
 | 		unlink_subheader_t unlink; | 
 | 		fstat_subheader_t fstat; | 
 | 		stat_subheader_t stat;	 | 
 | 	} subheader; | 
 | } syscall_req_header_t; | 
 |  | 
 | typedef struct syscall_req { | 
 | 	syscall_req_header_t header; | 
 | 	uint32_t payload_len; | 
 | 	void* payload; | 
 | } syscall_req_t; | 
 |  | 
 | typedef struct syscall_rsp_header { | 
 | 	int32_t return_val; | 
 | 	uint32_t return_errno; | 
 | } syscall_rsp_header_t; | 
 |  | 
 | typedef struct syscall_rsp { | 
 | 	syscall_rsp_header_t header; | 
 | 	uint32_t payload_len; | 
 | 	void* payload; | 
 | } syscall_rsp_t; | 
 |  | 
 | void run_server(); | 
 | int init_syscall_server(int* fd_read, int* fd_write); | 
 | void translate_stat(struct stat* native, struct newlib_stat* newlib); | 
 | int translate_flags(int native_flags); | 
 | int translate_mode(int native_mode); | 
 | int translate_whence(int native_whence); | 
 | void translate_errno(int native, int newlib); | 
 | void set_syscall_req_payload_len(syscall_req_t* req); | 
 | void read_syscall_req(int fd, syscall_req_t* req); | 
 | void read_syscall_req_header(int fd, syscall_req_t* req); | 
 | void read_syscall_req_payload(int fd, syscall_req_t* req); | 
 | void write_syscall_rsp(int fd, syscall_rsp_t* rsp); | 
 | void write_syscall_rsp_header(int fd, syscall_rsp_t* rsp); | 
 | void write_syscall_rsp_payload(int fd, syscall_rsp_t* rsp); | 
 | int read_syscall_server(int fd, char* buf, int len); | 
 | int write_syscall_server(int fd, char* buf, int len, int bytes_to_follow);  | 
 | void error(int fd, const char* s); | 
 | char* sandbox_file_name(char* name, uint32_t len); | 
 |  | 
 | void handle_syscall(syscall_req_t* req, syscall_rsp_t* rsp); | 
 | void handle_open(syscall_req_t* req, syscall_rsp_t* rsp); | 
 | void handle_close(syscall_req_t* req, syscall_rsp_t* rsp); | 
 | void handle_read(syscall_req_t* req, syscall_rsp_t* rsp); | 
 | void handle_write(syscall_req_t* req, syscall_rsp_t* rsp); | 
 | void handle_link(syscall_req_t* req, syscall_rsp_t* rsp); | 
 | void handle_unlink(syscall_req_t* req, syscall_rsp_t* rsp); | 
 | void handle_lseek(syscall_req_t* req, syscall_rsp_t* rsp); | 
 | void handle_fstat(syscall_req_t* req, syscall_rsp_t* rsp); | 
 | void handle_isatty(syscall_req_t* req, syscall_rsp_t* rsp); | 
 | void handle_stat(syscall_req_t* req, syscall_rsp_t* rsp); | 
 |  | 
 | #endif //SERIAL_SERVER_H |