1 /* radare - LGPL - Copyright 2011-2017 pancake<nopcode.org> */
2
3 #include <r_io.h>
4 #include <r_fs.h>
5 #include "grubfs.h"
6 #include <stdio.h>
7 #include <string.h>
8
9
10 static RIOBind *bio = NULL;
11 static ut64 delta = 0;
12
empty(int sz)13 static void* empty (int sz) {
14 void *p = malloc (sz);
15 if (p) memset (p, '\0', sz);
16 return p;
17 }
18
read_foo(struct grub_disk * disk,grub_disk_addr_t sector,grub_size_t size,char * buf)19 static grub_err_t read_foo (struct grub_disk *disk, grub_disk_addr_t sector, grub_size_t size, char *buf) {
20 if (!disk) {
21 eprintf ("oops. no disk\n");
22 return 1;
23 }
24 const int blocksize = 512; // TODO unhardcode 512
25 RIOBind *iob = disk->data;
26 if (bio) {
27 iob = bio;
28 }
29 //printf ("io %p\n", file->root->iob.io);
30 return !iob->read_at (iob->io, delta+(blocksize*sector), (ut8*)buf, size*blocksize);
31 }
32
grubfs_new(struct grub_fs * myfs,void * data)33 GrubFS *grubfs_new (struct grub_fs *myfs, void *data) {
34 struct grub_file *file;
35 GrubFS *gfs = empty (sizeof (GrubFS));
36 // hacky mallocs :D
37 gfs->file = file = empty (sizeof (struct grub_file));
38 file->device = empty (sizeof (struct grub_device)+1024);
39 file->device->disk = empty (sizeof (struct grub_disk));
40 file->device->disk->dev = (grub_disk_dev_t)file->device; // hack!
41 file->device->disk->dev->read = read_foo; // grub_disk_dev
42 file->device->disk->data = data;
43 //file->device->disk->read_hook = read_foo; //read_hook;
44 file->fs = myfs;
45 return gfs;
46 }
47
grubfs_disk(void * data)48 grub_disk_t grubfs_disk (void *data) {
49 struct grub_disk *disk = empty (sizeof (struct grub_disk));
50 disk->dev = empty (sizeof (struct grub_disk_dev));
51 disk->dev->read = read_foo; // grub_disk_dev
52 disk->data = data;
53 return disk;
54 }
55
grubfs_free(GrubFS * gf)56 void grubfs_free (GrubFS *gf) {
57 if (gf) {
58 if (gf->file && gf->file->device) {
59 free (gf->file->device->disk);
60 }
61 //free (gf->file->device);
62 free (gf->file);
63 free (gf);
64 }
65 }
66
grubfs_bind_io(RIOBind * iob,ut64 _delta)67 void grubfs_bind_io (RIOBind *iob, ut64 _delta) {
68 bio = iob;
69 delta = _delta;
70 }
71