[Libguestfs] [PATCH v3 1/3] virt-ls: support drive letters on Windows

Maros Zatko mzatko at redhat.com
Fri May 22 15:06:33 UTC 2015


On 05/21/2015 12:16 PM, Pino Toscano wrote:
> On Wednesday 20 May 2015 19:41:47 Maros Zatko wrote:
>> Directory name can include Windows drive letter if guest
>> is Windows and inspection is enabled (i.e. option -m is not given).
>>
>> Fixes: RHBZ#845234
> Please move the bug notice directly in the first line of the commit
> message, e.g.:
>
>   virt-ls: support drive letters on Windows (RHBZ#845234)
>
>> ---
>>   cat/ls.c | 37 ++++++++++++++++++++++++++++++++++---
>>   1 file changed, 34 insertions(+), 3 deletions(-)
>>
>> diff --git a/cat/ls.c b/cat/ls.c
>> index 9161fb6..1a164b3 100644
>> --- a/cat/ls.c
>> +++ b/cat/ls.c
>> @@ -37,6 +37,7 @@
>>   
>>   #include "options.h"
>>   #include "visit.h"
>> +#include "windows.h"
>>   
>>   /* Currently open libguestfs handle. */
>>   guestfs_h *g;
>> @@ -76,6 +77,8 @@ static void output_int64_uid (int64_t);
>>   static void output_string (const char *);
>>   static void output_string_link (const char *);
>>   
>> +static const char *get_windows_root ();
>> +
>>   static void __attribute__((noreturn))
>>   usage (int status)
>>   {
>> @@ -176,6 +179,7 @@ main (int argc, char *argv[])
>>   #define MODE_LS_R  2
>>   #define MODE_LS_LR (MODE_LS_L|MODE_LS_R)
>>     int mode = 0;
>> +  CLEANUP_FREE const char * win_root;
> Take care of setting CLEANUP_FREE variables to NULL, otherwise the
> cleanup routine will try to free a garbage pointer.
>
>>     g = guestfs_create ();
>>     if (g == NULL) {
>> @@ -362,19 +366,28 @@ main (int argc, char *argv[])
>>     if (guestfs_launch (g) == -1)
>>       exit (EXIT_FAILURE);
>>   
>> -  if (mps != NULL)
>> +  if (mps != NULL) {
>>       mount_mps (mps);
>> -  else
>> +  } else {
>>       inspect_mount ();
>> +    win_root = get_windows_root ();
>> +  }
> Hm why doing that only when inspecting? Other tools (e.g. virt-cat)
> do this also when specifying mount points.
Issue was speed. Without inspection (i.e. -m is given) it takes
3 seconds on my machine. With inspection it takes for 6-8 seconds.
If this is a non-issue, I'll add it. Only inspect_os needed for this to 
work.
>
>>   
>>     /* Free up data structures, no longer needed after this point. */
>>     free_drives (drvs);
>>     free_mps (mps);
>>   
>> +
>>     unsigned errors = 0;
>>   
>>     while (optind < argc) {
>> -    const char *dir = argv[optind];
>> +    CLEANUP_FREE const char *dir;
>> +
>> +    if (inspector == 1 && win_root != NULL) {
>> +      dir = windows_path (g, win_root, argv[optind], 1 /* readonly */ );
>> +    } else {
>> +      dir = safe_strdup (g, argv[optind]);
>> +    }
>>   
>>       switch (mode) {
>>       case 0:                     /* no -l or -R option */
>> @@ -409,6 +422,24 @@ main (int argc, char *argv[])
>>     exit (errors == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
>>   }
>>   
>> +static const char *
> Given a new string is returned, the return value needs to not be const.
>
>> +get_windows_root (void)
>> +{
>> +  CLEANUP_FREE_STRING_LIST char **roots = NULL;
>> +  const char *root;
>> +
>> +  roots = guestfs_inspect_get_roots (g);
>> +  assert (roots);
>> +  assert (roots[0] != NULL);
>> +  assert (roots[1] == NULL);
>> +  root = safe_strdup(g, roots[0]);
> safe_strdup could be delayed until the actual return later, otherwise
> if is_windows returns false that string is leaked.
>
>> +
>> +  if (is_windows (g, root))
>> +    return root;
>> +  else
>> +    return NULL;
>> +}
>> +
> I'd inline the whole get_windows_root just before the
> "while (optind < argc)", like done in cat/cat.c:do_cat.
I've specifically took it out to it's own function. It's more clear to 
me like this.
> Another option could be factor out this code somewhere (like windows.c).
I like this idea better. cat/cat.c could maybe use it too.




More information about the Libguestfs mailing list