Minix1.5/commands/atrun.c

Compare this file to the similar file:
Show the results in this format:

/* atrun - perform the work 'at' has squirreled away	Author: Jan Looyen */

/*-------------------------------------------------------------------------*
 *	atrun scans directory /usr/spool/at for 'at' jobs to be executed.  *
 *	Finished jobs have been moved to directory /usr/spool/at/past.     *
 *-------------------------------------------------------------------------*/
#include <sys/types.h>
#include <sys/dir.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <limits.h>
#include <time.h>
#include <stdio.h>

main()
{
  int fd, nr;
  char realtime[15], procname[35], procpast[35];
  struct direct dirbuf;
  struct tm *p, *localtime();
  struct stat sbuf;
  time_t clock;

/*-------------------------------------------------------------------------*
 *	Compute real time,  move 'at' jobs whose filenames < real time to  *
 *	/usr/spool/at/past and start a sh for each job.			   *
 *-------------------------------------------------------------------------*/
  time(&clock);
  p = localtime(&clock);
  sprintf(realtime, "%02d.%03d.%02d%02d.00",
	p->tm_year % 100, p->tm_yday, p->tm_hour, p->tm_min);
  if ((fd = open("/usr/spool/at", O_RDONLY)) > 0)
	while (read(fd, (char *) &dirbuf, sizeof(dirbuf)) > 0)
		if (dirbuf.d_ino > 0 &&
		    dirbuf.d_name[0] != '.' &&
		    dirbuf.d_name[0] != 'p' &&
		    strncmp(dirbuf.d_name, realtime, 11) <= 0) {

			sprintf(procname, "/usr/spool/at/%.14s", dirbuf.d_name);
			sprintf(procpast, "/usr/spool/at/past/%.14s", dirbuf.d_name);

			if (fork() == 0)	/* code for child */
				if (link(procname, procpast) == 0) {	/* link ok? */
					unlink(procname);
					stat(procpast, &sbuf);
					setgid(sbuf.st_uid);
					setuid(sbuf.st_gid);
					execl("/bin/sh", "sh", procpast, (char *) 0);
					fprintf(stderr, "proc %s can't start\n", procpast);
					exit(1);
				}
		}
}