<html>
  <head>
    <meta content="text/html; charset=windows-1252"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    On 26/08/16 15:58, Pino Toscano wrote:<br>
    <blockquote cite="mid:2312535.Vi7x7plggs@thyrus.usersys.redhat.com"
      type="cite">
      <pre wrap="">On Friday, 26 August 2016 15:15:17 CEST noxdafox wrote:
</pre>
      <blockquote type="cite">
        <pre wrap="">On 26/08/16 14:15, Pino Toscano wrote:
</pre>
        <blockquote type="cite">
          <pre wrap="">On Thursday, 25 August 2016 23:53:51 CEST Matteo Cafasso wrote:
</pre>
          <blockquote type="cite">
            <pre wrap="">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 <a class="moz-txt-link-rfc2396E" href="mailto:noxdafox@gmail.com"><noxdafox@gmail.com></a>
---
  daemon/tsk.c | 17 ++++++++++++++---
  1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/daemon/tsk.c b/daemon/tsk.c
index dd368d7..6e6df6d 100644
--- a/daemon/tsk.c
+++ b/daemon/tsk.c
@@ -48,6 +48,7 @@ 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 int entry_is_dot(TSK_FS_FILE *);
  static void reply_with_tsk_error (const char *);
</pre>
          </blockquote>
          <pre wrap="">Since in patch #2 this forward declaration is moved, put it at the
right place already in this patch.

</pre>
          <blockquote type="cite">
            <pre wrap="">  int
@@ -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;
</pre>
          </blockquote>
          <pre wrap="">Nitpick: add a space between the function name and the opening round
bracket.

</pre>
          <blockquote type="cite">
            <pre wrap="">    /* Build the full relative path of the entry */
@@ -271,6 +270,18 @@ reply_with_tsk_error (const char *funcname)
      reply_with_error ("%s: unknown error", funcname);
  }
  
+/* Check whether the entry is dot and is not Root. */
+static int
+entry_is_dot(TSK_FS_FILE *fsfile)
</pre>
          </blockquote>
          <pre wrap="">Ditto.

</pre>
          <blockquote type="cite">
            <pre wrap="">+{
+  if (TSK_FS_ISDOT (fsfile->name->name))
+    if (fsfile->fs_info->root_inum != fsfile->name->meta_addr ||
+        strcmp (fsfile->name->name, "."))
</pre>
          </blockquote>
          <pre wrap="">Simply merge the two if's into a single if (A && B) condition?
Also, the strcmp is already done by TSK_FS_ISDOT, isn't it?
So this should be like:

   if (TSK_FS_ISDOT (fsfile->name->name)
       && (fsfile->fs_info->root_inum != fsfile->name->meta_addr))
</pre>
        </blockquote>
        <pre wrap="">It's a bit more complicated, that's why I preferred to keep the two if 
statements separated.
</pre>
      </blockquote>
      <pre wrap="">
Most probably I expressed myself in an unclear way:

* TSK_FS_ISDOT (foo) returns truen when foo is "." or ".."

* strcmp (foo, ".") -- btw, please use STREQ/STRNEQ -- returns true
  when foo is not "."</pre>
    </blockquote>
    Didn't know about STREQ, it indeed makes the code more readable. <br>
    <br>
    The logic was:<br>
    <br>
    if IS_DOT<br>
    . if (IS_NOT_ROOT or IS_NOT_SINGLE_DOT) <br>
    .. SKIP_THE_ENTRY<br>
    else<br>
    . PARSE_THE_ENTRY<br>
    <br>
    I changed it in something more readable:<br>
    <br>
    if IS_DOT<br>
    . if (IS_ROOT and IS_SINGLE_DOT)<br>
    .. PARSE_THE_ENTRY<br>
    . else<br>
    .. SKIP_THE_ENTRY<br>
    else<br>
    . PARSE_THE_ENTRY<br>
    <blockquote cite="mid:2312535.Vi7x7plggs@thyrus.usersys.redhat.com"
      type="cite">
      <pre wrap="">

</pre>
      <blockquote type="cite">
        <pre wrap="">TSK_FS_ISDOT returns whether the string is either '.' or '..'.
Yet we want to return Root so we check if that's the case.
</pre>
      </blockquote>
      <pre wrap="">
OK.

</pre>
      <blockquote type="cite">
        <pre wrap="">Problem is that we'd return multiple entries for Root because:
.
..
etc/..
bin/..
</pre>
      </blockquote>
      <pre wrap="">
fsfile->name->name is a filename only, isn't it?</pre>
    </blockquote>
    Yes, the callback returns the fsfile struct and the path in two
    separate parameters.<br>
    <blockquote cite="mid:2312535.Vi7x7plggs@thyrus.usersys.redhat.com"
      type="cite">
      <pre wrap="">

</pre>
      <blockquote type="cite">
        <pre wrap="">Are all matching the statement:

fsfile->fs_info->root_inum != fsfile->name->meta_addr
</pre>
      </blockquote>
      <pre wrap="">
I don't understand this: if the statement will match all the dot and
dot-dot entries, why is it checked at all?
Or it will be valid for all the dot and dot-dot inodes different than
the ones in the root, right?
</pre>
    </blockquote>
    As I explained in the last patch series, the callback will be called
    for every entry.<br>
    <br>
    <pre wrap="">. <-- the Root entry
etc/.
etc/.. <-- again the Root entry
etc/systemd/.
etc/systemd/..
bin/.
bin/.. <-- again the Root entry

</pre>
    Therefore we need to make sure we return the Root entry only once.<br>
    <blockquote cite="mid:2312535.Vi7x7plggs@thyrus.usersys.redhat.com"
      type="cite">
      <pre wrap="">
</pre>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
Libguestfs mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Libguestfs@redhat.com">Libguestfs@redhat.com</a>
<a class="moz-txt-link-freetext" href="https://www.redhat.com/mailman/listinfo/libguestfs">https://www.redhat.com/mailman/listinfo/libguestfs</a></pre>
    </blockquote>
    <br>
  </body>
</html>