00001 /* 00002 * fdopen - convert a (UNIX) file descriptor into a FILE pointer 00003 */ 00004 /* $Header: /opt/proj/minix/cvsroot/src/lib/other/fdopen.c,v 1.2 2005/09/06 10:15:57 beng Exp $ */ 00005 00006 #include <stdlib.h> 00007 #include "../stdio/loc_incl.h" 00008 #include <stdio.h> 00009 #include <sys/stat.h> 00010 00011 FILE * 00012 fdopen(fd, mode) 00013 int fd; 00014 _CONST char *mode; 00015 { 00016 register int i; 00017 struct stat st; 00018 FILE *stream; 00019 int flags = 0; 00020 00021 if (fd < 0) return (FILE *)NULL; 00022 for (i = 0; __iotab[i] != 0 ; i++) 00023 if (i >= FOPEN_MAX-1) 00024 return (FILE *)NULL; 00025 00026 switch(*mode++) { 00027 case 'r': 00028 flags |= _IOREAD | _IOREADING; 00029 break; 00030 case 'a': 00031 flags |= _IOAPPEND; 00032 case 'w': 00033 flags |= _IOWRITE | _IOWRITING; 00034 break; 00035 default: 00036 return (FILE *)NULL; 00037 } 00038 while(*mode) { 00039 switch(*mode++) { 00040 case 'b': 00041 continue; 00042 case '+': 00043 flags |= _IOREAD | _IOWRITE; 00044 continue; 00045 /* The sequence may be followed by aditional characters */ 00046 default: 00047 break; 00048 } 00049 break; 00050 } 00051 00052 if ( fstat( fd, &st ) < 0 ) { 00053 return (FILE *)NULL; 00054 } 00055 00056 if ( st.st_mode & S_IFIFO ) { 00057 flags |= _IOFIFO; 00058 } 00059 00060 if ((stream = (FILE *) malloc(sizeof(FILE))) == NULL) { 00061 return (FILE *)NULL; 00062 } 00063 00064 if ((flags & _IOREAD) && (flags & _IOWRITE)) 00065 flags &= ~(_IOREADING | _IOWRITING); 00066 00067 stream->_count = 0; 00068 stream->_fd = fd; 00069 stream->_flags = flags; 00070 stream->_buf = NULL; 00071 __iotab[i] = stream; 00072 return stream; 00073 }
1.4.6