|
|
1.1 ! root 1: #include <sys/types.h> ! 2: #include <stdio.h> ! 3: #include <ctype.h> ! 4: #include <signal.h> ! 5: #include <dir.h> ! 6: ! 7: char *cpp = "/lib/cpp"; ! 8: char *ccom = "/lib/ccom"; ! 9: char *c2 = "/lib/c2"; ! 10: char *as = "/bin/as"; ! 11: char *ld = "/bin/ld"; ! 12: char *crt0 = "/lib/crt0.o"; ! 13: char *instrcnt = "/lib/instrcnt"; ! 14: ! 15: char tmp0[30]; /* big enough for /tmp/ctm%05.5d */ ! 16: char *tmp1, *tmp2, *tmp3, *tmp4, *tmp5; ! 17: char *outfile; ! 18: char *savestr(), *strspl(), *setsuf(); ! 19: int idexit(); ! 20: char **av, **clist, **llist, **plist; ! 21: int cflag, eflag, gflag, oflag, pflag, sflag, wflag, Rflag, exflag, proflag; ! 22: int vflag, Cflag; ! 23: char *dflag; ! 24: int exfail; ! 25: char *chpass; ! 26: char *npassname; ! 27: extern int optind; ! 28: extern int opterr; ! 29: extern char *optarg; ! 30: extern int optopt; ! 31: ! 32: int nc, nl, np, nxo, na; ! 33: ! 34: #define cunlink(s) if (s) unlink(s) ! 35: ! 36: main(argc, argv) ! 37: char **argv; ! 38: { ! 39: char *t; ! 40: char *assource; ! 41: int i, j, c; ! 42: char errbuf[BUFSIZE]; ! 43: setbuf(stderr, errbuf); ! 44: ! 45: /* ld currently adds upto 5 args; 10 is room to spare */ ! 46: av = (char **)calloc(argc+10, sizeof (char **)); ! 47: clist = (char **)calloc(argc, sizeof (char **)); ! 48: llist = (char **)calloc(argc, sizeof (char **)); ! 49: plist = (char **)calloc(argc, sizeof (char **)); ! 50: opterr = 0; ! 51: while (optind<argc) switch (c = getopt(argc, argv, "vsSo:RiOPgwEpPcD:I:U:C:t:B:l:d:")) { ! 52: case 'i': ! 53: Cflag++; ! 54: continue; ! 55: case 'v': ! 56: vflag++; ! 57: continue; ! 58: case 'S': ! 59: sflag++; ! 60: cflag++; ! 61: continue; ! 62: case 'l': ! 63: llist[nl++] = strspl("-l", optarg); ! 64: continue; ! 65: case 'o': ! 66: outfile = optarg; ! 67: switch (getsuf(outfile)) { ! 68: ! 69: case 'c': ! 70: case 'o': ! 71: error("-o would overwrite %s", outfile); ! 72: exit(8); ! 73: } ! 74: continue; ! 75: case 'R': ! 76: Rflag++; ! 77: continue; ! 78: case 'O': ! 79: oflag++; ! 80: continue; ! 81: case 'p': ! 82: proflag++; ! 83: continue; ! 84: case 'g': ! 85: gflag++; ! 86: continue; ! 87: case 'w': ! 88: wflag++; ! 89: continue; ! 90: case 'E': ! 91: exflag++; ! 92: case 'P': ! 93: pflag++; ! 94: t = strspl("-", "x"); ! 95: t[1] = optopt; ! 96: plist[np++] = t; ! 97: case 'c': ! 98: cflag++; ! 99: continue; ! 100: case 'D': ! 101: case 'I': ! 102: case 'U': ! 103: case 'C': ! 104: plist[np] = strspl("-X", optarg); ! 105: plist[np++][1] = c; ! 106: continue; ! 107: case 't': ! 108: if (chpass) ! 109: error("-t overwrites earlier option", 0); ! 110: chpass = optarg; ! 111: if (chpass[0]==0) ! 112: chpass = "012p"; ! 113: continue; ! 114: case 'B': ! 115: if (npassname) ! 116: error("-B overwrites earlier option", 0); ! 117: npassname = optarg; ! 118: if (npassname[0]==0) ! 119: npassname = "/usr/c/o"; ! 120: continue; ! 121: case 'd': ! 122: dflag = strspl("-d", optarg); ! 123: continue; ! 124: ! 125: case '?': ! 126: case 's': ! 127: t = strspl("-", "x"); ! 128: t[1] = optopt; ! 129: llist[nl++] = t; ! 130: continue; ! 131: ! 132: case EOF: ! 133: t = argv[optind]; ! 134: optind++; ! 135: c = getsuf(t); ! 136: if (c=='c' || c=='s' || c=='i' || exflag) { ! 137: clist[nc++] = t; ! 138: t = setsuf(t, 'o'); ! 139: } ! 140: if (nodup(llist, t)) { ! 141: llist[nl++] = t; ! 142: if (getsuf(t)=='o') ! 143: nxo++; ! 144: } ! 145: } ! 146: if (gflag) { ! 147: if (oflag) ! 148: fprintf(stderr, "cc: warning: -g disables -O\n"); ! 149: oflag = 0; ! 150: } ! 151: if (npassname && chpass ==0) ! 152: chpass = "012p"; ! 153: if (chpass && npassname==0) ! 154: npassname = "/usr/new"; ! 155: if (chpass) ! 156: for (t=chpass; *t; t++) { ! 157: switch (*t) { ! 158: ! 159: case '0': ! 160: ccom = strspl(npassname, "ccom"); ! 161: continue; ! 162: case '2': ! 163: c2 = strspl(npassname, "c2"); ! 164: continue; ! 165: case 'p': ! 166: cpp = strspl(npassname, "cpp"); ! 167: continue; ! 168: } ! 169: } ! 170: if (proflag) ! 171: crt0 = "/lib/mcrt0.o"; ! 172: if (nc==0) ! 173: goto nocom; ! 174: if (signal(SIGINT, SIG_IGN) != SIG_IGN) ! 175: signal(SIGINT, idexit); ! 176: if (signal(SIGTERM, SIG_IGN) != SIG_IGN) ! 177: signal(SIGTERM, idexit); ! 178: if (pflag==0) ! 179: sprintf(tmp0, "/tmp/ctm%05.5d", getpid()); ! 180: tmp1 = strspl(tmp0, "1"); ! 181: tmp2 = strspl(tmp0, "2"); ! 182: tmp3 = strspl(tmp0, "3"); ! 183: if (pflag==0) ! 184: tmp4 = strspl(tmp0, "4"); ! 185: if (oflag || Cflag) ! 186: tmp5 = strspl(tmp0, "5"); ! 187: for (i=0; i<nc; i++) { ! 188: int suffix = getsuf(clist[i]); ! 189: if (nc > 1) { ! 190: printf("%s:\n", clist[i]); ! 191: fflush(stdout); ! 192: } ! 193: if (suffix == 's') { ! 194: assource = clist[i]; ! 195: goto assemble; ! 196: } else ! 197: assource = tmp3; ! 198: if (suffix == 'i') ! 199: goto compile; ! 200: if (pflag) ! 201: tmp4 = setsuf(clist[i], 'i'); ! 202: av[0] = "cpp"; ! 203: av[1] = clist[i]; ! 204: av[2] = exflag ? "-" : tmp4; ! 205: na = 3; ! 206: for (j = 0; j < np; j++) ! 207: av[na++] = plist[j]; ! 208: av[na++] = 0; ! 209: switch (callsys(cpp, av)) { ! 210: case 0: ! 211: break; ! 212: #define CLASS 27 ! 213: case CLASS: ! 214: if (callsys("/lib/cpre",av) == 0) ! 215: break; ! 216: default: ! 217: exfail++; ! 218: eflag++; ! 219: } ! 220: if (pflag || exfail) { ! 221: cflag++; ! 222: continue; ! 223: } ! 224: compile: ! 225: if (sflag) ! 226: assource = tmp3 = setsuf(clist[i], 's'); ! 227: av[0] = "ccom"; ! 228: av[1] = suffix=='i'? clist[i]: tmp4; ! 229: av[2] = (oflag || Cflag)? tmp5:tmp3; ! 230: na = 3; ! 231: if (proflag) ! 232: av[na++] = "-Xp"; ! 233: if (gflag) ! 234: av[na++] = "-g"; ! 235: if (wflag) ! 236: av[na++] = "-w"; ! 237: av[na] = 0; ! 238: if (callsys(ccom, av)) { ! 239: cflag++; ! 240: eflag++; ! 241: continue; ! 242: } ! 243: if (oflag || Cflag) { ! 244: av[0] = Cflag? "instrcnt": "c2"; ! 245: av[1] = tmp5; av[2] = tmp3; av[3] = 0; ! 246: if (callsys(Cflag? instrcnt: c2, av)) { ! 247: unlink(tmp3); ! 248: tmp3 = assource = tmp5; ! 249: } else ! 250: unlink(tmp5); ! 251: } ! 252: if (sflag) ! 253: continue; ! 254: assemble: ! 255: cunlink(tmp1); cunlink(tmp2); cunlink(tmp4); ! 256: av[0] = "as"; av[1] = "-o"; av[2] = setsuf(clist[i], 'o'); ! 257: na = 3; ! 258: if (Rflag) ! 259: av[na++] = "-R"; ! 260: if (dflag) ! 261: av[na++] = dflag; ! 262: av[na++] = assource; ! 263: av[na] = 0; ! 264: if (callsys(as, av)) { ! 265: cflag++; ! 266: eflag++; ! 267: continue; ! 268: } ! 269: } ! 270: nocom: ! 271: if (cflag==0 && nl!=0) { ! 272: i = 0; ! 273: av[0] = "ld"; av[1] = "-X"; av[2] = crt0; na = 3; ! 274: if (outfile) { ! 275: av[na++] = "-o"; ! 276: av[na++] = outfile; ! 277: } ! 278: while (i < nl) ! 279: av[na++] = llist[i++]; ! 280: if (gflag) ! 281: av[na++] = "-lg"; ! 282: av[na++] = "-lc"; ! 283: av[na++] = 0; ! 284: eflag |= callsys(ld, av); ! 285: if (nc==1 && nxo==1 && eflag==0) ! 286: unlink(setsuf(clist[0], 'o')); ! 287: } ! 288: dexit(); ! 289: } ! 290: ! 291: idexit() ! 292: { ! 293: ! 294: eflag = 100; ! 295: dexit(); ! 296: } ! 297: ! 298: dexit() ! 299: { ! 300: ! 301: if (!pflag) { ! 302: cunlink(tmp1); ! 303: cunlink(tmp2); ! 304: if (sflag==0) ! 305: cunlink(tmp3); ! 306: cunlink(tmp4); ! 307: cunlink(tmp5); ! 308: } ! 309: exit(eflag); ! 310: } ! 311: ! 312: error(s, x) ! 313: char *s, *x; ! 314: { ! 315: FILE *diag = exflag ? stderr : stdout; ! 316: ! 317: fprintf(diag, "cc: "); ! 318: fprintf(diag, s, x); ! 319: putc('\n', diag); ! 320: fflush(diag); ! 321: exfail++; ! 322: cflag++; ! 323: eflag++; ! 324: } ! 325: ! 326: getsuf(as) ! 327: char as[]; ! 328: { ! 329: register int c; ! 330: register char *s; ! 331: register int t; ! 332: ! 333: s = as; ! 334: c = 0; ! 335: while (t = *s++) ! 336: if (t=='/') ! 337: c = 0; ! 338: else ! 339: c++; ! 340: s -= 3; ! 341: if (c <= DIRSIZ && c > 2 && *s++ == '.') ! 342: return (*s); ! 343: return (0); ! 344: } ! 345: ! 346: char * ! 347: setsuf(as, ch) ! 348: char *as; ! 349: { ! 350: register char *s, *s1; ! 351: ! 352: s = s1 = savestr(as); ! 353: while (*s) ! 354: if (*s++ == '/') ! 355: s1 = s; ! 356: s[-1] = ch; ! 357: return (s1); ! 358: } ! 359: ! 360: callsys(f, v) ! 361: char *f, **v; ! 362: { ! 363: int t, status; ! 364: register char **vp; /* god */ ! 365: ! 366: if(vflag) { /* god & mjm */ ! 367: vp = v; ! 368: fprintf(stderr,"+ "); ! 369: while (*vp) ! 370: fprintf(stderr,"%s ",*vp++); ! 371: fprintf(stderr, "\n"); ! 372: fflush(stderr); ! 373: } ! 374: ! 375: ! 376: t = vfork(); ! 377: if (t == -1) { ! 378: printf("No more processes\n"); ! 379: return (100); ! 380: } ! 381: if (t == 0) { ! 382: execv(f, v); ! 383: printf("Can't find %s\n", f); ! 384: fflush(stdout); ! 385: _exit(100); ! 386: } ! 387: while (t != wait(&status)) ! 388: ; ! 389: if ((t=(status&0377)) != 0 && t!=14) { ! 390: if (t!=2) { ! 391: printf("Fatal error in %s\n", f); ! 392: eflag = 8; ! 393: } ! 394: dexit(); ! 395: } ! 396: return ((status>>8) & 0377); ! 397: } ! 398: ! 399: nodup(l, os) ! 400: char **l, *os; ! 401: { ! 402: register char *t, *s; ! 403: register int c; ! 404: ! 405: s = os; ! 406: if (getsuf(s) != 'o') ! 407: return (1); ! 408: while (t = *l++) { ! 409: while (c = *s++) ! 410: if (c != *t++) ! 411: break; ! 412: if (*t==0 && c==0) ! 413: return (0); ! 414: s = os; ! 415: } ! 416: return (1); ! 417: } ! 418: ! 419: #define NSAVETAB 1024 ! 420: char *savetab; ! 421: int saveleft; ! 422: ! 423: char * ! 424: savestr(cp) ! 425: register char *cp; ! 426: { ! 427: register int len; ! 428: ! 429: len = strlen(cp) + 1; ! 430: if (len > saveleft) { ! 431: saveleft = NSAVETAB; ! 432: if (len > saveleft) ! 433: saveleft = len; ! 434: savetab = (char *)malloc(saveleft); ! 435: if (savetab == 0) { ! 436: fprintf(stderr, "ran out of memory (savestr)\n"); ! 437: exit(1); ! 438: } ! 439: } ! 440: strncpy(savetab, cp, len); ! 441: cp = savetab; ! 442: savetab += len; ! 443: saveleft -= len; ! 444: return (cp); ! 445: } ! 446: ! 447: char * ! 448: strspl(left, right) ! 449: char *left, *right; ! 450: { ! 451: char buf[BUFSIZ]; ! 452: ! 453: strcpy(buf, left); ! 454: strcat(buf, right); ! 455: return (savestr(buf)); ! 456: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.