[Libguestfs] [PATCH v5 1/6] filesystem_walk: fixed root inode listing

Pino Toscano ptoscano at redhat.com
Fri Sep 16 13:26:17 UTC 2016


On Thursday, 15 September 2016 23:16:39 CEST Matteo Cafasso wrote:
> With the current implementation, the root inode of the given partition
> is ignored.
> 
> The root inode is now reported. Its name will be a single dot '.'
> reproducing the TSK API.
> 
> Signed-off-by: Matteo Cafasso <noxdafox at gmail.com>
> ---
>  daemon/tsk.c         | 22 +++++++++++++++++++---
>  generator/actions.ml |  5 ++---
>  2 files changed, 21 insertions(+), 6 deletions(-)
> 
> diff --git a/daemon/tsk.c b/daemon/tsk.c
> index dd368d7..9884472 100644
> --- a/daemon/tsk.c
> +++ b/daemon/tsk.c
> @@ -49,6 +49,7 @@ 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 *);

Minor coding style here ...

>  int
>  do_internal_filesystem_walk (const mountable_t *mountable)
> @@ -113,9 +114,7 @@ fswalk_callback (TSK_FS_FILE *fsfile, const char *path, void *data)
>    CLEANUP_FREE char *fname = NULL;
>    struct guestfs_int_tsk_dirent dirent;
>  
> -  /* Ignore ./ and ../ */
> -  ret = TSK_FS_ISDOT (fsfile->name->name);
> -  if (ret != 0)
> +  if (entry_is_dot (fsfile))
>      return TSK_WALK_CONT;
>  
>    /* Build the full relative path of the entry */
> @@ -271,6 +270,23 @@ reply_with_tsk_error (const char *funcname)
>      reply_with_error ("%s: unknown error", funcname);
>  }
>  
> +/* Check whether the entry is dot and is not Root.
> + * Return 1 if it is dot, 0 otherwise or if it is the Root entry.
> + */
> +static int
> +entry_is_dot (TSK_FS_FILE *fsfile)
> +{
> +  if (TSK_FS_ISDOT (fsfile->name->name)) {
> +    if (fsfile->fs_info->root_inum == fsfile->name->meta_addr &&  /* Root */
> +        STREQ(fsfile->name->name, "."))  /* Avoid '..' 'bin/..' 'etc/..' */

... and here too.

Note that, theoretically, you could join all the conditions in a single
one, as "if" is short-circuited:

  return (TSK_FS_ISDOT (fsfile->name->name) &&
          !(fsfile->fs_info->root_inum == fsfile->name->meta_addr &&  /* Root */
           STREQ(fsfile->name->name, "."))  /* Avoid '..' 'bin/..' 'etc/..' */

LGTM otherwise.

Thanks,
-- 
Pino Toscano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://listman.redhat.com/archives/libguestfs/attachments/20160916/51d64552/attachment.sig>


More information about the Libguestfs mailing list