]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* gnulib/progname.c: New file (imported from Gnulib).
authorRobert Millan <rmh@aybabtu.com>
Tue, 17 Nov 2009 10:40:43 +0000 (10:40 +0000)
committerRobert Millan <rmh@aybabtu.com>
Tue, 17 Nov 2009 10:40:43 +0000 (10:40 +0000)
        * 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
conf/i386-pc.rmk
gnulib/progname.c [new file with mode: 0644]
gnulib/progname.h [new file with mode: 0644]
util/i386/pc/grub-mkimage.c

index 966bf8e7d18ddbd526f580462311f79b984f176c..dc59657a335180205ed96c6ccaccc4ee7eedc9d9 100644 (file)
@@ -1,5 +1,12 @@
 2009-11-16  Robert Millan  <rmh.grub@aybabtu.com>
 
+       * 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'.
index a3aae6bad394b9c6cbcfae630799a9eb569298ea..fecd0182887817aea9825e9739b7cfd9a9720baa 100644 (file)
@@ -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 (file)
index 0000000..bfa374a
--- /dev/null
@@ -0,0 +1,78 @@
+/* Program name management.
+   Copyright (C) 2001-2003, 2005-2009 Free Software Foundation, Inc.
+   Written by Bruno Haible <haible@clisp.cons.org>, 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 <http://www.gnu.org/licenses/>.  */
+
+
+#include <config.h>
+
+/* Specification.  */
+#undef ENABLE_RELOCATABLE /* avoid defining set_program_name as a macro */
+#include "progname.h"
+
+#include <errno.h> /* get program_invocation_name declaration */
+#include <string.h>
+
+
+/* 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 "<dirname>/.libs/" or "<dirname>/.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 <dirname>/ 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 (file)
index 0000000..82615c6
--- /dev/null
@@ -0,0 +1,60 @@
+/* Program name management.
+   Copyright (C) 2001-2004, 2006 Free Software Foundation, Inc.
+   Written by Bruno Haible <haible@clisp.cons.org>, 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 <http://www.gnu.org/licenses/>.  */
+
+#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 */
index a720892f671ba794f482db488bb150d4a5b7da10..249a409767bc3a9f9d815219f95e75908e2f3a08 100644 (file)
@@ -37,6 +37,8 @@
 #define _GNU_SOURCE    1
 #include <getopt.h>
 
+#include "progname.h"
+
 #ifdef ENABLE_LZMA
 #include <grub/lib/LzmaEnc.h>
 
@@ -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)