ib_read.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. /*
  2. * Copyright (c) 2003 Gunnar Ritter
  3. *
  4. * This software is provided 'as-is', without any express or implied
  5. * warranty. In no event will the authors be held liable for any damages
  6. * arising from the use of this software.
  7. *
  8. * Permission is granted to anyone to use this software for any purpose,
  9. * including commercial applications, and to alter it and redistribute
  10. * it freely, subject to the following restrictions:
  11. *
  12. * 1. The origin of this software must not be misrepresented; you must not
  13. * claim that you wrote the original software. If you use this software
  14. * in a product, an acknowledgment in the product documentation would be
  15. * appreciated but is not required.
  16. *
  17. * 2. Altered source versions must be plainly marked as such, and must not be
  18. * misrepresented as being the original software.
  19. *
  20. * 3. This notice may not be removed or altered from any source distribution.
  21. */
  22. /* Sccsid @(#)ib_read.c 1.2 (gritter) 4/17/03 */
  23. #include <sys/types.h>
  24. #include <sys/stat.h>
  25. #include <fcntl.h>
  26. #include <unistd.h>
  27. #include <string.h>
  28. #include <errno.h>
  29. #include <stdlib.h>
  30. #include "iblok.h"
  31. int
  32. ib_read(struct iblok *ip)
  33. {
  34. ssize_t sz;
  35. do {
  36. if ((sz = read(ip->ib_fd, ip->ib_blk, ip->ib_blksize)) > 0) {
  37. ip->ib_endoff += sz;
  38. ip->ib_cur = ip->ib_blk;
  39. ip->ib_end = &ip->ib_blk[sz];
  40. return *ip->ib_cur++ & 0377;
  41. }
  42. } while (sz < 0 && errno == EINTR);
  43. if (sz < 0)
  44. ip->ib_errno = errno;
  45. ip->ib_cur = ip->ib_end = NULL;
  46. return EOF;
  47. }