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();
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to