|
|
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: FILE *dirf; ! 24: ! 25: setuid(0); ! 26: setgid(0); ! 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: if (sscanf(dirent.d_name, "%2d.%3d.%4d.%2d", &year, &day, &tt, &uniq) != 4) ! 37: continue; ! 38: if (nowyear < year) ! 39: continue; ! 40: if (nowyear==year && nowdate < day) ! 41: continue; ! 42: if (nowyear==year && nowdate==day && nowtime < tt) ! 43: continue; ! 44: run(dirent.d_name); ! 45: } ! 46: fclose(dirf); ! 47: updatetime(nowtime); ! 48: exit(0); ! 49: } ! 50: ! 51: makenowtime() ! 52: { ! 53: long t; ! 54: struct tm *localtime(); ! 55: register struct tm *tp; ! 56: ! 57: time(&t); ! 58: tp = localtime(&t); ! 59: nowtime = tp->tm_hour*100 + tp->tm_min; ! 60: nowdate = tp->tm_yday; ! 61: nowyear = tp->tm_year; ! 62: } ! 63: ! 64: updatetime(t) ! 65: { ! 66: FILE *tfile; ! 67: ! 68: tfile = fopen(LASTF, "w"); ! 69: if (tfile == NULL) { ! 70: fprintf(stderr, "can't write lastfile\n"); ! 71: exit(1); ! 72: } ! 73: fprintf(tfile, "%04d\n", t); ! 74: } ! 75: ! 76: run(file) ! 77: char *file; ! 78: { ! 79: struct stat stbuf; ! 80: register pid, i; ! 81: char sbuf[64]; ! 82: ! 83: /* printf("running %s\n", file); */ ! 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, "/bin/mv %.14s %s", file, PDIR); ! 90: system(sbuf); ! 91: chdir(PDIR); ! 92: if (stat(file, &stbuf) == -1) ! 93: exit(1); ! 94: if (pid = fork()) { ! 95: if (pid == -1) ! 96: exit(1); ! 97: wait((int *)0); ! 98: unlink(file); ! 99: exit(0); ! 100: } ! 101: setgid(stbuf.st_gid); ! 102: setuid(stbuf.st_uid); ! 103: nice(3); ! 104: execl("/bin/sh", "sh", file, 0); ! 105: execl("/usr/bin/sh", "sh", file, 0); ! 106: fprintf(stderr, "Can't execl shell\n"); ! 107: exit(1); ! 108: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.