home *** CD-ROM | disk | FTP | other *** search
- /* History:
- 5/1/91 DJB baseline public domain
- */
-
- /*
-
- See kmem.c for documentation.
-
- */
-
- #include <sys/types.h>
- #include <sys/file.h>
- #include "mmem.h"
- #include "strerr.h"
-
- #define MMEM "/dev/mem"
-
- #define LSEEKFROMSTART 0
-
- static int mmemfd = -1;
- static int mmemerrno = 0;
-
- static char *mmemerrprk(ke) strerrfun *ke; { *ke = strerrsys; return MMEM; }
-
- char *mmemstrerr(ke)
- strerrfun *ke;
- {
- *ke = 0;
- switch(mmemerrno)
- {
- case 0:
- return "mem error 0";
- #define MMEM_OPEN 1
- case MMEM_OPEN:
- *ke = mmemerrprk;
- return "cannot open ";
- #define MMEM_LSEEK 2
- case MMEM_LSEEK:
- *ke = strerrsys;
- return "cannot lseek mem";
- #define MMEM_READ 3
- case MMEM_READ:
- *ke = strerrsys;
- return "cannot read mem";
- #define MMEM_READZERO 4
- case MMEM_READZERO:
- return "mem read 0 bytes";
- default:
- return "unknown mem error";
- }
- }
-
- int mmeminit()
- {
- mmemfd = open(MMEM,O_RDONLY);
- if (mmemfd == -1)
- RETERN(-1,mmemerrno,MMEM_OPEN)
- return 0;
- }
-
- int mmemcpy(buf,pos,n)
- char *buf;
- char *pos;
- int n;
- {
- int r;
-
- if (!n)
- return 0;
- if (mmemfd == -1)
- if (mmeminit() == -1)
- return -1;
- if (lseek(mmemfd,(long) pos,LSEEKFROMSTART) == -1)
- RETERN(-1,mmemerrno,MMEM_LSEEK)
- while ((r = read(mmemfd,buf,n)) < n)
- if (r == -1)
- RETERN(-1,mmemerrno,MMEM_READ)
- else if (r == 0) /* XXX: this can never happen */
- RETERN(-1,mmemerrno,MMEM_READZERO)
- else
- {
- buf += r;
- n -= r;
- }
- return 0;
- }
-