home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / gnu / glibc-1.06 / sysdeps / posix / sysd-stdio.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-19  |  3.1 KB  |  140 lines

  1. /* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
  2. This file is part of the GNU C Library.
  3.  
  4. The GNU C Library is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU Library General Public License as
  6. published by the Free Software Foundation; either version 2 of the
  7. License, or (at your option) any later version.
  8.  
  9. The GNU C Library is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12. Library General Public License for more details.
  13.  
  14. You should have received a copy of the GNU Library General Public
  15. License along with the GNU C Library; see the file COPYING.LIB.  If
  16. not, write to the Free Software Foundation, Inc., 675 Mass Ave,
  17. Cambridge, MA 02139, USA.  */
  18.  
  19. #include <ansidecl.h>
  20. #include <errno.h>
  21. #include <stddef.h>
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <string.h>
  25. #include <sys/types.h>
  26. #include <sys/stat.h>
  27. #include <fcntl.h>
  28. #include <unistd.h>
  29.  
  30. /* Read N bytes into BUF from COOKIE.  */
  31. int
  32. DEFUN(__stdio_read, (cookie, buf, n),
  33.       PTR cookie AND register char *buf AND register size_t n)
  34. {
  35. #if    defined (EINTR) && defined (EINTR_REPEAT)
  36.   CONST int fd = *(int *) cookie;
  37.   int save = errno;
  38.   int nread;
  39.  
  40.  try:;
  41.   errno = 0;
  42.   nread = __read(fd, buf, (int) n);
  43.   if (nread < 0)
  44.     {
  45.       if (errno == EINTR)
  46.     goto try;
  47.       return -1;
  48.     }
  49.   errno = save;
  50.   return nread;
  51.  
  52. #else    /* No EINTR.  */
  53.   return __read(*(int *) cookie, buf, (int) n);
  54. #endif
  55. }
  56.  
  57.  
  58. /* Write N bytes from BUF to COOKIE.  */
  59. int
  60. DEFUN(__stdio_write, (cookie, buf, n),
  61.       PTR cookie AND register CONST char *buf AND register size_t n)
  62. {
  63.   CONST int fd = *(int *) cookie;
  64.   register size_t written = 0;
  65.  
  66.   while (n > 0)
  67.     {
  68.       int count = __write (fd, buf, (int) n);
  69.       if (count > 0)
  70.     {
  71.       buf += count;
  72.       written += count;
  73.       n -= count;
  74.     }
  75.       else if (count < 0
  76. #if    defined (EINTR) && defined (EINTR_REPEAT)
  77.            && errno != EINTR
  78. #endif
  79.            )
  80.     /* Write error.  */
  81.     return -1;
  82.     }
  83.  
  84.   return (int) written;
  85. }
  86.  
  87.  
  88. /* Move COOKIE's file position *POS bytes, according to WHENCE.
  89.    The new file position is stored in *POS.
  90.    Returns zero if successful, nonzero if not.  */
  91. int
  92. DEFUN(__stdio_seek, (cookie, pos, whence),
  93.       PTR cookie AND fpos_t *pos AND int whence)
  94. {
  95.   off_t new;
  96.   new = __lseek(*(int *) cookie, (off_t) *pos, whence);
  97.   if (new < 0)
  98.     return 1;
  99.   *pos = (fpos_t) new;
  100.   return 0;
  101. }
  102.  
  103.  
  104. /* Close COOKIE.  */
  105. int
  106. DEFUN(__stdio_close, (cookie), PTR cookie)
  107. {
  108.   return __close(*(int *) cookie);
  109. }
  110.  
  111.  
  112. /* Open the given file with the mode given in the __io_mode argument.  */
  113. PTR
  114. DEFUN(__stdio_open, (filename, m, fdptr),
  115.       CONST char *filename AND __io_mode m AND int *fdptr)
  116. {
  117.   int mode;
  118.  
  119.   if (m.__read && m.__write)
  120.     mode = O_RDWR;
  121.   else
  122.     mode = m.__read ? O_RDONLY : O_WRONLY;
  123.  
  124.   if (m.__append)
  125.     mode |= O_APPEND;
  126.   if (m.__exclusive)
  127.     mode |= O_EXCL;
  128.   if (m.__truncate)
  129.     mode |= O_TRUNC;
  130.  
  131.   if (m.__create)
  132.     *fdptr = __open(filename, mode | O_CREAT,
  133.             S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
  134.   else
  135.     *fdptr = __open(filename, mode);
  136.  
  137.   return NULL;
  138.  
  139. }
  140.