fdopen.c 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /*
  2. * fdopen - convert a (UNIX) file descriptor into a FILE pointer
  3. */
  4. /* $Id$ */
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include "../stdio/loc_incl.h"
  8. FILE *
  9. fdopen(int fd, const char *mode)
  10. {
  11. register int i;
  12. FILE *stream;
  13. int flags = 0;
  14. if (fd < 0) return (FILE *)NULL;
  15. for (i = 0; __iotab[i] != 0 ; i++)
  16. if (i >= FOPEN_MAX-1)
  17. return (FILE *)NULL;
  18. switch(*mode++) {
  19. case 'r':
  20. flags |= _IOREAD | _IOREADING;
  21. break;
  22. case 'a':
  23. flags |= _IOAPPEND;
  24. case 'w':
  25. flags |= _IOWRITE | _IOWRITING;
  26. break;
  27. default:
  28. return (FILE *)NULL;
  29. }
  30. while(*mode) {
  31. switch(*mode++) {
  32. case 'b':
  33. continue;
  34. case '+':
  35. flags |= _IOREAD | _IOWRITE;
  36. continue;
  37. /* The sequence may be followed by aditional characters */
  38. default:
  39. break;
  40. }
  41. break;
  42. }
  43. if ((stream = (FILE *) malloc(sizeof(FILE))) == NULL) {
  44. return (FILE *)NULL;
  45. }
  46. if ((flags & _IOREAD) && (flags & _IOWRITE))
  47. flags &= ~(_IOREADING | _IOWRITING);
  48. stream->_count = 0;
  49. stream->_fd = fd;
  50. stream->_flags = flags;
  51. stream->_buf = NULL;
  52. __iotab[i] = stream;
  53. return stream;
  54. }