source: bootcd/isolinux/syslinux-6.03/com32/hdt/hdt-dump-disks.c

Last change on this file was e16e8f2, checked in by Edwin Eefting <edwin@datux.nl>, 3 years ago

bootstuff

  • Property mode set to 100644
File size: 4.7 KB
Line 
1/* ----------------------------------------------------------------------- *
2 *
3 *   Copyright 2011 Erwan Velu - All Rights Reserved
4 *
5 *   Permission is hereby granted, free of charge, to any person
6 *   obtaining a copy of this software and associated documentation
7 *   files (the "Software"), to deal in the Software without
8 *   restriction, including without limitation the rights to use,
9 *   copy, modify, merge, publish, distribute, sublicense, and/or
10 *   sell copies of the Software, and to permit persons to whom
11 *   the Software is furnished to do so, subject to the following
12 *   conditions:
13 *
14 *   The above copyright notice and this permission notice shall
15 *   be included in all copies or substantial portions of the Software.
16 *
17 *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
19 *   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20 *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21 *   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22 *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24 *   OTHER DEALINGS IN THE SOFTWARE.
25 *
26 * -----------------------------------------------------------------------
27 */
28
29#include "hdt-common.h"
30#include "hdt-dump.h"
31#include "hdt-util.h"
32
33ZZJSON_CONFIG *config;
34ZZJSON **item;
35
36static void show_partition_information(struct driveinfo *drive_info,
37                                       struct part_entry *ptab,
38                                       int partition_offset,
39                                       int nb_partitions_seen) {
40    char size[11] = {0};
41    char bootloader_name[9] = {0};
42    char ostype[64]={0};
43    char *parttype;
44    unsigned int start, end;
45    char bootable[6] = {0};
46
47    int i = nb_partitions_seen;
48    start = partition_offset;
49    end = start + ptab->length - 1;
50
51    if (ptab->length > 0)
52        sectors_to_size(ptab->length, size);
53
54    get_label(ptab->ostype, &parttype);
55    get_bootloader_string(drive_info, ptab, bootloader_name, 9);
56    if (ptab->active_flag == 0x80)
57        snprintf(bootable,sizeof(bootable),"%s","true");
58    else
59        snprintf(bootable,sizeof(bootable),"%s","false");
60
61    snprintf(ostype,sizeof(ostype),"%02X",ptab->ostype);
62
63    APPEND_ARRAY
64            add_ai("partition->number",i)
65            add_ai("partition->sector_start",start)
66            add_ai("partition->sector_end",end)
67            add_as("partition->size",size)
68            add_as("partition->type",parttype)
69            add_as("partition->os_type",ostype)
70            add_as("partition->boot_flag",bootable)
71    END_OF_APPEND;
72    free(parttype);
73}
74
75
76
77void show_disk(struct s_hardware *hardware, ZZJSON_CONFIG *conf, ZZJSON **it, int drive) {
78        config=conf;
79        item=it;
80        int i = drive - 0x80;
81        struct driveinfo *d = &hardware->disk_info[i];
82        char mbr_name[50]={0};
83        char disk_size[11]={0};
84
85        get_mbr_string(hardware->mbr_ids[i], &mbr_name,sizeof(mbr_name));
86        if ((int)d->edd_params.sectors > 0)
87                sectors_to_size((int)d->edd_params.sectors, disk_size);
88
89        char disk[5]={0};
90        char edd_version[5]={0};
91        snprintf(disk,sizeof(disk),"0x%X",d->disk);
92        snprintf(edd_version,sizeof(edd_version),"%X",d->edd_version);
93        zzjson_print(config, *item);
94        zzjson_free(config, *item);
95
96        CREATE_ARRAY
97                add_as("disk->number",disk)
98                add_ai("disk->cylinders",d->legacy_max_cylinder +1)
99                add_ai("disk->heads",d->legacy_max_head +1)
100                add_ai("disk->sectors_per_track",d->legacy_sectors_per_track)
101                add_as("disk->edd_version",edd_version)
102                add_as("disk->size",disk_size)
103                add_ai("disk->bytes_per_sector",(int)d->edd_params.bytes_per_sector)
104                add_ai("disk->sectors_per_track",(int)d->edd_params.sectors_per_track)
105                add_as("disk->host_bus",remove_spaces((char *)d->edd_params.host_bus_type))
106                add_as("disk->interface_type",remove_spaces((char *)d->edd_params.interface_type))
107                add_as("disk->mbr_name",mbr_name)
108                add_ai("disk->mbr_id",hardware->mbr_ids[i])
109        END_OF_ARRAY;
110
111        if (parse_partition_table(d, &show_partition_information)) {
112                if (errno_disk) {
113                        APPEND_ARRAY
114                                add_as("disk->error", "IO Error")
115                        END_OF_APPEND;
116                } else  {
117                        APPEND_ARRAY
118                                add_as("disk->error", "Unrecognized Partition Layout")
119                        END_OF_APPEND;
120                }
121        }
122}
123
124void dump_disks(struct s_hardware *hardware, ZZJSON_CONFIG *config, ZZJSON **item) {
125        bool found=false;
126
127        if (hardware->disks_count > 0) 
128            for (int drive = 0x80; drive < 0xff; drive++) {
129                if (hardware->disk_info[drive - 0x80].cbios) {
130                        if (found==false) {
131                                CREATE_NEW_OBJECT;
132                                add_b("disks->is_valid",true);
133                                found=true;
134                        }
135                        show_disk(hardware, config, item, drive);
136                }
137        }
138
139        if (found==false) {
140                CREATE_NEW_OBJECT;
141                add_b("disks->is_valid",false);
142        }
143        FLUSH_OBJECT;
144        to_cpio("disks");
145}
Note: See TracBrowser for help on using the repository browser.