1 #ifndef lint 2 static char *sccsid = "@(#)atrun.c 4.4 (Berkeley) 07/02/83"; 3 #endif 4 /* 5 * Run programs submitted by at. 6 */ 7 #include <stdio.h> 8 #include <sys/param.h> 9 #include <sys/dir.h> 10 #include <sys/time.h> 11 #include <sys/stat.h> 12 13 # define ATDIR "/usr/spool/at" 14 # define PDIR "past" 15 # define LASTF "/usr/spool/at/lasttimedone" 16 17 int nowtime; 18 int nowdate; 19 int nowyear; 20 21 main(argc, argv) 22 char **argv; 23 { 24 int tt, day, year, uniq; 25 struct direct *dirent; 26 DIR *dirp; 27 28 chdir(ATDIR); 29 makenowtime(); 30 if ((dirp = opendir(".")) == NULL) { 31 fprintf(stderr, "Cannot read at directory\n"); 32 exit(1); 33 } 34 while ((dirent = readdir(dirp)) != NULL) { 35 if (dirent->d_ino==0) 36 continue; 37 if (sscanf(dirent->d_name, "%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(dirent->d_name); 46 } 47 closedir(dirp); 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, "%04d\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 /* printf("running %s\n", file); */ 85 if (fork()!=0) 86 return; 87 for (i=0; i<15; i++) 88 close(i); 89 dup(dup(open("/dev/null", 0))); 90 sprintf(sbuf, "%s/%s", PDIR, file); 91 link(file, sbuf); 92 unlink(file); 93 chdir(PDIR); 94 if (stat(file, &stbuf) == -1) 95 exit(1); 96 if (pid = fork()) { 97 if (pid == -1) 98 exit(1); 99 wait((int *)0); 100 unlink(file); 101 exit(0); 102 } 103 setgid(stbuf.st_gid); 104 setuid(stbuf.st_uid); 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 } 110