blob: 790d1350b7be7485cbab5577ab56c7a6401f21cd [file] [log] [blame]
#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