File tzcode-link.diff of Package timezone.openSUSE_13.2_Update

This patch is used on openSUSE versions older than 12.2.
Back then, /etc/localtime was either a hard link to a zone
file in /usr/share/zoneinfo or a copy of it.

By default, zic tries the following approaches to create
/etc/localtime:

  1. Hard link
  2. Symbolic link
  3. File copy

This patch changes the order to:

  1. Hard link
  2. File copy
  3. Symbolic link

Index: timezone-2015f/zic.c
===================================================================
--- timezone-2015f.orig/zic.c
+++ timezone-2015f/zic.c
@@ -738,6 +738,23 @@ relname(char const *dir, char const *bas
   }
 }
 
+static int
+copy(fromname, toname)
+const char * const	fromname;
+const char * const	toname;
+{
+	if (!fork()) {
+		execl("/bin/cp", "cp", fromname, toname, (char*) NULL);
+		_exit(1);
+	}
+	int s;
+	if (wait(&s) < 0)
+		return -1;
+	if (!WIFEXITED(s))
+		return -1;
+	return -WEXITSTATUS(s);
+}
+
 static void
 dolink(char const *fromfield, char const *tofield)
 {
@@ -767,6 +784,8 @@ dolink(char const *fromfield, char const
 			exit(EXIT_FAILURE);
 
 		result = link(fromname, toname);
+		if (result != 0)
+			result = copy(fromname, toname);
 		if (result != 0) {
 				const char *s = fromname;
 				const char *t;
openSUSE Build Service is sponsored by