http://packetstormsecurity.org/UNIX/admin/xscreensaver-4.02.tar.gz
[xscreensaver] / driver / prefs.c
index 7dcb768adecd4ecfde82ccd677ba7e757f47e918..180dfca6478f31d4bd0bb06b7b83118efcf24994 100644 (file)
@@ -77,6 +77,8 @@ static void get_screenhacks (saver_preferences *p);
 static char *format_command (const char *cmd, Bool wrap_p);
 static void merge_system_screenhacks (saver_preferences *p,
                                       screenhack **system_list, int count);
+static void stop_the_insanity (saver_preferences *p);
+
 
 static char *
 chase_symlinks (const char *file)
@@ -216,6 +218,7 @@ get_byte_resource (char *name, char *class)
     LOSE:
       fprintf (stderr, "%s: %s must be a number of bytes, not \"%s\".\n",
                progname, name, s);
+      free (s);
       return 0;
     }
   s2++;
@@ -223,6 +226,7 @@ get_byte_resource (char *name, char *class)
   while (isspace(*s2)) s2++;
   if (*s2) goto LOSE;
 
+  free (s);
   return n;
 }
 
@@ -632,6 +636,11 @@ write_init_file (saver_preferences *p, const char *version_string,
 
   if (n2) name = n2;
 
+  /* Throttle the various timeouts to reasonable values before writing
+     the file to disk. */
+  stop_the_insanity (p);
+
+
   if (verbose_p)
     fprintf (stderr, "%s: writing \"%s\".\n", blurb(), name);
 
@@ -701,6 +710,7 @@ write_init_file (saver_preferences *p, const char *version_string,
        *ss++ = '\n';
        *ss = 0;
       }
+    free (hack_strings);
   }
 
   {
@@ -939,6 +949,7 @@ free_screenhack_list (screenhack **list, int count)
 }
 
 
+
 /* Populate `saver_preferences' with the contents of the resource database.
    Note that this may be called multiple times -- it is re-run each time
    the ~/.xscreensaver file is reloaded.
@@ -1043,43 +1054,7 @@ load_init_file (saver_preferences *p)
                                                     "Boolean");
   p->use_proc_interrupts = get_boolean_resource ("procInterrupts", "Boolean");
 
-  /* Throttle the various timeouts to reasonable values.
-   */
-  if (p->passwd_timeout <= 0) p->passwd_timeout = 30000;        /* 30 secs */
-  if (p->timeout < 10000) p->timeout = 10000;                   /* 10 secs */
-  if (p->cycle != 0 && p->cycle < 2000) p->cycle = 2000;        /*  2 secs */
-  if (p->pointer_timeout <= 0) p->pointer_timeout = 5000;       /*  5 secs */
-  if (p->notice_events_timeout <= 0)
-    p->notice_events_timeout = 10000;                           /* 10 secs */
-  if (p->fade_seconds <= 0 || p->fade_ticks <= 0)
-    p->fade_p = False;
-  if (! p->fade_p) p->unfade_p = False;
-
-  /* The DPMS settings may have the value 0.
-     But if they are negative, or are a range less than 10 seconds,
-     reset them to sensible defaults.  (Since that must be a mistake.)
-   */
-  if (p->dpms_standby != 0 &&
-      p->dpms_standby < 10 * 1000)
-    p->dpms_standby =  2 * 60 * 60 * 1000;                      /* 2 hours */
-  if (p->dpms_suspend != 0 &&
-      p->dpms_suspend < 10 * 1000)
-    p->dpms_suspend =  2 * 60 * 60 * 1000;                      /* 2 hours */
-  if (p->dpms_off != 0 &&
-      p->dpms_off < 10 * 1000)
-    p->dpms_off      = 4 * 60 * 60 * 1000;                      /* 4 hours */
-
-  if (p->dpms_standby == 0 &&     /* if *all* are 0, then DPMS is disabled */
-      p->dpms_suspend == 0 &&
-      p->dpms_off     == 0)
-    p->dpms_enabled_p = False;
-
-
-  p->watchdog_timeout = p->cycle * 0.6;
-  if (p->watchdog_timeout < 30000) p->watchdog_timeout = 30000;          /* 30 secs */
-  if (p->watchdog_timeout > 3600000) p->watchdog_timeout = 3600000; /*  1 hr */
-
-  get_screenhacks (p);
+  get_screenhacks (p);                /* Parse the "programs" resource. */
 
   p->selected_hack = get_integer_resource ("selected", "Integer");
   if (p->selected_hack < 0 || p->selected_hack >= p->screenhacks_count)
@@ -1091,6 +1066,7 @@ load_init_file (saver_preferences *p)
     else if (s && !strcasecmp (s, "blank")) p->mode = BLANK_ONLY;
     else if (s && !strcasecmp (s, "off"))   p->mode = DONT_BLANK;
     else                                    p->mode = RANDOM_HACKS;
+    if (s) free (s);
   }
 
   if (system_default_screenhack_count)  /* note: first_time is also true */
@@ -1110,6 +1086,10 @@ load_init_file (saver_preferences *p)
       p->timestamp_p = True;
       p->initial_delay = 0;
     }
+
+  /* Throttle the various timeouts to reasonable values after reading the
+     disk file. */
+  stop_the_insanity (p);
 }
 
 
@@ -1319,7 +1299,10 @@ make_hack_name (const char *shell_command)
   sprintf (res_name, "hacks.%s.name", s);              /* resource? */
   s2 = get_string_resource (res_name, res_name);
   if (s2)
-    return s2;
+    {
+      free (s);
+      return s2;
+    }
 
   for (s2 = s; *s2; s2++)      /* if it has any capitals, return it */
     if (*s2 >= 'A' && *s2 <= 'Z')
@@ -1337,15 +1320,28 @@ char *
 format_hack (screenhack *hack, Bool wrap_p)
 {
   int tab = 32;
-  int size = (2 * (strlen(hack->command) +
-                   (hack->visual ? strlen(hack->visual) : 0) +
-                   (hack->name ? strlen(hack->name) : 0) +
-                   tab));
-  char *h2 = (char *) malloc (size);
-  char *out = h2;
-  char *s;
+  int size;
+  char *h2, *out, *s;
   int col = 0;
 
+  char *def_name = make_hack_name (hack->command);
+
+  /* Don't ever write out a name for a hack if it's the same as the default.
+   */
+  if (hack->name && !strcmp (hack->name, def_name))
+    {
+      free (hack->name);
+      hack->name = 0;
+    }
+  free (def_name);
+
+  size = (2 * (strlen(hack->command) +
+               (hack->visual ? strlen(hack->visual) : 0) +
+               (hack->name ? strlen(hack->name) : 0) +
+               tab));
+  h2 = (char *) malloc (size);
+  out = h2;
+
   if (!hack->enabled_p) *out++ = '-';          /* write disabled flag */
 
   if (hack->visual && *hack->visual)           /* write visual name */
@@ -1468,9 +1464,51 @@ get_screenhacks (saver_preferences *p)
       start = end+1;
     }
 
+  free (d);
+
   if (p->screenhacks_count == 0)
     {
       free (p->screenhacks);
       p->screenhacks = 0;
     }
 }
+
+
+/* Make sure all the values in the preferences struct are sane.
+ */
+static void
+stop_the_insanity (saver_preferences *p)
+{
+  if (p->passwd_timeout <= 0) p->passwd_timeout = 30000;        /* 30 secs */
+  if (p->timeout < 15000) p->timeout = 15000;                   /* 15 secs */
+  if (p->cycle != 0 && p->cycle < 2000) p->cycle = 2000;        /*  2 secs */
+  if (p->pointer_timeout <= 0) p->pointer_timeout = 5000;       /*  5 secs */
+  if (p->notice_events_timeout <= 0)
+    p->notice_events_timeout = 10000;                           /* 10 secs */
+  if (p->fade_seconds <= 0 || p->fade_ticks <= 0)
+    p->fade_p = False;
+  if (! p->fade_p) p->unfade_p = False;
+
+  /* The DPMS settings may have the value 0.
+     But if they are negative, or are a range less than 10 seconds,
+     reset them to sensible defaults.  (Since that must be a mistake.)
+   */
+  if (p->dpms_standby != 0 &&
+      p->dpms_standby < 10 * 1000)
+    p->dpms_standby =  2 * 60 * 60 * 1000;                      /* 2 hours */
+  if (p->dpms_suspend != 0 &&
+      p->dpms_suspend < 10 * 1000)
+    p->dpms_suspend =  2 * 60 * 60 * 1000;                      /* 2 hours */
+  if (p->dpms_off != 0 &&
+      p->dpms_off < 10 * 1000)
+    p->dpms_off      = 4 * 60 * 60 * 1000;                      /* 4 hours */
+
+  if (p->dpms_standby == 0 &&     /* if *all* are 0, then DPMS is disabled */
+      p->dpms_suspend == 0 &&
+      p->dpms_off     == 0)
+    p->dpms_enabled_p = False;
+
+  p->watchdog_timeout = p->cycle * 0.6;
+  if (p->watchdog_timeout < 30000) p->watchdog_timeout = 30000;          /* 30 secs */
+  if (p->watchdog_timeout > 3600000) p->watchdog_timeout = 3600000; /*  1 hr */
+}