|
|
1.1 ! root 1: #include <stdio.h> ! 2: #define BIN IntBin ! 3: #define ICONX Iconx ! 4: #define MAXARGS 20 ! 5: #define PATHSIZE 100 /* maximum length of a fully qualified file name */ ! 6: #ifndef ITRAN ! 7: #define ITRAN "%s/itran" ! 8: #endif ! 9: #ifndef ILINK ! 10: #define ILINK "%s/ilink" ! 11: #endif ! 12: extern char **environ; ! 13: char **rfiles; ! 14: main(argc,argv) ! 15: int argc; char **argv; ! 16: { ! 17: char **tfiles; ! 18: char **lfiles; ! 19: char **execlist; ! 20: char *tflags[MAXARGS]; ! 21: char *lflags[MAXARGS]; ! 22: char **xargs; ! 23: int ntf, nlf, nrf, ntflags, nlflags, cflag, quiet; ! 24: char **arg; ! 25: char *base, *getbase(); ! 26: char *u1, *u2, *xfile; ! 27: char *rindex(), *mkname(); ! 28: char cmd[PATHSIZE]; ! 29: ! 30: ntf = nlf = nrf = ntflags = nlflags = cflag = quiet = 0; ! 31: rfiles = (char **)calloc(2*(argc+10), sizeof(char **)); ! 32: tfiles = (char **)calloc(argc+10, sizeof(char **)); ! 33: lfiles = (char **)calloc(argc+10, sizeof(char **)); ! 34: execlist = (char **)calloc(2*(argc+10), sizeof(char **)); ! 35: ! 36: tflags[ntflags++] = "itran"; ! 37: lflags[nlflags++] = "ilink"; ! 38: lflags[nlflags++] = "-i"; ! 39: lflags[nlflags++] = ICONX; ! 40: rfiles[nrf++] = "rm"; ! 41: rfiles[nrf++] = "-f"; ! 42: xfile = ""; ! 43: ! 44: for (arg = &argv[1]; arg <= &argv[argc-1]; arg++) { ! 45: if ((*arg)[0] == '-') switch ((*arg)[1]) { ! 46: case '\0': /* "-" */ ! 47: tfiles[ntf++] = *arg; ! 48: lfiles[nlf++] = rfiles[nrf++] ! 49: = "stdin.u1"; ! 50: rfiles[nrf++] = "stdin.u2"; ! 51: break; ! 52: case 's': ! 53: tflags[ntflags++] = "-s"; ! 54: quiet++; ! 55: break; ! 56: case 'o': ! 57: lfiles[nlf++] = "-o"; ! 58: xfile = lfiles[nlf++] = *++arg; ! 59: break; ! 60: case 'x': ! 61: xargs = arg++; ! 62: goto argsdone; ! 63: case 'c': ! 64: cflag++; ! 65: break; ! 66: default: ! 67: lflags[nlflags++] = tflags[ntflags++] = *arg; ! 68: break; ! 69: } ! 70: else if (suffix(*arg,".icn")) { ! 71: tfiles[ntf++] = *arg; ! 72: base = getbase(*arg,".icn"); ! 73: u1 = mkname(base,".u1"); ! 74: u2 = mkname(base,".u2"); ! 75: lfiles[nlf++] = rfiles[nrf++] = u1; ! 76: rfiles[nrf++] = u2; ! 77: } ! 78: else if (suffix(*arg,".u1")) { ! 79: lfiles[nlf++] = *arg; ! 80: } ! 81: else { ! 82: fprintf(stderr,"%s: bad argument '%s'\n",argv[0],*arg); ! 83: exit(1); ! 84: } ! 85: } ! 86: argsdone: ! 87: if (nlf == 0) ! 88: usage(argv[0]); ! 89: if (!xfile[0]) ! 90: xfile = getbase(lfiles[0],".u1"); ! 91: ! 92: if (ntf != 0) { ! 93: lcat(execlist,tflags,tfiles); ! 94: sprintf(cmd,ITRAN,BIN); ! 95: runit(cmd,execlist,environ); ! 96: } ! 97: if (cflag) { ! 98: exit(0); ! 99: } ! 100: if (!quiet) ! 101: fprintf(stderr,"Linking:\n"); ! 102: execlist[0] = 0; ! 103: lcat(execlist,lflags,lfiles); ! 104: sprintf(cmd,ILINK,BIN); ! 105: runit(cmd,execlist,environ); ! 106: docmd("/bin/rm",rfiles,environ); ! 107: chmod(xfile,0755); ! 108: if (xargs) { ! 109: if (!quiet) ! 110: fprintf(stderr,"Executing:\n"); ! 111: xargs[0] = xfile; ! 112: #ifdef DIREX ! 113: execv(xfile,xargs); ! 114: #else DIREX ! 115: execlist[0] = "iconx"; ! 116: execlist[1] = 0; ! 117: lcat(execlist,xargs,0); ! 118: execv(ICONX,execlist); ! 119: #endif DIREX ! 120: } ! 121: } ! 122: runit(c,a,e) ! 123: char *c; char **a, **e; ! 124: { ! 125: int rc; ! 126: if ((rc = docmd(c,a,e)) != 0) { ! 127: docmd("/bin/rm",rfiles,e); ! 128: exit(1); ! 129: } ! 130: } ! 131: suffix(name,suf) ! 132: char *name,*suf; ! 133: { ! 134: return !strcmp(suf,rindex(name,'.')); ! 135: } ! 136: char * ! 137: mkname(name,suf) ! 138: char *name,*suf; ! 139: { ! 140: char *p, *malloc(); ! 141: ! 142: p = malloc(16); ! 143: strcpy(p,name); ! 144: strcat(p,suf); ! 145: return p; ! 146: } ! 147: char * ! 148: getbase(name,suf) ! 149: char *name,*suf; ! 150: { ! 151: char *f,*e, *rindex(), *p, *malloc(); ! 152: ! 153: if (!(f = rindex(name,'/'))) ! 154: f = name; ! 155: else ! 156: f++; ! 157: e = rindex(f,'.'); ! 158: p = malloc(16); ! 159: strncpy(p,f,e-f); ! 160: return p; ! 161: } ! 162: lcat(c,a,b) ! 163: int c[],a[],b[]; ! 164: { ! 165: int cp,p; ! 166: ! 167: cp = p = 0; ! 168: while (c[cp]) ! 169: cp++; ! 170: while (c[cp] = a[p++]) ! 171: cp++; ! 172: p = 0; ! 173: if (b) ! 174: while (c[cp++] = b[p++]); ! 175: } ! 176: usage(p) ! 177: char *p; ! 178: { ! 179: fprintf(stderr,"usage: %s [-c] [-m] [-t] [-u] file ... [-x args]\n",p); ! 180: exit(1); ! 181: } ! 182: docmd(cmd,argv,envp) ! 183: char *cmd, **argv, **envp; ! 184: { ! 185: int rc, stat; ! 186: rc = FORK(); ! 187: if (rc == -1) { ! 188: fprintf(stderr,"No more processes\n"); ! 189: return 255; ! 190: } ! 191: if (rc == 0) { ! 192: execve(cmd,argv,envp); ! 193: fprintf(stderr,"exec failed on %s\n",cmd); ! 194: _exit(255); ! 195: } ! 196: while (rc != wait(&stat)); ! 197: return (stat>>8) & 0xff; ! 198: } ! 199: plist(title,list) ! 200: char *title, **list; ! 201: { ! 202: char **p; ! 203: printf("\n%s\n",title); ! 204: for (p = list; *p; p++) ! 205: printf("'%s'\n",*p); ! 206: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.