Merge branch 'refs/heads/t/compress'
[paraslash.git] / blob.c
diff --git a/blob.c b/blob.c
index 8abecf6aa7301318426de7f44ca9bb96f3bd734b..4ecbc45bb15f42c15342e7900f4de94522ef45bb 100644 (file)
--- a/blob.c
+++ b/blob.c
@@ -1,8 +1,4 @@
-/*
- * Copyright (C) 2007 Andre Noll <maan@tuebingen.mpg.de>
- *
- * Licensed under the GPL v2. For licencing details see COPYING.
- */
+/* Copyright (C) 2007 Andre Noll <maan@tuebingen.mpg.de>, see file COPYING. */
 
 /** \file blob.c Macros and functions for blob handling. */
 
  * \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);
+       uint32_t d1 = read_u32(obj1->data);
+       uint32_t d2 = read_u32(obj2->data);
 
        if (d1 < d2)
                return 1;
@@ -78,7 +72,6 @@ static struct osl_column_description blob_cols[] = {
 /** Define a pointer to an osl blob table with a canonical name. */
 #define DEFINE_BLOB_TABLE_PTR(table_name) struct osl_table *table_name ## _table;
 
-
 /** Define a blob table. */
 #define INIT_BLOB_TABLE(table_name) \
        DEFINE_BLOB_TABLE_DESC(table_name); \
@@ -110,7 +103,7 @@ static int print_blob(struct osl_table *table, struct osl_row *row,
                para_printf(&aca->pbout, "cannot list %s\n", name);
                return ret;
        }
-       id = *(uint32_t *)obj.data;
+       id = read_u32(obj.data);
        para_printf(&aca->pbout, "%u\t%s\n", id, name);
        return 1;
 }
@@ -127,6 +120,7 @@ static int com_lsblob_callback(const struct lls_command * const cmd,
                .action = print_blob,
        };
        int ret;
+
        ret = lls_deserialize_parse_result(aca->query.data, cmd, &aca->lpr);
        pmd.lpr = aca->lpr;
        assert(ret >= 0);
@@ -182,6 +176,7 @@ static int com_catblob_callback(const struct lls_command * const cmd,
                .data = &aca->fd,
                .action = cat_blob
        };
+
        ret = lls_deserialize_parse_result(aca->query.data, cmd, &aca->lpr);
        assert(ret >= 0);
        pmd.lpr = aca->lpr;
@@ -213,6 +208,7 @@ static int remove_blob(struct osl_table *table, struct osl_row *row,
 {
        struct afs_callback_arg *aca = data;
        int ret = osl(osl_del_row(table, row));
+
        if (ret < 0) {
                para_printf(&aca->pbout, "cannot remove %s\n", name);
                return ret;
@@ -232,6 +228,7 @@ static int com_rmblob_callback(const struct lls_command * const cmd,
                .data = aca,
                .action = remove_blob
        };
+
        ret = lls_deserialize_parse_result(aca->query.data, cmd, &aca->lpr);
        assert(ret >= 0);
        pmd.lpr = aca->lpr;
@@ -269,7 +266,8 @@ static int com_addblob_callback(__a_unused const struct lls_command * const cmd,
        struct osl_object objs[NUM_BLOB_COLUMNS];
        char *name = aca->query.data;
        size_t name_len = strlen(name) + 1;
-       uint32_t id;
+       uint32_t id = (uint32_t)-1; /* STFU, gcc */
+       char id_buf[sizeof(id)];
        unsigned num_rows;
        int ret;
 
@@ -277,10 +275,15 @@ static int com_addblob_callback(__a_unused const struct lls_command * const cmd,
        if (ret < 0)
                goto out;
        if (!num_rows) { /* this is the first entry ever added */
-               /* insert dummy row containing the id */
-               id = 2; /* this entry will be entry #1, so 2 is the next */
-               objs[BLOBCOL_ID].data = &id;
-               objs[BLOBCOL_ID].size = sizeof(id);
+               /*
+                * Insert dummy row containing the next free ID. Since we are
+                * about to insert the first blob with ID 1, the next free ID
+                * will be 2.
+                */
+               id = 2U;
+               write_u32(id_buf, id);
+               objs[BLOBCOL_ID].data = id_buf;
+               objs[BLOBCOL_ID].size = sizeof(id_buf);
                objs[BLOBCOL_NAME].data = "";
                objs[BLOBCOL_NAME].size = 1;
                objs[BLOBCOL_DEF].data = "";
@@ -299,7 +302,7 @@ static int com_addblob_callback(__a_unused const struct lls_command * const cmd,
                        ret = osl(osl_get_object(table, row, BLOBCOL_ID, &obj));
                        if (ret < 0)
                                goto out;
-                       id = *(uint32_t *)obj.data;
+                       id = read_u32(obj.data);
                        obj.data = name + name_len;
                        obj.size = aca->query.size - name_len;
                        ret = osl(osl_update_object(table, row, BLOBCOL_DEF, &obj));
@@ -314,15 +317,17 @@ static int com_addblob_callback(__a_unused const struct lls_command * const cmd,
                ret = osl(osl_get_object(table, row, BLOBCOL_ID, &obj));
                if (ret < 0)
                        goto out;
-               id = *(uint32_t *)obj.data + 1;
-               obj.data = &id;
+               id = read_u32(obj.data) + 1;
+               write_u32(id_buf, id);
+               obj.data = &id_buf;
                ret = osl(osl_update_object(table, row, BLOBCOL_ID, &obj));
                if (ret < 0)
                        goto out;
        }
        id--;
-       objs[BLOBCOL_ID].data = &id;
-       objs[BLOBCOL_ID].size = sizeof(id);
+       write_u32(id_buf, id);
+       objs[BLOBCOL_ID].data = &id_buf;
+       objs[BLOBCOL_ID].size = sizeof(id_buf);
        objs[BLOBCOL_NAME].data = name;
        objs[BLOBCOL_NAME].size = name_len;
        objs[BLOBCOL_DEF].data = name + name_len;
@@ -380,7 +385,7 @@ again:
  *
  * This function is called from the addblob command handlers to instruct the
  * afs process to store the input in a blob table. Input is read and decrypted
- * from the file descriptor given by cc and appended to arg_obj, which contains
+ * from the file descriptor given by cc and appended to a buffer which also contains
  * the name of the blob to create. The combined buffer is made available to the
  * afs process via the callback method.
  */
@@ -515,7 +520,6 @@ static int blob_get_name_by_id(struct osl_table *table, uint32_t id,
                return blob_get_name_by_id(table_name ## _table, id, name); \
        }
 
-
 static int blob_get_def_by_name(struct osl_table *table, char *name,
                struct osl_object *def)
 {
@@ -567,6 +571,7 @@ static int blob_get_name_and_def_by_row(struct osl_table *table,
 {
        struct osl_object obj;
        int ret = osl(osl_get_object(table, row, BLOBCOL_NAME, &obj));
+
        if (ret < 0)
                return ret;
        *name = obj.data;
@@ -602,6 +607,7 @@ static int blob_open(struct osl_table **table,
                const char *dir)
 {
        int ret;
+
        desc->dir = dir;
        ret = osl(osl_open_table(desc, table));
        if (ret >= 0)