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

  1. /* History:
  2. 5/1/91 DJB baseline public domain
  3. */
  4.  
  5. /*
  6.  
  7. int kmemcpy(buf,pos,n) char *buf; char *pos; int n; copies n bytes from
  8. position pos in kernel memory into buffer buf (in user memory). It
  9. returns 0 on success, -1 on error.
  10.  
  11. kmeminit() is an optional initialization routine to cooperate with other
  12. libraries.
  13.  
  14. kmemstrerr is a strerrfun for kmeminit() and kmemcpy().
  15.  
  16. */
  17.  
  18. #include <sys/types.h>
  19. #include <sys/file.h>
  20. #include "kmem.h"
  21. #include "strerr.h"
  22.  
  23. #define KMEM "/dev/kmem"
  24.  
  25. #define LSEEKFROMSTART 0
  26.  
  27. static int kmemfd = -1;
  28. static int kmemerrno = 0;
  29.  
  30. static char *kmemerrprk(ke) strerrfun *ke; { *ke = strerrsys; return KMEM; }
  31.  
  32. char *kmemstrerr(ke)
  33. strerrfun *ke;
  34. {
  35.  *ke = 0;
  36.  switch(kmemerrno)
  37.   {
  38.    case 0:
  39.      return "kmem error 0";
  40. #define KMEM_OPEN 1
  41.    case KMEM_OPEN:
  42.      *ke = kmemerrprk;
  43.      return "cannot open ";
  44. #define KMEM_LSEEK 2
  45.    case KMEM_LSEEK:
  46.      *ke = strerrsys;
  47.      return "cannot lseek kmem";
  48. #define KMEM_READ 3
  49.    case KMEM_READ:
  50.      *ke = strerrsys;
  51.      return "cannot read kmem";
  52. #define KMEM_READZERO 4
  53.    case KMEM_READZERO:
  54.      return "kmem read 0 bytes";
  55.    default:
  56.      return "unknown kmem error";
  57.   }
  58. }
  59.  
  60. int kmeminit()
  61. {
  62.  kmemfd = open(KMEM,O_RDONLY);
  63.  if (kmemfd == -1)
  64.    RETERN(-1,kmemerrno,KMEM_OPEN)
  65.  return 0;
  66. }
  67.  
  68. int kmemcpy(buf,pos,n)
  69. char *buf;
  70. char *pos;
  71. int n;
  72. {
  73.  int r;
  74.  
  75.  if (!n)
  76.    return 0;
  77.  if (kmemfd == -1)
  78.    if (kmeminit() == -1)
  79.      return -1;
  80.  if (lseek(kmemfd,(long) pos,LSEEKFROMSTART) == -1)
  81.    RETERN(-1,kmemerrno,KMEM_LSEEK)
  82.  while ((r = read(kmemfd,buf,n)) < n)
  83.    if (r == -1)
  84.      RETERN(-1,kmemerrno,KMEM_READ)
  85.    else if (r == 0) /* XXX: this can never happen */
  86.      RETERN(-1,kmemerrno,KMEM_READZERO)
  87.    else
  88.     {
  89.      buf += r;
  90.      n -= r;
  91.     }
  92.  return 0;
  93. }
  94.