|
|
1.1 ! root 1: /* @(#)io.c 1.5 */ ! 2: /* ! 3: * UNIX shell ! 4: * ! 5: * Bell Telephone Laboratories ! 6: * ! 7: */ ! 8: ! 9: #include "defs.h" ! 10: #include <fcntl.h> ! 11: ! 12: short topfd; ! 13: ! 14: /* ======== input output and file copying ======== */ ! 15: ! 16: initf(fd) ! 17: int fd; ! 18: { ! 19: register struct fileblk *f = standin; ! 20: ! 21: f->fdes = fd; ! 22: f->fsiz = ((flags & oneflg) == 0 ? BUFSIZ : 1); ! 23: f->fnxt = f->fend = f->fbuf; ! 24: f->feval = 0; ! 25: f->flin = 1; ! 26: f->feof = FALSE; ! 27: } ! 28: ! 29: estabf(s) ! 30: register char *s; ! 31: { ! 32: register struct fileblk *f; ! 33: ! 34: (f = standin)->fdes = -1; ! 35: f->fend = length(s) + (f->fnxt = s); ! 36: f->flin = 1; ! 37: return(f->feof = (s == 0)); ! 38: } ! 39: ! 40: push(af) ! 41: struct fileblk *af; ! 42: { ! 43: register struct fileblk *f; ! 44: ! 45: (f = af)->fstak = standin; ! 46: f->feof = 0; ! 47: f->feval = 0; ! 48: standin = f; ! 49: } ! 50: ! 51: pop() ! 52: { ! 53: register struct fileblk *f; ! 54: ! 55: if ((f = standin)->fstak) ! 56: { ! 57: if (f->fdes >= 0) ! 58: close(f->fdes); ! 59: standin = f->fstak; ! 60: return(TRUE); ! 61: } ! 62: else ! 63: return(FALSE); ! 64: } ! 65: ! 66: struct tempblk *tmpfptr; ! 67: ! 68: pushtemp(fd,tb) ! 69: int fd; ! 70: struct tempblk *tb; ! 71: { ! 72: tb->fdes = fd; ! 73: tb->fstak = tmpfptr; ! 74: tmpfptr = tb; ! 75: } ! 76: ! 77: poptemp() ! 78: { ! 79: if (tmpfptr) ! 80: { ! 81: close(tmpfptr->fdes); ! 82: tmpfptr = tmpfptr->fstak; ! 83: return(TRUE); ! 84: } ! 85: else ! 86: return(FALSE); ! 87: } ! 88: ! 89: chkpipe(pv) ! 90: int *pv; ! 91: { ! 92: if (pipe(pv) < 0 || pv[INPIPE] < 0 || pv[OTPIPE] < 0) ! 93: error(piperr); ! 94: } ! 95: ! 96: chkopen(idf) ! 97: char *idf; ! 98: { ! 99: register int rc; ! 100: ! 101: if ((rc = open(idf, 0)) < 0) ! 102: failed(idf, badopen); ! 103: else ! 104: return(rc); ! 105: } ! 106: ! 107: rename(f1, f2) ! 108: register int f1, f2; ! 109: { ! 110: #ifndef SYSV ! 111: if (f1 != f2) ! 112: { ! 113: dup2(f1, f2); ! 114: close(f1); ! 115: if (f2 == 0) ! 116: ioset |= 1; ! 117: } ! 118: #else ! 119: int fs; ! 120: ! 121: if (f1 != f2) ! 122: { ! 123: fs = fcntl(f2, 1, 0); ! 124: close(f2); ! 125: fcntl(f1, 0, f2); ! 126: close(f1); ! 127: if (fs == 1) ! 128: fcntl(f2, 2, 1); ! 129: if (f2 == 0) ! 130: ioset |= 1; ! 131: } ! 132: #endif ! 133: } ! 134: ! 135: create(s) ! 136: char *s; ! 137: { ! 138: register int rc; ! 139: ! 140: if ((rc = creat(s, 0666)) < 0) ! 141: failed(s, badcreate); ! 142: else ! 143: return(rc); ! 144: } ! 145: ! 146: tmpfil(tb) ! 147: struct tempblk *tb; ! 148: { ! 149: int fd; ! 150: ! 151: itos(serial++); ! 152: movstr(numbuf, tmpnam); ! 153: fd = create(tmpout); ! 154: pushtemp(fd,tb); ! 155: return(fd); ! 156: } ! 157: ! 158: /* ! 159: * set by trim ! 160: */ ! 161: extern BOOL nosubst; ! 162: #define CPYSIZ 512 ! 163: ! 164: copy(ioparg) ! 165: struct ionod *ioparg; ! 166: { ! 167: register char *cline; ! 168: register char *clinep; ! 169: register struct ionod *iop; ! 170: char c; ! 171: char *ends; ! 172: char *start; ! 173: int fd; ! 174: int i; ! 175: ! 176: ! 177: if (iop = ioparg) ! 178: { ! 179: struct tempblk tb; ! 180: ! 181: copy(iop->iolst); ! 182: ends = mactrim(iop->ioname); ! 183: if (nosubst) ! 184: iop->iofile &= ~IODOC; ! 185: fd = tmpfil(&tb); ! 186: ! 187: if (fndef) ! 188: iop->ioname = make(tmpout); ! 189: else ! 190: iop->ioname = cpystak(tmpout); ! 191: ! 192: iop->iolst = iotemp; ! 193: iotemp = iop; ! 194: ! 195: cline = clinep = start = locstak(); ! 196: for (;;) ! 197: { ! 198: chkpr(); ! 199: if (nosubst) ! 200: { ! 201: c = readc(); ! 202: ! 203: while (!eolchar(c)) ! 204: { ! 205: *clinep++ = c; ! 206: c = readc(); ! 207: } ! 208: } ! 209: else ! 210: { ! 211: c = nextc(*ends); ! 212: ! 213: while (!eolchar(c)) ! 214: { ! 215: *clinep++ = c; ! 216: c = nextc(*ends); ! 217: } ! 218: } ! 219: ! 220: *clinep = 0; ! 221: if (eof || eq(cline, ends)) ! 222: { ! 223: if ((i = cline - start) > 0) ! 224: write(fd, start, i); ! 225: break; ! 226: } ! 227: else ! 228: *clinep++ = NL; ! 229: ! 230: if ((i = clinep - start) < CPYSIZ) ! 231: cline = clinep; ! 232: else ! 233: { ! 234: write(fd, start, i); ! 235: cline = clinep = start; ! 236: } ! 237: } ! 238: ! 239: poptemp(); /* pushed in tmpfil -- bug fix for problem ! 240: deleting in-line scripts */ ! 241: } ! 242: } ! 243: ! 244: ! 245: link_iodocs(i) ! 246: struct ionod *i; ! 247: { ! 248: while(i) ! 249: { ! 250: shfree(i->iolink); ! 251: ! 252: itos(serial++); ! 253: movstr(numbuf, tmpnam); ! 254: i->iolink = make(tmpout); ! 255: link(i->ioname, i->iolink); ! 256: ! 257: i = i->iolst; ! 258: } ! 259: } ! 260: ! 261: ! 262: swap_iodoc_nm(i) ! 263: struct ionod *i; ! 264: { ! 265: while(i) ! 266: { ! 267: shfree(i->ioname); ! 268: i->ioname = i->iolink; ! 269: i->iolink = 0; ! 270: ! 271: i = i->iolst; ! 272: } ! 273: } ! 274: ! 275: ! 276: savefd(fd) ! 277: int fd; ! 278: { ! 279: register int f; ! 280: ! 281: #ifdef SYSV ! 282: f = fcntl(fd, F_DUPFD, 10); ! 283: #else ! 284: f = dup2(fd, 10); ! 285: #endif ! 286: return(f); ! 287: } ! 288: ! 289: ! 290: restore(last) ! 291: register int last; ! 292: { ! 293: register int i; ! 294: register int dupfd; ! 295: ! 296: for (i = topfd - 1; i >= last; i--) ! 297: { ! 298: if ((dupfd = fdmap[i].dup_fd) > 0) ! 299: rename(dupfd, fdmap[i].org_fd); ! 300: else ! 301: close(fdmap[i].org_fd); ! 302: } ! 303: topfd = last; ! 304: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.