(build-testdata): Add GCONV_PATH to environment.
[kopensolaris-gnu/glibc.git] / timezone / zic.c
index 040a605..ddf155f 100644 (file)
@@ -1,6 +1,6 @@
 #ifndef lint
 #ifndef NOID
-static char    elsieid[] = "@(#)zic.c  7.96";
+static char    elsieid[] = "@(#)zic.c  7.100";
 #endif /* !defined NOID */
 #endif /* !defined lint */
 
@@ -11,6 +11,8 @@ static char   elsieid[] = "@(#)zic.c  7.96";
 #include "sys/stat.h"                  /* for umask manifest constants */
 #endif /* defined unix */
 
+#include <libintl.h>
+
 /*
 ** On some ancient hosts, predicates like `isspace(C)' are defined
 ** only if isascii(C) || C == EOF.  Modern hosts obey the C Standard,
@@ -563,12 +565,18 @@ _("%s: More than one -L option specified\n"),
        /*
        ** Make links.
        */
-       for (i = 0; i < nlinks; ++i)
+       for (i = 0; i < nlinks; ++i) {
+               eat(links[i].l_filename, links[i].l_linenum);
                dolink(links[i].l_from, links[i].l_to);
-       if (lcltime != NULL)
+       }
+       if (lcltime != NULL) {
+               eat("command line", 1);
                dolink(lcltime, TZDEFAULT);
-       if (psxrules != NULL)
+       }
+       if (psxrules != NULL) {
+               eat("command line", 1);
                dolink(psxrules, TZDEFRULES);
+       }
        return (errors == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
 }
 
@@ -605,12 +613,30 @@ const char * const        tofile;
 
                if (mkdirs(toname) != 0)
                        (void) exit(EXIT_FAILURE);
+
                result = link(fromname, toname);
-#if (HAVE_SYMLINK - 0) 
+#if (HAVE_SYMLINK - 0)
                if (result != 0) {
-                       result = symlink(fromname, toname);
+                       const char *s = tofile;
+                       register char *symlinkcontents = NULL;
+                       while ((s = strchr(s+1, '/')) != NULL)
+                               symlinkcontents = ecatalloc(symlinkcontents, "../");
+                       symlinkcontents = ecatalloc(symlinkcontents, fromname);
+
+                       result = unlink(toname);
+                       if (result != 0 && errno != ENOENT) {
+                               const char *e = strerror(errno);
+
+                               (void) fprintf(stderr,
+                                              _("%s: Can't unlink  %s: %s\n"),
+                                              progname, toname, e);
+                               (void) exit(EXIT_FAILURE);
+                       }
+
+                       result = symlink(symlinkcontents, toname);
                        if (result == 0)
 warning(_("hard link failed, symbolic link used"));
+                       ifree(symlinkcontents);
                }
 #endif
                if (result != 0) {
@@ -1892,10 +1918,12 @@ const char * const      type;
        buf = erealloc(buf, (int) (132 + strlen(yitcommand) + strlen(type)));
        (void) sprintf(buf, "%s %d %s", yitcommand, year, type);
        result = system(buf);
-       if (result == 0)
-               return TRUE;
-       if (result == (1 << 8))
-               return FALSE;
+       if (WIFEXITED(result)) switch (WEXITSTATUS(result)) {
+               case 0:
+                       return TRUE;
+               case 1:
+                       return FALSE;
+       }
        error(_("Wild result from command execution"));
        (void) fprintf(stderr, _("%s: command was '%s', result was %d\n"),
                progname, buf, result);