fopen.c 835 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. /* $Id$ */
  2. #include <stdio.h>
  3. #define PMODE 0666
  4. FILE *fopen(name,mode)
  5. char *name , *mode;
  6. {
  7. register int i;
  8. FILE *fp;
  9. char *malloc();
  10. int fd,
  11. flags = 0;
  12. for (i = 0; _io_table[i] != 0 ; i++)
  13. if ( i >= _NFILES )
  14. return(NULL);
  15. switch(*mode){
  16. case 'w':
  17. flags |= IO_WRITEMODE;
  18. fd = creat (name,PMODE);
  19. break;
  20. case 'a':
  21. flags |= IO_WRITEMODE;
  22. if (( fd = open(name, 1)) < 0 )
  23. fd = creat(name, PMODE);
  24. if (fd >= 0) lseek(fd,0L,2);
  25. break;
  26. case 'r':
  27. flags |= IO_READMODE;
  28. if (( fd = open (name, 0)) < 0 )
  29. return(NULL);
  30. break;
  31. default:
  32. return(NULL);
  33. }
  34. if (fd < 0) return NULL;
  35. if (( fp = (FILE *) malloc (sizeof( FILE))) == NULL ) {
  36. close(fd);
  37. return(NULL);
  38. }
  39. fp->_count = 0;
  40. fp->_fd = fd;
  41. fp->_flags = flags;
  42. fp->_buf = 0;
  43. _io_table[i] = fp;
  44. return(fp);
  45. }