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