|
|
1.1 ! root 1: #include "decl.h" ! 2: #include <signal.h> ! 3: #include <errno.h> ! 4: #include <pwd.h> ! 5: ! 6: extern "C" { ! 7: extern int dup2 (int, int); ! 8: extern int fork(); ! 9: extern int setupshares (int, void(*)() = 0); ! 10: extern void perror (char*); ! 11: extern int errno; ! 12: extern int sys_nerr; ! 13: extern char *sys_errlist[]; ! 14: } ! 15: ! 16: static const int bufsize = 4096; ! 17: static const int timeout = 60*10; ! 18: static const int wtimeout = 15; ! 19: ! 20: static void ! 21: alarmcatch(int) ! 22: { ! 23: signal (SIGALRM, alarmcatch); ! 24: } ! 25: ! 26: static void ! 27: die (String s) ! 28: { ! 29: String msg = s; ! 30: if ((unsigned) errno < sys_nerr) ! 31: msg += ":" + String(sys_errlist[errno]); ! 32: msg += "\n"; ! 33: cout << msg; ! 34: exit (1); ! 35: } ! 36: ! 37: static void ! 38: twrite (char* buf, int len) ! 39: { ! 40: alarm (timeout); ! 41: int n = write (1, buf, len); ! 42: alarm (0); ! 43: if (n != len) ! 44: die ("remote write failed"); ! 45: } ! 46: ! 47: static int ! 48: tread (char* buf, int len) ! 49: { ! 50: alarm (timeout); ! 51: int n = read (0, buf, len); ! 52: alarm (0); ! 53: if (n < 0) ! 54: die ("remote read failed"); ! 55: return n; ! 56: } ! 57: ! 58: static void ! 59: send (char* s) ! 60: { ! 61: twrite (s, strlen (s)); ! 62: } ! 63: ! 64: static int ! 65: mkfile (String file) ! 66: { ! 67: unlink (file); ! 68: int fd = creat (file, 0600); ! 69: if (fd < 0) ! 70: die ("temp file creat"); ! 71: if (close (fd) < 0) ! 72: die ("temp file close"); ! 73: fd = open (file, 2); ! 74: if (fd < 0) ! 75: die ("temp file reopen"); ! 76: if (unlink (file) < 0) ! 77: die ("temp file unlink"); ! 78: return fd; ! 79: } ! 80: ! 81: main() ! 82: { ! 83: signal (SIGALRM, alarmcatch); ! 84: ! 85: /* announce our presence */ ! 86: send ("asd\n"); ! 87: ! 88: /* use daemon's share instead of root */ ! 89: struct passwd *pw; ! 90: pw = getpwnam ("daemon"); ! 91: if (pw) ! 92: setupshares (pw->pw_uid); ! 93: char buf[bufsize]; ! 94: int n; ! 95: checksum cs, rcs; ! 96: ! 97: umask (077); ! 98: ! 99: /* make a temp file to hold the data */ ! 100: Path tfile = Path(tmpdir) & "asd" + String(dec(getpid())); ! 101: int infd = mkfile (tfile); ! 102: int outfd = mkfile (tfile); ! 103: ! 104: /* copy the data to the input temp file and checksum it */ ! 105: while ((n = tread (buf, bufsize)) > 0) { ! 106: cs.combine (buf, n); ! 107: if (write (infd, buf, n) != n) ! 108: die ("temp file write"); ! 109: } ! 110: lseek (infd, 0, 0); ! 111: ! 112: /* Check for normal end of data */ ! 113: if (n < 0) ! 114: die ("remote read"); ! 115: ! 116: /* Try to read the checksum */ ! 117: alarm (timeout); ! 118: n = read (0, rcs); ! 119: alarm (0); ! 120: ! 121: /* Do the checksums match? */ ! 122: if (n != cksize || cs != rcs) { ! 123: cout << "checksum error\n"; ! 124: exit (1); ! 125: } ! 126: ! 127: /* Assert we got the stuff successfully */ ! 128: twrite ("", 0); ! 129: ! 130: /* Run inspkg and put the results in the output temp file */ ! 131: int rc, status; ! 132: int pid = fork(); ! 133: ! 134: switch (pid) { ! 135: case -1: ! 136: die ("fork"); ! 137: ! 138: case 0: // child ! 139: dup2 (infd, 0); ! 140: dup2 (outfd, 1); ! 141: close (infd); ! 142: close (outfd); ! 143: dup2 (1, 2); ! 144: dup2 (1, 3); ! 145: execl (inspkg, "inspkg", (char*) 0); ! 146: die ("execl"); ! 147: ! 148: default: // parent ! 149: do { ! 150: alarm (wtimeout); ! 151: rc = wait (&status); ! 152: alarm (0); ! 153: if (rc == -1) { ! 154: if (errno == EINTR) ! 155: twrite ("\n", 1); ! 156: else ! 157: die ("wait"); ! 158: } ! 159: } while (rc != pid); ! 160: } ! 161: ! 162: /* Send the output temp file to the other end */ ! 163: lseek (outfd, 0, 0); ! 164: while ((n = read (outfd, buf, bufsize)) > 0) ! 165: twrite (buf, n); ! 166: ! 167: /* Check for normal EOF */ ! 168: if (n < 0) ! 169: die ("reading inspkg output"); ! 170: ! 171: /* Report the inspkg return code */ ! 172: cout << "return code " << status << "\n"; ! 173: ! 174: return 0; ! 175: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.