|
|
1.1 root 1: /*
2: * Run programs submitted by at.
3: */
4: #include <stdio.h>
5: #include <sys/param.h>
6: #include <time.h>
7: #include <sys/stat.h>
8: #include <ndir.h>
9: #include <pwd.h>
10:
11: # define SDIR "/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: DIR *dirp;
24: struct direct *dp;
25:
26: chdir(SDIR);
27: makenowtime();
28: if ((dirp = opendir(".")) == 0) {
29: fprintf(stderr, "Cannot read at directory\n");
30: exit(1);
31: }
32: for (dp = readdir(dirp); dp; dp = readdir(dirp)) {
33: if (dp->d_name[0] == '.') {
34: if (dp->d_name[1] == '\0')
35: continue;
36: if (dp->d_name[1] == '.' && dp->d_name[2] == '\0')
37: continue;
38: }
39: if (sscanf(dp->d_name, "%2d.%3d.%4d.%2d", &year, &day, &tt, &uniq) != 4)
40: continue;
41: if (nowyear < year)
42: continue;
43: if (nowyear == year && nowdate < day)
44: continue;
45: if (nowyear == year && nowdate == day && nowtime < tt)
46: continue;
47: run(dp->d_name);
48: }
49: closedir(dirp);
50: updatetime(nowtime);
51: exit(0);
52: }
53:
54: makenowtime()
55: {
56: long t;
57: struct tm *localtime();
58: register struct tm *tp;
59:
60: time(&t);
61: tp = localtime(&t);
62: nowtime = tp->tm_hour*100 + tp->tm_min;
63: nowdate = tp->tm_yday;
64: nowyear = tp->tm_year;
65: }
66:
67: updatetime(t)
68: {
69: FILE *tfile;
70:
71: tfile = fopen(LASTF, "w");
72: if (tfile == NULL) {
73: fprintf(stderr, "can't write lastfile\n");
74: exit(1);
75: }
76: fprintf(tfile, "%.4d\n", t);
77: }
78:
79: run(file)
80: char *file;
81: {
82: struct stat stbuf;
83: register pid, i;
84: char sbuf[64];
85: struct passwd *pw;
86: struct passwd *getpwuid();
87:
88: if (fork()!=0)
89: return;
90: for (i=0; i<NOFILE; i++)
91: close(i);
92: dup(dup(dup(open("/dev/null", 2))));
93: sprintf(sbuf, "%s/%s", PDIR, file);
94: link(file, sbuf);
95: unlink(file);
96: chdir(PDIR);
97: if (stat(file, &stbuf) == -1)
98: exit(1);
99: if ((pw = getpwuid(stbuf.st_uid)) == NULL)
100: exit(1); /* cruel but fair */
101: if (pid = fork()) {
102: if (pid == -1)
103: exit(1);
104: wait((int *)0);
105: unlink(file);
106: exit(0);
107: }
108: setlogname(pw->pw_name);
109: (void)setupshares(stbuf.st_uid, (void (*)())0);
110: setupgroups(pw->pw_name, stbuf.st_gid);
111: setgid(stbuf.st_gid);
112: setuid(stbuf.st_uid);
113: nice(5);
114: execl("/bin/sh", "sh", file, 0);
115: execl("/usr/bin/sh", "sh", file, 0);
116: fprintf(stderr, "Can't execl shell\n");
117: exit(1);
118: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.