1*17874Sserge /* @(#)findfp.c 1.1 (Berkeley) 01/29/85 */ 2*17874Sserge #include "stdio.h" 3*17874Sserge 4*17874Sserge #define NSTATIC 5 /* stdin, stdout, stderr, plus slack */ 5*17874Sserge 6*17874Sserge extern char *calloc(); 7*17874Sserge 8*17874Sserge static FILE **iov, **iovend; 9*17874Sserge static FILE *dummy[NSTATIC]; 10*17874Sserge 11*17874Sserge FILE _iob[NSTATIC] = { 12*17874Sserge { 0, NULL, NULL, NULL, _IOREAD, 0 }, /* stdin */ 13*17874Sserge { 0, NULL, NULL, NULL, _IOWRT, 1 }, /* stdout */ 14*17874Sserge { 0, NULL, NULL, NULL, _IOWRT+_IONBF, 2 }, /* stderr */ 15*17874Sserge }; 16*17874Sserge 17*17874Sserge FILE * 18*17874Sserge _findiop() 19*17874Sserge { 20*17874Sserge register FILE **iovp; 21*17874Sserge register FILE *fp; 22*17874Sserge register int nfiles; 23*17874Sserge register int i; 24*17874Sserge char *p; 25*17874Sserge 26*17874Sserge if (iov == NULL) { 27*17874Sserge nfiles = getdtablesize(); 28*17874Sserge if (nfiles > NSTATIC) 29*17874Sserge p = calloc(1, nfiles * sizeof *iov + 30*17874Sserge (nfiles - NSTATIC) * sizeof **iov); 31*17874Sserge else 32*17874Sserge p = NULL; 33*17874Sserge 34*17874Sserge if (p == NULL) { 35*17874Sserge iov = dummy; 36*17874Sserge iovend = iov + NSTATIC; 37*17874Sserge } else { 38*17874Sserge iov = (FILE **)p; 39*17874Sserge iovend = iov + nfiles; 40*17874Sserge 41*17874Sserge fp = (FILE *)iovend; 42*17874Sserge for (iovp = iov + NSTATIC; iovp < iovend; /* void */) 43*17874Sserge *iovp++ = fp++; 44*17874Sserge } 45*17874Sserge 46*17874Sserge for (i = 0; i < NSTATIC; i++) 47*17874Sserge iov[i] = &_iob[i]; 48*17874Sserge } 49*17874Sserge 50*17874Sserge for (iovp = iov; (*iovp)->_flag & (_IOREAD|_IOWRT|_IORW); /* void */) 51*17874Sserge if (++iovp >= iovend) 52*17874Sserge return (NULL); 53*17874Sserge 54*17874Sserge return (*iovp); 55*17874Sserge } 56*17874Sserge 57*17874Sserge _cleanup() 58*17874Sserge { 59*17874Sserge register FILE *_lastbuf = _iob + NSTATIC; 60*17874Sserge register FILE **iovp; 61*17874Sserge register FILE *iop; 62*17874Sserge 63*17874Sserge if (iov == NULL) 64*17874Sserge for (iop = _iob; iop < _lastbuf; iop++) 65*17874Sserge fclose(iop); 66*17874Sserge else 67*17874Sserge for (iovp = iov; iovp < iovend; iovp++) 68*17874Sserge fclose(*iovp); 69*17874Sserge } 70