home *** CD-ROM | disk | FTP | other *** search
- /* History:
- 5/1/91 DJB baseline public domain
- */
-
- /*
-
- int kmemcpy(buf,pos,n) char *buf; char *pos; int n; copies n bytes from
- position pos in kernel memory into buffer buf (in user memory). It
- returns 0 on success, -1 on error.
-
- kmeminit() is an optional initialization routine to cooperate with other
- libraries.
-
- kmemstrerr is a strerrfun for kmeminit() and kmemcpy().
-
- */
-
- #include <sys/types.h>
- #include <sys/file.h>
- #include "kmem.h"
- #include "strerr.h"
-
- #define KMEM "/dev/kmem"
-
- #define LSEEKFROMSTART 0
-
- static int kmemfd = -1;
- static int kmemerrno = 0;
-
- static char *kmemerrprk(ke) strerrfun *ke; { *ke = strerrsys; return KMEM; }
-
- char *kmemstrerr(ke)
- strerrfun *ke;
- {
- *ke = 0;
- switch(kmemerrno)
- {
- case 0:
- return "kmem error 0";
- #define KMEM_OPEN 1
- case KMEM_OPEN:
- *ke = kmemerrprk;
- return "cannot open ";
- #define KMEM_LSEEK 2
- case KMEM_LSEEK:
- *ke = strerrsys;
- return "cannot lseek kmem";
- #define KMEM_READ 3
- case KMEM_READ:
- *ke = strerrsys;
- return "cannot read kmem";
- #define KMEM_READZERO 4
- case KMEM_READZERO:
- return "kmem read 0 bytes";
- default:
- return "unknown kmem error";
- }
- }
-
- int kmeminit()
- {
- kmemfd = open(KMEM,O_RDONLY);
- if (kmemfd == -1)
- RETERN(-1,kmemerrno,KMEM_OPEN)
- return 0;
- }
-
- int kmemcpy(buf,pos,n)
- char *buf;
- char *pos;
- int n;
- {
- int r;
-
- if (!n)
- return 0;
- if (kmemfd == -1)
- if (kmeminit() == -1)
- return -1;
- if (lseek(kmemfd,(long) pos,LSEEKFROMSTART) == -1)
- RETERN(-1,kmemerrno,KMEM_LSEEK)
- while ((r = read(kmemfd,buf,n)) < n)
- if (r == -1)
- RETERN(-1,kmemerrno,KMEM_READ)
- else if (r == 0) /* XXX: this can never happen */
- RETERN(-1,kmemerrno,KMEM_READZERO)
- else
- {
- buf += r;
- n -= r;
- }
- return 0;
- }
-