1 /* 2 * Copyright (c) 1980 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 */ 6 7 #ifndef lint 8 static char sccsid[] = "@(#)fdopen.c 5.1 (Berkeley) 05/30/85"; 9 #endif not lint 10 11 /* 12 * Unix routine to do an "fopen" on file descriptor 13 * The mode has to be repeated because you can't query its 14 * status 15 */ 16 17 #include <sys/types.h> 18 #include <sys/file.h> 19 #include <stdio.h> 20 21 FILE * 22 fdopen(fd, mode) 23 register char *mode; 24 { 25 extern FILE *_findiop(); 26 static int nofile = -1; 27 register FILE *iop; 28 29 if (nofile < 0) 30 nofile = getdtablesize(); 31 32 if (fd < 0 || fd >= nofile) 33 return (NULL); 34 35 iop = _findiop(); 36 if (iop == NULL) 37 return (NULL); 38 39 iop->_cnt = 0; 40 iop->_file = fd; 41 iop->_bufsiz = 0; 42 iop->_base = iop->_ptr = NULL; 43 44 switch (*mode) { 45 case 'r': 46 iop->_flag = _IOREAD; 47 break; 48 case 'a': 49 lseek(fd, (off_t)0, L_XTND); 50 /* fall into ... */ 51 case 'w': 52 iop->_flag = _IOWRT; 53 break; 54 default: 55 return (NULL); 56 } 57 58 if (mode[1] == '+') 59 iop->_flag = _IORW; 60 61 return (iop); 62 } 63