modified to be able to read info from an image like from a block device

This commit is contained in:
Laurent Vivier 2006-05-30 21:21:31 +00:00
parent 7e67a5fe43
commit a3f46bd6c8

View File

@ -13,6 +13,7 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include "partition.h"
#include "libemile.h" #include "libemile.h"
int verbose = 0; int verbose = 0;
@ -59,7 +60,7 @@ static struct option long_options[] =
static void usage(int argc, char** argv) static void usage(int argc, char** argv)
{ {
fprintf(stderr, "Usage: %s [--verbose|-v] [--scanbus|<disk>]\n", argv[0]); fprintf(stderr, "Usage: %s [--verbose|-v] [--scanbus|<disk>]\n", argv[0]);
fprintf(stderr, "Usage: %s [--startup|--flags FLAGS][--type TYPE][--get-driver|-g FILE][--put-driver|-p FILE] <partition>\n", argv[0]); fprintf(stderr, "Usage: %s [--startup|--flags FLAGS][--type TYPE][--get-driver|-g FILE][--put-driver|-p FILE] [<partition>|<disk> <part number>]\n", argv[0]);
fprintf(stderr, "\nbuild: \n%s\n", SIGNATURE); fprintf(stderr, "\nbuild: \n%s\n", SIGNATURE);
} }
@ -74,7 +75,6 @@ static int get_driver(emile_map_t *map, int partition, char* appledriver)
char *code; char *code;
int fd; int fd;
int ret; int ret;
char part_name[16];
emile_map_read(map, partition); emile_map_read(map, partition);
if (strncmp(emile_map_get_partition_type(map), if (strncmp(emile_map_get_partition_type(map),
@ -92,6 +92,7 @@ static int get_driver(emile_map_t *map, int partition, char* appledriver)
} }
emile_map_geometry(map, &block_size, &block_count); emile_map_geometry(map, &block_size, &block_count);
printf("block size: %d\n", block_size);
driver_number = emile_map_get_driver_number(map); driver_number = emile_map_get_driver_number(map);
if (driver_number == 0) if (driver_number == 0)
@ -115,7 +116,8 @@ static int get_driver(emile_map_t *map, int partition, char* appledriver)
return -1; return -1;
} }
printf("Found driver %d for partition %d\n", driver, partition + 1); printf("Found driver %d for partition %d\n", driver, partition + 1);
printf("base: %d size: %d type: 0x%x\n", block, size, type); printf("base: %d size: %d type: %d\n", block * block_size / 512,
size * block_size / 512 , type);
emile_map_get_bootinfo(map, &bootstart, &bootsize, &bootaddr, emile_map_get_bootinfo(map, &bootstart, &bootsize, &bootaddr,
&bootentry, &checksum, processor); &bootentry, &checksum, processor);
printf("Bootstart: %d, Bootsize: %d, Bootaddr: %d, Bootentry: %d\n", printf("Bootstart: %d, Bootsize: %d, Bootaddr: %d, Bootentry: %d\n",
@ -136,8 +138,7 @@ static int get_driver(emile_map_t *map, int partition, char* appledriver)
return -1; return -1;
} }
sprintf(part_name, "%s%d", emile_map_dev(map), partition + 1); fd = open(emile_map_dev(map), O_RDONLY);
fd = open(part_name, O_RDONLY);
if (fd == -1) if (fd == -1)
{ {
fprintf(stderr, "ERROR: cannot read driver (open())\n"); fprintf(stderr, "ERROR: cannot read driver (open())\n");
@ -145,6 +146,13 @@ static int get_driver(emile_map_t *map, int partition, char* appledriver)
return -1; return -1;
} }
if (lseek(fd, block * block_size,SEEK_SET) != (block * block_size))
{
fprintf(stderr, "ERROR: cannot read driver (lseek())\n");
free(code);
return -1;
}
ret = read(fd, code, bootsize); ret = read(fd, code, bootsize);
close(fd); close(fd);
@ -155,9 +163,10 @@ static int get_driver(emile_map_t *map, int partition, char* appledriver)
return -1; return -1;
} }
if (emile_checksum(code, bootsize) != checksum) ret = emile_checksum(code, bootsize);
if (ret != checksum)
fprintf(stderr, "WARNING: checksum is invalid (0x%x)\n", fprintf(stderr, "WARNING: checksum is invalid (0x%x)\n",
emile_checksum(code, bootsize)); ret);
else else
printf("Checksum OK\n"); printf("Checksum OK\n");
@ -331,7 +340,8 @@ int main(int argc, char** argv)
int ret; int ret;
int disk; int disk;
int partition; int partition;
char disk_name[16]; char *disk_name;
char buffer[16];
char *driver; char *driver;
int action = ACTION_NONE; int action = ACTION_NONE;
char *dev_name = NULL; char *dev_name = NULL;
@ -380,7 +390,7 @@ int main(int argc, char** argv)
} }
} }
if (optind < argc) if (optind < argc)
dev_name = argv[optind]; dev_name = argv[optind++];
if ( !action && dev_name) if ( !action && dev_name)
{ {
@ -409,11 +419,23 @@ int main(int argc, char** argv)
} }
ret = emile_scsi_get_rdev(dev_name, &driver, &disk, &partition); ret = emile_scsi_get_rdev(dev_name, &driver, &disk, &partition);
if (ret == -1) if ( (ret == -1) && (optind < argc))
{
disk_name = dev_name;
driver = NULL;
disk = 0;
partition = atoi(argv[optind++]);
}
else if (ret == -1)
{ {
fprintf(stderr, "ERROR: cannot find disk of %s\n", dev_name); fprintf(stderr, "ERROR: cannot find disk of %s\n", dev_name);
return 1; return 1;
} }
else
{
sprintf(buffer, "%s%c", driver, 'a' + disk);
disk_name = buffer;
}
if (partition == 0) if (partition == 0)
{ {
@ -422,7 +444,6 @@ int main(int argc, char** argv)
return 1; return 1;
} }
sprintf(disk_name, "%s%c", driver, 'a' + disk);
if (action & ACTION_STARTUP) if (action & ACTION_STARTUP)
{ {