fdopen.c

Go to the documentation of this file.
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 }

Generated on Fri Apr 14 22:57:26 2006 for minix by  doxygen 1.4.6