54 lines
1.8 KiB
C
54 lines
1.8 KiB
C
/* 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);
|
|
}
|
|
}
|
|
}
|