Annotation of embedaddon/libiconv/srclib/progname.c, revision 1.1.1.2

1.1       misho       1: /* Program name management.
1.1.1.2 ! misho       2:    Copyright (C) 2001-2003, 2005-2011 Free Software Foundation, Inc.
        !             3:    Written by Bruno Haible <bruno@clisp.org>, 2001.
1.1       misho       4: 
                      5:    This program is free software: you can redistribute it and/or modify
                      6:    it under the terms of the GNU General Public License as published by
                      7:    the Free Software Foundation; either version 3 of the License, or
                      8:    (at your option) any later version.
                      9: 
                     10:    This program is distributed in the hope that it will be useful,
                     11:    but WITHOUT ANY WARRANTY; without even the implied warranty of
                     12:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     13:    GNU General Public License for more details.
                     14: 
                     15:    You should have received a copy of the GNU General Public License
                     16:    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
                     17: 
                     18: 
                     19: #include <config.h>
                     20: 
                     21: /* Specification.  */
                     22: #undef ENABLE_RELOCATABLE /* avoid defining set_program_name as a macro */
                     23: #include "progname.h"
                     24: 
1.1.1.2 ! misho      25: #include <errno.h> /* get program_invocation_name declaration */
        !            26: #include <stdio.h>
        !            27: #include <stdlib.h>
1.1       misho      28: #include <string.h>
                     29: 
                     30: 
                     31: /* String containing name the program is called with.
                     32:    To be initialized by main().  */
                     33: const char *program_name = NULL;
                     34: 
1.1.1.2 ! misho      35: /* Set program_name, based on argv[0].
        !            36:    argv0 must be a string allocated with indefinite extent, and must not be
        !            37:    modified after this call.  */
1.1       misho      38: void
                     39: set_program_name (const char *argv0)
                     40: {
                     41:   /* libtool creates a temporary executable whose name is sometimes prefixed
                     42:      with "lt-" (depends on the platform).  It also makes argv[0] absolute.
                     43:      But the name of the temporary executable is a detail that should not be
                     44:      visible to the end user and to the test suite.
                     45:      Remove this "<dirname>/.libs/" or "<dirname>/.libs/lt-" prefix here.  */
                     46:   const char *slash;
                     47:   const char *base;
                     48: 
1.1.1.2 ! misho      49:   /* Sanity check.  POSIX requires the invoking process to pass a non-NULL
        !            50:      argv[0].  */
        !            51:   if (argv0 == NULL)
        !            52:     {
        !            53:       /* It's a bug in the invoking program.  Help diagnosing it.  */
        !            54:       fputs ("A NULL argv[0] was passed through an exec system call.\n",
        !            55:              stderr);
        !            56:       abort ();
        !            57:     }
        !            58: 
1.1       misho      59:   slash = strrchr (argv0, '/');
                     60:   base = (slash != NULL ? slash + 1 : argv0);
                     61:   if (base - argv0 >= 7 && strncmp (base - 7, "/.libs/", 7) == 0)
                     62:     {
                     63:       argv0 = base;
                     64:       if (strncmp (base, "lt-", 3) == 0)
1.1.1.2 ! misho      65:         {
        !            66:           argv0 = base + 3;
        !            67:           /* On glibc systems, remove the "lt-" prefix from the variable
        !            68:              program_invocation_short_name.  */
        !            69: #if HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
        !            70:           program_invocation_short_name = (char *) argv0;
        !            71: #endif
        !            72:         }
1.1       misho      73:     }
                     74: 
                     75:   /* But don't strip off a leading <dirname>/ in general, because when the user
                     76:      runs
                     77:          /some/hidden/place/bin/cp foo foo
                     78:      he should get the error message
                     79:          /some/hidden/place/bin/cp: `foo' and `foo' are the same file
                     80:      not
                     81:          cp: `foo' and `foo' are the same file
                     82:    */
                     83: 
                     84:   program_name = argv0;
1.1.1.2 ! misho      85: 
        !            86:   /* On glibc systems, the error() function comes from libc and uses the
        !            87:      variable program_invocation_name, not program_name.  So set this variable
        !            88:      as well.  */
        !            89: #if HAVE_DECL_PROGRAM_INVOCATION_NAME
        !            90:   program_invocation_name = (char *) argv0;
        !            91: #endif
1.1       misho      92: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>