home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3297 / mmem.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 "mmem.h"
  14. #include "strerr.h"
  15.  
  16. #define MMEM "/dev/mem"
  17.  
  18. #define LSEEKFROMSTART 0
  19.  
  20. static int mmemfd = -1;
  21. static int mmemerrno = 0;
  22.  
  23. static char *mmemerrprk(ke) strerrfun *ke; { *ke = strerrsys; return MMEM; }
  24.  
  25. char *mmemstrerr(ke)
  26. strerrfun *ke;
  27. {
  28.  *ke = 0;
  29.  switch(mmemerrno)
  30.   {
  31.    case 0:
  32.      return "mem error 0";
  33. #define MMEM_OPEN 1
  34.    case MMEM_OPEN:
  35.      *ke = mmemerrprk;
  36.      return "cannot open ";
  37. #define MMEM_LSEEK 2
  38.    case MMEM_LSEEK:
  39.      *ke = strerrsys;
  40.      return "cannot lseek mem";
  41. #define MMEM_READ 3
  42.    case MMEM_READ:
  43.      *ke = strerrsys;
  44.      return "cannot read mem";
  45. #define MMEM_READZERO 4
  46.    case MMEM_READZERO:
  47.      return "mem read 0 bytes";
  48.    default:
  49.      return "unknown mem error";
  50.   }
  51. }
  52.  
  53. int mmeminit()
  54. {
  55.  mmemfd = open(MMEM,O_RDONLY);
  56.  if (mmemfd == -1)
  57.    RETERN(-1,mmemerrno,MMEM_OPEN)
  58.  return 0;
  59. }
  60.  
  61. int mmemcpy(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 (mmemfd == -1)
  71.    if (mmeminit() == -1)
  72.      return -1;
  73.  if (lseek(mmemfd,(long) pos,LSEEKFROMSTART) == -1)
  74.    RETERN(-1,mmemerrno,MMEM_LSEEK)
  75.  while ((r = read(mmemfd,buf,n)) < n)
  76.    if (r == -1)
  77.      RETERN(-1,mmemerrno,MMEM_READ)
  78.    else if (r == 0) /* XXX: this can never happen */
  79.      RETERN(-1,mmemerrno,MMEM_READZERO)
  80.    else
  81.     {
  82.      buf += r;
  83.      n -= r;
  84.     }
  85.  return 0;
  86. }
  87.