|
|
1.1 root 1: static char *sccsid = "@(#)atrun.c 4.2 (Berkeley) 10/21/80";
2: /*
3: * Run programs submitted by at.
4: */
5: #include <stdio.h>
6: #include <sys/types.h>
7: #include <sys/dir.h>
8: #include <time.h>
9: #include <sys/stat.h>
10:
11: # define DIR "/usr/spool/at"
12: # define PDIR "past"
13: # define LASTF "/usr/spool/at/lasttimedone"
14:
15: int nowtime;
16: int nowdate;
17: int nowyear;
18:
19: main(argc, argv)
20: char **argv;
21: {
22: int tt, day, year, uniq;
23: struct direct dirent;
24: FILE *dirf;
25: char file[DIRSIZ+1];
26:
27: chdir(DIR);
28: makenowtime();
29: if ((dirf = fopen(".", "r")) == NULL) {
30: fprintf(stderr, "Cannot read at directory\n");
31: exit(1);
32: }
33: while (fread((char *)&dirent, sizeof(dirent), 1, dirf) == 1) {
34: if (dirent.d_ino==0)
35: continue;
36: strcpyn(file, dirent.d_name, DIRSIZ);
37: file[DIRSIZ] = '\0';
38: if (sscanf(file, "%2d.%3d.%4d.%2d", &year, &day, &tt, &uniq) != 4)
39: continue;
40: if (nowyear < year)
41: continue;
42: if (nowyear==year && nowdate < day)
43: continue;
44: if (nowyear==year && nowdate==day && nowtime < tt)
45: continue;
46: run(file);
47: }
48: fclose(dirf);
49: updatetime(nowtime);
50: exit(0);
51: }
52:
53: makenowtime()
54: {
55: long t;
56: struct tm *localtime();
57: register struct tm *tp;
58:
59: time(&t);
60: tp = localtime(&t);
61: nowtime = tp->tm_hour*100 + tp->tm_min;
62: nowdate = tp->tm_yday;
63: nowyear = tp->tm_year;
64: }
65:
66: updatetime(t)
67: {
68: FILE *tfile;
69:
70: tfile = fopen(LASTF, "w");
71: if (tfile == NULL) {
72: fprintf(stderr, "can't write lastfile\n");
73: exit(1);
74: }
75: fprintf(tfile, "%04d\n", t);
76: }
77:
78: run(file)
79: char *file;
80: {
81: struct stat stbuf;
82: register pid, i;
83: char sbuf[64];
84:
85: /* printf("running %s\n", file); */
86: if (fork()!=0)
87: return;
88: for (i=0; i<15; i++)
89: close(i);
90: dup(dup(open("/dev/null", 0)));
91: sprintf(sbuf, "%s/%s", PDIR, file);
92: link(file, sbuf);
93: unlink(file);
94: chdir(PDIR);
95: if (stat(file, &stbuf) == -1)
96: exit(1);
97: if (pid = fork()) {
98: if (pid == -1)
99: exit(1);
100: wait((int *)0);
101: unlink(file);
102: exit(0);
103: }
104: setgid(stbuf.st_gid);
105: setuid(stbuf.st_uid);
106: execl("/bin/sh", "sh", file, 0);
107: execl("/usr/bin/sh", "sh", file, 0);
108: fprintf(stderr, "Can't execl shell\n");
109: exit(1);
110: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.