Matteo Cafasso
2016-Mar-30 19:18 UTC
[Libguestfs] [PATCH 0/3] rename icat API into download_inode
The command name is a bit confusing because it's similar to "cat" but act as "donwload". Therefore I am renaming it with a more clear name. At the same go I cleaned up a bit the code following the standards and improved the API documentation. This patch is ready for review. Code available at: https://github.com/noxdafox/libguestfs/tree/download_inode Matteo Cafasso (3): Rename icat command in download_inode Improve download_inode documentation string. Code cleanup in daemon/sleuthkit.c daemon/sleuthkit.c | 50 ++++++++++++++++++++----------------- generator/actions.ml | 10 +++++--- tests/tsk/Makefile.am | 2 +- tests/tsk/test-download-inode.sh | 53 ++++++++++++++++++++++++++++++++++++++++ tests/tsk/test-icat.sh | 53 ---------------------------------------- 5 files changed, 88 insertions(+), 80 deletions(-) create mode 100755 tests/tsk/test-download-inode.sh delete mode 100755 tests/tsk/test-icat.sh -- 2.8.0.rc3
Matteo Cafasso
2016-Mar-30 19:18 UTC
[Libguestfs] [PATCH 1/3] Rename icat command in download_inode
The "icat" name comes from the employed command line tool which might be replaced at any time with a different implementation. The command name is a bit confusing because it's similar to "cat" but act as "donwload". download_inode is more clear and descriptive. Signed-off-by: Matteo Cafasso <noxdafox@gmail.com> --- daemon/sleuthkit.c | 2 +- generator/actions.ml | 2 +- tests/tsk/Makefile.am | 2 +- tests/tsk/test-download-inode.sh | 53 ++++++++++++++++++++++++++++++++++++++++ tests/tsk/test-icat.sh | 53 ---------------------------------------- 5 files changed, 56 insertions(+), 56 deletions(-) create mode 100755 tests/tsk/test-download-inode.sh delete mode 100755 tests/tsk/test-icat.sh diff --git a/daemon/sleuthkit.c b/daemon/sleuthkit.c index 0fe1250..2f8c97b 100644 --- a/daemon/sleuthkit.c +++ b/daemon/sleuthkit.c @@ -40,7 +40,7 @@ optgroup_sleuthkit_available (void) } int -do_icat (const mountable_t *mountable, int64_t inode) +do_download_inode (const mountable_t *mountable, int64_t inode) { CLEANUP_FREE char *cmd = NULL; diff --git a/generator/actions.ml b/generator/actions.ml index ff72cfe..e5cb939 100644 --- a/generator/actions.ml +++ b/generator/actions.ml @@ -12946,7 +12946,7 @@ The filesystem from which to extract the file must be unmounted, otherwise the call will fail." }; { defaults with - name = "icat"; added = (1, 33, 14); + name = "download_inode"; added = (1, 33, 14); style = RErr, [Mountable "device"; Int64 "inode"; FileOut "filename"], []; proc_nr = Some 464; optional = Some "sleuthkit"; diff --git a/tests/tsk/Makefile.am b/tests/tsk/Makefile.am index e060e58..0cd7c03 100644 --- a/tests/tsk/Makefile.am +++ b/tests/tsk/Makefile.am @@ -18,7 +18,7 @@ include $(top_srcdir)/subdir-rules.mk TESTS = \ - test-icat.sh + test-download-inode.sh TESTS_ENVIRONMENT = $(top_builddir)/run --test diff --git a/tests/tsk/test-download-inode.sh b/tests/tsk/test-download-inode.sh new file mode 100755 index 0000000..9c65aa9 --- /dev/null +++ b/tests/tsk/test-download-inode.sh @@ -0,0 +1,53 @@ +#!/bin/bash - +# libguestfs +# Copyright (C) 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. + +# Test the download_inode command. + +set -e + +if [ -n "$SKIP_TEST_DOWNLOAD_INODE_SH" ]; then + echo "$0: test skipped because environment variable is set." + exit 77 +fi + +rm -f test-mft.bin + +# Skip if TSK is not supported by the appliance. +if ! guestfish add /dev/null : run : available "sleuthkit"; then + echo "$0: skipped because TSK is not available in the appliance" + exit 77 +fi + +if [ ! -s ../../test-data/phony-guests/windows.img ]; then + echo "$0: skipped because windows.img is zero-sized" + exit 77 +fi + +# download Master File Table ($MFT). +guestfish --ro -a ../../test-data/phony-guests/windows.img <<EOF +run +download-inode /dev/sda2 0 test-mft.bin +EOF + +# test extracted file is the Master File Table +if [ `head -c 5 test-mft.bin` != "FILE0" ]; then + echo "$0: wrong file extracted." + exit 1 +fi + +rm -f test-mft.bin diff --git a/tests/tsk/test-icat.sh b/tests/tsk/test-icat.sh deleted file mode 100755 index 3b0fca4..0000000 --- a/tests/tsk/test-icat.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash - -# libguestfs -# Copyright (C) 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. - -# Test the icat command. - -set -e - -if [ -n "$SKIP_TEST_ICAT_SH" ]; then - echo "$0: test skipped because environment variable is set." - exit 77 -fi - -rm -f test-mft.bin - -# Skip if TSK is not supported by the appliance. -if ! guestfish add /dev/null : run : available "sleuthkit"; then - echo "$0: skipped because TSK is not available in the appliance" - exit 77 -fi - -if [ ! -s ../../test-data/phony-guests/windows.img ]; then - echo "$0: skipped because windows.img is zero-sized" - exit 77 -fi - -# download Master File Table ($MFT). -guestfish --ro -a ../../test-data/phony-guests/windows.img <<EOF -run -icat /dev/sda2 0 test-mft.bin -EOF - -# test extracted file is the Master File Table -if [ `head -c 5 test-mft.bin` != "FILE0" ]; then - echo "$0: wrong file extracted." - exit 1 -fi - -rm -f test-mft.bin -- 2.8.0.rc3
Matteo Cafasso
2016-Mar-30 19:18 UTC
[Libguestfs] [PATCH 2/3] Improve download_inode documentation string.
The download_inode does not require the disk to be mounted in order to work. Signed-off-by: Matteo Cafasso <noxdafox@gmail.com> --- generator/actions.ml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/generator/actions.ml b/generator/actions.ml index e5cb939..0eb11fe 100644 --- a/generator/actions.ml +++ b/generator/actions.ml @@ -12953,10 +12953,12 @@ otherwise the call will fail." }; 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. +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." }; +It is not required to mount the disk to run this command. + +The command is capable of downloading deleted or inaccessible files." }; ] -- 2.8.0.rc3
Matteo Cafasso
2016-Mar-30 19:18 UTC
[Libguestfs] [PATCH 3/3] Code cleanup in daemon/sleuthkit.c
Adhere to coding standards. Signed-off-by: Matteo Cafasso <noxdafox@gmail.com> --- daemon/sleuthkit.c | 48 +++++++++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/daemon/sleuthkit.c b/daemon/sleuthkit.c index 2f8c97b..1262b68 100644 --- a/daemon/sleuthkit.c +++ b/daemon/sleuthkit.c @@ -29,19 +29,14 @@ #include "actions.h" #include "optgroups.h" -static int file_out (const char *cmd); +static int send_command_output (const char *cmd); -GUESTFSD_EXT_CMD(str_sleuthkit_probe, icat); - -int -optgroup_sleuthkit_available (void) -{ - return prog_exists (str_sleuthkit_probe); -} +GUESTFSD_EXT_CMD(str_icat, icat); int do_download_inode (const mountable_t *mountable, int64_t inode) { + int ret; CLEANUP_FREE char *cmd = NULL; /* Inode must be greater than 0 */ @@ -51,18 +46,22 @@ do_download_inode (const mountable_t *mountable, int64_t inode) } /* Construct the command. */ - if (asprintf (&cmd, "icat -r %s %" PRIi64, mountable->device, inode) == -1) { + ret = asprintf(&cmd, "%s -r %s %" PRIi64, str_icat, mountable->device, inode); + if (ret < 0) { reply_with_perror ("asprintf"); return -1; } - return file_out (cmd); + return send_command_output (cmd); } +/* Run the given command, collect the output and send it to the appliance. + * Return 0 on success, -1 on error. + */ static int -file_out (const char *cmd) +send_command_output (const char *cmd) { - int r; + int ret; FILE *fp; CLEANUP_FREE char *buffer = NULL; @@ -81,34 +80,41 @@ file_out (const char *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. - */ + /* Send reply message before the file content. */ reply (NULL, NULL); - while ((r = fread (buffer, 1, sizeof buffer, fp)) > 0) { - if (send_file_write (buffer, r) < 0) { + while ((ret = fread (buffer, 1, sizeof buffer, fp)) > 0) { + ret = send_file_write (buffer, ret); + if (ret < 0) { pclose (fp); return -1; } } - if (ferror (fp)) { + ret = ferror (fp); + if (ret != 0) { fprintf (stderr, "fread: %m"); send_file_end (1); /* Cancel. */ pclose (fp); return -1; } - if (pclose (fp) != 0) { + ret = pclose (fp); + if (ret != 0) { fprintf (stderr, "pclose: %m"); send_file_end (1); /* Cancel. */ return -1; } - if (send_file_end (0)) /* Normal end of file. */ + ret = send_file_end (0); /* Normal end of file. */ + if (ret != 0) return -1; return 0; } + +int +optgroup_sleuthkit_available (void) +{ + return prog_exists (str_icat); +} -- 2.8.0.rc3
Pino Toscano
2016-Mar-31 08:58 UTC
Re: [Libguestfs] [PATCH 1/3] Rename icat command in download_inode
On Wednesday 30 March 2016 22:18:08 Matteo Cafasso wrote:> The "icat" name comes from the employed command line tool which might be > replaced at any time with a different implementation. > > The command name is a bit confusing because it's similar to "cat" but > act as "donwload".small typo..^> download_inode is more clear and descriptive. > > Signed-off-by: Matteo Cafasso <noxdafox@gmail.com> > ---LGTM -- fixed the typo in the commit message directly while applying it. Thanks, -- Pino Toscano
Maybe Matching Threads
- [PATCH 0/2] rename icat API as download_inode
- [PATCH 0/3] added The Sleuth Kit and icat API for downloading inaccessible files
- [PATCH v2 0/2] Added download_blocks API
- [PATCH 0/2] Added download_blocks API
- [PATCH 0/2] added icat and fls0 APIs for deleted files recovery