summaryrefslogtreecommitdiff
path: root/sys/src/cmd/dossrv/devio.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/dossrv/devio.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/dossrv/devio.c')
-rwxr-xr-xsys/src/cmd/dossrv/devio.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/sys/src/cmd/dossrv/devio.c b/sys/src/cmd/dossrv/devio.c
new file mode 100755
index 000000000..0ec1681ef
--- /dev/null
+++ b/sys/src/cmd/dossrv/devio.c
@@ -0,0 +1,65 @@
+#include <u.h>
+#include <libc.h>
+#include "iotrack.h"
+#include "dat.h"
+#include "fns.h"
+
+int readonly;
+
+static int
+deverror(char *name, Xfs *xf, long addr, long n, long nret)
+{
+ errno = Eio;
+ if(nret < 0){
+ chat("%s errstr=\"%r\"...", name);
+ close(xf->dev);
+ xf->dev = -1;
+ return -1;
+ }
+ fprint(2, "dev %d sector %ld, %s: %ld, should be %ld\n", xf->dev, addr, name, nret, n);
+ return -1;
+}
+
+int
+devread(Xfs *xf, long addr, void *buf, long n)
+{
+ long nread;
+
+ if(xf->dev < 0)
+ return -1;
+ nread = pread(xf->dev, buf, n, xf->offset+(vlong)addr*Sectorsize);
+ if (nread == n)
+ return 0;
+ return deverror("read", xf, addr, n, nread);
+}
+
+int
+devwrite(Xfs *xf, long addr, void *buf, long n)
+{
+ long nwrite;
+
+ if(xf->omode==OREAD)
+ return -1;
+
+ if(xf->dev < 0)
+ return -1;
+ nwrite = pwrite(xf->dev, buf, n, xf->offset+(vlong)addr*Sectorsize);
+ if (nwrite == n)
+ return 0;
+ return deverror("write", xf, addr, n, nwrite);
+}
+
+int
+devcheck(Xfs *xf)
+{
+ char buf[Sectorsize];
+
+ if(xf->dev < 0)
+ return -1;
+ if(pread(xf->dev, buf, Sectorsize, 0) != Sectorsize){
+ close(xf->dev);
+ xf->dev = -1;
+ return -1;
+ }
+ return 0;
+}