xref: /csrg-svn/lib/libc/stdio/findfp.c (revision 24936)
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