http://ftp.x.org/contrib/applications/xscreensaver-3.17.tar.gz
[xscreensaver] / driver / prefs.c
index cdf957961696a919868ac0184582054114d1e430..747db1e58e85c4107755ebdede87c3e3c37e985f 100644 (file)
@@ -75,6 +75,24 @@ extern const char *blurb (void);
 static void get_screenhacks (saver_preferences *p);
 
 
+static char *
+chase_symlinks (const char *file)
+{
+# ifdef HAVE_REALPATH
+  if (file)
+    {
+      char buf [2048];
+      if (realpath (file, buf))
+        return strdup (buf);
+
+      sprintf (buf, "%s: realpath", blurb());
+      perror(buf);
+    }
+# endif /* HAVE_REALPATH */
+  return 0;
+}
+
+
 const char *
 init_file_name (void)
 {
@@ -123,6 +141,10 @@ init_file_tmp_name (void)
     {
       const char *name = init_file_name();
       const char *suffix = ".tmp";
+
+      char *n2 = chase_symlinks (name);
+      if (n2) name = n2;
+
       if (!name || !*name)
        file = "";
       else
@@ -131,6 +153,8 @@ init_file_tmp_name (void)
          strcpy(file, name);
          strcat(file, suffix);
        }
+
+      if (n2) free (n2);
     }
 
   if (file && *file)
@@ -339,6 +363,7 @@ parse_init_file (saver_preferences *p)
       if (!p->db) abort();
       handle_entry (&p->db, key, value, name, line);
     }
+  fclose (in);
   free(buf);
 
   p->init_file_date = write_date;
@@ -492,6 +517,7 @@ write_init_file (saver_preferences *p, const char *version_string)
 {
   const char *name = init_file_name();
   const char *tmp_name = init_file_tmp_name();
+  char *n2 = chase_symlinks (name);
   struct stat st;
   int i, j;
 
@@ -504,7 +530,9 @@ write_init_file (saver_preferences *p, const char *version_string)
   char *stderr_font;
   FILE *out;
 
-  if (!name) return;
+  if (!name) goto END;
+
+  if (n2) name = n2;
 
   if (p->verbose_p)
     fprintf (stderr, "%s: writing \"%s\".\n", blurb(), name);
@@ -517,7 +545,7 @@ write_init_file (saver_preferences *p, const char *version_string)
       sprintf(buf, "%s: error writing \"%s\"", blurb(), name);
       perror(buf);
       free(buf);
-      return;
+      goto END;
     }
 
   /* Give the new .xscreensaver file the same permissions as the old one;
@@ -536,7 +564,7 @@ write_init_file (saver_preferences *p, const char *version_string)
                   tmp_name, (unsigned int) mode);
          perror(buf);
          free(buf);
-         return;
+         goto END;
        }
     }
 
@@ -698,7 +726,7 @@ write_init_file (saver_preferences *p, const char *version_string)
          perror(buf);
          unlink (tmp_name);
          free(buf);
-         return;
+         goto END;
        }
 
       if (rename (tmp_name, name) != 0)
@@ -709,7 +737,7 @@ write_init_file (saver_preferences *p, const char *version_string)
          perror(buf);
          unlink (tmp_name);
          free(buf);
-         return;
+         goto END;
        }
       else
        {
@@ -727,8 +755,11 @@ write_init_file (saver_preferences *p, const char *version_string)
       perror(buf);
       free(buf);
       unlink (tmp_name);
-      return;
+      goto END;
     }
+
+ END:
+  if (n2) free (n2);
 }
 
 \f