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