[Libguestfs] [PATCH 1/2] added icat and fls0 APIs

Matteo Cafasso noxdafox at gmail.com
Sun Mar 6 15:42:25 UTC 2016


Signed-off-by: Matteo Cafasso <noxdafox at gmail.com>
---
 appliance/packagelist.in |   3 ++
 daemon/Makefile.am       |   1 +
 daemon/tsk.c             | 122 +++++++++++++++++++++++++++++++++++++++++++++++
 generator/actions.ml     |  33 +++++++++++++
 po/POTFILES              |   1 +
 src/MAX_PROC_NR          |   2 +-
 6 files changed, 161 insertions(+), 1 deletion(-)
 create mode 100644 daemon/tsk.c

diff --git a/appliance/packagelist.in b/appliance/packagelist.in
index aa5e07e..0951417 100644
--- a/appliance/packagelist.in
+++ b/appliance/packagelist.in
@@ -46,6 +46,7 @@ ifelse(REDHAT,1,
   pcre
   reiserfs-utils
   libselinux
+  sleuthkit
   syslinux-extlinux
   systemd              dnl for /sbin/reboot and udevd
   vim-minimal
@@ -89,6 +90,7 @@ dnl iproute has been renamed to iproute2
   ntfs-3g
   openssh-client
   reiserfsprogs
+  sleuthkit
   sysvinit                  dnl for /sbin/reboot
   systemd                   dnl alternative for /sbin/reboot
   ufsutils
@@ -120,6 +122,7 @@ ifelse(ARCHLINUX,1,
   ntfs-3g
   pcre
   reiserfsprogs
+  sleuthkit
   systemd
   vim
   xz
diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index caba83e..4e2051b 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -179,6 +179,7 @@ guestfsd_SOURCES = \
 	syslinux.c \
 	tar.c \
 	truncate.c \
+	tsk.c \
 	umask.c \
 	upload.c \
 	utimens.c \
diff --git a/daemon/tsk.c b/daemon/tsk.c
new file mode 100644
index 0000000..8cc35eb
--- /dev/null
+++ b/daemon/tsk.c
@@ -0,0 +1,122 @@
+/* libguestfs - the guestfsd daemon
+ * Copyright (C) 2009-2016 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <inttypes.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "guestfs_protocol.h"
+#include "daemon.h"
+#include "actions.h"
+#include "optgroups.h"
+
+static int file_out (const char *cmd);
+
+GUESTFSD_EXT_CMD(str_tsk_probe, icat);
+
+int
+optgroup_icat_available (void)
+{
+  return prog_exists (str_tsk_probe);
+}
+
+int
+do_icat (const mountable_t *mountable, int64_t inode)
+{
+  CLEANUP_FREE char *cmd = NULL;
+
+  /* Inode must be greater than 0 */
+  if (inode < 0) {
+    reply_with_error ("inode must be >= 0");
+    return -1;
+  }
+
+  /* Construct the command. */
+  if (asprintf (&cmd, "icat -r %s %" PRIi64, mountable->device, inode) == -1) {
+    reply_with_perror ("asprintf");
+    return -1;
+  }
+
+  return file_out (cmd);
+}
+
+int
+do_fls0 (const mountable_t *mountable)
+{
+  CLEANUP_FREE char *cmd = NULL;
+
+  /* Construct the command. */
+  if (asprintf (&cmd, "fls -pr %s", mountable->device) == -1) {
+    reply_with_perror ("asprintf");
+    return -1;
+  }
+
+  return file_out (cmd);
+}
+
+static int
+file_out (const char *cmd)
+{
+  int r;
+  FILE *fp;
+  char buffer[GUESTFS_MAX_CHUNK_SIZE];
+
+  if (verbose)
+    fprintf (stderr, "%s\n", cmd);
+
+  fp = popen (cmd, "r");
+  if (fp == NULL) {
+    reply_with_perror ("%s", cmd);
+    return -1;
+  }
+
+  /* Now we must send the reply message, before the file contents.  After
+   * this there is no opportunity in the protocol to send any error
+   * message back.  Instead we can only cancel the transfer.
+   */
+  reply (NULL, NULL);
+
+  while ((r = fread (buffer, 1, sizeof buffer, fp)) > 0) {
+    if (send_file_write (buffer, r) < 0) {
+      pclose (fp);
+      return -1;
+    }
+  }
+
+  if (ferror (fp)) {
+    fprintf (stderr, "fread: %m");
+    send_file_end (1);		/* Cancel. */
+    pclose (fp);
+    return -1;
+  }
+
+  if (pclose (fp) != 0) {
+    fprintf (stderr, "pclose: %m");
+    send_file_end (1);		/* Cancel. */
+    return -1;
+  }
+
+  if (send_file_end (0))	/* Normal end of file. */
+    return -1;
+
+  return 0;
+}
diff --git a/generator/actions.ml b/generator/actions.ml
index 287d7f5..ff6aa3f 100644
--- a/generator/actions.ml
+++ b/generator/actions.ml
@@ -12919,6 +12919,39 @@ within the C<$Extend> folder.
 The filesystem from which to extract the file must be unmounted,
 otherwise the call will fail." };

+  { defaults with
+    name = "icat"; added = (1, 33, 14);
+    style = RErr, [Mountable "device"; Int64 "inode"; FileOut "filename"], [];
+    proc_nr = Some 464;
+    optional = Some "icat";
+    progress = true; cancellable = true;
+    shortdesc = "download a file to the local machine given its inode";
+    longdesc = "\
+Download a file given its inode from the disk partition (eg. F</dev/sda1>)
+and save it as F<filename> on the local machine.
+
+This allows to download deleted or inaccessible files." };
+
+  { defaults with
+    name = "fls0"; added = (1, 33, 14);
+    style = RErr, [Mountable "device"; FileOut "filename"], [];
+    proc_nr = Some 465;
+    optional = Some "icat";
+    progress = true; cancellable = true;
+    shortdesc = "list the content of the disk";
+    longdesc = "\
+This specialized command is used to get a listing of
+the content of the disk partition (eg. F</dev/sda1>).
+The list of filenames is written to the local file F<filenames> (on the host).
+
+The command can display hidden or deleted files.
+
+The output information contains the file type, the metadata address
+and the full path of the file.
+
+If the file was deleted, an asterisk will be shown between the file type
+and the metadata address." };
+
 ]

 (* Non-API meta-commands available only in guestfish.
diff --git a/po/POTFILES b/po/POTFILES
index 0fb99b0..4fbc551 100644
--- a/po/POTFILES
+++ b/po/POTFILES
@@ -108,6 +108,7 @@ daemon/sync.c
 daemon/syslinux.c
 daemon/tar.c
 daemon/truncate.c
+daemon/tsk.c
 daemon/umask.c
 daemon/upload.c
 daemon/utimens.c
diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR
index 26551cf..073c57b 100644
--- a/src/MAX_PROC_NR
+++ b/src/MAX_PROC_NR
@@ -1 +1 @@
-463
+465
--
2.7.0




More information about the Libguestfs mailing list