[Libguestfs] [PATCH libguestfs 2/5] guestfish: write --help to stdout, use gnulib's progname module

Jim Meyering jim at meyering.net
Mon Aug 24 15:46:03 UTC 2009


Richard W.M. Jones wrote:

> On Mon, Aug 24, 2009 at 04:26:16PM +0200, Jim Meyering wrote:
>> Richard W.M. Jones wrote:
>>
>> > On Mon, Aug 24, 2009 at 02:21:51PM +0200, Jim Meyering wrote:
>> >> Sure.  That works, too.
>> >> Here's the incremental:
>> >
>> > No, this doesn't fix the path munging to use real_argv0.
>>
>> "fix"?
>> Is something incorrect, or is it just that you'd prefer
>> to move the definition of real_argv0 "up"?
>>
>> I see only two uses of argv[0] in main:
>>
>> - path-related stuff *before* I change argv[0] and define real_argv0
>>
>>   if (getenv ("LIBGUESTFS_PATH") == NULL &&
>>       argv[0] &&
>>       (argv[0][0] != '/' || strstr (argv[0], "/.libs/lt-") != NULL))
>>     guestfs_set_path (g, "appliance:" GUESTFS_DEFAULT_PATH);
>>
>> - then, this code, afterwards, that I did change to use real_argv0:
>>
>>     strcpy (cmd, "a=`virt-inspector");
>>     while (optind < argc) {
>>       if (strlen (cmd) + strlen (argv[optind]) + strlen (real_argv0) + 60
>>     ...
>>     sprintf (&cmd[strlen(cmd)], "` && %s $a", real_argv0);
>>
>> If you'd prefer to move the definition of real_argv0 to precede
>> the former, let me know, and I'll move it and adjust.
>> However, note that that has no impact on correctness.
>
> You're right - for some reason I thought the path-munging code
> occurred after overwriting argv[0].
>
> In general though I think the code is now much more prone to errors if
> we rearrange the code in future.  (It's already complex and prone to
> introducing errors).
>
> If the only benefit to rewriting argv[0] is that we get a slightly
> better error message from getopt, then I'm inclined not to do it at
> all.  Leave all the argv[0] code as it is, and change anything else to
> use program_name.

There are a couple of compelling arguments for making the
change in general:

  - testing and reproducibility: with the change, all diagnostics
    start with the constant string, "program_name: ".
    Otherwise, you'll have most that are that way, yet a few
    that then start with an absolute directory name and end in
    "/.libs/lt-program_name: ".  Worse still, in some environments,
    that leading directory name will vary from run to run depending
    on mount point names.

  - overall uniformity.  in building the tools and testing them, we've
    seen how much output you may have to wade through when diagnosing a
    problem.  If we ensure that all diagnostics start with "program_name: "
    it's that much easier to be sure that a quick use of grep finds all
    error messages.

If it will make it easier to accept, I will add some small tests
that verify the expected behavior.

An alternative is not to modify argv at all, but
rather to make a copy of it, change argv_copy[0],
and to pass argv_copy to getopt_long.

Let me know.




More information about the Libguestfs mailing list