URI:
       tread.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tread.c (1161B)
       ---
            1 /* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */
            2 /* See COPYRIGHT */
            3 
            4 #include <u.h>
            5 #include <libc.h>
            6 #include <fcall.h>
            7 #include <9pclient.h>
            8 #include "fsimpl.h"
            9 
           10 long
           11 fspread(CFid *fid, void *buf, long n, vlong offset)
           12 {
           13         Fcall tx, rx;
           14         void *freep;
           15         uint msize;
           16         long nr;
           17 
           18         msize = fid->fs->msize - IOHDRSZ;
           19         if(n > msize)
           20                 n = msize;
           21         tx.type = Tread;
           22         tx.fid = fid->fid;
           23         if(offset == -1){
           24                 qlock(&fid->lk);
           25                 tx.offset = fid->offset;
           26                 qunlock(&fid->lk);
           27         }else
           28                 tx.offset = offset;
           29         tx.count = n;
           30 
           31         if(_fsrpc(fid->fs, &tx, &rx, &freep) < 0)
           32                 return -1;
           33         if(rx.type == Rerror){
           34                 werrstr("%s", rx.ename);
           35                 free(freep);
           36                 return -1;
           37         }
           38         nr = rx.count;
           39         if(nr > n)
           40                 nr = n;
           41 
           42         if(nr){
           43                 memmove(buf, rx.data, nr);
           44                 if(offset == -1){
           45                         qlock(&fid->lk);
           46                         fid->offset += nr;
           47                         qunlock(&fid->lk);
           48                 }
           49         }
           50         free(freep);
           51 
           52         return nr;
           53 }
           54 
           55 long
           56 fsread(CFid *fid, void *buf, long n)
           57 {
           58         return fspread(fid, buf, n, -1);
           59 }
           60 
           61 long
           62 fsreadn(CFid *fid, void *buf, long n)
           63 {
           64         long tot, nn;
           65 
           66         for(tot=0; tot<n; tot+=nn){
           67                 nn = fsread(fid, (char*)buf+tot, n-tot);
           68                 if(nn <= 0){
           69                         if(tot == 0)
           70                                 return nn;
           71                         break;
           72                 }
           73         }
           74         return tot;
           75 }