Marcela Mašláňová 489143
--- at-3.1.10/atd.c.instinet	2006-09-12 11:01:10.000000000 +0200
Marcela Mašláňová 489143
+++ at-3.1.10/atd.c	2006-09-12 11:24:49.000000000 +0200
Marcela Mašláňová 489143
@@ -102,7 +102,7 @@
Marcela Mašláňová 489143
 static const char *svnid = "$Id$";
Marcela Mašláňová 489143
 static double load_avg = LOADAVG_MX;
Marcela Mašláňová 489143
 static time_t now;
Marcela Mašláňová 489143
-static time_t last_chg;
Marcela Mašláňová 489143
+//static time_t last_chg;
Marcela Mašláňová 489143
 static int nothing_to_do;
Marcela Mašláňová 489143
 unsigned int batch_interval;
Marcela Mašláňová 489143
 static int run_as_daemon = 0;
Marcela Mašláňová 489143
@@ -197,7 +197,7 @@
Marcela Mašláňová 489143
 #endif
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
 static void
Marcela Mašláňová 489143
-run_file(const char *filename, uid_t uid, gid_t gid)
Marcela Mašláňová 489143
+run_file(char *filename, uid_t uid, gid_t gid)
Marcela Mašláňová 489143
 {
Marcela Mašláňová 489143
 /* Run a file by by spawning off a process which redirects I/O,
Marcela Mašláňová 489143
  * spawns a subshell, then waits for it to complete and sends
Marcela Mašláňová 489143
@@ -208,7 +208,7 @@
Marcela Mašláňová 489143
     char jobbuf[9];
Marcela Mašláňová 489143
     char *mailname = NULL;
Marcela Mašláňová 489143
     int mailsize = 128;
Marcela Mašláňová 489143
-    char *newname;
Marcela Mašláňová 489143
+    char newname[256];
Marcela Mašláňová 489143
     FILE *stream;
Marcela Mašláňová 489143
     int send_mail = 0;
Marcela Mašláňová 489143
     struct stat buf, lbuf;
Marcela Mašláňová 489143
@@ -242,11 +242,17 @@
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
     sprintf(jobbuf, "%8lu", jobno);
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
-    if ((newname = malloc(strlen(filename) + 1)) == NULL)
Marcela Mašláňová 489143
-	pabort("Job %8lu : out of virtual memory", jobno);
Marcela Mašláňová 489143
+    if( strlen( filename ) >= sizeof( newname ) - 1 )
Marcela Mašláňová 489143
+       pabort("File name too long: %s", filename );
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
     strcpy(newname, filename);
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
+    newname[0] = '!';
Marcela Mašláňová 489143
+
Marcela Mašláňová 489143
+    if( rename( filename, newname ) < 0 )
Marcela Mašláňová 489143
+	perr( "Error renaming job file." );
Marcela Mašláňová 489143
+
Marcela Mašláňová 489143
+    filename[0] = '!';
Marcela Mašláňová 489143
     newname[0] = '=';
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
     /* We try to make a hard link to lock the file.  If we fail, then
Marcela Mašláňová 489143
@@ -264,14 +270,15 @@
Marcela Mašláňová 489143
 	}
Marcela Mašláňová 489143
     }
Marcela Mašláňová 489143
     /* If something goes wrong between here and the unlink() call,
Marcela Mašláňová 489143
-     * the job gets restarted as soon as the "=" entry is cleared
Marcela Mašláňová 489143
-     * by the main atd loop.
Marcela Mašláňová 489143
-     */
Marcela Mašláňová 489143
+     * the job will remain in the "!" queue.
Marcela Mašláňová 489143
+     * no point in retrying, and need glaring proof that something went wrong
Marcela Mašláňová 489143
+    */
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
     pid = fork();
Marcela Mašláňová 489143
-    if (pid == -1)
Marcela Mašláňová 489143
+    if (pid == -1) {
Marcela Mašláňová 489143
+	unlink(newname);
Marcela Mašláňová 489143
 	perr("Cannot fork");
Marcela Mašláňová 489143
-
Marcela Mašláňová 489143
+    }
Marcela Mašláňová 489143
     else if (pid != 0) {
Marcela Mašláňová 489143
 	free(mailname);
Marcela Mašláňová 489143
 	free(newname);
Marcela Mašláňová 489143
@@ -284,6 +291,7 @@
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
     pentry = getpwuid(uid);
Marcela Mašláňová 489143
     if (pentry == NULL) {
Marcela Mašláňová 489143
+	unlink(newname);
Marcela Mašláňová 489143
 	pabort("Userid %lu not found - aborting job %8lu (%.500s)",
Marcela Mašláňová 489143
 	       (unsigned long) uid, jobno, filename);
Marcela Mašláňová 489143
     }
Marcela Mašláňová 489143
@@ -293,35 +301,43 @@
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
     PRIV_END
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
-    if (stream == NULL)
Marcela Mašláňová 489143
+    if (stream == NULL) {
Marcela Mašláňová 489143
+	unlink( newname );
Marcela Mašláňová 489143
 	perr("Cannot open input file");
Marcela Mašláňová 489143
-
Marcela Mašláňová 489143
-    if ((fd_in = dup(fileno(stream))) < 0)
Marcela Mašláňová 489143
+    }
Marcela Mašláňová 489143
+    if ((fd_in = dup(fileno(stream))) < 0) {
Marcela Mašláňová 489143
+	unlink( newname );
Marcela Mašláňová 489143
 	perr("Error duplicating input file descriptor");
Marcela Mašláňová 489143
-
Marcela Mašláňová 489143
-    if (fstat(fd_in, &buf) == -1)
Marcela Mašláňová 489143
+    }
Marcela Mašláňová 489143
+    if (fstat(fd_in, &buf) == -1) {
Marcela Mašláňová 489143
+	unlink( newname );
Marcela Mašláňová 489143
 	perr("Error in fstat of input file descriptor");
Marcela Mašláňová 489143
-
Marcela Mašláňová 489143
-    if (lstat(filename, &lbuf) == -1)
Marcela Mašláňová 489143
+    }
Marcela Mašláňová 489143
+    if (lstat(filename, &lbuf) == -1) {
Marcela Mašláňová 489143
+	unlink( newname );
Marcela Mašláňová 489143
 	perr("Error in fstat of input file");
Marcela Mašláňová 489143
-
Marcela Mašláňová 489143
-    if (S_ISLNK(lbuf.st_mode))
Marcela Mašláňová 489143
+    }
Marcela Mašláňová 489143
+    if (S_ISLNK(lbuf.st_mode)) {
Marcela Mašláňová 489143
+	unlink( newname );
Marcela Mašláňová 489143
 	perr("Symbolic link encountered in job %8lu (%.500s) - aborting",
Marcela Mašláňová 489143
 	     jobno, filename);
Marcela Mašláňová 489143
-
Marcela Mašláňová 489143
+    }
Marcela Mašláňová 489143
     if ((lbuf.st_dev != buf.st_dev) || (lbuf.st_ino != buf.st_ino) ||
Marcela Mašláňová 489143
 	(lbuf.st_uid != buf.st_uid) || (lbuf.st_gid != buf.st_gid) ||
Marcela Mašláňová 489143
-	(lbuf.st_size != buf.st_size))
Marcela Mašláňová 489143
+	(lbuf.st_size != buf.st_size)) {
Marcela Mašláňová 489143
+	unlink( newname );
Marcela Mašláňová 489143
 	perr("Somebody changed files from under us for job %8lu (%.500s) - "
Marcela Mašláňová 489143
 	     "aborting", jobno, filename);
Marcela Mašláňová 489143
-
Marcela Mašláňová 489143
+    }
Marcela Mašláňová 489143
     if (buf.st_nlink > 2) {
Marcela Mašláňová 489143
+	unlink( newname );
Marcela Mašláňová 489143
 	perr("Somebody is trying to run a linked script for job %8lu (%.500s)",
Marcela Mašláňová 489143
 	     jobno, filename);
Marcela Mašláňová 489143
     }
Marcela Mašláňová 489143
-    if ((fflags = fcntl(fd_in, F_GETFD)) < 0)
Marcela Mašláňová 489143
+    if ((fflags = fcntl(fd_in, F_GETFD)) < 0) {
Marcela Mašláňová 489143
+	unlink( newname );
Marcela Mašláňová 489143
 	perr("Error in fcntl");
Marcela Mašláňová 489143
-
Marcela Mašláňová 489143
+    }
Marcela Mašláňová 489143
     fcntl(fd_in, F_SETFD, fflags & ~FD_CLOEXEC);
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
     /*
Marcela Mašláňová 489143
@@ -335,28 +351,44 @@
Marcela Mašláňová 489143
 	mailsize );
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
     if (fscanf(stream, fmt,
Marcela Mašláňová 489143
-	       &nuid, &ngid, mailname, &send_mail) != 4)
Marcela Mašláňová 489143
+	       &nuid, &ngid, mailname, &send_mail) != 4) {
Marcela Mašláňová 489143
+	unlink( newname );
Marcela Mašláňová 489143
 	pabort("File %.500s is in wrong format - aborting",
Marcela Mašláňová 489143
 	       filename);
Marcela Mašláňová 489143
+    }
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
-    if (mailname[0] == '-')
Marcela Mašláňová 489143
+    if (mailname[0] == '-') {
Marcela Mašláňová 489143
+	unlink( newname );
Marcela Mašláňová 489143
 	pabort("illegal mail name %.300s in job %8lu (%.300s)", mailname,
Marcela Mašláňová 489143
 	       jobno, filename);
Marcela Mašláňová 489143
-
Marcela Mašláňová 489143
-    if (nuid != uid)
Marcela Mašláňová 489143
+    }
Marcela Mašláňová 489143
+    if (nuid != uid) {
Marcela Mašláňová 489143
+	unlink( newname );
Marcela Mašláňová 489143
 	pabort("Job %8lu (%.500s) - userid %d does not match file uid %d",
Marcela Mašláňová 489143
 	       jobno, filename, nuid, uid);
Marcela Mašláňová 489143
-
Marcela Mašláňová 489143
+    }
Marcela Mašláňová 489143
+    if (ngid != gid) {
Marcela Mašláňová 489143
+	unlink( newname );
Marcela Mašláňová 489143
+	pabort("Job %8lu %.500s - groupid %d does not match file gid %d",
Marcela Mašláňová 489143
+	    jobno, filename, ngid, gid);
Marcela Mašláňová 489143
+    }
Marcela Mašláňová 489143
     /* We are now committed to executing this script.  Unlink the
Marcela Mašláňová 489143
      * original.
Marcela Mašláňová 489143
      */
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
     unlink(filename);
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
+    /* If we bail out from now on, the job gets stuck in "="
Marcela Mašláňová 489143
+     * The main loop should take care of that.
Marcela Mašláňová 489143
+     */
Marcela Mašláňová 489143
+
Marcela Mašláňová 489143
     fclose(stream);
Marcela Mašláňová 489143
+
Marcela Mašláňová 489143
     if (chdir(ATSPOOL_DIR) < 0)
Marcela Mašláňová 489143
 	perr("Cannot chdir to " ATSPOOL_DIR);
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
+    filename[0] = queue;
Marcela Mašláňová 489143
+
Marcela Mašláňová 489143
     /* Create a file to hold the output of the job we are about to run.
Marcela Mašláňová 489143
      * Write the mail header.  Complain in case 
Marcela Mašláňová 489143
      */
Marcela Mašláňová 489143
@@ -466,19 +498,19 @@
Marcela Mašláňová 489143
 #endif
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
     /* Send mail.  Unlink the output file after opening it, so it
Marcela Mašláňová 489143
-     * doesn't hang around after the run.
Marcela Mašláňová 489143
+     * doesn't hang around after the run (if we are to send mail).
Marcela Mašláňová 489143
      */
Marcela Mašláňová 489143
-    stat(filename, &buf;;
Marcela Mašláňová 489143
-    if (open(filename, O_RDONLY) != STDIN_FILENO)
Marcela Mašláňová 489143
-	perr("Open of jobfile failed");
Marcela Mašláňová 489143
-
Marcela Mašláňová 489143
-    unlink(filename);
Marcela Mašláňová 489143
+    if( send_mail != -1 ) {
Marcela Mašláňová 489143
+	stat(filename, &buf;;
Marcela Mašláňová 489143
+	if (open(filename, O_RDONLY) != STDIN_FILENO)
Marcela Mašláňová 489143
+	    perr("Open of jobfile failed");
Marcela Mašláňová 489143
+        unlink(filename);
Marcela Mašláňová 489143
+    }
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
     /* The job is now finished.  We can delete its input file.
Marcela Mašláňová 489143
      */
Marcela Mašláňová 489143
     chdir(ATJOB_DIR);
Marcela Mašláňová 489143
     unlink(newname);
Marcela Mašláňová 489143
-    free(newname);
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
     if (((send_mail != -1) && (buf.st_size != size)) || (send_mail == 1)) {
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
@@ -508,6 +540,8 @@
Marcela Mašláňová 489143
     exit(EXIT_SUCCESS);
Marcela Mašláňová 489143
 }
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
+#define CHECK_INTERVAL_5MIN    300
Marcela Mašláňová 489143
+
Marcela Mašláňová 489143
 static time_t
Marcela Mašláňová 489143
 run_loop()
Marcela Mašláňová 489143
 {
Marcela Mašláňová 489143
@@ -537,7 +571,7 @@
Marcela Mašláňová 489143
      * atrun.
Marcela Mašláňová 489143
      */
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
-    next_job = now + CHECK_INTERVAL;
Marcela Mašláňová 489143
+    next_job = now + CHECK_INTERVAL_5MIN;
Marcela Mašláňová 489143
     if (next_batch == 0)
Marcela Mašláňová 489143
 	next_batch = now;
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
@@ -548,11 +582,11 @@
Marcela Mašláňová 489143
 
Marcela Mašláňová 489143
     if (stat(".", &buf) == -1)
Marcela Mašláňová 489143
 	perr("Cannot stat " ATJOB_DIR);
Marcela Mašláňová 489143
-
Marcela Mašláňová 489143
+/*
Marcela Mašláňová 489143
     if (nothing_to_do && buf.st_mtime <= last_chg)
Marcela Mašláňová 489143
 	return next_job;
Marcela Mašláňová 489143
     last_chg = buf.st_mtime;
Marcela Mašláňová 489143
-
Marcela Mašláňová 489143
+*/
Marcela Mašláňová 489143
     if ((spool = opendir(".")) == NULL)
Marcela Mašláňová 489143
 	perr("Cannot read " ATJOB_DIR);
Marcela Mašláňová 489143