URI:
       tfile.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
       ---
       tfile.c (1444B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <diskfs.h>
            4 
            5 int nfilereads;
            6 void _nfilereads_darwin_sucks(void) { }
            7 
            8 typedef struct DiskFile DiskFile;
            9 struct DiskFile
           10 {
           11         Disk disk;
           12         int fd;
           13 };
           14 
           15 static long
           16 preadn(int fd, void *vdata, u32int ulen, u64int offset)
           17 {
           18         long n;
           19         uchar *data;
           20         long len;
           21 
           22         nfilereads++;
           23         len = ulen;
           24         data = vdata;
           25 /*        fprint(2, "readn 0x%llux 0x%ux\n", offset, ulen); */
           26         while(len > 0){
           27                 n = pread(fd, data, len, offset);
           28                 if(n <= 0)
           29                         break;
           30                 data += n;
           31                 offset += n;
           32                 len -= n;
           33         }
           34         return data-(uchar*)vdata;
           35 }
           36 
           37 static void
           38 diskfileblockput(Block *b)
           39 {
           40         free(b);
           41 }
           42 
           43 uvlong nreadx;
           44 static Block*
           45 diskfileread(Disk *dd, u32int len, u64int offset)
           46 {
           47         int n;
           48         Block *b;
           49         DiskFile *d = (DiskFile*)dd;
           50 
           51         b = mallocz(sizeof(Block)+len, 1);
           52         if(b == nil)
           53                 return nil;
           54         b->data = (uchar*)&b[1];
           55 nreadx += len;
           56         n = preadn(d->fd, b->data, len, offset);
           57         if(n <= 0){
           58                 free(b);
           59                 return nil;
           60         }
           61         b->_close = diskfileblockput;
           62         b->len = n;
           63         return b;
           64 }
           65 
           66 static int
           67 diskfilesync(Disk *dd)
           68 {
           69         USED(dd);
           70         return 0;
           71 }
           72 
           73 static void
           74 diskfileclose(Disk *dd)
           75 {
           76         DiskFile *d = (DiskFile*)dd;
           77 
           78         close(d->fd);
           79         free(d);
           80 }
           81 
           82 Disk*
           83 diskopenfile(char *file)
           84 {
           85         int fd;
           86         DiskFile *d;
           87 
           88         if((fd = open(file, OREAD)) < 0)
           89                 return nil;
           90         d = mallocz(sizeof(DiskFile), 1);
           91         if(d == nil){
           92                 close(fd);
           93                 return nil;
           94         }
           95         d->disk._read = diskfileread;
           96         d->disk._sync = diskfilesync;
           97         d->disk._close = diskfileclose;
           98         d->fd = fd;
           99         return &d->disk;
          100 }