svn commit: r184780 - head/usr.sbin/cron/crontab
Matteo Riondato
matteo at FreeBSD.org
Sat Nov 8 23:34:12 PST 2008
Author: matteo
Date: Sun Nov 9 07:34:11 2008
New Revision: 184780
URL: http://svn.freebsd.org/changeset/base/184780
Log:
Don't leave files in /var/cront/tabs when interrupted
PR: 17363
MFC after: 3 days
Modified:
head/usr.sbin/cron/crontab/crontab.c
Modified: head/usr.sbin/cron/crontab/crontab.c
==============================================================================
--- head/usr.sbin/cron/crontab/crontab.c Sun Nov 9 06:44:53 2008 (r184779)
+++ head/usr.sbin/cron/crontab/crontab.c Sun Nov 9 07:34:11 2008 (r184780)
@@ -63,6 +63,7 @@ static FILE *NewCrontab;
static int CheckErrorCount;
static enum opt_t Option;
static struct passwd *pw;
+static char *tmp_path;
static void list_cmd(void),
delete_cmd(void),
edit_cmd(void),
@@ -486,6 +487,16 @@ edit_cmd() {
}
+void
+static remove_tmp(int sig)
+{
+ if (tmp_path) {
+ unlink(tmp_path);
+ }
+ exit(ERROR_EXIT);
+}
+
+
/* returns 0 on success
* -1 on syntax error
* -2 on install error
@@ -498,6 +509,7 @@ replace_cmd() {
entry *e;
time_t now = time(NULL);
char **envp = env_init();
+ void (*f[3])();
if (envp == NULL) {
warnx("cannot allocate memory");
@@ -506,6 +518,13 @@ replace_cmd() {
(void) snprintf(n, sizeof(n), "tmp.%d", Pid);
(void) snprintf(tn, sizeof(n), CRON_TAB(n));
+
+ /* Set up to remove the temp file if interrupted by a signal. */
+ f[0] = signal(SIGHUP, remove_tmp);
+ f[1] = signal(SIGINT, remove_tmp);
+ f[2] = signal(SIGTERM, remove_tmp);
+ tmp_path = tn;
+
if (!(tmp = fopen(tn, "w+"))) {
warn("%s", tn);
return (-2);
@@ -598,6 +617,13 @@ replace_cmd() {
unlink(tn);
return (-2);
}
+
+ /* Restore the default signal handlers. */
+ tmp_path = NULL;
+ signal(SIGHUP, f[0]);
+ signal(SIGINT, f[1]);
+ signal(SIGTERM, f[2]);
+
log_it(RealUser, Pid, "REPLACE", User);
poke_daemon();
More information about the svn-src-head
mailing list