Refactor logic in preparation for new APIs. Signed-off-by: Matteo Cafasso <noxda...@gmail.com> --- daemon/tsk.c | 87 ++++++++++++++++++++++++++++++------------------------------ 1 file changed, 43 insertions(+), 44 deletions(-)
diff --git a/daemon/tsk.c b/daemon/tsk.c index 22ca483..e5669da 100644 --- a/daemon/tsk.c +++ b/daemon/tsk.c @@ -44,10 +44,10 @@ enum tsk_dirent_flags { static int open_filesystem (const char *, TSK_IMG_INFO **, TSK_FS_INFO **); static TSK_WALK_RET_ENUM fswalk_callback (TSK_FS_FILE *, const char *, void *); +static int send_dirent_info (TSK_FS_FILE *, const char *); static char file_type (TSK_FS_FILE *); static int file_flags (TSK_FS_FILE *fsfile); static void file_metadata (TSK_FS_META *, guestfs_int_tsk_dirent *); -static int send_dirent_info (guestfs_int_tsk_dirent *); static void reply_with_tsk_error (const char *); static int entry_is_dot (TSK_FS_FILE *); @@ -104,29 +104,44 @@ open_filesystem (const char *device, TSK_IMG_INFO **img, TSK_FS_INFO **fs) } /* Filesystem walk callback, it gets called on every FS node. - * Parse the node, encode it into an XDR structure and send it to the appliance. + * Parse the node, encode it into an XDR structure and send it to the library. * Return TSK_WALK_CONT on success, TSK_WALK_ERROR on error. */ static TSK_WALK_RET_ENUM fswalk_callback (TSK_FS_FILE *fsfile, const char *path, void *data) { int ret = 0; - CLEANUP_FREE char *fname = NULL; - struct guestfs_int_tsk_dirent dirent; if (entry_is_dot (fsfile)) return TSK_WALK_CONT; + ret = send_dirent_info (fsfile, path); + + return (ret == 0) ? TSK_WALK_CONT : TSK_WALK_ERROR; +} + +/* Extract the information from the entry, serialize and send it out. + * Return 0 on success, -1 on error. + */ +static int +send_dirent_info (TSK_FS_FILE *fsfile, const char *path) +{ + XDR xdr; + int ret = 0; + size_t len = 0; + struct guestfs_int_tsk_dirent dirent; + CLEANUP_FREE char *buf = NULL, *fname = NULL; + + /* Set dirent fields */ + memset (&dirent, 0, sizeof dirent); + /* Build the full relative path of the entry */ ret = asprintf (&fname, "%s%s", path, fsfile->name->name); if (ret < 0) { perror ("asprintf"); - return TSK_WALK_ERROR; + return -1; } - /* Set dirent fields */ - memset (&dirent, 0, sizeof dirent); - dirent.tsk_inode = fsfile->name->meta_addr; dirent.tsk_type = file_type (fsfile); dirent.tsk_name = fname; @@ -134,10 +149,27 @@ fswalk_callback (TSK_FS_FILE *fsfile, const char *path, void *data) file_metadata (fsfile->meta, &dirent); - ret = send_dirent_info (&dirent); - ret = (ret == 0) ? TSK_WALK_CONT : TSK_WALK_ERROR; + /* Serialize tsk_dirent struct. */ + buf = malloc (GUESTFS_MAX_CHUNK_SIZE); + if (buf == NULL) { + perror ("malloc"); + return -1; + } - return ret; + xdrmem_create (&xdr, buf, GUESTFS_MAX_CHUNK_SIZE, XDR_ENCODE); + + ret = xdr_guestfs_int_tsk_dirent (&xdr, &dirent); + if (ret == 0) { + perror ("xdr_guestfs_int_tsk_dirent"); + return -1; + } + + len = xdr_getpos (&xdr); + + xdr_destroy (&xdr); + + /* Send serialised tsk_dirent out. */ + return send_file_write (buf, len); } /* Inspect fsfile to identify its type. */ @@ -221,39 +253,6 @@ file_metadata (TSK_FS_META *fsmeta, guestfs_int_tsk_dirent *dirent) } } -/* Serialise dirent into XDR stream and send it to the appliance. - * Return 0 on success, -1 on error. - */ -static int -send_dirent_info (guestfs_int_tsk_dirent *dirent) -{ - XDR xdr; - int ret = 0; - size_t len = 0; - CLEANUP_FREE char *buf = NULL; - - buf = malloc (GUESTFS_MAX_CHUNK_SIZE); - if (buf == NULL) { - perror ("malloc"); - return -1; - } - - /* Serialise tsk_dirent struct. */ - xdrmem_create (&xdr, buf, GUESTFS_MAX_CHUNK_SIZE, XDR_ENCODE); - - ret = xdr_guestfs_int_tsk_dirent (&xdr, dirent); - if (ret == 0) { - perror ("xdr_guestfs_int_tsk_dirent"); - return -1; - } - len = xdr_getpos (&xdr); - - xdr_destroy (&xdr); - - /* Send serialised tsk_dirent out. */ - return send_file_write (buf, len); -} - /* Parse TSK error and send it to the appliance. */ static void reply_with_tsk_error (const char *funcname) -- 2.9.3 _______________________________________________ Libguestfs mailing list Libguestfs@redhat.com https://www.redhat.com/mailman/listinfo/libguestfs