On 22/02/16 17:26, Richard W.M. Jones wrote:> On Sun, Feb 21, 2016 at 11:22:23PM +0200, Matteo Cafasso wrote: >> Adding ntfscat_i command for downloading files based on their inode number. >> >> This allows the dowload of files unaccessible otherwise from a NTFS guest disk image. > The patch seems fine, but it really needs a test otherwise this > feature could silently break.I was thinking the same but I stumbled over an issue which prevented me from running the tests. I'm not sure this is the right place where to discuss the problem but here's few lines about it. make blank-disk.img blank-part.img blank-fs.img blank-bootroot.img blank-bootrootlv.img debian.img fedora.img fedora-md1.img fedora-md2.img fedora-btrfs.img ubuntu.img archlinux.img coreos.img windows.img guests-all-good.xml make[3]: Entering directory '/home/noxdafox/development/libguestfs/test-data/phony-guests' make[3]: 'blank-disk.img' is up to date. make[3]: 'blank-part.img' is up to date. make[3]: 'blank-fs.img' is up to date. make[3]: 'blank-bootroot.img' is up to date. make[3]: 'blank-bootrootlv.img' is up to date. make[3]: 'debian.img' is up to date. rm -f fedora-name.db fedora-name.db-t no fedora-name.db-t < fedora-name.db.txt /bin/bash: no: command not found Makefile:1793: recipe for target 'fedora-name.db' failed make[3]: *** [fedora-name.db] Error 127 Searching around it seems some dependency is missing but ./configure is not helping me to find which one.> > Have a look at the tests/ntfsclone/ subdirectory for the general idea.This was also another issue, I was not sure ntfs was supported by the test suite and I didn't find any documentation about it. I'll take a look at these ones.> > One problem with writing the test (indeed, with the general idea) is > how do you discover which inode numbers can be downloaded? Does NTFS > have some standard inode numbers for things like the MFT?The $MFT file has alway 0 as index number.> > Rich. > >> --- >> daemon/ntfs.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++ >> generator/actions.ml | 15 +++++++++++++ >> 2 files changed, 77 insertions(+) >> >> diff --git a/daemon/ntfs.c b/daemon/ntfs.c >> index 568899e..58f62fa 100644 >> --- a/daemon/ntfs.c >> +++ b/daemon/ntfs.c >> @@ -266,3 +266,65 @@ do_ntfsfix (const char *device, int clearbadsectors) >> >> return 0; >> } >> + >> +int >> +do_ntfscat_i (const mountable_t *mountable, int64_t inode) >> +{ >> + int r; >> + FILE *fp; >> + CLEANUP_FREE char *cmd = NULL; >> + char buffer[GUESTFS_MAX_CHUNK_SIZE]; >> + >> + /* Inode must be greater than 0 */ >> + if (inode < 0) { >> + reply_with_error("Inode must be greater than 0"); >> + return -1; >> + } >> + >> + /* Construct the command. */ >> + if (asprintf_nowarn (&cmd, "ntfscat -i %ld %s", >> + inode, mountable->device) == -1) { >> + reply_with_perror ("asprintf"); >> + return -1; >> + } >> + >> + 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: %ld: %m\n", inode); >> + send_file_end (1); /* Cancel. */ >> + pclose (fp); >> + return -1; >> + } >> + >> + if (pclose (fp) != 0) { >> + fprintf (stderr, "pclose: %ld: %m\n", inode); >> + 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 eb45392..18418aa 100644 >> --- a/generator/actions.ml >> +++ b/generator/actions.ml >> @@ -12891,6 +12891,21 @@ This is equivalent to C<sgdisk -e>. >> >> See also L<sgdisk(8)>." }; >> >> + { defaults with >> + name = "ntfscat_i"; added = (1, 33, 12); >> + style = RErr, [Mountable "device"; Int64 "inode"; FileOut "filename"], []; >> + proc_nr = Some 463; >> + progress = true; cancellable = true; >> + shortdesc = "download a file to the local machine given its inode"; >> + longdesc = "\ >> +Download a file given its inode from a NTFS filesystem and save it as F<filename> >> +on the local machine. >> + >> +This allows to download some otherwise unaccessible files such as the ones >> +within the $Extend folder. >> + >> +F<filename> can also be a named pipe." }; >> + >> ] >> >> (* Non-API meta-commands available only in guestfish. >> -- >> 2.7.0
On Mon, Feb 22, 2016 at 07:23:45PM +0200, noxdafox wrote:> On 22/02/16 17:26, Richard W.M. Jones wrote: > >On Sun, Feb 21, 2016 at 11:22:23PM +0200, Matteo Cafasso wrote: > >>Adding ntfscat_i command for downloading files based on their inode number. > >> > >>This allows the dowload of files unaccessible otherwise from a NTFS guest disk image. > >The patch seems fine, but it really needs a test otherwise this > >feature could silently break. > I was thinking the same but I stumbled over an issue which prevented > me from running the tests. > I'm not sure this is the right place where to discuss the problem > but here's few lines about it. > > make blank-disk.img blank-part.img blank-fs.img blank-bootroot.img > blank-bootrootlv.img debian.img fedora.img fedora-md1.img > fedora-md2.img fedora-btrfs.img ubuntu.img archlinux.img coreos.img > windows.img guests-all-good.xml > make[3]: Entering directory > '/home/noxdafox/development/libguestfs/test-data/phony-guests' > make[3]: 'blank-disk.img' is up to date. > make[3]: 'blank-part.img' is up to date. > make[3]: 'blank-fs.img' is up to date. > make[3]: 'blank-bootroot.img' is up to date. > make[3]: 'blank-bootrootlv.img' is up to date. > make[3]: 'debian.img' is up to date. > rm -f fedora-name.db fedora-name.db-t > no fedora-name.db-t < fedora-name.db.txt > /bin/bash: no: command not foundWhat happens here is it's trying to run ``$(DB_LOAD) fedora-name.db-t'' but the db_load program wasn't found by your configure. I think you need to install whatever is the db4-utils (Berkeley DB 4) on your OS. Alternately you can grab the pre-built databases from a recent tarball, since we distribute this stuff in the tarball so it doesn't need to be rebuilt for most end users. Rich.> Makefile:1793: recipe for target 'fedora-name.db' failed > make[3]: *** [fedora-name.db] Error 127 > > Searching around it seems some dependency is missing but ./configure > is not helping me to find which one. > > > > >Have a look at the tests/ntfsclone/ subdirectory for the general idea. > This was also another issue, I was not sure ntfs was supported by > the test suite and I didn't find any documentation about it. I'll > take a look at these ones. > > > >One problem with writing the test (indeed, with the general idea) is > >how do you discover which inode numbers can be downloaded? Does NTFS > >have some standard inode numbers for things like the MFT? > The $MFT file has alway 0 as index number. > > > >Rich. > > > >>--- > >> daemon/ntfs.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++ > >> generator/actions.ml | 15 +++++++++++++ > >> 2 files changed, 77 insertions(+) > >> > >>diff --git a/daemon/ntfs.c b/daemon/ntfs.c > >>index 568899e..58f62fa 100644 > >>--- a/daemon/ntfs.c > >>+++ b/daemon/ntfs.c > >>@@ -266,3 +266,65 @@ do_ntfsfix (const char *device, int clearbadsectors) > >> > >> return 0; > >> } > >>+ > >>+int > >>+do_ntfscat_i (const mountable_t *mountable, int64_t inode) > >>+{ > >>+ int r; > >>+ FILE *fp; > >>+ CLEANUP_FREE char *cmd = NULL; > >>+ char buffer[GUESTFS_MAX_CHUNK_SIZE]; > >>+ > >>+ /* Inode must be greater than 0 */ > >>+ if (inode < 0) { > >>+ reply_with_error("Inode must be greater than 0"); > >>+ return -1; > >>+ } > >>+ > >>+ /* Construct the command. */ > >>+ if (asprintf_nowarn (&cmd, "ntfscat -i %ld %s", > >>+ inode, mountable->device) == -1) { > >>+ reply_with_perror ("asprintf"); > >>+ return -1; > >>+ } > >>+ > >>+ 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: %ld: %m\n", inode); > >>+ send_file_end (1); /* Cancel. */ > >>+ pclose (fp); > >>+ return -1; > >>+ } > >>+ > >>+ if (pclose (fp) != 0) { > >>+ fprintf (stderr, "pclose: %ld: %m\n", inode); > >>+ 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 eb45392..18418aa 100644 > >>--- a/generator/actions.ml > >>+++ b/generator/actions.ml > >>@@ -12891,6 +12891,21 @@ This is equivalent to C<sgdisk -e>. > >> > >> See also L<sgdisk(8)>." }; > >> > >>+ { defaults with > >>+ name = "ntfscat_i"; added = (1, 33, 12); > >>+ style = RErr, [Mountable "device"; Int64 "inode"; FileOut "filename"], []; > >>+ proc_nr = Some 463; > >>+ progress = true; cancellable = true; > >>+ shortdesc = "download a file to the local machine given its inode"; > >>+ longdesc = "\ > >>+Download a file given its inode from a NTFS filesystem and save it as F<filename> > >>+on the local machine. > >>+ > >>+This allows to download some otherwise unaccessible files such as the ones > >>+within the $Extend folder. > >>+ > >>+F<filename> can also be a named pipe." }; > >>+ > >> ] > >> > >> (* Non-API meta-commands available only in guestfish. > >>-- > >>2.7.0-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-builder quickly builds VMs from scratch http://libguestfs.org/virt-builder.1.html
On 22/02/16 19:43, Richard W.M. Jones wrote:> On Mon, Feb 22, 2016 at 07:23:45PM +0200, noxdafox wrote: >> On 22/02/16 17:26, Richard W.M. Jones wrote: >>> On Sun, Feb 21, 2016 at 11:22:23PM +0200, Matteo Cafasso wrote: >>>> Adding ntfscat_i command for downloading files based on their inode number. >>>> >>>> This allows the dowload of files unaccessible otherwise from a NTFS guest disk image. >>> The patch seems fine, but it really needs a test otherwise this >>> feature could silently break. >> I was thinking the same but I stumbled over an issue which prevented >> me from running the tests. >> I'm not sure this is the right place where to discuss the problem >> but here's few lines about it. >> >> make blank-disk.img blank-part.img blank-fs.img blank-bootroot.img >> blank-bootrootlv.img debian.img fedora.img fedora-md1.img >> fedora-md2.img fedora-btrfs.img ubuntu.img archlinux.img coreos.img >> windows.img guests-all-good.xml >> make[3]: Entering directory >> '/home/noxdafox/development/libguestfs/test-data/phony-guests' >> make[3]: 'blank-disk.img' is up to date. >> make[3]: 'blank-part.img' is up to date. >> make[3]: 'blank-fs.img' is up to date. >> make[3]: 'blank-bootroot.img' is up to date. >> make[3]: 'blank-bootrootlv.img' is up to date. >> make[3]: 'debian.img' is up to date. >> rm -f fedora-name.db fedora-name.db-t >> no fedora-name.db-t < fedora-name.db.txt >> /bin/bash: no: command not found > What happens here is it's trying to run ``$(DB_LOAD) fedora-name.db-t'' > but the db_load program wasn't found by your configure. I think you > need to install whatever is the db4-utils (Berkeley DB 4) on your OS. > > Alternately you can grab the pre-built databases from a recent > tarball, since we distribute this stuff in the tarball so it doesn't > need to be rebuilt for most end users. > > Rich.Once fixed that and few other things I got stuck with this: SRCDIR=. LAYOUT=partitions ../../run --test ./make-fedora-img.pl Can't locate loadable object for module Sys::Guestfs in @INC (@INC contains: /home/noxdafox/development/libguestfs/perl/blib/lib /home/noxdafox/development/libguestfs/perl/blib/arch /home/noxdafox/development/libguestfs/perl/lib /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.22.1 /usr/local/share/perl/5.22.1 /usr/lib/x86_64-linux-gnu/perl5/5.22 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.22 /usr/share/perl/5.22 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base .) at ./make-fedora-img.pl line 27. Compilation failed in require at ./make-fedora-img.pl line 27. The module is looking for should be in /home/noxdafox/development/libguestfs/perl/lib and it's included in @INC. I'm on Debian Jessie.> >> Makefile:1793: recipe for target 'fedora-name.db' failed >> make[3]: *** [fedora-name.db] Error 127 >> >> Searching around it seems some dependency is missing but ./configure >> is not helping me to find which one. >> >>> Have a look at the tests/ntfsclone/ subdirectory for the general idea. >> This was also another issue, I was not sure ntfs was supported by >> the test suite and I didn't find any documentation about it. I'll >> take a look at these ones. >>> One problem with writing the test (indeed, with the general idea) is >>> how do you discover which inode numbers can be downloaded? Does NTFS >>> have some standard inode numbers for things like the MFT? >> The $MFT file has alway 0 as index number. >>> Rich. >>> >>>> --- >>>> daemon/ntfs.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++ >>>> generator/actions.ml | 15 +++++++++++++ >>>> 2 files changed, 77 insertions(+) >>>> >>>> diff --git a/daemon/ntfs.c b/daemon/ntfs.c >>>> index 568899e..58f62fa 100644 >>>> --- a/daemon/ntfs.c >>>> +++ b/daemon/ntfs.c >>>> @@ -266,3 +266,65 @@ do_ntfsfix (const char *device, int clearbadsectors) >>>> >>>> return 0; >>>> } >>>> + >>>> +int >>>> +do_ntfscat_i (const mountable_t *mountable, int64_t inode) >>>> +{ >>>> + int r; >>>> + FILE *fp; >>>> + CLEANUP_FREE char *cmd = NULL; >>>> + char buffer[GUESTFS_MAX_CHUNK_SIZE]; >>>> + >>>> + /* Inode must be greater than 0 */ >>>> + if (inode < 0) { >>>> + reply_with_error("Inode must be greater than 0"); >>>> + return -1; >>>> + } >>>> + >>>> + /* Construct the command. */ >>>> + if (asprintf_nowarn (&cmd, "ntfscat -i %ld %s", >>>> + inode, mountable->device) == -1) { >>>> + reply_with_perror ("asprintf"); >>>> + return -1; >>>> + } >>>> + >>>> + 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: %ld: %m\n", inode); >>>> + send_file_end (1); /* Cancel. */ >>>> + pclose (fp); >>>> + return -1; >>>> + } >>>> + >>>> + if (pclose (fp) != 0) { >>>> + fprintf (stderr, "pclose: %ld: %m\n", inode); >>>> + 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 eb45392..18418aa 100644 >>>> --- a/generator/actions.ml >>>> +++ b/generator/actions.ml >>>> @@ -12891,6 +12891,21 @@ This is equivalent to C<sgdisk -e>. >>>> >>>> See also L<sgdisk(8)>." }; >>>> >>>> + { defaults with >>>> + name = "ntfscat_i"; added = (1, 33, 12); >>>> + style = RErr, [Mountable "device"; Int64 "inode"; FileOut "filename"], []; >>>> + proc_nr = Some 463; >>>> + progress = true; cancellable = true; >>>> + shortdesc = "download a file to the local machine given its inode"; >>>> + longdesc = "\ >>>> +Download a file given its inode from a NTFS filesystem and save it as F<filename> >>>> +on the local machine. >>>> + >>>> +This allows to download some otherwise unaccessible files such as the ones >>>> +within the $Extend folder. >>>> + >>>> +F<filename> can also be a named pipe." }; >>>> + >>>> ] >>>> >>>> (* Non-API meta-commands available only in guestfish. >>>> -- >>>> 2.7.0