|
|
1.1 root 1: /* Copyright (c) 1979 Regents of the University of California */
2: #include <stdio.h>
3: _filbuf(iop)
4: register struct _iobuf *iop;
5: {
6: static char smallbuf[_NFILE];
7: register n;
8: char *malloc();
9:
10: if ((iop->_flag&_IOREAD) == 0)
11: _error("Reading bad file\n");
12: if (iop->_flag&_IOSTRG)
13: return(-1);
14: tryagain:
15: if (iop->_base==NULL) {
16: if (iop->_flag&_IONBF) {
17: iop->_base = &smallbuf[fileno(iop)];
18: goto tryagain;
19: }
20: if ((iop->_base = malloc(BUFSIZ)) == NULL) {
21: iop->_flag |= _IONBF;
22: goto tryagain;
23: }
24: iop->_flag |= _IOMYBUF;
25: }
26: if((iop->_flag & _IODIRT) && !(iop->_flag & _IONBF) && (iop->_flag & _IOWRT)) {
27: if (iop->_delta)
28: if (lseek(iop->_file,(long) -iop->_delta, 1) < 0) {
29: _error("Seek error in filbuf\n");
30: iop->_flag |= _IOERR;
31: }
32: if( 0 < (n = iop->_ptr - iop->_base))
33: if( n != write(iop->_file, iop->_base, n) )
34: iop->_flag |= _IOERR;
35: iop->_flag &= ~_IODIRT;
36: }
37: iop->_ptr = iop->_base;
38: iop->_cnt = read(fileno(iop), iop->_ptr, iop->_flag&_IONBF?1:BUFSIZ);
39: iop->_delta = iop->_cnt;
40: if (--iop->_cnt < 0) {
41: if (iop->_cnt == -1)
42: iop->_flag |= _IOEOF;
43: else
44: iop->_flag |= _IOERR;
45: iop->_cnt = 0;
46: return(-1);
47: }
48: return(*iop->_ptr++&0377);
49: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.