1*18248Sserge /* @(#)findfp.c 1.3 (Berkeley) 03/04/85 */ 217951Sserge #include <stdio.h> 317874Sserge 4*18248Sserge #define active(iop) ((iop)->_flag & (_IOREAD|_IOWRT|_IORW)) 517874Sserge 6*18248Sserge #define NSTATIC 3 /* stdin + stdout + stderr */ 717874Sserge 817874Sserge FILE _iob[NSTATIC] = { 9*18248Sserge { 0, NULL, NULL, 0, _IOREAD, 0 }, /* stdin */ 10*18248Sserge { 0, NULL, NULL, 0, _IOWRT, 1 }, /* stdout */ 11*18248Sserge { 0, NULL, NULL, 0, _IOWRT|_IONBF, 2 }, /* stderr */ 1217874Sserge }; 1317874Sserge 14*18248Sserge static FILE *_lastbuf = _iob + NSTATIC; 1517951Sserge 16*18248Sserge extern char *calloc(); 17*18248Sserge 18*18248Sserge static FILE **iobglue; 19*18248Sserge static FILE **endglue; 20*18248Sserge static int nfiles; 21*18248Sserge 2217874Sserge FILE * 2317874Sserge _findiop() 2417874Sserge { 25*18248Sserge register FILE **iov; 2617874Sserge register FILE *fp; 2717874Sserge 28*18248Sserge if (nfiles <= 0) 2917874Sserge nfiles = getdtablesize(); 3017874Sserge 31*18248Sserge if (iobglue == NULL) { 32*18248Sserge iobglue = (FILE **)calloc(nfiles, sizeof *iobglue); 33*18248Sserge if (iobglue == NULL) 34*18248Sserge return (NULL); 3517951Sserge 36*18248Sserge endglue = iobglue + nfiles; 3717874Sserge 38*18248Sserge iov = iobglue; 39*18248Sserge for (fp = _iob; fp < _lastbuf; /* void */) 40*18248Sserge *iov++ = fp++; 4117874Sserge } 4217874Sserge 43*18248Sserge iov = iobglue; 44*18248Sserge while (*iov != NULL && active(*iov)) 45*18248Sserge if (++iov >= endglue) 4617874Sserge return (NULL); 4717874Sserge 48*18248Sserge if (*iov == NULL) 49*18248Sserge *iov = (FILE *)calloc(1, sizeof **iov); 50*18248Sserge 51*18248Sserge return (*iov); 5217874Sserge } 5317874Sserge 54*18248Sserge _fwalk(function) 55*18248Sserge register int (*function)(); 5617874Sserge { 57*18248Sserge register FILE **iov; 58*18248Sserge register FILE *fp; 5917874Sserge 60*18248Sserge if (function == NULL) 61*18248Sserge return; 62*18248Sserge 63*18248Sserge if (iobglue == NULL) { 64*18248Sserge for (fp = _iob; fp < _lastbuf; fp++) 65*18248Sserge if (active(fp)) 66*18248Sserge (*function)(fp); 67*18248Sserge } else { 68*18248Sserge for (iov = iobglue; iov < endglue; iov++) 69*18248Sserge if (*iov != NULL && active(*iov)) 70*18248Sserge (*function)(*iov); 71*18248Sserge } 7217874Sserge } 7317951Sserge 74*18248Sserge _cleanup() 7517951Sserge { 76*18248Sserge extern int fclose(); 77*18248Sserge 78*18248Sserge _fwalk(fclose); 7917951Sserge } 80