1 d3df3087 2003-12-06 devnull /* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */
2 d3df3087 2003-12-06 devnull /* See COPYRIGHT */
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"
11 d3df3087 2003-12-06 devnull fspread(Fid *fid, void *buf, long n, vlong offset)
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;
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);
27 d3df3087 2003-12-06 devnull tx.offset = offset;
28 d3df3087 2003-12-06 devnull tx.count = n;
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;
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);
45 d3df3087 2003-12-06 devnull free(freep);
47 d3df3087 2003-12-06 devnull return rx.count;
51 d3df3087 2003-12-06 devnull fsread(Fid *fid, void *buf, long n)
53 d3df3087 2003-12-06 devnull return fspread(fid, buf, n, -1);
57 2277c5d7 2004-03-21 devnull fsreadn(Fid *fid, void *buf, long n)
59 2277c5d7 2004-03-21 devnull long tot, nn;
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;
69 2277c5d7 2004-03-21 devnull return tot;