xref: /csrg-svn/lib/libc/stdio/findfp.c (revision 26097)
121402Sdist /*
2*26097Skarels  * Copyright (c) 1983, 1985 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*26097Skarels static char sccsid[] = "@(#)findfp.c	5.3 (Berkeley) 02/06/86";
921402Sdist #endif not lint
1021402Sdist 
1117951Sserge #include <stdio.h>
1224936Slepreau #include <errno.h>
1317874Sserge 
1424936Slepreau extern int errno;
1524936Slepreau 
1618248Sserge #define active(iop)	((iop)->_flag & (_IOREAD|_IOWRT|_IORW))
1717874Sserge 
18*26097Skarels #define NSTATIC	20	/* stdin + stdout + stderr + the usual */
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 extern	char	*calloc();
2718248Sserge 
2818248Sserge static	FILE	**iobglue;
2918248Sserge static	FILE	**endglue;
3018248Sserge static	int	nfiles;
3118248Sserge 
3217874Sserge FILE *
3317874Sserge _findiop()
3417874Sserge {
3518248Sserge 	register FILE **iov;
3617874Sserge 	register FILE *fp;
3717874Sserge 
38*26097Skarels 	if (iobglue == 0 && _stdio_init() == 0) {
39*26097Skarels 		errno = ENOMEM;
40*26097Skarels 		return (NULL);
4117874Sserge 	}
4217874Sserge 
4318248Sserge 	iov = iobglue;
4418248Sserge 	while (*iov != NULL && active(*iov))
4524936Slepreau 		if (++iov >= endglue) {
4624936Slepreau 			errno = EMFILE;
4717874Sserge 			return (NULL);
4824936Slepreau 		}
4917874Sserge 
5018248Sserge 	if (*iov == NULL)
5118248Sserge 		*iov = (FILE *)calloc(1, sizeof **iov);
5218248Sserge 
5318248Sserge 	return (*iov);
5417874Sserge }
5517874Sserge 
56*26097Skarels _stdio_init()
57*26097Skarels {
58*26097Skarels 	register FILE **iov;
59*26097Skarels 	register FILE *fp;
60*26097Skarels 
61*26097Skarels 	nfiles = getdtablesize();
62*26097Skarels 
63*26097Skarels 	iobglue = (FILE **)calloc(nfiles, sizeof *iobglue);
64*26097Skarels 	if (iobglue == NULL)
65*26097Skarels 		return (0);
66*26097Skarels 
67*26097Skarels 	endglue = iobglue + nfiles;
68*26097Skarels 
69*26097Skarels 	for (fp = _iob, iov = iobglue; fp < &_iob[NSTATIC]; /* void */)
70*26097Skarels 		*iov++ = fp++;
71*26097Skarels 	return (1);
72*26097Skarels }
73*26097Skarels 
74*26097Skarels f_prealloc()
75*26097Skarels {
76*26097Skarels 	register FILE **iov;
77*26097Skarels 	register FILE *fp;
78*26097Skarels 
79*26097Skarels 	if (iobglue == NULL && _stdio_init() == 0)
80*26097Skarels 		return;
81*26097Skarels 
82*26097Skarels 	for (iov = iobglue; iov < endglue; iov++)
83*26097Skarels 		if (*iov == NULL)
84*26097Skarels 			*iov = (FILE *)calloc(1, sizeof **iov);
85*26097Skarels }
86*26097Skarels 
8718248Sserge _fwalk(function)
8818248Sserge 	register int (*function)();
8917874Sserge {
9018248Sserge 	register FILE **iov;
9118248Sserge 	register FILE *fp;
9217874Sserge 
9318248Sserge 	if (iobglue == NULL) {
94*26097Skarels 		for (fp = _iob; fp < &_iob[NSTATIC]; fp++)
9518248Sserge 			if (active(fp))
9618248Sserge 				(*function)(fp);
9718248Sserge 	} else {
9818248Sserge 		for (iov = iobglue; iov < endglue; iov++)
99*26097Skarels 			if (*iov && active(*iov))
10018248Sserge 				(*function)(*iov);
10118248Sserge 	}
10217874Sserge }
10317951Sserge 
10418248Sserge _cleanup()
10517951Sserge {
10618248Sserge 	extern int fclose();
10718248Sserge 
10818248Sserge 	_fwalk(fclose);
10917951Sserge }
110