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