]>
Commit | Line | Data |
---|---|---|
4d8d554a CW |
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 | } |