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 "smem.h"
- #include "strerr.h"
-
- #define SMEM "/dev/drum"
-
- #define LSEEKFROMSTART 0
-
- static int smemfd = -1;
- static int smemerrno = 0;
-
- static char *smemerrprk(ke) strerrfun *ke; { *ke = strerrsys; return SMEM; }
-
- char *smemstrerr(ke)
- strerrfun *ke;
- {
- *ke = 0;
- switch(smemerrno)
- {
- case 0:
- return "drum error 0";
- #define SMEM_OPEN 1
- case SMEM_OPEN:
- *ke = smemerrprk;
- return "cannot open ";
- #define SMEM_LSEEK 2
- case SMEM_LSEEK:
- *ke = strerrsys;
- return "cannot lseek drum";
- #define SMEM_READ 3
- case SMEM_READ:
- *ke = strerrsys;
- return "cannot read drum";
- #define SMEM_READZERO 4
- case SMEM_READZERO:
- return "drum read 0 bytes";
- default:
- return "unknown drum error";
- }
- }
-
- int smeminit()
- {
- smemfd = open(SMEM,O_RDONLY);
- if (smemfd == -1)
- RETERN(-1,smemerrno,SMEM_OPEN)
- return 0;
- }
-
- int smemcpy(buf,pos,n)
- char *buf;
- char *pos;
- int n;
- {
- int r;
-
- if (!n)
- return 0;
- if (smemfd == -1)
- if (smeminit() == -1)
- return -1;
- if (lseek(smemfd,(long) pos,LSEEKFROMSTART) == -1)
- RETERN(-1,smemerrno,SMEM_LSEEK)
- while ((r = read(smemfd,buf,n)) < n)
- if (r == -1)
- RETERN(-1,smemerrno,SMEM_READ)
- else if (r == 0) /* XXX: this can never happen */
- RETERN(-1,smemerrno,SMEM_READZERO)
- else
- {
- buf += r;
- n -= r;
- }
- return 0;
- }
-