From 23de41a9296d0a1c708390eca8b53cca08d8d306 Mon Sep 17 00:00:00 2001 From: Laurent Vivier Date: Fri, 24 Aug 2007 09:27:29 +0000 Subject: [PATCH] Skip first level if it exists --- libemile/emile_second_get_configuration.c | 25 ++++++++++++++++------- libemile/emile_second_set_configuration.c | 16 +++++++++++---- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/libemile/emile_second_get_configuration.c b/libemile/emile_second_get_configuration.c index 4e682ff..8914d18 100644 --- a/libemile/emile_second_get_configuration.c +++ b/libemile/emile_second_get_configuration.c @@ -1,38 +1,49 @@ /* * - * (c) 2005 Laurent Vivier + * (c) 2005-2007 Laurent Vivier * */ #include #include #include +#include #include "libemile.h" #include "emile.h" char* emile_second_get_configuration(int fd) { - char *conf; + char *conf = NULL; emile_l2_header_t header; int ret; int size; + off_t offset; + + memset(&header, 0, sizeof(header)); ret = read(fd, &header, sizeof(header)); - if (ret != sizeof(header)) - return NULL; - if (!EMILE_COMPAT(EMILE_06_SIGNATURE, read_long(&header.signature))) - return NULL; + { + offset = lseek(fd, FIRST_LEVEL_SIZE, SEEK_SET); + ret = read(fd, &header, sizeof(header)); + if (!EMILE_COMPAT(EMILE_06_SIGNATURE, read_long(&header.signature))) + goto exit; + } + + if (ret != sizeof(header)) + goto exit; size = read_short(&header.conf_size); conf = (char*)malloc(size); if (conf == NULL) - return NULL; + goto exit; ret = read(fd, conf, size); if (ret != size) return NULL; +exit: + lseek(fd, offset, SEEK_SET); return conf; } diff --git a/libemile/emile_second_set_configuration.c b/libemile/emile_second_set_configuration.c index aaea019..ddb5f4d 100644 --- a/libemile/emile_second_set_configuration.c +++ b/libemile/emile_second_set_configuration.c @@ -1,6 +1,6 @@ /* * - * (c) 2005 Laurent Vivier + * (c) 2005-2007 Laurent Vivier * */ @@ -20,19 +20,27 @@ int emile_second_set_configuration(int fd, char *configuration) int ret; int size; int len; + off_t offset; if (configuration == NULL) return EEMILE_CANNOT_READ_SECOND; len = strlen (configuration) + 1; /* + 1 for ending 0 */ + memset(&header, 0, sizeof(header)); + ret = read(fd, &header, sizeof(header)); + if (!EMILE_COMPAT(EMILE_06_SIGNATURE, read_long(&header.signature))) + { + offset = lseek(fd, FIRST_LEVEL_SIZE, SEEK_SET); + ret = read(fd, &header, sizeof(header)); + if (!EMILE_COMPAT(EMILE_06_SIGNATURE, read_long(&header.signature))) + return EEMILE_INVALID_SECOND; + } + if (ret != sizeof(header)) return EEMILE_CANNOT_READ_SECOND; - if (!EMILE_COMPAT(EMILE_06_SIGNATURE, read_long(&header.signature))) - return EEMILE_INVALID_SECOND; - size = read_short(&header.conf_size); if (len > size) return EEMILE_INVALID_SECOND;