3 * (c) 2004 Laurent Vivier <Laurent@Vivier.EU>
21 #define EMILE_MAX_DISK 16
22 #define EMILE_MAX_DEVNAME 16
24 typedef char device_name_t[EMILE_MAX_DEVNAME];
28 static void print_size(int nb_blocks, int block_size)
32 B = (nb_blocks * block_size) % 1024;
34 if (block_size > 1024)
35 kB = nb_blocks * (block_size / 1024);
37 kB = nb_blocks / (1024 / block_size);
46 printf("%d.%03d GB", GB, MB * 1000 / 1024);
48 printf("%d.%03d MB", MB, kB * 1000 / 1024);
50 printf("%d.%03d kB", kB, B * 1000 / 1024);
53 static int emile_scanbus(device_name_t devices[EMILE_MAX_DISK])
63 for(i = 0; (i < EMILE_MAX_DISK) && (j < EMILE_MAX_DISK); i++)
65 sprintf(dev, "/dev/sd%c", 'a' + i);
66 fd = open(dev, O_RDONLY);
70 strncpy(devices[j++], dev, EMILE_MAX_DEVNAME);
73 /* scan ATA disks: EMILE doesn't manage them, but this
74 * allows to have all information on all disks
77 for(i = 0; (i < EMILE_MAX_DISK) && (j < EMILE_MAX_DISK); i++)
79 sprintf(dev, "/dev/hd%c", 'a' + i);
80 fd = open(dev, O_RDONLY);
84 strncpy(devices[j++], dev, EMILE_MAX_DEVNAME);
90 void diskinfo(char* devname)
95 char bootblock[BOOTBLOCK_SIZE];
96 int block_size, block_count;
100 printf("%s:", devname);
102 device_sector_size = 512;
103 device.data = (void*)device_open(devname, O_RDONLY);
104 device.write_sector = (stream_write_sector_t)device_write_sector;
105 device.read_sector = (stream_read_sector_t)device_read_sector;
106 device.close = (stream_close_t)device_close;
107 device.get_blocksize = (stream_get_blocksize_t)device_get_blocksize;
109 map = map_open(&device);
112 fprintf(stderr, "Cannot read map of %s\n", devname);
116 ret = map_geometry(map, &block_size, &block_count);
117 if ((ret != -1) && verbose)
119 printf(" block size: %d, blocks number: %d (",
120 block_size, block_count);
121 print_size(block_count, block_size);
128 printf("\t<No information available>\n");
131 if (!map_is_valid(map))
133 printf("\t<No valid partition map found>\n");
136 if (map_get_driver_number(map) > 0)
137 printf(" Drivers\n");
138 for (j = 0; j < map_get_driver_number(map); j++)
140 int block, size, type, part;
141 map_get_driver_info(map, j,
142 &block, &size, &type);
143 printf(" %d: base: %d size: %d ",
144 j, block * block_size / 512,
145 size * block_size / 512);
149 case kDriverTypeMacSCSI:
152 case kDriverTypeMacATA:
155 case kDriverTypeMacSCSIChained:
156 printf("SCSI chained");
158 case kDriverTypeMacATAChained:
159 printf("ATA chained");
162 printf("unknown (%04x)\n", type);
165 part = map_seek_driver_partition(map,
166 block * block_size / 512);
169 part = map_seek_driver_partition(map,
172 printf(" <invalid>\n");
178 if (!emile_is_apple_driver(map))
180 part = map_seek_driver_partition(map,
183 printf(" <invalid>\n");
187 printf(" <%d: %s [%s], ", part + 1,
188 map_get_partition_name(map),
189 map_get_partition_type(map));
190 switch(map_get_driver_signature(map))
192 case kPatchDriverSignature:
193 printf("patch driver");
195 case kSCSIDriverSignature:
196 printf("SCSI HD driver");
198 case kATADriverSignature:
199 printf("ATAPI HD driver");
201 case kSCSICDDriverSignature:
202 printf("SCSI CDROM driver");
204 case kATAPIDriverSignature:
205 printf("ATAPI CDROM driver");
207 case kDriveSetupHFSSignature:
208 printf("Drive Setup HFS partition");
211 printf("Unknown (0x%08lx)", map_get_driver_signature(map));
216 printf(" Partitions\n");
217 for (j = 0; j < map_get_number(map); j++)
221 if (map_partition_is_startup(map))
225 printf("%d: ", j + 1);
226 printf("%16s [%-16s] ",
227 map_get_partition_name(map),
228 map_get_partition_type(map));
229 map_bootblock_read(map, bootblock);
230 boottype = map_bootblock_get_type(bootblock);
233 case INVALID_BOOTBLOCK:
235 case APPLE_BOOTBLOCK:
236 printf(" <Apple bootblock>");
238 case EMILE_BOOTBLOCK:
239 printf(" <EMILE bootblock>");
242 printf(" <unknown bootblock>");
245 if (map_partition_is_bootable(map))
252 int bootstart, bootsize, bootaddr, bootentry;
255 if (*(unsigned long*)
256 (map_get_partition_type(map) + 28))
257 printf(" patch: %s\n",
258 map_get_partition_type(map) + 28);
260 ret = map_get_partition_geometry(map,
268 print_size(count, 512);
270 printf(" flags: 0x%08x\n",
271 map_partition_get_flags(map));
272 map_get_bootinfo(map, &bootstart,
273 &bootsize, &bootaddr,
274 &bootentry, &checksum,
277 "Bootstart: %d, Bootsize: %d\n",
278 bootstart, bootsize);
280 "Bootaddr: %d, Bootentry: %d\n",
281 bootaddr, bootentry);
283 "Checksum: 0x%04x, Processor: %s\n",
284 checksum, processor);
293 device_name_t devname[EMILE_MAX_DISK];
297 count = emile_scanbus(devname);
303 "ERROR: cannot access to devices (you should try as root...)\n");
306 printf("No disk found\n");
308 for (i = 0; i < count; i++)
309 diskinfo(devname[i]);