X-Git-Url: https://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Frelocwrapper.c;h=d3980dd07d2ea590610ed85ae283b816b2982e3e;hb=221d8efe25aa7f053d3a2d2dedb4f98886500784;hp=ca186c357500dfa34065a2df2e7292894180ecd7;hpb=57fdfd3f8ec62b105c53bcdf6f127c35c7fe7391;p=gnulib.git diff --git a/lib/relocwrapper.c b/lib/relocwrapper.c index ca186c357..d3980dd07 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-2010 Free Software Foundation, Inc. Written by Bruno Haible , 2003. This program is free software: you can redistribute it and/or modify @@ -19,11 +19,11 @@ relocwrapper -> progname -> progreloc - -> xreadlink - -> areadlink - -> readlink + -> areadlink + -> readlink -> canonicalize-lgpl -> malloca + -> readlink -> relocatable -> setenv -> malloca @@ -53,8 +53,12 @@ #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 +#undef malloc /* 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 +71,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 +115,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 +192,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); }