Home | History | Annotate | Download | only in hdt
      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 
     33 ZZJSON_CONFIG *config;
     34 ZZJSON **item;
     35 
     36 static 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 
     77 void 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 
    124 void 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 }
    146