1*17951Sserge /* @(#)findfp.c 1.2 (Berkeley) 02/13/85 */ 2*17951Sserge #include <stdio.h> 317874Sserge 4*17951Sserge #define NSTATIC 10 /* stdin, stdout, stderr, plus slack */ 517874Sserge 617874Sserge extern char *calloc(); 717874Sserge 817874Sserge static FILE *dummy[NSTATIC]; 9*17951Sserge static FILE **iov = NULL; 10*17951Sserge static FILE **iovend; 1117874Sserge 1217874Sserge FILE _iob[NSTATIC] = { 13*17951Sserge { 0, NULL, NULL, NULL, _IOREAD, 0 }, /* stdin */ 14*17951Sserge { 0, NULL, NULL, NULL, _IOWRT, 1 }, /* stdout */ 15*17951Sserge { 0, NULL, NULL, NULL, _IOWRT|_IONBF, 2 }, /* stderr */ 1617874Sserge }; 1717874Sserge 18*17951Sserge static char smallbuf[NSTATIC]; 19*17951Sserge static char *unbufp = NULL; 20*17951Sserge 2117874Sserge FILE * 2217874Sserge _findiop() 2317874Sserge { 2417874Sserge register FILE **iovp; 2517874Sserge register FILE *fp; 2617874Sserge register int nfiles; 2717874Sserge 2817874Sserge if (iov == NULL) { 29*17951Sserge unbufp = NULL; 30*17951Sserge iov = NULL; 31*17951Sserge fp = NULL; 32*17951Sserge 3317874Sserge nfiles = getdtablesize(); 34*17951Sserge if (nfiles > NSTATIC) { 35*17951Sserge fp = (FILE *)calloc(nfiles - NSTATIC, sizeof *fp); 36*17951Sserge if (fp != NULL) { 37*17951Sserge iov = (FILE **)calloc(nfiles, sizeof *iov); 38*17951Sserge if (iov != NULL) 39*17951Sserge unbufp = calloc(nfiles, sizeof *unbufp); 40*17951Sserge } 41*17951Sserge } 4217874Sserge 43*17951Sserge if (unbufp != NULL) { 4417874Sserge iovend = iov + nfiles; 4517874Sserge for (iovp = iov + NSTATIC; iovp < iovend; /* void */) 4617874Sserge *iovp++ = fp++; 47*17951Sserge } else { 48*17951Sserge if (fp != NULL) { 49*17951Sserge free((char *)fp); 50*17951Sserge if (iov != NULL) 51*17951Sserge free((char *)iov); 52*17951Sserge } 53*17951Sserge 54*17951Sserge iovend = dummy + NSTATIC; 55*17951Sserge iov = dummy; 5617874Sserge } 5717874Sserge 58*17951Sserge iovp = iov; 59*17951Sserge for (fp = _iob; fp < _iob + NSTATIC; /* void */) 60*17951Sserge *iovp++ = fp++; 6117874Sserge } 6217874Sserge 6317874Sserge for (iovp = iov; (*iovp)->_flag & (_IOREAD|_IOWRT|_IORW); /* void */) 6417874Sserge if (++iovp >= iovend) 6517874Sserge return (NULL); 6617874Sserge 6717874Sserge return (*iovp); 6817874Sserge } 6917874Sserge 7017874Sserge _cleanup() 7117874Sserge { 7217874Sserge register FILE *_lastbuf = _iob + NSTATIC; 7317874Sserge register FILE **iovp; 7417874Sserge register FILE *iop; 7517874Sserge 7617874Sserge if (iov == NULL) 7717874Sserge for (iop = _iob; iop < _lastbuf; iop++) 7817874Sserge fclose(iop); 7917874Sserge else 8017874Sserge for (iovp = iov; iovp < iovend; iovp++) 8117874Sserge fclose(*iovp); 8217874Sserge } 83*17951Sserge 84*17951Sserge char * 85*17951Sserge _smallbuf(iop) 86*17951Sserge register FILE *iop; 87*17951Sserge { 88*17951Sserge if (unbufp == NULL) 89*17951Sserge return (&smallbuf[iop - _iob]); 90*17951Sserge else 91*17951Sserge return (&unbufp[fileno(iop)]); 92*17951Sserge } 93