File tzcode-symlink.patch of Package timezone-java.1047

Index: timezone-2012h/zic.c
===================================================================
--- timezone-2012h.orig/zic.c
+++ timezone-2012h/zic.c
@@ -110,7 +110,7 @@ static int	addtype(long gmtoff, const ch
 static void	leapadd(zic_t t, int positive, int rolling, int count);
 static void	adjleap(void);
 static void	associate(void);
-static void	dolink(const char * fromfield, const char * tofield);
+static void	dolink(const char * fromfield, const char * tofield, int defaultsymlink);
 static long	eitol(int i);
 static char **	getfields(char * buf);
 static long	gethms(const char * string, const char * errstrng,
@@ -558,7 +558,7 @@ _("%s: More than one -L option specified
 	*/
 	for (i = 0; i < nlinks; ++i) {
 		eat(links[i].l_filename, links[i].l_linenum);
-		dolink(links[i].l_from, links[i].l_to);
+		dolink(links[i].l_from, links[i].l_to, FALSE);
 		if (noise)
 			for (j = 0; j < nlinks; ++j)
 				if (strcmp(links[i].l_to,
@@ -567,17 +567,17 @@ _("%s: More than one -L option specified
 	}
 	if (lcltime != NULL) {
 		eat("command line", 1);
-		dolink(lcltime, TZDEFAULT);
+		dolink(lcltime, TZDEFAULT, TRUE);
 	}
 	if (psxrules != NULL) {
 		eat("command line", 1);
-		dolink(psxrules, TZDEFRULES);
+		dolink(psxrules, TZDEFRULES, FALSE);
 	}
 	return (errors == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
 }
 
 static void
-dolink(const char *const fromfield, const char *const tofield)
+dolink(const char *const fromfield, const char *const tofield, int defaultsymlink)
 {
 	register char *	fromname;
 	register char *	toname;
@@ -602,15 +602,16 @@ dolink(const char *const fromfield, cons
 	*/
 	if (!itsdir(toname))
 		(void) remove(toname);
-	if (link(fromname, toname) != 0) {
+	if (defaultsymlink || link(fromname, toname) != 0) {
 		int	result;
 
 		if (mkdirs(toname) != 0)
 			exit(EXIT_FAILURE);
 
-		result = link(fromname, toname);
+		if (!defaultsymlink)
+			result = link(fromname, toname);
 #if HAVE_SYMLINK
-		if (result != 0 &&
+		if ((defaultsymlink || (!defaultsymlink && result != 0)) &&
 			access(fromname, F_OK) == 0 &&
 			!itsdir(fromname)) {
 				const char *s = tofield;
openSUSE Build Service is sponsored by