Richard W.M. Jones wrote:
On Mon, Aug 24, 2009 at 01:51:18PM +0200, Jim Meyering wrote:
@@ -205,6 +202,11 @@ main (int argc, char *argv[]) (argv[0][0] != '/' || strstr (argv[0], "/.libs/lt-") != NULL)) guestfs_set_path (g, "appliance:" GUESTFS_DEFAULT_PATH);
+ /* getopt_long uses argv[0], so give it the sanitized name, too. + But only temporarily. */ + char *argv0 = argv[0]; + argv[0] = bad_cast (program_name); + for (;;) { c = getopt_long (argc, argv, options, long_options, &option_index); if (c == -1) break;
@@ -325,6 +327,9 @@ main (int argc, char *argv[]) } }
+ /* Restore original value. */ + argv[0] = argv0; + /* Inspector mode invalidates most of the other arguments. */ if (inspector) { char cmd[1024];
I'm maybe missing something, but why restore it?
How about instead something like:
char *real_argv0 = argv[0]; argv[0] = bad_cast (program_name);
//...
/* change the path-munging code to use real_argv0 */
//...
/* don't bother restoring argv[0] */
Sure. That works, too. Here's the incremental: diff --git a/fish/fish.c b/fish/fish.c index baa1b6e..e799f86 100644 --- a/fish/fish.c +++ b/fish/fish.c @@ -203,7 +203,7 @@ main (int argc, char *argv[]) /* getopt_long uses argv[0], so give it the sanitized name, too. But only temporarily. */ - char *argv0 = argv[0]; + char *real_argv0 = argv[0]; argv[0] = bad_cast (program_name); for (;;) { @@ -328,9 +328,6 @@ main (int argc, char *argv[]) } } - /* Restore original value. */ - argv[0] = argv0; - /* Inspector mode invalidates most of the other arguments. */ if (inspector) { char cmd[1024]; @@ -352,7 +349,7 @@ main (int argc, char *argv[]) strcpy (cmd, "a=`virt-inspector"); while (optind < argc) { - if (strlen (cmd) + strlen (argv[optind]) + strlen (argv[0]) + 60 + if (strlen (cmd) + strlen (argv[optind]) + strlen (real_argv0) + 60 >= sizeof cmd) { fprintf (stderr, _("%s: virt-inspector command too long for fixed-size buffer\n"), @@ -370,7 +367,7 @@ main (int argc, char *argv[]) else strcat (cmd, " --fish"); - sprintf (&cmd[strlen(cmd)], "` && %s $a", argv[0]); + sprintf (&cmd[strlen(cmd)], "` && %s $a", real_argv0); if (guestfs_get_verbose (g)) strcat (cmd, " -v");