|
|
1.1 ! root 1: #include <stddef.h> ! 2: #include <stdio.h> ! 3: #include <sys/types.h> ! 4: #include <sys/stat.h> ! 5: #include <fcntl.h> ! 6: #include <unistd.h> ! 7: #include "dist.h" ! 8: ! 9: void ! 10: recvjob(void) ! 11: { ! 12: char data[MAXNAME], errs[MAXNAME], mesg[MAXLINE]; ! 13: int dfd, efd, attempt, status; ! 14: ! 15: if (!getline(mesg)) ! 16: exit(0); ! 17: ! 18: if (sscanf(mesg, "begin job %s", data) != 1) { ! 19: eprintf("job header munged: mesg = %s", mesg); ! 20: exit(1); ! 21: } ! 22: ! 23: sprintf(data, "data.%d", getpid()); ! 24: remove(data); ! 25: dfd = creat(data, 0600); /* ape deficiency */ ! 26: close(dfd); ! 27: dfd = open(data, O_RDWR); ! 28: if (dfd < 0) { ! 29: eprintf("can't create data file %s", data); ! 30: exit(1); ! 31: } ! 32: ! 33: if (!recvfile(dfd)) { ! 34: remove(data); ! 35: eprintf("recvfile failed"); ! 36: exit(1); ! 37: } ! 38: ! 39: /* see if file system permissions will likely allow inspkg to succeed */ ! 40: lseek(dfd, 0L, 0); ! 41: attempt = tryperm(dfd); ! 42: sprintf(mesg, "client attempt=%d\n", attempt); ! 43: write(1, mesg, strlen(mesg)); ! 44: ! 45: if (attempt) { ! 46: sprintf(errs, "errs.%d", getpid()); ! 47: efd = creat(errs, 0600); /* more ape bogosity */ ! 48: close(efd); ! 49: efd = open(errs, O_RDWR); ! 50: if (efd < 0) { ! 51: eprintf("can't create errs file %s", errs); ! 52: exit(1); ! 53: } ! 54: ! 55: if (fork()) { ! 56: status = 0xFF; /* evilly catch wait failures */ ! 57: wait(&status); ! 58: if (status & 0xFF) { ! 59: sprintf(mesg, "inspkg: exit %d\n", status & 0xFF); ! 60: write(efd, mesg, strlen(mesg)); ! 61: } ! 62: } else { ! 63: lseek(dfd, 0L, 0); ! 64: dup2(dfd, 0); ! 65: dup2(efd, 1); ! 66: dup2(efd, 2); ! 67: close(dfd); ! 68: close(efd); ! 69: execl(LDIR "/inspkg", "inspkg", 0); ! 70: eprintf("can't exec inspkg"); ! 71: exit(1); ! 72: } ! 73: ! 74: lseek(efd, 0L, 0); ! 75: if (!sendfile(efd)) { ! 76: remove(data); ! 77: remove(errs); ! 78: eprintf("can't send error log"); ! 79: exit(1); ! 80: } ! 81: } ! 82: ! 83: close(dfd); ! 84: remove(data); ! 85: close(efd); ! 86: remove(errs); ! 87: } ! 88: ! 89: int ! 90: main(int argc, char *argv[]) ! 91: { ! 92: prog = argv[0]; ! 93: for (;;) ! 94: recvjob(); ! 95: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.