X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Frelocwrapper.c;h=4f330deb74c4fe61b213a75d0f330417203e0a44;hb=1276a2c5f24c0c932426aca9c899fa524d2443f2;hp=ca186c357500dfa34065a2df2e7292894180ecd7;hpb=57fdfd3f8ec62b105c53bcdf6f127c35c7fe7391;p=gnulib.git diff --git a/lib/relocwrapper.c b/lib/relocwrapper.c index ca186c357..4f330deb7 100644 --- a/lib/relocwrapper.c +++ b/lib/relocwrapper.c @@ -1,5 +1,5 @@ /* Relocating wrapper program. - Copyright (C) 2003, 2005-2007 Free Software Foundation, Inc. + Copyright (C) 2003, 2005-2007, 2009-2014 Free Software Foundation, Inc. Written by Bruno Haible , 2003. This program is free software: you can redistribute it and/or modify @@ -19,15 +19,16 @@ relocwrapper -> progname -> progreloc - -> xreadlink - -> areadlink - -> readlink + -> areadlink + -> careadlinkat + -> allocator + -> readlink -> canonicalize-lgpl -> malloca + -> readlink -> relocatable -> setenv -> malloca - -> strerror -> c-ctype Macros that need to be set while compiling this file: @@ -43,6 +44,7 @@ libc functions, no gettext(), no error(), no xmalloc(), no xsetenv(). */ +#define _GL_USE_STDLIB_ALLOC 1 #include #include @@ -53,8 +55,11 @@ #include "progname.h" #include "relocatable.h" -#include "setenv.h" #include "c-ctype.h" +#include "verify.h" + +/* Use the system functions, not the gnulib overrides in this file. */ +#undef fprintf /* Return a copy of the filename, with an extra ".bin" at the end. More generally, it replaces "${EXEEXT}" at the end with ".bin${EXEEXT}". */ @@ -67,34 +72,34 @@ add_dotbin (const char *filename) if (result != NULL) { if (sizeof (EXEEXT) > sizeof ("")) - { - /* EXEEXT handling. */ - const size_t exeext_len = sizeof (EXEEXT) - sizeof (""); - static const char exeext[] = EXEEXT; - if (filename_len > exeext_len) - { - /* Compare using an inlined copy of c_strncasecmp(), because - the filenames may have undergone a case conversion since - they were packaged. In other words, EXEEXT may be ".exe" - on one system and ".EXE" on another. */ - const char *s1 = filename + filename_len - exeext_len; - const char *s2 = exeext; - for (; *s1 != '\0'; s1++, s2++) - { - unsigned char c1 = *s1; - unsigned char c2 = *s2; - if (c_tolower (c1) != c_tolower (c2)) - goto simple_append; - } - /* Insert ".bin" before EXEEXT or its equivalent. */ - memcpy (result, filename, filename_len - exeext_len); - memcpy (result + filename_len - exeext_len, ".bin", 4); - memcpy (result + filename_len - exeext_len + 4, - filename + filename_len - exeext_len, - exeext_len + 1); - return result; - } - } + { + /* EXEEXT handling. */ + const size_t exeext_len = sizeof (EXEEXT) - sizeof (""); + static const char exeext[] = EXEEXT; + if (filename_len > exeext_len) + { + /* Compare using an inlined copy of c_strncasecmp(), because + the filenames may have undergone a case conversion since + they were packaged. In other words, EXEEXT may be ".exe" + on one system and ".EXE" on another. */ + const char *s1 = filename + filename_len - exeext_len; + const char *s2 = exeext; + for (; *s1 != '\0'; s1++, s2++) + { + unsigned char c1 = *s1; + unsigned char c2 = *s2; + if (c_tolower (c1) != c_tolower (c2)) + goto simple_append; + } + /* Insert ".bin" before EXEEXT or its equivalent. */ + memcpy (result, filename, filename_len - exeext_len); + memcpy (result + filename_len - exeext_len, ".bin", 4); + memcpy (result + filename_len - exeext_len + 4, + filename + filename_len - exeext_len, + exeext_len + 1); + return result; + } + } simple_append: /* Simply append ".bin". */ memcpy (result, filename, filename_len); @@ -111,7 +116,7 @@ add_dotbin (const char *filename) /* List of directories that contain the libraries. */ static const char *libdirs[] = { LIBDIRS NULL }; /* Verify that at least one directory is given. */ -typedef int verify1[2 * (sizeof (libdirs) / sizeof (libdirs[0]) > 1) - 1]; +verify (sizeof (libdirs) / sizeof (libdirs[0]) > 1); /* Relocate the list of directories that contain the libraries. */ static void @@ -188,6 +193,6 @@ main (int argc, char *argv[]) activate_libdirs (); execv (argv[0], argv); fprintf (stderr, "%s: could not execute %s: %s\n", - program_name, argv[0], strerror (errno)); + program_name, argv[0], strerror (errno)); exit (127); }