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