Blame


1 d3df3087 2003-12-06 devnull /* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */
2 d3df3087 2003-12-06 devnull /* See COPYRIGHT */
3 d3df3087 2003-12-06 devnull
4 d3df3087 2003-12-06 devnull #include <u.h>
5 d3df3087 2003-12-06 devnull #include <libc.h>
6 d3df3087 2003-12-06 devnull #include <fcall.h>
7 d3df3087 2003-12-06 devnull #include <fs.h>
8 d3df3087 2003-12-06 devnull #include "fsimpl.h"
9 d3df3087 2003-12-06 devnull
10 d3df3087 2003-12-06 devnull long
11 d3df3087 2003-12-06 devnull fspread(Fid *fid, void *buf, long n, vlong offset)
12 d3df3087 2003-12-06 devnull {
13 d3df3087 2003-12-06 devnull Fcall tx, rx;
14 d3df3087 2003-12-06 devnull void *freep;
15 5a8e63b2 2004-02-29 devnull uint msize;
16 d3df3087 2003-12-06 devnull
17 5a8e63b2 2004-02-29 devnull msize = fid->fs->msize - IOHDRSZ;
18 5a8e63b2 2004-02-29 devnull if(n > msize)
19 5a8e63b2 2004-02-29 devnull n = msize;
20 d3df3087 2003-12-06 devnull tx.type = Tread;
21 ceb04770 2003-12-09 devnull tx.fid = fid->fid;
22 d3df3087 2003-12-06 devnull if(offset == -1){
23 d3df3087 2003-12-06 devnull qlock(&fid->lk);
24 d3df3087 2003-12-06 devnull tx.offset = fid->offset;
25 d3df3087 2003-12-06 devnull qunlock(&fid->lk);
26 d3df3087 2003-12-06 devnull }else
27 d3df3087 2003-12-06 devnull tx.offset = offset;
28 d3df3087 2003-12-06 devnull tx.count = n;
29 d3df3087 2003-12-06 devnull
30 15680d56 2004-03-05 devnull if(fsrpc(fid->fs, &tx, &rx, &freep) < 0)
31 15680d56 2004-03-05 devnull return -1;
32 d3df3087 2003-12-06 devnull if(rx.type == Rerror){
33 d3df3087 2003-12-06 devnull werrstr("%s", rx.ename);
34 d3df3087 2003-12-06 devnull free(freep);
35 d3df3087 2003-12-06 devnull return -1;
36 d3df3087 2003-12-06 devnull }
37 d3df3087 2003-12-06 devnull if(rx.count){
38 d3df3087 2003-12-06 devnull memmove(buf, rx.data, rx.count);
39 d3df3087 2003-12-06 devnull if(offset == -1){
40 d3df3087 2003-12-06 devnull qlock(&fid->lk);
41 ceb04770 2003-12-09 devnull fid->offset += rx.count;
42 d3df3087 2003-12-06 devnull qunlock(&fid->lk);
43 d3df3087 2003-12-06 devnull }
44 d3df3087 2003-12-06 devnull }
45 d3df3087 2003-12-06 devnull free(freep);
46 d3df3087 2003-12-06 devnull
47 d3df3087 2003-12-06 devnull return rx.count;
48 d3df3087 2003-12-06 devnull }
49 d3df3087 2003-12-06 devnull
50 d3df3087 2003-12-06 devnull long
51 d3df3087 2003-12-06 devnull fsread(Fid *fid, void *buf, long n)
52 d3df3087 2003-12-06 devnull {
53 d3df3087 2003-12-06 devnull return fspread(fid, buf, n, -1);
54 d3df3087 2003-12-06 devnull }
55 2277c5d7 2004-03-21 devnull
56 2277c5d7 2004-03-21 devnull long
57 2277c5d7 2004-03-21 devnull fsreadn(Fid *fid, void *buf, long n)
58 2277c5d7 2004-03-21 devnull {
59 2277c5d7 2004-03-21 devnull long tot, nn;
60 2277c5d7 2004-03-21 devnull
61 2277c5d7 2004-03-21 devnull for(tot=0; tot<n; tot+=nn){
62 2277c5d7 2004-03-21 devnull nn = fsread(fid, (char*)buf+tot, n-tot);
63 2277c5d7 2004-03-21 devnull if(nn <= 0){
64 2277c5d7 2004-03-21 devnull if(tot == 0)
65 2277c5d7 2004-03-21 devnull return nn;
66 2277c5d7 2004-03-21 devnull break;
67 2277c5d7 2004-03-21 devnull }
68 2277c5d7 2004-03-21 devnull }
69 2277c5d7 2004-03-21 devnull return tot;
70 2277c5d7 2004-03-21 devnull }
71 2277c5d7 2004-03-21 devnull
72 2277c5d7 2004-03-21 devnull