diff options
author | matt335672 <30179339+matt335672@users.noreply.github.com> | 2019-03-04 18:52:49 +0300 |
---|---|---|
committer | matt335672 <30179339+matt335672@users.noreply.github.com> | 2019-04-01 16:13:57 +0300 |
commit | c31b3b0dc2d046b9545442f207ce1b6d406b441a (patch) | |
tree | 77b98d1faf9fcecc4db7429312afac1bd6022bfd | |
parent | 06042dcff7d76314882c211d9ab7f0b93b8eaade (diff) |
chansrv_fuse.c tidyups
- Remove unused USE_SYNC_FLAG macro
- Remove unused members invoke_fuse, off, dirbuf1 from XFUSE_INFO
- Clear f_fifo_opendir entries on deinit
- Added some comments and fixed some others
-rw-r--r-- | sesman/chansrv/chansrv_fuse.c | 182 |
1 files changed, 73 insertions, 109 deletions
diff --git a/sesman/chansrv/chansrv_fuse.c b/sesman/chansrv/chansrv_fuse.c index 2eb8efda..14b446af 100644 --- a/sesman/chansrv/chansrv_fuse.c +++ b/sesman/chansrv/chansrv_fuse.c @@ -37,8 +37,6 @@ * */ -//#define USE_SYNC_FLAG - /* FUSE mount point */ char g_fuse_root_path[256] = ""; char g_fuse_clipboard_path[256] = ""; /* for clipboard use */ @@ -198,16 +196,13 @@ struct xfuse_info fuse_req_t req; fuse_ino_t inode; fuse_ino_t new_inode; - int invoke_fuse; char name[1024]; char new_name[1024]; tui32 device_id; - int reply_type; + int reply_type; /* RT_FUSE_REPLY_xxx */ int mode; int type; size_t size; - off_t off; - struct dirbuf1 dirbuf1; }; typedef struct xfuse_info XFUSE_INFO; @@ -287,11 +282,6 @@ static int xfuse_delete_dir_with_xinode(XRDP_INODE *xinode); static int xfuse_recursive_delete_dir_with_xinode(XRDP_INODE *xinode); static void xfuse_update_xrdpfs_size(void); -#ifdef USE_SYNC_FLAG -static void xfuse_enum_dir(fuse_req_t req, fuse_ino_t ino, size_t size, - off_t off, struct fuse_file_info *fi); -#endif - /* forward declarations for FUSE callbacks */ static void xfuse_cb_lookup(fuse_req_t req, fuse_ino_t parent, const char *name); @@ -492,6 +482,14 @@ xfuse_init(void) int xfuse_deinit(void) { + struct opendir_req *odreq; + /* Fail any waiting FUSE requests in the FIFO */ + while (!fifo_is_empty(&g_fifo_opendir)) + { + odreq = (struct opendir_req *)fifo_remove(&g_fifo_opendir); + fuse_reply_err(odreq->req, EBADF); + g_free(odreq); + } fifo_deinit(&g_fifo_opendir); if (g_ch != 0) @@ -1531,6 +1529,8 @@ int xfuse_devredir_cb_enum_dir(void *vp, struct xrdp_inode *xinode) } /** + * This routine is called by devredir when the opendir_req entry at the + * front of the opendir FIFO has completed processing. *****************************************************************************/ void xfuse_devredir_cb_enum_dir_done(void *vp, tui32 IoStatus) @@ -1551,8 +1551,7 @@ void xfuse_devredir_cb_enum_dir_done(void *vp, tui32 IoStatus) if (IoStatus != 0) { /* command failed */ - if (fip->invoke_fuse) - fuse_reply_err(fip->req, ENOENT); + fuse_reply_err(fip->req, ENOENT); goto done; } @@ -1560,14 +1559,15 @@ void xfuse_devredir_cb_enum_dir_done(void *vp, tui32 IoStatus) if (!xfuse_is_inode_valid(fip->inode)) { log_error("inode %ld is not valid", fip->inode); - if (fip->invoke_fuse) - fuse_reply_err(fip->req, EBADF); + fuse_reply_err(fip->req, EBADF); goto done; } xfuse_delete_stale_entries(fip->inode); - /* this will be used by xfuse_cb_readdir() */ + /* Generate a FUSE reply. + * The dir_info struct will be used by xfuse_cb_readdir() + */ di = g_new0(struct dir_info, 1); di->index = FIRST_INODE; fip->fi->fh = (tintptr) di; @@ -1576,10 +1576,9 @@ void xfuse_devredir_cb_enum_dir_done(void *vp, tui32 IoStatus) done: - if (fip) - free(fip); + free(fip); - /* remove current request */ + /* remove completed request */ g_free(fifo_remove(&g_fifo_opendir)); while (1) @@ -1614,9 +1613,6 @@ void xfuse_devredir_cb_open_file(void *vp, tui32 IoStatus, tui32 DeviceId, if (IoStatus != 0) { - if (!fip->invoke_fuse) - goto done; - switch (IoStatus) { case 0xC0000022: @@ -1642,8 +1638,7 @@ void xfuse_devredir_cb_open_file(void *vp, tui32 IoStatus, tui32 DeviceId, if (fh == NULL) { log_error("system out of memory"); - if (fip->invoke_fuse) - fuse_reply_err(fip->req, ENOMEM); + fuse_reply_err(fip->req, ENOMEM); free(fip); return; @@ -1658,73 +1653,70 @@ void xfuse_devredir_cb_open_file(void *vp, tui32 IoStatus, tui32 DeviceId, fip, fip->fi, (long long) fip->fi->fh); } - if (fip->invoke_fuse) + if (fip->reply_type == RT_FUSE_REPLY_OPEN) { - if (fip->reply_type == RT_FUSE_REPLY_OPEN) - { - log_debug("sending fuse_reply_open(); " - "DeviceId=%d FileId=%d req=%p fi=%p", - fh->DeviceId, fh->FileId, fip->req, fip->fi); + log_debug("sending fuse_reply_open(); " + "DeviceId=%d FileId=%d req=%p fi=%p", + fh->DeviceId, fh->FileId, fip->req, fip->fi); - /* update open count */ - if ((xinode = g_xrdp_fs.inode_table[fip->inode]) != NULL) - xinode->nopen++; + /* update open count */ + if ((xinode = g_xrdp_fs.inode_table[fip->inode]) != NULL) + xinode->nopen++; - fuse_reply_open(fip->req, fip->fi); - } - else if (fip->reply_type == RT_FUSE_REPLY_CREATE) - { - struct fuse_entry_param e; + fuse_reply_open(fip->req, fip->fi); + } + else if (fip->reply_type == RT_FUSE_REPLY_CREATE) + { + struct fuse_entry_param e; // LK_TODO #if 0 - if ((xinode = g_xrdp_fs.inode_table[fip->inode]) == NULL) - { - log_error("inode at inode_table[%ld] is NULL", fip->inode); - fuse_reply_err(fip->req, EBADF); - goto done; - } + if ((xinode = g_xrdp_fs.inode_table[fip->inode]) == NULL) + { + log_error("inode at inode_table[%ld] is NULL", fip->inode); + fuse_reply_err(fip->req, EBADF); + goto done; + } #else - /* create entry in xrdp file system */ - xinode = xfuse_create_file_in_xrdp_fs(fip->device_id, fip->inode, - fip->name, fip->mode); - if (xinode == NULL) - { - fuse_reply_err(fip->req, ENOMEM); - return; - } + /* create entry in xrdp file system */ + xinode = xfuse_create_file_in_xrdp_fs(fip->device_id, fip->inode, + fip->name, fip->mode); + if (xinode == NULL) + { + fuse_reply_err(fip->req, ENOMEM); + return; + } #endif - memset(&e, 0, sizeof(struct fuse_entry_param)); - - e.ino = xinode->inode; - e.attr_timeout = XFUSE_ATTR_TIMEOUT; - e.entry_timeout = XFUSE_ENTRY_TIMEOUT; - e.attr.st_ino = xinode->inode; - e.attr.st_mode = xinode->mode; - e.attr.st_nlink = xinode->nlink; - e.attr.st_uid = xinode->uid; - e.attr.st_gid = xinode->gid; - e.attr.st_size = xinode->size; - e.attr.st_atime = xinode->atime; - e.attr.st_mtime = xinode->mtime; - e.attr.st_ctime = xinode->ctime; - e.generation = 1; - - if (fip->mode == S_IFDIR) - { - fuse_reply_entry(fip->req, &e); - } - else - { - xinode->nopen++; - fuse_reply_create(fip->req, &e, fip->fi); - } + memset(&e, 0, sizeof(struct fuse_entry_param)); + + e.ino = xinode->inode; + e.attr_timeout = XFUSE_ATTR_TIMEOUT; + e.entry_timeout = XFUSE_ENTRY_TIMEOUT; + e.attr.st_ino = xinode->inode; + e.attr.st_mode = xinode->mode; + e.attr.st_nlink = xinode->nlink; + e.attr.st_uid = xinode->uid; + e.attr.st_gid = xinode->gid; + e.attr.st_size = xinode->size; + e.attr.st_atime = xinode->atime; + e.attr.st_mtime = xinode->mtime; + e.attr.st_ctime = xinode->ctime; + e.generation = 1; + + if (fip->mode == S_IFDIR) + { + fuse_reply_entry(fip->req, &e); } else { - log_error("invalid reply type: %d", fip->reply_type); + xinode->nopen++; + fuse_reply_create(fip->req, &e, fip->fi); } } + else + { + log_error("invalid reply type: %d", fip->reply_type); + } done: @@ -1970,7 +1962,6 @@ static void xfuse_cb_lookup(fuse_req_t req, fuse_ino_t parent, const char *name) fuse_reply_entry(req, &e); log_debug("found entry for parent=%ld name=%s uid=%d gid=%d", parent, name, xinode->uid, xinode->gid); - return; } /** @@ -2265,7 +2256,6 @@ static void xfuse_remove_dir_or_file(fuse_req_t req, fuse_ino_t parent, fip->req = req; fip->inode = parent; - fip->invoke_fuse = 1; fip->device_id = device_id; strncpy(fip->name, name, 1024); fip->name[1023] = 0; @@ -2287,7 +2277,7 @@ static void xfuse_remove_dir_or_file(fuse_req_t req, fuse_ino_t parent, { if (devredir_rmdir_or_file((void *) fip, device_id, cptr, O_RDWR)) { - log_error("failed to send dev_redir_get_dir_listing() cmd"); + log_error("failed to send devredir_rmdir_or_file() cmd"); fuse_reply_err(req, EREMOTEIO); free(fip); return; @@ -2400,7 +2390,6 @@ static void xfuse_cb_rename(fuse_req_t req, strncpy(fip->new_name, new_name, 1024); fip->name[1023] = 0; fip->new_name[1023] = 0; - fip->invoke_fuse = 1; fip->device_id = device_id; if ((cp = strchr(new_full_path, '/')) == NULL) @@ -2501,7 +2490,6 @@ static void xfuse_create_dir_or_file(fuse_req_t req, fuse_ino_t parent, fip->req = req; fip->fi = fi; fip->inode = parent; - fip->invoke_fuse = 1; fip->device_id = device_id; fip->mode = type; fip->reply_type = RT_FUSE_REPLY_CREATE; @@ -2528,7 +2516,7 @@ static void xfuse_create_dir_or_file(fuse_req_t req, fuse_ino_t parent, if (dev_redir_file_open((void *) fip, device_id, cptr, O_CREAT, type, NULL)) { - log_error("failed to send dev_redir_get_dir_listing() cmd"); + log_error("failed to send dev_redir_file_open() cmd"); fuse_reply_err(req, EREMOTEIO); } } @@ -2595,7 +2583,6 @@ static void xfuse_cb_open(fuse_req_t req, fuse_ino_t ino, fip->req = req; fip->inode = ino; - fip->invoke_fuse = 1; fip->device_id = device_id; fip->fi = fi; @@ -2621,7 +2608,7 @@ static void xfuse_cb_open(fuse_req_t req, fuse_ino_t ino, if (dev_redir_file_open((void *) fip, device_id, cptr, fi->flags, S_IFREG, NULL)) { - log_error("failed to send dev_redir_get_dir_listing() cmd"); + log_error("failed to send dev_redir_file_open() cmd"); fuse_reply_err(req, EREMOTEIO); } } @@ -2679,7 +2666,6 @@ static void xfuse_cb_release(fuse_req_t req, fuse_ino_t ino, struct fip->req = req; fip->inode = ino; - fip->invoke_fuse = 1; fip->device_id = handle->DeviceId; fip->fi = fi; @@ -2766,7 +2752,6 @@ static void xfuse_cb_read(fuse_req_t req, fuse_ino_t ino, size_t size, } fusep->req = req; fusep->inode = ino; - fusep->invoke_fuse = 1; fusep->device_id = fh->DeviceId; fusep->fi = fi; @@ -2815,7 +2800,6 @@ static void xfuse_cb_write(fuse_req_t req, fuse_ino_t ino, const char *buf, fusep->req = req; fusep->inode = ino; - fusep->invoke_fuse = 1; fusep->device_id = fh->DeviceId; fusep->fi = fi; @@ -3006,22 +2990,6 @@ static int xfuse_proc_opendir_req(fuse_req_t req, fuse_ino_t ino, goto done; /* enumerate resources on a remote device */ - -#ifdef USE_SYNC_FLAG - if (xinode->is_synced) - { - xfuse_enum_dir(req, ino, size, off, fi); - g_free(fifo_remove(&g_fifo_opendir)); - return -1; - } - else - { - goto do_remote_lookup; - } - -do_remote_lookup: -#endif - xfuse_mark_as_stale(ino); log_debug("did not find entry; redirecting call to dev_redir"); @@ -3041,12 +3009,8 @@ do_remote_lookup: fip->req = req; fip->inode = ino; fip->size = 0; - fip->off = 0; fip->fi = fi; - fip->dirbuf1.first_time = 1; - fip->dirbuf1.bytes_in_buf = 0; - fip->invoke_fuse = 1; fip->device_id = device_id; /* we want path minus 'root node of the share' */ |