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)
{
{
const char *name = init_file_name();
const char *suffix = ".tmp";
+
+ char *n2 = chase_symlinks (name);
+ if (n2) name = n2;
+
if (!name || !*name)
file = "";
else
strcpy(file, name);
strcat(file, suffix);
}
+
+ if (n2) free (n2);
}
if (file && *file)
"sgiSaverExtension",
"mitSaverExtension",
"xidleExtension",
+ "procInterrupts",
"overlayStderr",
"overlayTextBackground", /* not saved -- X resources only */
"overlayTextForeground", /* not saved -- X resources only */
if (!p->db) abort();
handle_entry (&p->db, key, value, name, line);
}
+ fclose (in);
free(buf);
p->init_file_date = write_date;
{
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;
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);
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;
tmp_name, (unsigned int) mode);
perror(buf);
free(buf);
- return;
+ goto END;
}
}
CHECK("sgiSaverExtension")type = pref_bool, b=p->use_sgi_saver_extension;
CHECK("mitSaverExtension")type = pref_bool, b=p->use_mit_saver_extension;
CHECK("xidleExtension") type = pref_bool, b = p->use_xidle_extension;
+ CHECK("procInterrupts") type = pref_bool, b = p->use_proc_interrupts;
CHECK("overlayStderr") type = pref_bool, b = overlay_stderr_p;
CHECK("overlayTextBackground") continue; /* don't save */
CHECK("overlayTextForeground") continue; /* don't save */
perror(buf);
unlink (tmp_name);
free(buf);
- return;
+ goto END;
}
if (rename (tmp_name, name) != 0)
perror(buf);
unlink (tmp_name);
free(buf);
- return;
+ goto END;
}
else
{
perror(buf);
free(buf);
unlink (tmp_name);
- return;
+ goto END;
}
+
+ END:
+ if (n2) free (n2);
}
\f
"Boolean");
p->use_sgi_saver_extension = get_boolean_resource ("sgiSaverExtension",
"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 = 0;
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->fade_p = False;
if (! p->fade_p) p->unfade_p = False;
- if (p->verbose_p && !p->fading_possible_p && (p->fade_p || p->unfade_p))
- {
- fprintf (stderr, "%s: there are no PseudoColor or GrayScale visuals.\n",
- blurb());
- fprintf (stderr, "%s: ignoring the request for fading/unfading.\n",
- blurb());
- }
-
- p->watchdog_timeout = p->cycle;
+ 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 */