]> git.proxmox.com Git - grub2.git/blob - grub-core/osdep/haiku/getroot.c
Import grub2_2.02+dfsg1.orig.tar.xz
[grub2.git] / grub-core / osdep / haiku / getroot.c
1 #include <config.h>
2 #include <config-util.h>
3 #include <sys/types.h>
4 #include <sys/stat.h>
5 #include <string.h>
6 #include <errno.h>
7 #include <stdint.h>
8 #include <grub/util/misc.h>
9 #include <grub/emu/hostdisk.h>
10 #include <grub/emu/getroot.h>
11 #include <fs_info.h>
12 #include <Drivers.h>
13 #include <StorageDefs.h>
14
15 enum grub_dev_abstraction_types
16 grub_util_get_dev_abstraction_os (const char *os_dev __attribute__((unused)))
17 {
18 return GRUB_DEV_ABSTRACTION_NONE;
19 }
20
21 int
22 grub_util_pull_device_os (const char *os_dev __attribute__ ((unused)),
23 enum grub_dev_abstraction_types ab __attribute__ ((unused)))
24 {
25 return 0;
26 }
27
28 char *
29 grub_util_get_grub_dev_os (const char *os_dev __attribute__ ((unused)))
30 {
31 return NULL;
32 }
33
34 char **
35 grub_guess_root_devices (const char *dir_in)
36 {
37 dev_t dv = dev_for_path (dir_in);
38 fs_info inf;
39 char **ret;
40 if (fs_stat_dev (dv, &inf) != B_OK)
41 return NULL;
42 ret = xmalloc (2 * sizeof (ret[0]));
43 ret[0] = xstrdup (inf.device_name);
44 ret[1] = NULL;
45 return ret;
46 }
47
48 grub_disk_addr_t
49 grub_util_find_partition_start_os (const char *dev)
50 {
51 partition_info part;
52 grub_disk_addr_t ret;
53 int fd = open (dev, O_RDONLY);
54 if (fd < 0)
55 return 0;
56 if (ioctl (fd, B_GET_PARTITION_INFO, &part, sizeof (part)) < 0)
57 {
58 close (fd);
59 return 0;
60 }
61 ret = part.offset;
62 close (fd);
63 fd = open (part.device, O_RDONLY);
64
65 device_geometry geo;
66 if (ioctl (fd, B_GET_GEOMETRY, &geo, sizeof (geo)) < 0)
67 return 0;
68 ret /= geo.bytes_per_sector ? : 512;
69 close (fd);
70 return ret;
71 }
72
73 char *
74 grub_util_part_to_disk (const char *os_dev,
75 struct stat *st __attribute__ ((unused)),
76 int *is_part)
77 {
78 char *ret;
79 partition_info part;
80 int fd = open (os_dev, O_RDONLY);
81 *is_part = 0;
82
83 if (fd < 0)
84 return xstrdup (os_dev);
85 if (ioctl (fd, B_GET_PARTITION_INFO, &part, sizeof (part)) < 0)
86 {
87 close (fd);
88 return xstrdup (os_dev);
89 }
90 ret = xstrdup (part.device);
91 close (fd);
92 *is_part=1;
93 return ret;
94 }
95
96 int
97 grub_util_biosdisk_is_floppy (grub_disk_t disk)
98 {
99 const char *dname;
100
101 dname = grub_util_biosdisk_get_osdev (disk);
102
103 return (strncmp (dname, "/dev/disk/floppy/", sizeof ("/dev/disk/floppy/") - 1)
104 == 0);
105 }