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 fprint(2, "n %d msize %d\n", n, msize);
19 5a8e63b2 2004-02-29 devnull if(n > msize)
20 5a8e63b2 2004-02-29 devnull n = msize;
21 d3df3087 2003-12-06 devnull tx.type = Tread;
22 ceb04770 2003-12-09 devnull tx.fid = fid->fid;
23 d3df3087 2003-12-06 devnull if(offset == -1){
24 d3df3087 2003-12-06 devnull qlock(&fid->lk);
25 d3df3087 2003-12-06 devnull tx.offset = fid->offset;
26 d3df3087 2003-12-06 devnull qunlock(&fid->lk);
27 d3df3087 2003-12-06 devnull }else
28 d3df3087 2003-12-06 devnull tx.offset = offset;
29 d3df3087 2003-12-06 devnull tx.count = n;
30 d3df3087 2003-12-06 devnull
31 15680d56 2004-03-05 devnull if(fsrpc(fid->fs, &tx, &rx, &freep) < 0)
32 15680d56 2004-03-05 devnull return -1;
33 d3df3087 2003-12-06 devnull if(rx.type == Rerror){
34 d3df3087 2003-12-06 devnull werrstr("%s", rx.ename);
35 d3df3087 2003-12-06 devnull free(freep);
36 d3df3087 2003-12-06 devnull return -1;
37 d3df3087 2003-12-06 devnull }
38 d3df3087 2003-12-06 devnull if(rx.count){
39 d3df3087 2003-12-06 devnull memmove(buf, rx.data, rx.count);
40 d3df3087 2003-12-06 devnull if(offset == -1){
41 d3df3087 2003-12-06 devnull qlock(&fid->lk);
42 ceb04770 2003-12-09 devnull fid->offset += rx.count;
43 d3df3087 2003-12-06 devnull qunlock(&fid->lk);
44 d3df3087 2003-12-06 devnull }
45 d3df3087 2003-12-06 devnull }
46 d3df3087 2003-12-06 devnull free(freep);
47 d3df3087 2003-12-06 devnull
48 d3df3087 2003-12-06 devnull return rx.count;
49 d3df3087 2003-12-06 devnull }
50 d3df3087 2003-12-06 devnull
51 d3df3087 2003-12-06 devnull long
52 d3df3087 2003-12-06 devnull fsread(Fid *fid, void *buf, long n)
53 d3df3087 2003-12-06 devnull {
54 d3df3087 2003-12-06 devnull return fspread(fid, buf, n, -1);
55 d3df3087 2003-12-06 devnull }