mirror of
https://github.com/jamessanford/kegs.git
synced 2024-09-11 12:55:04 +00:00
136 lines
2.9 KiB
C
136 lines
2.9 KiB
C
|
|
#include "defc.h"
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include <errno.h>
|
|
|
|
|
|
#define BUF_SIZE 65536
|
|
char buf[BUF_SIZE];
|
|
|
|
void
|
|
read_block(int fd, char *buf, int blk, int blk_size)
|
|
{
|
|
int ret;
|
|
|
|
ret = lseek(fd, blk * blk_size, SEEK_SET);
|
|
if(ret != blk * blk_size) {
|
|
printf("lseek: %d, errno: %d\n", ret, errno);
|
|
exit(1);
|
|
}
|
|
|
|
ret = read(fd, buf, blk_size);
|
|
if(ret != blk_size) {
|
|
printf("ret: %d, errno: %d\n", ret, errno);
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
int
|
|
main(int argc, char **argv)
|
|
{
|
|
Driver_desc *driver_desc_ptr;
|
|
Part_map *part_map_ptr;
|
|
double dsize;
|
|
int fd;
|
|
int block_size;
|
|
word32 sig;
|
|
word32 map_blk_cnt;
|
|
word32 phys_part_start;
|
|
word32 part_blk_cnt;
|
|
word32 data_start;
|
|
word32 data_cnt;
|
|
int map_blocks;
|
|
int cur;
|
|
int long_form;
|
|
int last_arg;
|
|
int i;
|
|
|
|
/* parse args */
|
|
long_form = 0;
|
|
last_arg = 1;
|
|
for(i = 1; i < argc; i++) {
|
|
if(!strcmp("-l", argv[i])) {
|
|
long_form = 1;
|
|
} else {
|
|
last_arg = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
fd = open(argv[last_arg], O_RDONLY | O_BINARY, 0x1b6);
|
|
if(fd < 0) {
|
|
printf("open %s, ret: %d, errno:%d\n", argv[last_arg],fd,errno);
|
|
exit(1);
|
|
}
|
|
if(long_form) {
|
|
printf("fd: %d\n", fd);
|
|
}
|
|
|
|
block_size = 512;
|
|
read_block(fd, buf, 0, block_size);
|
|
|
|
driver_desc_ptr = (Driver_desc *)buf;
|
|
sig = GET_BE_WORD16(driver_desc_ptr->sig);
|
|
block_size = GET_BE_WORD16(driver_desc_ptr->blk_size);
|
|
if(long_form) {
|
|
printf("sig: %04x, blksize: %04x\n", sig, block_size);
|
|
}
|
|
if(block_size == 0) {
|
|
block_size = 512;
|
|
}
|
|
|
|
if(sig == 0x4552 && block_size >= 0x200) {
|
|
if(long_form) {
|
|
printf("good!\n");
|
|
}
|
|
} else {
|
|
printf("bad sig:%04x or block_size:%04x!\n", sig, block_size);
|
|
exit(1);
|
|
}
|
|
|
|
map_blocks = 1;
|
|
cur = 0;
|
|
while(cur < map_blocks) {
|
|
read_block(fd, buf, cur + 1, block_size);
|
|
part_map_ptr = (Part_map *)buf;
|
|
sig = GET_BE_WORD16(part_map_ptr->sig);
|
|
map_blk_cnt = GET_BE_WORD32(part_map_ptr->map_blk_cnt);
|
|
phys_part_start = GET_BE_WORD32(part_map_ptr->phys_part_start);
|
|
part_blk_cnt = GET_BE_WORD32(part_map_ptr->part_blk_cnt);
|
|
data_start = GET_BE_WORD32(part_map_ptr->data_start);
|
|
data_cnt = GET_BE_WORD32(part_map_ptr->data_cnt);
|
|
|
|
if(cur == 0) {
|
|
map_blocks = MIN(100, map_blk_cnt);
|
|
}
|
|
|
|
if(long_form) {
|
|
printf("%2d: sig: %04x, map_blk_cnt: %d, "
|
|
"phys_part_start: %08x, part_blk_cnt: %08x\n",
|
|
cur, sig, map_blk_cnt, phys_part_start,
|
|
part_blk_cnt);
|
|
printf(" part_name: %s, part_type: %s\n",
|
|
part_map_ptr->part_name,
|
|
part_map_ptr->part_type);
|
|
printf(" data_start:%08x, data_cnt:%08x status:%08x\n",
|
|
GET_BE_WORD32(part_map_ptr->data_start),
|
|
GET_BE_WORD32(part_map_ptr->data_cnt),
|
|
GET_BE_WORD32(part_map_ptr->part_status));
|
|
printf(" processor: %s\n", part_map_ptr->processor);
|
|
} else {
|
|
dsize = (double)GET_BE_WORD32(part_map_ptr->data_cnt);
|
|
printf("%2d:%-20s size=%6.2fMB type=%s\n", cur,
|
|
part_map_ptr->part_name,
|
|
(dsize/(1024.0*2.0)),
|
|
part_map_ptr->part_type);
|
|
}
|
|
|
|
cur++;
|
|
}
|
|
|
|
close(fd);
|
|
return 0;
|
|
}
|