Pass full argument list to mood parsers.
[paraslash.git] / blob.c
diff --git a/blob.c b/blob.c
index 5905c9ad660cd93360fe77ef50ff81c4fe2a39df..38e5cb54df04ad3a0600ac893e108a71446eb6da 100644 (file)
--- a/blob.c
+++ b/blob.c
@@ -8,6 +8,7 @@
 
 #include <fnmatch.h>
 #include <openssl/rc4.h>
+#include <osl.h>
 
 #include "para.h"
 #include "error.h"
 #include "afs.h"
 #include "net.h"
 #include "ipc.h"
+#include "portable_io.h"
+
+/**
+ * Compare two osl objects pointing to unsigned integers of 32 bit size.
+ *
+ * \param obj1 Pointer to the first integer.
+ * \param obj2 Pointer to the second integer.
+ *
+ * \return The values required for an osl compare function.
+ *
+ * \sa osl_compare_func, osl_hash_compare().
+ */
+static int uint32_compare(const struct osl_object *obj1, const struct osl_object *obj2)
+{
+       uint32_t d1 = read_u32((const char *)obj1->data);
+       uint32_t d2 = read_u32((const char *)obj2->data);
+
+       if (d1 < d2)
+               return 1;
+       if (d1 > d2)
+               return -1;
+       return 0;
+}
 
 static struct osl_column_description blob_cols[] = {
        [BLOBCOL_ID] = {
@@ -74,7 +98,7 @@ static int print_blob(struct osl_table *table, struct osl_row *row,
 
        if (!(lbad->flags & BLOB_LS_FLAG_LONG))
                return para_printf(&lbad->pb, "%s\n", name);
-       ret = osl_get_object(table, row, BLOBCOL_ID, &obj);
+       ret = osl(osl_get_object(table, row, BLOBCOL_ID, &obj));
        if (ret < 0) {
                para_printf(&lbad->pb, "%s: %s\n", name, para_strerror(-ret));
                return ret;
@@ -159,12 +183,12 @@ static int cat_blob(struct osl_table *table, struct osl_row *row,
        int ret = 0, ret2;
        struct osl_object obj;
 
-       ret = osl_open_disk_object(table, row, BLOBCOL_DEF, &obj);
+       ret = osl(osl_open_disk_object(table, row, BLOBCOL_DEF, &obj));
        if (ret < 0)
                return ret;
        if (obj.size)
                ret = pass_buffer_as_shm(obj.data, obj.size, data);
-       ret2 = osl_close_disk_object(&obj);
+       ret2 = osl(osl_close_disk_object(&obj));
        return (ret < 0)? ret : ret2;
 }
 
@@ -204,7 +228,7 @@ static int remove_blob(struct osl_table *table, struct osl_row *row,
                const char *name, void *data)
 {
        struct rmblob_data *rmbd = data;
-       int ret = osl_del_row(table, row);
+       int ret = osl(osl_del_row(table, row));
        if (ret < 0) {
                para_printf(&rmbd->pb, "%s: %s\n", name, para_strerror(-ret));
                return ret;
@@ -271,7 +295,7 @@ static void com_addblob_callback(struct osl_table *table, __a_unused int fd,
        unsigned num_rows;
        int ret;
 
-       ret = osl_get_num_rows(table, &num_rows);
+       ret = osl(osl_get_num_rows(table, &num_rows));
        if (ret < 0)
                goto out;
        if (!num_rows) { /* this is the first entry ever added */
@@ -283,34 +307,34 @@ static void com_addblob_callback(struct osl_table *table, __a_unused int fd,
                objs[BLOBCOL_NAME].size = 1;
                objs[BLOBCOL_DEF].data = "";
                objs[BLOBCOL_DEF].size = 1;
-               ret = osl_add_row(table, objs);
+               ret = osl(osl_add_row(table, objs));
                if (ret < 0)
                        goto out;
        } else {
                /* check if name already exists */
                struct osl_row *row;
                struct osl_object obj = {.data = name, .size = name_len};
-               ret = osl_get_row(table, BLOBCOL_NAME, &obj, &row);
-               if (ret < 0 && ret != -E_RB_KEY_NOT_FOUND)
+               ret = osl(osl_get_row(table, BLOBCOL_NAME, &obj, &row));
+               if (ret < 0 && ret != -OSL_ERRNO_TO_PARA_ERROR(E_OSL_RB_KEY_NOT_FOUND))
                        goto out;
                if (ret >= 0) { /* we already have a blob with this name */
                        obj.data = name + name_len;
                        obj.size = query->size - name_len;
-                       ret = osl_update_object(table, row, BLOBCOL_DEF, &obj);
+                       ret = osl(osl_update_object(table, row, BLOBCOL_DEF, &obj));
                        goto out;
                }
                /* new blob, get id of the dummy row and increment it */
                obj.data = "";
                obj.size = 1;
-               ret = osl_get_row(table, BLOBCOL_NAME, &obj, &row);
+               ret = osl(osl_get_row(table, BLOBCOL_NAME, &obj, &row));
                if (ret < 0)
                        goto out;
-               ret = osl_get_object(table, row, BLOBCOL_ID, &obj);
+               ret = osl(osl_get_object(table, row, BLOBCOL_ID, &obj));
                if (ret < 0)
                        goto out;
                id = *(uint32_t *)obj.data + 1;
                obj.data = &id;
-               ret = osl_update_object(table, row, BLOBCOL_ID, &obj);
+               ret = osl(osl_update_object(table, row, BLOBCOL_ID, &obj));
                if (ret < 0)
                        goto out;
        }
@@ -321,7 +345,7 @@ static void com_addblob_callback(struct osl_table *table, __a_unused int fd,
        objs[BLOBCOL_NAME].size = name_len;
        objs[BLOBCOL_DEF].data = name + name_len;
        objs[BLOBCOL_DEF].size = query->size - name_len;
-       ret = osl_add_row(table, objs);
+       ret = osl(osl_add_row(table, objs));
        if (ret < 0)
                goto out;
        afs_event(BLOB_ADD, NULL, table);
@@ -427,13 +451,13 @@ static void com_mvblob_callback(struct osl_table *table, __a_unused int fd,
        struct osl_object obj = {.data = src, .size = strlen(src) + 1};
        char *dest = src + obj.size;
        struct osl_row *row;
-       int ret = osl_get_row(table, BLOBCOL_NAME, &obj, &row);
+       int ret = osl(osl_get_row(table, BLOBCOL_NAME, &obj, &row));
 
        if (ret < 0)
                goto out;
        obj.data = dest;
        obj.size = strlen(dest) + 1;
-       ret = osl_update_object(table, row, BLOBCOL_NAME, &obj);
+       ret = osl(osl_update_object(table, row, BLOBCOL_NAME, &obj));
        if (ret < 0)
                goto out;
        afs_event(BLOB_RENAME, NULL, table);
@@ -471,10 +495,10 @@ static int blob_get_name_by_id(struct osl_table *table, uint32_t id,
        *name = NULL;
        if (!id)
                return 1;
-       ret = osl_get_row(table, BLOBCOL_ID, &obj, &row);
+       ret = osl(osl_get_row(table, BLOBCOL_ID, &obj, &row));
        if (ret < 0)
                return ret;
-       ret = osl_get_object(table, row, BLOBCOL_NAME, &obj);
+       ret = osl(osl_get_object(table, row, BLOBCOL_NAME, &obj));
        if (ret < 0)
                return ret;
        *name = (char *)obj.data;
@@ -499,10 +523,10 @@ static int blob_get_def_by_name(struct osl_table *table, char *name,
        def->data = NULL;
        if (!*name)
                return 1;
-       ret = osl_get_row(table, BLOBCOL_NAME, &obj, &row);
+       ret = osl(osl_get_row(table, BLOBCOL_NAME, &obj, &row));
        if (ret < 0)
                return ret;
-       return osl_open_disk_object(table, row, BLOBCOL_DEF, def);
+       return osl(osl_open_disk_object(table, row, BLOBCOL_DEF, def));
 }
 
 /** Define the \p get_def_by_id function for this blob type. */
@@ -522,10 +546,10 @@ static int blob_get_def_by_id(struct osl_table *table, uint32_t id,
        def->data = NULL;
        if (!id)
                return 1;
-       ret = osl_get_row(table, BLOBCOL_ID, &obj, &row);
+       ret = osl(osl_get_row(table, BLOBCOL_ID, &obj, &row));
        if (ret < 0)
                return ret;
-       return osl_open_disk_object(table, row, BLOBCOL_DEF, def);
+       return osl(osl_open_disk_object(table, row, BLOBCOL_DEF, def));
 }
 
 /** Define the \p get_def_by_id function for this blob type. */
@@ -539,11 +563,11 @@ static int blob_get_name_and_def_by_row(struct osl_table *table,
                const struct osl_row *row, char **name, struct osl_object *def)
 {
        struct osl_object obj;
-       int ret = osl_get_object(table, row, BLOBCOL_NAME, &obj);
+       int ret = osl(osl_get_object(table, row, BLOBCOL_NAME, &obj));
        if (ret < 0)
                return ret;
        *name = obj.data;
-       return osl_open_disk_object(table, row, BLOBCOL_DEF, def);
+       return osl(osl_open_disk_object(table, row, BLOBCOL_DEF, def));
 }
 /** Define the \p get_name_and_def_by_row function for this blob type. */
 #define DEFINE_GET_NAME_AND_DEF_BY_ROW(table_name, cmd_prefix) \
@@ -576,11 +600,11 @@ static int blob_open(struct osl_table **table,
 {
        int ret;
        desc->dir = dir;
-       ret = osl_open_table(desc, table);
+       ret = osl(osl_open_table(desc, table));
        if (ret >= 0)
                return ret;
        *table = NULL;
-       if (ret >= 0 || is_errno(-ret, ENOENT))
+       if (ret >= 0 || ret == -OSL_ERRNO_TO_PARA_ERROR(E_OSL_NOENT))
                return 1;
        return ret;
 }