X-Git-Url: http://git.tuebingen.mpg.de/?p=osl.git;a=blobdiff_plain;f=osl.c;h=90601dc287e3b8ec3de7baf7b9d1c6f2862e1c72;hp=5b9308e4bec25185134724a10fe3d8eb2023d84d;hb=f0884471639e04bda513bb5a9055d5c00d8c4533;hpb=22abcc2013d2f68ec55e5e0113c682899662c7d7 diff --git a/osl.c b/osl.c index 5b9308e..90601dc 100644 --- a/osl.c +++ b/osl.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2008 Andre Noll + * Copyright (C) 2007-2009 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -331,8 +331,8 @@ err: * \param map The memory mapping of the index file. * \param desc The values found in the index header are returned here. * - * Read the index header, check for the paraslash magic string and the table version number. - * Read all information stored in the index header into \a desc. + * Read the index header, check for the osl magic string and the table version + * number. Read all information stored in the index header into \a desc. * * \return Standard. * @@ -341,7 +341,7 @@ err: int read_table_desc(struct osl_object *map, struct osl_table_description *desc) { char *buf = map->data; - uint8_t version; + uint8_t version, compat_version, create_version; uint16_t header_size; int ret, i; unsigned offset; @@ -349,10 +349,22 @@ int read_table_desc(struct osl_object *map, struct osl_table_description *desc) if (map->size < MIN_INDEX_HEADER_SIZE(1)) return -E_OSL_SHORT_TABLE; - if (strncmp(buf + IDX_PARA_MAGIC, PARA_MAGIC, strlen(PARA_MAGIC))) + if (strncmp(buf + IDX_OSL_MAGIC, OSL_MAGIC, strlen(OSL_MAGIC))) return -E_OSL_NO_MAGIC; version = read_u8(buf + IDX_VERSION); - if (version < MIN_TABLE_VERSION || version > MAX_TABLE_VERSION) + /* + * The on-disk version consists of two version numbers: the + * create_version (low 4 bits) is the CURRENT_TABLE_VERSION version + * number of the library that created the table, and compat_version + * (high 4 bits) tells us the lowest version of the library that can + * still read this table. + */ + create_version = version & 0xf; + compat_version = version >> 4; + INFO_LOG("create_version: %u, compat_version: %u\n", create_version, + compat_version); + if (create_version < MIN_TABLE_VERSION /* table too old */ + || compat_version > CURRENT_TABLE_VERSION) /* libosl too old */ return -E_OSL_VERSION_MISMATCH; desc->flags = read_u8(buf + IDX_TABLE_FLAGS); desc->num_columns = read_u16(buf + IDX_NUM_COLUMNS); @@ -484,10 +496,11 @@ static int create_table_index(struct osl_table *t) buf = calloc(1, size); if (!buf) return -E_OSL_NOMEM; - sprintf(buf + IDX_PARA_MAGIC, "%s", PARA_MAGIC); + sprintf(buf + IDX_OSL_MAGIC, "%s", OSL_MAGIC); write_u8(buf + IDX_TABLE_FLAGS, t->desc->flags); write_u8(buf + IDX_DIRTY_FLAG, 0); - write_u8(buf + IDX_VERSION, CURRENT_TABLE_VERSION); + write_u8(buf + IDX_VERSION, CURRENT_TABLE_VERSION + + (COMPAT_TABLE_VERSION << 4)); write_u16(buf + IDX_NUM_COLUMNS, t->num_mapped_columns + t->num_disk_storage_columns); write_u16(buf + IDX_HEADER_SIZE, t->index_header_size); offset = IDX_COLUMN_DESCRIPTIONS; @@ -1067,12 +1080,10 @@ __export int osl_open_table(const struct osl_table_description *table_desc, if (!dirname) goto err; /* check if directory exists */ - ret = stat(dirname, &statbuf); + ret = osl_stat(dirname, &statbuf); free(dirname); - if (ret < 0) { - ret = -E_OSL_STAT; + if (ret < 0) goto err; - } ret = -E_OSL_NOTDIR; if (!S_ISDIR(statbuf.st_mode)) goto err;