plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

file.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 }