Drop dependency on openssl.
[osl.git] / osl.c
diff --git a/osl.c b/osl.c
index eb1d24f8828676adaac023b4c458a37a1f485c2a..90601dc287e3b8ec3de7baf7b9d1c6f2862e1c72 100644 (file)
--- a/osl.c
+++ b/osl.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2008 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2007-2009 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -10,7 +10,6 @@
 
 #include "log.h"
 #include "osl.h"
-#include "error.h"
 #include "util.h"
 #include "osl_core.h"
 
@@ -38,8 +37,6 @@ static const unsigned int errmsgidx[] = {
 
 __export const char *osl_strerror(int num)
 {
-       if (IS_SYSTEM_ERROR(num))
-               return strerror((num) & ((1 << SYSTEM_ERROR_BIT) - 1));
        return msgstr.str + errmsgidx[num];
 }
 
@@ -334,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.
  *
@@ -344,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;
@@ -352,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);
@@ -487,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;
@@ -1070,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;