121402Sdist /* 221402Sdist * Copyright (c) 1983 Regents of the University of California. 321402Sdist * All rights reserved. The Berkeley software License Agreement 421402Sdist * specifies the terms and conditions for redistribution. 521402Sdist */ 621402Sdist 721402Sdist #ifndef lint 8*24936Slepreau static char sccsid[] = "@(#)findfp.c 5.2 (Berkeley) 09/18/85"; 921402Sdist #endif not lint 1021402Sdist 1117951Sserge #include <stdio.h> 12*24936Slepreau #include <errno.h> 1317874Sserge 14*24936Slepreau extern int errno; 15*24936Slepreau 1618248Sserge #define active(iop) ((iop)->_flag & (_IOREAD|_IOWRT|_IORW)) 1717874Sserge 1818248Sserge #define NSTATIC 3 /* stdin + stdout + stderr */ 1917874Sserge 2017874Sserge FILE _iob[NSTATIC] = { 2118248Sserge { 0, NULL, NULL, 0, _IOREAD, 0 }, /* stdin */ 2218248Sserge { 0, NULL, NULL, 0, _IOWRT, 1 }, /* stdout */ 2318248Sserge { 0, NULL, NULL, 0, _IOWRT|_IONBF, 2 }, /* stderr */ 2417874Sserge }; 2517874Sserge 2618248Sserge static FILE *_lastbuf = _iob + NSTATIC; 2717951Sserge 2818248Sserge extern char *calloc(); 2918248Sserge 3018248Sserge static FILE **iobglue; 3118248Sserge static FILE **endglue; 3218248Sserge static int nfiles; 3318248Sserge 3417874Sserge FILE * 3517874Sserge _findiop() 3617874Sserge { 3718248Sserge register FILE **iov; 3817874Sserge register FILE *fp; 3917874Sserge 4018248Sserge if (nfiles <= 0) 4117874Sserge nfiles = getdtablesize(); 4217874Sserge 4318248Sserge if (iobglue == NULL) { 4418248Sserge iobglue = (FILE **)calloc(nfiles, sizeof *iobglue); 4518248Sserge if (iobglue == NULL) 4618248Sserge return (NULL); 4717951Sserge 4818248Sserge endglue = iobglue + nfiles; 4917874Sserge 5018248Sserge iov = iobglue; 5118248Sserge for (fp = _iob; fp < _lastbuf; /* void */) 5218248Sserge *iov++ = fp++; 5317874Sserge } 5417874Sserge 5518248Sserge iov = iobglue; 5618248Sserge while (*iov != NULL && active(*iov)) 57*24936Slepreau if (++iov >= endglue) { 58*24936Slepreau errno = EMFILE; 5917874Sserge return (NULL); 60*24936Slepreau } 6117874Sserge 6218248Sserge if (*iov == NULL) 6318248Sserge *iov = (FILE *)calloc(1, sizeof **iov); 6418248Sserge 6518248Sserge return (*iov); 6617874Sserge } 6717874Sserge 6818248Sserge _fwalk(function) 6918248Sserge register int (*function)(); 7017874Sserge { 7118248Sserge register FILE **iov; 7218248Sserge register FILE *fp; 7317874Sserge 7418248Sserge if (function == NULL) 7518248Sserge return; 7618248Sserge 7718248Sserge if (iobglue == NULL) { 7818248Sserge for (fp = _iob; fp < _lastbuf; fp++) 7918248Sserge if (active(fp)) 8018248Sserge (*function)(fp); 8118248Sserge } else { 8218248Sserge for (iov = iobglue; iov < endglue; iov++) 8318248Sserge if (*iov != NULL && active(*iov)) 8418248Sserge (*function)(*iov); 8518248Sserge } 8617874Sserge } 8717951Sserge 8818248Sserge _cleanup() 8917951Sserge { 9018248Sserge extern int fclose(); 9118248Sserge 9218248Sserge _fwalk(fclose); 9317951Sserge } 94