diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /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-x | sys/src/cmd/dossrv/devio.c | 65 |
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; +} |