|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <sysexits.h> ! 3: ! 4: /* string extraction/restoration routines */ ! 5: ! 6: /* ! 7: STR_FILE must be defined as a quoted string on the cc command line, ! 8: for example: ! 9: ! 10: -DSTR_FILE=\\\"/usr/local/lib/kermit5.sr\\\" ! 11: ! 12: This is the file where the strings go, and where C-Kermit looks for them ! 13: at runtime. ! 14: */ ! 15: #ifdef STR_FILE ! 16: char *StringFile = STR_FILE; ! 17: #else ! 18: char *StringFile = "/usr/local/lib/kermit5.sr"; ! 19: #endif /* STR_FILE */ ! 20: ! 21: #ifdef STR_CTIMED ! 22: char *Ctimed = STR_CTIMED; ! 23: #else ! 24: char *Ctimed = "/usr/lib/ctimed"; ! 25: #endif ! 26: ! 27: extern int errno; ! 28: static int strfile = -1, ourpid = 0; ! 29: ! 30: #define BUFLEN 256 ! 31: ! 32: errprep(offset, buf) ! 33: unsigned short offset; ! 34: char *buf; ! 35: { ! 36: register int pid = getpid(); ! 37: ! 38: if (pid != ourpid) { ! 39: ourpid = pid; ! 40: if (strfile >= 0) { ! 41: close(strfile); ! 42: strfile = -1; ! 43: } ! 44: } ! 45: if (strfile < 0) { ! 46: char *p, *getenv(); ! 47: if (p = getenv("KSTR")) ! 48: if (strlen(p)) ! 49: StringFile = p; ! 50: strfile = open(StringFile, 0); ! 51: if (strfile < 0) { ! 52: oops: ! 53: fprintf(stderr, "Cannot find %s\r\n", StringFile); ! 54: exit(EX_OSFILE); ! 55: } ! 56: } ! 57: if (lseek(strfile, (long) offset, 0) < 0 ! 58: || read(strfile, buf, BUFLEN) <= 0) ! 59: goto oops; ! 60: } ! 61: ! 62: /* extracted string front end for printf() */ ! 63: /*VARARGS1*/ ! 64: strprerror(fmt, a, b, c, d, e, f, g, h, i, j, k, l) ! 65: int fmt; ! 66: { ! 67: char buf[BUFLEN]; ! 68: ! 69: errprep(fmt, buf); ! 70: printf(buf, a, b, c, d, e, f, g, h, i ,j, k, l); ! 71: } ! 72: ! 73: /* extracted string front end for sprintf() */ ! 74: /*VARARGS1*/ ! 75: strsrerror(fmt, obuf, a, b, c, d, e, f, g, h, i, j, k, l) ! 76: int fmt; ! 77: char *obuf; ! 78: { ! 79: char buf[BUFLEN]; ! 80: ! 81: errprep(fmt, buf); ! 82: sprintf(obuf, buf, a, b, c, d, e, f, g, h, i, j, k, l); ! 83: } ! 84: ! 85: /* extracted string front end for fprintf() */ ! 86: /*VARARGS1*/ ! 87: strfrerror(fmt, fd, a, b, c, d, e, f, g, h, i, j, k, l) ! 88: int fmt, fd; ! 89: { ! 90: char buf[BUFLEN]; ! 91: ! 92: errprep(fmt, buf); ! 93: fprintf(fd, buf, a, b, c, d, e, f, g, h, i, j, k, l); ! 94: } ! 95: ! 96: /* extracted string front end for perror() */ ! 97: strperror(fmt) ! 98: int fmt; ! 99: { ! 100: char buf[BUFLEN]; ! 101: register int saverr = errno; ! 102: ! 103: errprep(fmt, buf); ! 104: errno = saverr; ! 105: perror(buf); ! 106: } ! 107: ! 108: perror(str) ! 109: char *str; ! 110: { ! 111: ! 112: printf("%s: errno %d\n", str, errno); ! 113: } ! 114: ! 115: #include <sys/types.h> ! 116: #include <sys/time.h> ! 117: ! 118: #define SEND_FD W[1] ! 119: #define RECV_FD R[0] ! 120: ! 121: #define CTIME 1 ! 122: #define ASCTIME 2 ! 123: #define TZSET 3 ! 124: #define LOCALTIME 4 ! 125: #define GMTIME 5 ! 126: #define OFFTIME 6 ! 127: ! 128: static int R[2], W[2], inited; ! 129: static char result[26]; ! 130: static struct tm tmtmp; ! 131: ! 132: char * ! 133: ctime(t) ! 134: time_t *t; ! 135: { ! 136: u_char fnc = CTIME; ! 137: ! 138: sewer(); ! 139: write(SEND_FD, fnc, sizeof fnc); ! 140: write(SEND_FD, t, sizeof (*t)); ! 141: getb(RECV_FD, result, 26); ! 142: return(result); ! 143: } ! 144: ! 145: char * ! 146: asctime(tp) ! 147: struct tm *tp; ! 148: { ! 149: u_char fnc = ASCTIME; ! 150: ! 151: sewer(); ! 152: write(SEND_FD, &fnc, sizeof fnc); ! 153: write(SEND_FD, tp, sizeof (*tp)); ! 154: getb(RECV_FD, result, 26); ! 155: return(result); ! 156: } ! 157: ! 158: void ! 159: tzset() ! 160: { ! 161: u_char fnc = TZSET; ! 162: ! 163: sewer(); ! 164: write(SEND_FD, &fnc, sizeof fnc); ! 165: } ! 166: ! 167: struct tm * ! 168: localtime(tp) ! 169: time_t *tp; ! 170: { ! 171: u_char fnc = LOCALTIME; ! 172: ! 173: sewer(); ! 174: write(SEND_FD, &fnc, sizeof fnc); ! 175: write(SEND_FD, tp, sizeof (*tp)); ! 176: getb(RECV_FD, &tmtmp, sizeof tmtmp); ! 177: getb(RECV_FD, result, 24); ! 178: tmtmp.tm_zone = result; ! 179: return(&tmtmp); ! 180: } ! 181: ! 182: struct tm * ! 183: gmtime(tp) ! 184: time_t *tp; ! 185: { ! 186: u_char fnc = GMTIME; ! 187: ! 188: sewer(); ! 189: write(SEND_FD, &fnc, sizeof fnc); ! 190: write(SEND_FD, tp, sizeof (*tp)); ! 191: getb(RECV_FD, &tmtmp, sizeof tmtmp); ! 192: getb(RECV_FD, result, 24); ! 193: tmtmp.tm_zone = result; ! 194: return(&tmtmp); ! 195: } ! 196: ! 197: struct tm * ! 198: offtime(clock, offset) ! 199: time_t *clock; ! 200: long offset; ! 201: { ! 202: u_char fnc = OFFTIME; ! 203: ! 204: sewer(); ! 205: write(SEND_FD, &fnc, sizeof fnc); ! 206: write(SEND_FD, clock, sizeof (*clock)); ! 207: write(SEND_FD, &offset, sizeof offset); ! 208: getb(RECV_FD, &tmtmp, sizeof tmtmp); ! 209: tmtmp.tm_zone = ""; ! 210: return(&tmtmp); ! 211: } ! 212: ! 213: getb(f, p, n) ! 214: register int f, n; ! 215: register char *p; ! 216: { ! 217: int i; ! 218: ! 219: while (n) ! 220: { ! 221: i = read(f, p, n); ! 222: if (i <= 0) ! 223: return; ! 224: p += i; ! 225: n -= i; ! 226: } ! 227: } ! 228: ! 229: sewer() ! 230: { ! 231: register int pid, ourpid = getpid(); ! 232: ! 233: if (inited == ourpid) ! 234: return; ! 235: if (inited) ! 236: { ! 237: close(SEND_FD); ! 238: close(RECV_FD); ! 239: } ! 240: pipe(W); ! 241: pipe(R); ! 242: pid = vfork(); ! 243: if (pid == 0) ! 244: { /* child */ ! 245: alarm(0); /* cancel alarms */ ! 246: dup2(W[0], 0); /* parent write side to our stdin */ ! 247: dup2(R[1], 1); /* parent read side to our stdout */ ! 248: close(SEND_FD); /* copies made, close the... */ ! 249: close(RECV_FD); /* originals now */ ! 250: execl(Ctimed, "ctimed", 0); ! 251: _exit(EX_OSFILE); ! 252: } ! 253: if (pid == -1) ! 254: abort(); /* nothing else really to do */ ! 255: close(W[0]); /* close read side of SEND channel */ ! 256: close(R[1]); /* close write side of RECV channel */ ! 257: inited = ourpid; /* don't do this again in this proc */ ! 258: } ! 259: ! 260: XXctime() ! 261: { ! 262: ! 263: if (SEND_FD) ! 264: close(SEND_FD); ! 265: if (RECV_FD) ! 266: close(RECV_FD); ! 267: SEND_FD = RECV_FD = 0; ! 268: inited = 0; ! 269: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.