int handle_vFile (char *own_buf, int packet_len, int *new_packet_len) { if (strncmp (own_buf, "vFile:open:", 11) == 0) handle_open (own_buf); else if (strncmp (own_buf, "vFile:pread:", 11) == 0) handle_pread (own_buf, new_packet_len); else if (strncmp (own_buf, "vFile:pwrite:", 12) == 0) handle_pwrite (own_buf, packet_len); else if (strncmp (own_buf, "vFile:close:", 12) == 0) handle_close (own_buf); else if (strncmp (own_buf, "vFile:unlink:", 13) == 0) handle_unlink (own_buf); else return 0; return 1; }
void handle_syscall(syscall_req_t* req, syscall_rsp_t* rsp) { switch (req->header.id) { case OPEN_ID: handle_open(req, rsp); break; case CLOSE_ID: handle_close(req, rsp); break; case READ_ID: handle_read(req, rsp); break; case WRITE_ID: handle_write(req, rsp); break; case LINK_ID: handle_link(req, rsp); break; case UNLINK_ID: handle_unlink(req, rsp); break; case LSEEK_ID: handle_lseek(req, rsp); break; case FSTAT_ID: handle_fstat(req, rsp); break; case ISATTY_ID: handle_isatty(req, rsp); break; case STAT_ID: handle_stat(req, rsp); break; default: error(-1, "Illegal syscall, should never be here..."); } rsp->header.return_errno = errno; }
int handle_vFile (char *own_buf, int packet_len, int *new_packet_len) { if (startswith (own_buf, "vFile:open:")) handle_open (own_buf); else if (startswith (own_buf, "vFile:pread:")) handle_pread (own_buf, new_packet_len); else if (startswith (own_buf, "vFile:pwrite:")) handle_pwrite (own_buf, packet_len); else if (startswith (own_buf, "vFile:fstat:")) handle_fstat (own_buf, new_packet_len); else if (startswith (own_buf, "vFile:close:")) handle_close (own_buf); else if (startswith (own_buf, "vFile:unlink:")) handle_unlink (own_buf); else if (startswith (own_buf, "vFile:readlink:")) handle_readlink (own_buf, new_packet_len); else return 0; return 1; }
static int handle_fuse_request(struct fuse *fuse, struct fuse_handler* handler, const struct fuse_in_header *hdr, const void *data, size_t data_len) { switch (hdr->opcode) { case FUSE_LOOKUP: { /* bytez[] -> entry_out */ const char* name = data; return handle_lookup(fuse, handler, hdr, name); } case FUSE_FORGET: { const struct fuse_forget_in *req = data; return handle_forget(fuse, handler, hdr, req); } case FUSE_GETATTR: { /* getattr_in -> attr_out */ const struct fuse_getattr_in *req = data; return handle_getattr(fuse, handler, hdr, req); } case FUSE_SETATTR: { /* setattr_in -> attr_out */ const struct fuse_setattr_in *req = data; return handle_setattr(fuse, handler, hdr, req); } // case FUSE_READLINK: // case FUSE_SYMLINK: case FUSE_MKNOD: { /* mknod_in, bytez[] -> entry_out */ const struct fuse_mknod_in *req = data; const char *name = ((const char*) data) + sizeof(*req); return handle_mknod(fuse, handler, hdr, req, name); } case FUSE_MKDIR: { /* mkdir_in, bytez[] -> entry_out */ const struct fuse_mkdir_in *req = data; const char *name = ((const char*) data) + sizeof(*req); return handle_mkdir(fuse, handler, hdr, req, name); } case FUSE_UNLINK: { /* bytez[] -> */ const char* name = data; return handle_unlink(fuse, handler, hdr, name); } case FUSE_RMDIR: { /* bytez[] -> */ const char* name = data; return handle_rmdir(fuse, handler, hdr, name); } case FUSE_RENAME: { /* rename_in, oldname, newname -> */ const struct fuse_rename_in *req = data; const char *old_name = ((const char*) data) + sizeof(*req); const char *new_name = old_name + strlen(old_name) + 1; return handle_rename(fuse, handler, hdr, req, old_name, new_name); } // case FUSE_LINK: case FUSE_OPEN: { /* open_in -> open_out */ const struct fuse_open_in *req = data; return handle_open(fuse, handler, hdr, req); } case FUSE_READ: { /* read_in -> byte[] */ const struct fuse_read_in *req = data; return handle_read(fuse, handler, hdr, req); } case FUSE_WRITE: { /* write_in, byte[write_in.size] -> write_out */ const struct fuse_write_in *req = data; const void* buffer = (const __u8*)data + sizeof(*req); return handle_write(fuse, handler, hdr, req, buffer); } case FUSE_STATFS: { /* getattr_in -> attr_out */ return handle_statfs(fuse, handler, hdr); } case FUSE_RELEASE: { /* release_in -> */ const struct fuse_release_in *req = data; return handle_release(fuse, handler, hdr, req); } case FUSE_FSYNC: { const struct fuse_fsync_in *req = data; return handle_fsync(fuse, handler, hdr, req); } // case FUSE_SETXATTR: // case FUSE_GETXATTR: // case FUSE_LISTXATTR: // case FUSE_REMOVEXATTR: case FUSE_FLUSH: { return handle_flush(fuse, handler, hdr); } case FUSE_OPENDIR: { /* open_in -> open_out */ const struct fuse_open_in *req = data; return handle_opendir(fuse, handler, hdr, req); } case FUSE_READDIR: { const struct fuse_read_in *req = data; return handle_readdir(fuse, handler, hdr, req); } case FUSE_RELEASEDIR: { /* release_in -> */ const struct fuse_release_in *req = data; return handle_releasedir(fuse, handler, hdr, req); } // case FUSE_FSYNCDIR: case FUSE_INIT: { /* init_in -> init_out */ const struct fuse_init_in *req = data; return handle_init(fuse, handler, hdr, req); } default: { TRACE("[%d] NOTIMPL op=%d uniq=%llx nid=%llx\n", handler->token, hdr->opcode, hdr->unique, hdr->nodeid); return -ENOSYS; } } }