From 548643e528745aa150fddea1a677cc67614c547c Mon Sep 17 00:00:00 2001 From: Robert Millan Date: Tue, 17 Nov 2009 10:40:43 +0000 Subject: [PATCH] * gnulib/progname.c: New file (imported from Gnulib). * gnulib/progname.h: Likewise. * conf/i386-pc.rmk (grub_mkimage_SOURCES): Add `gnulib/progname.c'. * util/i386/pc/grub-mkimage.c: Include `"progname.h"'. (usage): Replace `progname' with `program_name'. (main): Use set_program_name() for program name initialization. --- ChangeLog.gettext | 7 ++++ conf/i386-pc.rmk | 2 +- gnulib/progname.c | 78 +++++++++++++++++++++++++++++++++++++ gnulib/progname.h | 60 ++++++++++++++++++++++++++++ util/i386/pc/grub-mkimage.c | 7 ++-- 5 files changed, 150 insertions(+), 4 deletions(-) create mode 100644 gnulib/progname.c create mode 100644 gnulib/progname.h diff --git a/ChangeLog.gettext b/ChangeLog.gettext index 966bf8e7d..dc59657a3 100644 --- a/ChangeLog.gettext +++ b/ChangeLog.gettext @@ -1,5 +1,12 @@ 2009-11-16 Robert Millan + * gnulib/progname.c: New file (imported from Gnulib). + * gnulib/progname.h: Likewise. + * conf/i386-pc.rmk (grub_mkimage_SOURCES): Add `gnulib/progname.c'. + * util/i386/pc/grub-mkimage.c: Include `"progname.h"'. + (usage): Replace `progname' with `program_name'. + (main): Use set_program_name() for program name initialization. + * aclocal.m4: Move from here ... * acinclude.m4: ... to here. * autogen.sh: Add call to `aclocal'. diff --git a/conf/i386-pc.rmk b/conf/i386-pc.rmk index a3aae6bad..fecd01828 100644 --- a/conf/i386-pc.rmk +++ b/conf/i386-pc.rmk @@ -87,7 +87,7 @@ sbin_UTILITIES += grub-emu endif # For grub-mkimage. -grub_mkimage_SOURCES = util/i386/pc/grub-mkimage.c util/misc.c \ +grub_mkimage_SOURCES = gnulib/progname.c util/i386/pc/grub-mkimage.c util/misc.c \ util/resolve.c lib/LzmaEnc.c lib/LzFind.c grub_mkimage_CFLAGS = -DGRUB_KERNEL_MACHINE_LINK_ADDR=$(GRUB_KERNEL_MACHINE_LINK_ADDR) util/i386/pc/grub-mkimage.c_DEPENDENCIES = Makefile diff --git a/gnulib/progname.c b/gnulib/progname.c new file mode 100644 index 000000000..bfa374a52 --- /dev/null +++ b/gnulib/progname.c @@ -0,0 +1,78 @@ +/* Program name management. + Copyright (C) 2001-2003, 2005-2009 Free Software Foundation, Inc. + Written by Bruno Haible , 2001. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + + +#include + +/* Specification. */ +#undef ENABLE_RELOCATABLE /* avoid defining set_program_name as a macro */ +#include "progname.h" + +#include /* get program_invocation_name declaration */ +#include + + +/* String containing name the program is called with. + To be initialized by main(). */ +const char *program_name = NULL; + +/* Set program_name, based on argv[0]. */ +void +set_program_name (const char *argv0) +{ + /* libtool creates a temporary executable whose name is sometimes prefixed + with "lt-" (depends on the platform). It also makes argv[0] absolute. + But the name of the temporary executable is a detail that should not be + visible to the end user and to the test suite. + Remove this "/.libs/" or "/.libs/lt-" prefix here. */ + const char *slash; + const char *base; + + slash = strrchr (argv0, '/'); + base = (slash != NULL ? slash + 1 : argv0); + if (base - argv0 >= 7 && strncmp (base - 7, "/.libs/", 7) == 0) + { + argv0 = base; + if (strncmp (base, "lt-", 3) == 0) + { + argv0 = base + 3; + /* On glibc systems, remove the "lt-" prefix from the variable + program_invocation_short_name. */ +#if HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME + program_invocation_short_name = (char *) argv0; +#endif + } + } + + /* But don't strip off a leading / in general, because when the user + runs + /some/hidden/place/bin/cp foo foo + he should get the error message + /some/hidden/place/bin/cp: `foo' and `foo' are the same file + not + cp: `foo' and `foo' are the same file + */ + + program_name = argv0; + + /* On glibc systems, the error() function comes from libc and uses the + variable program_invocation_name, not program_name. So set this variable + as well. */ +#if HAVE_DECL_PROGRAM_INVOCATION_NAME + program_invocation_name = (char *) argv0; +#endif +} diff --git a/gnulib/progname.h b/gnulib/progname.h new file mode 100644 index 000000000..82615c6bc --- /dev/null +++ b/gnulib/progname.h @@ -0,0 +1,60 @@ +/* Program name management. + Copyright (C) 2001-2004, 2006 Free Software Foundation, Inc. + Written by Bruno Haible , 2001. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef _PROGNAME_H +#define _PROGNAME_H + +/* Programs using this file should do the following in main(): + set_program_name (argv[0]); + */ + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* String containing name the program is called with. */ +extern const char *program_name; + +/* Set program_name, based on argv[0]. */ +extern void set_program_name (const char *argv0); + +#if ENABLE_RELOCATABLE + +/* Set program_name, based on argv[0], and original installation prefix and + directory, for relocatability. */ +extern void set_program_name_and_installdir (const char *argv0, + const char *orig_installprefix, + const char *orig_installdir); +#undef set_program_name +#define set_program_name(ARG0) \ + set_program_name_and_installdir (ARG0, INSTALLPREFIX, INSTALLDIR) + +/* Return the full pathname of the current executable, based on the earlier + call to set_program_name_and_installdir. Return NULL if unknown. */ +extern char *get_full_program_name (void); + +#endif + + +#ifdef __cplusplus +} +#endif + + +#endif /* _PROGNAME_H */ diff --git a/util/i386/pc/grub-mkimage.c b/util/i386/pc/grub-mkimage.c index a720892f6..249a40976 100644 --- a/util/i386/pc/grub-mkimage.c +++ b/util/i386/pc/grub-mkimage.c @@ -37,6 +37,8 @@ #define _GNU_SOURCE 1 #include +#include "progname.h" + #ifdef ENABLE_LZMA #include @@ -316,7 +318,7 @@ static void usage (int status) { if (status) - fprintf (stderr, _("Try ``%s --help'' for more information.\n"), progname); + fprintf (stderr, _("Try ``%s --help'' for more information.\n"), program_name); else printf ("\ Usage: grub-mkimage [OPTION]... [MODULES]\n\ @@ -348,8 +350,7 @@ main (int argc, char *argv[]) char *config = NULL; FILE *fp = stdout; - progname = "grub-mkimage"; - + set_program_name (argv[0]); textdomain (PACKAGE); while (1)