From 81033e78c71db7c179b16b191b60e1e8f88bef62 Mon Sep 17 00:00:00 2001 From: Laurent Vivier Date: Tue, 14 Dec 2004 23:49:59 +0000 Subject: [PATCH] First revision --- libemile/emile_map_bootblock_is_valid.c | 13 +++++ libemile/emile_map_close.c | 17 +++++++ libemile/emile_map_geometry.c | 19 +++++++ libemile/emile_map_get_driver_info.c | 24 +++++++++ libemile/emile_map_get_driver_number.c | 16 ++++++ libemile/emile_map_get_partition_geometry.c | 19 +++++++ libemile/emile_map_get_partition_name.c | 18 +++++++ libemile/emile_map_get_partition_type.c | 18 +++++++ libemile/emile_map_is_valid.c | 13 +++++ libemile/emile_map_open.c | 55 +++++++++++++++++++++ libemile/emile_map_partition_is_bootable.c | 13 +++++ libemile/emile_map_partition_is_startup.c | 13 +++++ libemile/emile_map_partition_is_valid.c | 13 +++++ libemile/emile_map_partition_set_bootable.c | 21 ++++++++ libemile/emile_map_partition_set_startup.c | 21 ++++++++ libemile/emile_map_read.c | 37 ++++++++++++++ libemile/emile_map_read_bootblock.c | 36 ++++++++++++++ libemile/emile_map_set_partition_name.c | 23 +++++++++ libemile/emile_map_set_partition_type.c | 23 +++++++++ libemile/emile_map_write.c | 40 +++++++++++++++ libemile/emile_map_write_bootblock.c | 36 ++++++++++++++ libemile/emile_second_get_buffer_size.c | 27 ++++++++++ libemile/emile_second_set_buffer_size.c | 41 +++++++++++++++ 23 files changed, 556 insertions(+) create mode 100644 libemile/emile_map_bootblock_is_valid.c create mode 100644 libemile/emile_map_close.c create mode 100644 libemile/emile_map_geometry.c create mode 100644 libemile/emile_map_get_driver_info.c create mode 100644 libemile/emile_map_get_driver_number.c create mode 100644 libemile/emile_map_get_partition_geometry.c create mode 100644 libemile/emile_map_get_partition_name.c create mode 100644 libemile/emile_map_get_partition_type.c create mode 100644 libemile/emile_map_is_valid.c create mode 100644 libemile/emile_map_open.c create mode 100644 libemile/emile_map_partition_is_bootable.c create mode 100644 libemile/emile_map_partition_is_startup.c create mode 100644 libemile/emile_map_partition_is_valid.c create mode 100644 libemile/emile_map_partition_set_bootable.c create mode 100644 libemile/emile_map_partition_set_startup.c create mode 100644 libemile/emile_map_read.c create mode 100644 libemile/emile_map_read_bootblock.c create mode 100644 libemile/emile_map_set_partition_name.c create mode 100644 libemile/emile_map_set_partition_type.c create mode 100644 libemile/emile_map_write.c create mode 100644 libemile/emile_map_write_bootblock.c create mode 100644 libemile/emile_second_get_buffer_size.c create mode 100644 libemile/emile_second_set_buffer_size.c diff --git a/libemile/emile_map_bootblock_is_valid.c b/libemile/emile_map_bootblock_is_valid.c new file mode 100644 index 0000000..cd4d46b --- /dev/null +++ b/libemile/emile_map_bootblock_is_valid.c @@ -0,0 +1,13 @@ +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include "partition.h" +#include "libemile.h" + +int emile_map_bootblock_is_valid(char *bootblock) +{ + return (bootblock[0] == 0x4C) && (bootblock[1] == 0x4B); +} diff --git a/libemile/emile_map_close.c b/libemile/emile_map_close.c new file mode 100644 index 0000000..df1fae0 --- /dev/null +++ b/libemile/emile_map_close.c @@ -0,0 +1,17 @@ +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include +#include + +#include "partition.h" +#include "libemile.h" + +void emile_map_close(emile_map_t *map) +{ + close(map->fd); + free(map); +} diff --git a/libemile/emile_map_geometry.c b/libemile/emile_map_geometry.c new file mode 100644 index 0000000..fc9b638 --- /dev/null +++ b/libemile/emile_map_geometry.c @@ -0,0 +1,19 @@ +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include "partition.h" +#include "libemile.h" + +int emile_map_geometry(emile_map_t *map, int *block_size, int *block_count) +{ + if (!emile_map_is_valid(map)) + return -1; + + *block_size = map->drivers.BlkSize; + *block_count = map->drivers.BlkCount; + + return 0; +} diff --git a/libemile/emile_map_get_driver_info.c b/libemile/emile_map_get_driver_info.c new file mode 100644 index 0000000..5121125 --- /dev/null +++ b/libemile/emile_map_get_driver_info.c @@ -0,0 +1,24 @@ +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include "partition.h" +#include "libemile.h" + +int emile_map_get_driver_info(emile_map_t *map, int number, + int *block, int *size, int* type) +{ + if (!emile_map_is_valid(map)) + return -1; + + if (number > emile_map_get_driver_number(map)) + return -1; + + *block = map->drivers.DrvInfo[number].Block; + *size = map->drivers.DrvInfo[number].Size; + *type = map->drivers.DrvInfo[number].Type; + + return 0; +} diff --git a/libemile/emile_map_get_driver_number.c b/libemile/emile_map_get_driver_number.c new file mode 100644 index 0000000..1e29566 --- /dev/null +++ b/libemile/emile_map_get_driver_number.c @@ -0,0 +1,16 @@ +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include "partition.h" +#include "libemile.h" + +int emile_map_get_driver_number(emile_map_t *map) +{ + if (!emile_map_is_valid(map)) + return -1; + + return map->drivers.DrvrCount; +} diff --git a/libemile/emile_map_get_partition_geometry.c b/libemile/emile_map_get_partition_geometry.c new file mode 100644 index 0000000..8a24d38 --- /dev/null +++ b/libemile/emile_map_get_partition_geometry.c @@ -0,0 +1,19 @@ +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include "partition.h" +#include "libemile.h" + +int emile_map_get_partition_geometry(emile_map_t *map, int *start, int *count) +{ + if (!emile_map_partition_is_valid(map)) + return -1; + + *start = map->partition.PyPartStart; + *count = map->partition.PartBlkCnt; + + return 0; +} diff --git a/libemile/emile_map_get_partition_name.c b/libemile/emile_map_get_partition_name.c new file mode 100644 index 0000000..5837033 --- /dev/null +++ b/libemile/emile_map_get_partition_name.c @@ -0,0 +1,18 @@ +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include "partition.h" +#include "libemile.h" + +int emile_map_get_partition_name(emile_map_t *map, char** name) +{ + if (!emile_map_partition_is_valid(map)) + return -1; + + *name = map->partition.PartName; + + return 0; +} diff --git a/libemile/emile_map_get_partition_type.c b/libemile/emile_map_get_partition_type.c new file mode 100644 index 0000000..89611f7 --- /dev/null +++ b/libemile/emile_map_get_partition_type.c @@ -0,0 +1,18 @@ +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include "partition.h" +#include "libemile.h" + +int emile_map_get_partition_type(emile_map_t *map, char** type) +{ + if (!emile_map_partition_is_valid(map)) + return -1; + + *type = map->partition.PartType; + + return 0; +} diff --git a/libemile/emile_map_is_valid.c b/libemile/emile_map_is_valid.c new file mode 100644 index 0000000..3581f91 --- /dev/null +++ b/libemile/emile_map_is_valid.c @@ -0,0 +1,13 @@ +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include "partition.h" +#include "libemile.h" + +int emile_map_is_valid(emile_map_t *map) +{ + return map->drivers.Sig == DD_SIGNATURE; +} diff --git a/libemile/emile_map_open.c b/libemile/emile_map_open.c new file mode 100644 index 0000000..dde6c9f --- /dev/null +++ b/libemile/emile_map_open.c @@ -0,0 +1,55 @@ +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include +#include +#include +#include +#include +#include + +#include "partition.h" +#include "libemile.h" + +emile_map_t* emile_map_open(char *dev, int flags) +{ + emile_map_t *map; + int ret; + + ASSERT_DD(printf("INTERNAL ERROR: Bad Block 0 size structure\n"); + return NULL;) + ASSERT_P(printf("INTERNAL ERROR: Bad Partition size structure\n"); + return NULL;) + + map = (emile_map_t*)malloc(sizeof(emile_map_t)); + if (map == NULL) + return NULL; + + map->fd = open(dev, flags); + if (map->fd == -1) + { + free(map); + return NULL; + } + strncpy(map->name, dev, 16); + + ret = read(map->fd, &map->drivers, sizeof(map->drivers)); + if (ret == -1) + { + free(map); + return NULL; + } + + ret = read(map->fd, &map->partition, sizeof(map->partition)); + if (ret == -1) + { + free(map); + return NULL; + } + map->current = 1; + + return map; +} diff --git a/libemile/emile_map_partition_is_bootable.c b/libemile/emile_map_partition_is_bootable.c new file mode 100644 index 0000000..9b25552 --- /dev/null +++ b/libemile/emile_map_partition_is_bootable.c @@ -0,0 +1,13 @@ +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include "partition.h" +#include "libemile.h" + +int emile_map_partition_is_bootable(emile_map_t *map) +{ + return (map->partition.PartStatus & kPartitionAUXIsBootValid) == kPartitionAUXIsBootValid; +} diff --git a/libemile/emile_map_partition_is_startup.c b/libemile/emile_map_partition_is_startup.c new file mode 100644 index 0000000..0f7cd6d --- /dev/null +++ b/libemile/emile_map_partition_is_startup.c @@ -0,0 +1,13 @@ +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include "partition.h" +#include "libemile.h" + +int emile_map_partition_is_startup(emile_map_t *map) +{ + return (map->partition.PartStatus & kPartitionIsStartup) == kPartitionIsStartup; +} diff --git a/libemile/emile_map_partition_is_valid.c b/libemile/emile_map_partition_is_valid.c new file mode 100644 index 0000000..d37e5af --- /dev/null +++ b/libemile/emile_map_partition_is_valid.c @@ -0,0 +1,13 @@ +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include "partition.h" +#include "libemile.h" + +int emile_map_partition_is_valid(emile_map_t *map) +{ + return map->partition.Sig == MAP_SIGNATURE; +} diff --git a/libemile/emile_map_partition_set_bootable.c b/libemile/emile_map_partition_set_bootable.c new file mode 100644 index 0000000..0fb2ba0 --- /dev/null +++ b/libemile/emile_map_partition_set_bootable.c @@ -0,0 +1,21 @@ +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include "partition.h" +#include "libemile.h" + +int emile_map_partition_set_bootable(emile_map_t *map, int enable) +{ + if (!emile_map_partition_is_valid(map)) + return -1; + + if (enable) + map->partition.PartStatus |= kPartitionAUXIsBootValid; + else + map->partition.PartStatus &= ~kPartitionAUXIsBootValid; + + return 0; +} diff --git a/libemile/emile_map_partition_set_startup.c b/libemile/emile_map_partition_set_startup.c new file mode 100644 index 0000000..c118283 --- /dev/null +++ b/libemile/emile_map_partition_set_startup.c @@ -0,0 +1,21 @@ +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include "partition.h" +#include "libemile.h" + +int emile_map_partition_set_startup(emile_map_t *map, int enable) +{ + if (!emile_map_partition_is_valid(map)) + return -1; + + if (enable) + map->partition.PartStatus |= kPartitionIsStartup; + else + map->partition.PartStatus &= ~kPartitionIsStartup; + + return 0; +} diff --git a/libemile/emile_map_read.c b/libemile/emile_map_read.c new file mode 100644 index 0000000..6c3ea7b --- /dev/null +++ b/libemile/emile_map_read.c @@ -0,0 +1,37 @@ +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include +#include + +#include "partition.h" +#include "libemile.h" + +int emile_map_read(emile_map_t *map, int part) +{ + off_t offset; + int ret; + + if (map->current == part) + return part; + + if (part > map->partition.MapBlkCnt) + return -1; + + offset = part * sizeof(struct Partition) + sizeof(struct DriverDescriptor); + + ret = lseek(map->fd, offset, SEEK_SET); + if (ret != offset) + return -1; + + ret = read(map->fd, &map->partition, sizeof(struct Partition)); + if (ret != sizeof(struct Partition)) + return -1; + + map->current = part; + + return part; +} diff --git a/libemile/emile_map_read_bootblock.c b/libemile/emile_map_read_bootblock.c new file mode 100644 index 0000000..c929bc1 --- /dev/null +++ b/libemile/emile_map_read_bootblock.c @@ -0,0 +1,36 @@ +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include +#include +#include +#include +#include + +#include "partition.h" +#include "libemile.h" + +int emile_map_read_bootblock(emile_map_t* map, char* bootblock) +{ + char name[16]; + int ret; + int fd; + + if (!emile_map_partition_is_valid(map)) + return -1; + + sprintf(name, "%s%d", map->name, map->current); + + fd = open(name, O_RDONLY); + if (fd == -1) + return -1; + + ret = read(fd, bootblock, BOOTBLOCK_SIZE); + + close(fd); + + return ret; +} diff --git a/libemile/emile_map_set_partition_name.c b/libemile/emile_map_set_partition_name.c new file mode 100644 index 0000000..8cf881c --- /dev/null +++ b/libemile/emile_map_set_partition_name.c @@ -0,0 +1,23 @@ +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include + +#include "partition.h" +#include "libemile.h" + +int emile_map_set_partition_name(emile_map_t *map, char* name) +{ + if (!emile_map_partition_is_valid(map)) + return -1; + + if (strlen(name) > 31) + return -1; + + strncpy(map->partition.PartName, name, 32); + + return 0; +} diff --git a/libemile/emile_map_set_partition_type.c b/libemile/emile_map_set_partition_type.c new file mode 100644 index 0000000..b202237 --- /dev/null +++ b/libemile/emile_map_set_partition_type.c @@ -0,0 +1,23 @@ +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include + +#include "partition.h" +#include "libemile.h" + +int emile_map_set_partition_type(emile_map_t *map, char* type) +{ + if (!emile_map_partition_is_valid(map)) + return -1; + + if (strlen(type) > 31) + return -1; + + strncpy(map->partition.PartType, type, 32); + + return 0; +} diff --git a/libemile/emile_map_write.c b/libemile/emile_map_write.c new file mode 100644 index 0000000..7d1b5d2 --- /dev/null +++ b/libemile/emile_map_write.c @@ -0,0 +1,40 @@ +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include +#include + +#include "partition.h" +#include "libemile.h" + +int emile_map_read(emile_map_t *map, int part) +{ + off_t offset; + int ret; + + if (map->current == 0) + return -1; + + if (map->current == part) + return part; + + if (part > map->partition.MapBlkCnt) + return -1; + + offset = part * sizeof(struct Partition) + sizeof(struct DriverDescriptor); + + ret = lseek(map->fd, offset, SEEK_SET); + if (ret != offset) + return -1; + + ret = write(map->fd, &map->partition, sizeof(struct Partition)); + if (ret != sizeof(struct Partition)) + return -1; + + map->current = part; + + return part; +} diff --git a/libemile/emile_map_write_bootblock.c b/libemile/emile_map_write_bootblock.c new file mode 100644 index 0000000..fa5ba21 --- /dev/null +++ b/libemile/emile_map_write_bootblock.c @@ -0,0 +1,36 @@ +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include +#include +#include +#include +#include + +#include "partition.h" +#include "libemile.h" + +int emile_map_write_bootblock(emile_map_t* map, char* bootblock) +{ + char name[16]; + int ret; + int fd; + + if (!emile_map_partition_is_valid(map)) + return -1; + + sprintf(name, "%s%d", map->name, map->current); + + fd = open(name, O_RDWR); + if (fd == -1) + return -1; + + ret = write(fd, bootblock, BOOTBLOCK_SIZE); + + close(fd); + + return ret; +} diff --git a/libemile/emile_second_get_buffer_size.c b/libemile/emile_second_get_buffer_size.c new file mode 100644 index 0000000..b2014c4 --- /dev/null +++ b/libemile/emile_second_get_buffer_size.c @@ -0,0 +1,27 @@ +static __attribute__((used)) char* rcsid = "$CVSHeader$"; +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include +#include +#include + +#include "libemile.h" +#include "emile.h" + +int emile_second_get_buffer_size(int fd, u_int32_t *buffer_size) +{ + emile_l2_header_t header; + int ret; + + ret = read(fd, &header, sizeof(header)); + if (ret != sizeof(header)) + return EEMILE_CANNOT_READ_SECOND; + + *buffer_size = read_long(&header.kernel_size); + + return 0; +} diff --git a/libemile/emile_second_set_buffer_size.c b/libemile/emile_second_set_buffer_size.c new file mode 100644 index 0000000..85f95d0 --- /dev/null +++ b/libemile/emile_second_set_buffer_size.c @@ -0,0 +1,41 @@ +static __attribute__((used)) char* rcsid = "$CVSHeader$"; +/* + * + * (c) 2004 Laurent Vivier + * + */ + +#include +#include +#include + +#include "libemile.h" +#include "emile.h" +#include "bootblock.h" + +int emile_second_set_buffer_size(int fd, u_int32_t buffer_size) +{ + emile_l2_header_t header; + int ret; + off_t location; + + location = lseek(fd, 0, SEEK_CUR); + if (ret == -1) + return EEMILE_CANNOT_READ_SECOND; + + ret = read(fd, &header, sizeof(header)); + if (ret != sizeof(header)) + return EEMILE_CANNOT_READ_SECOND; + + write_long(&header.kernel_size, buffer_size); + + ret = lseek(fd, location, SEEK_SET); + if (ret == -1) + return EEMILE_CANNOT_WRITE_SECOND; + + ret = write(fd, &header, sizeof(header)); + if (ret != sizeof(header)) + return EEMILE_CANNOT_WRITE_SECOND; + + return 0; +}