1*21402Sdist /* 2*21402Sdist * Copyright (c) 1983 Regents of the University of California. 3*21402Sdist * All rights reserved. The Berkeley software License Agreement 4*21402Sdist * specifies the terms and conditions for redistribution. 5*21402Sdist */ 6*21402Sdist 7*21402Sdist #ifndef lint 8*21402Sdist static char sccsid[] = "@(#)findfp.c 5.1 (Berkeley) 05/30/85"; 9*21402Sdist #endif not lint 10*21402Sdist 1117951Sserge #include <stdio.h> 1217874Sserge 1318248Sserge #define active(iop) ((iop)->_flag & (_IOREAD|_IOWRT|_IORW)) 1417874Sserge 1518248Sserge #define NSTATIC 3 /* stdin + stdout + stderr */ 1617874Sserge 1717874Sserge FILE _iob[NSTATIC] = { 1818248Sserge { 0, NULL, NULL, 0, _IOREAD, 0 }, /* stdin */ 1918248Sserge { 0, NULL, NULL, 0, _IOWRT, 1 }, /* stdout */ 2018248Sserge { 0, NULL, NULL, 0, _IOWRT|_IONBF, 2 }, /* stderr */ 2117874Sserge }; 2217874Sserge 2318248Sserge static FILE *_lastbuf = _iob + NSTATIC; 2417951Sserge 2518248Sserge extern char *calloc(); 2618248Sserge 2718248Sserge static FILE **iobglue; 2818248Sserge static FILE **endglue; 2918248Sserge static int nfiles; 3018248Sserge 3117874Sserge FILE * 3217874Sserge _findiop() 3317874Sserge { 3418248Sserge register FILE **iov; 3517874Sserge register FILE *fp; 3617874Sserge 3718248Sserge if (nfiles <= 0) 3817874Sserge nfiles = getdtablesize(); 3917874Sserge 4018248Sserge if (iobglue == NULL) { 4118248Sserge iobglue = (FILE **)calloc(nfiles, sizeof *iobglue); 4218248Sserge if (iobglue == NULL) 4318248Sserge return (NULL); 4417951Sserge 4518248Sserge endglue = iobglue + nfiles; 4617874Sserge 4718248Sserge iov = iobglue; 4818248Sserge for (fp = _iob; fp < _lastbuf; /* void */) 4918248Sserge *iov++ = fp++; 5017874Sserge } 5117874Sserge 5218248Sserge iov = iobglue; 5318248Sserge while (*iov != NULL && active(*iov)) 5418248Sserge if (++iov >= endglue) 5517874Sserge return (NULL); 5617874Sserge 5718248Sserge if (*iov == NULL) 5818248Sserge *iov = (FILE *)calloc(1, sizeof **iov); 5918248Sserge 6018248Sserge return (*iov); 6117874Sserge } 6217874Sserge 6318248Sserge _fwalk(function) 6418248Sserge register int (*function)(); 6517874Sserge { 6618248Sserge register FILE **iov; 6718248Sserge register FILE *fp; 6817874Sserge 6918248Sserge if (function == NULL) 7018248Sserge return; 7118248Sserge 7218248Sserge if (iobglue == NULL) { 7318248Sserge for (fp = _iob; fp < _lastbuf; fp++) 7418248Sserge if (active(fp)) 7518248Sserge (*function)(fp); 7618248Sserge } else { 7718248Sserge for (iov = iobglue; iov < endglue; iov++) 7818248Sserge if (*iov != NULL && active(*iov)) 7918248Sserge (*function)(*iov); 8018248Sserge } 8117874Sserge } 8217951Sserge 8318248Sserge _cleanup() 8417951Sserge { 8518248Sserge extern int fclose(); 8618248Sserge 8718248Sserge _fwalk(fclose); 8817951Sserge } 89