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