home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3297 / smem.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-07  |  1.4 KB  |  87 lines

  1. /* History:
  2. 5/1/91 DJB baseline public domain
  3. */
  4.  
  5. /*
  6.  
  7. See kmem.c for documentation.
  8.  
  9. */
  10.  
  11. #include <sys/types.h>
  12. #include <sys/file.h>
  13. #include "smem.h"
  14. #include "strerr.h"
  15.  
  16. #define SMEM "/dev/drum"
  17.  
  18. #define LSEEKFROMSTART 0
  19.  
  20. static int smemfd = -1;
  21. static int smemerrno = 0;
  22.  
  23. static char *smemerrprk(ke) strerrfun *ke; { *ke = strerrsys; return SMEM; }
  24.  
  25. char *smemstrerr(ke)
  26. strerrfun *ke;
  27. {
  28.  *ke = 0;
  29.  switch(smemerrno)
  30.   {
  31.    case 0:
  32.      return "drum error 0";
  33. #define SMEM_OPEN 1
  34.    case SMEM_OPEN:
  35.      *ke = smemerrprk;
  36.      return "cannot open ";
  37. #define SMEM_LSEEK 2
  38.    case SMEM_LSEEK:
  39.      *ke = strerrsys;
  40.      return "cannot lseek drum";
  41. #define SMEM_READ 3
  42.    case SMEM_READ:
  43.      *ke = strerrsys;
  44.      return "cannot read drum";
  45. #define SMEM_READZERO 4
  46.    case SMEM_READZERO:
  47.      return "drum read 0 bytes";
  48.    default:
  49.      return "unknown drum error";
  50.   }
  51. }
  52.  
  53. int smeminit()
  54. {
  55.  smemfd = open(SMEM,O_RDONLY);
  56.  if (smemfd == -1)
  57.    RETERN(-1,smemerrno,SMEM_OPEN)
  58.  return 0;
  59. }
  60.  
  61. int smemcpy(buf,pos,n)
  62. char *buf;
  63. char *pos;
  64. int n;
  65. {
  66.  int r;
  67.  
  68.  if (!n)
  69.    return 0;
  70.  if (smemfd == -1)
  71.    if (smeminit() == -1)
  72.      return -1;
  73.  if (lseek(smemfd,(long) pos,LSEEKFROMSTART) == -1)
  74.    RETERN(-1,smemerrno,SMEM_LSEEK)
  75.  while ((r = read(smemfd,buf,n)) < n)
  76.    if (r == -1)
  77.      RETERN(-1,smemerrno,SMEM_READ)
  78.    else if (r == 0) /* XXX: this can never happen */
  79.      RETERN(-1,smemerrno,SMEM_READZERO)
  80.    else
  81.     {
  82.      buf += r;
  83.      n -= r;
  84.     }
  85.  return 0;
  86. }
  87.