]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - attribute.c
paraslash 0.7.3
[paraslash.git] / attribute.c
index c869e39197005d79603cf069a11b0162414d4c5b..51630b257f7d88829c657361b06c1fd09d008326 100644 (file)
@@ -1,8 +1,4 @@
-/*
- * Copyright (C) 1997 Andre Noll <maan@tuebingen.mpg.de>
- *
- * Licensed under the GPL v2. For licencing details see COPYING.
- */
+/* Copyright (C) 1997 Andre Noll <maan@tuebingen.mpg.de>, see file COPYING. */
 
 /** \file attribute.c Attribute handling functions. */
 
@@ -108,7 +104,7 @@ int get_attribute_bitnum_by_name(const char *att_name, unsigned char *bitnum)
        return 1;
 }
 
-/** Data passed to the action function of lsatt */
+/* Data passed to the action function of lsatt */
 static int print_attribute(struct osl_table *table, struct osl_row *row,
                const char *name, void *data)
 {
@@ -123,7 +119,7 @@ static int print_attribute(struct osl_table *table, struct osl_row *row,
        }
        ret = osl(osl_get_object(table, row, ATTCOL_BITNUM, &bitnum_obj));
        if (ret < 0) {
-               para_printf(&aca->pbout, "%s: %s\n", name, para_strerror(-ret));
+               afs_error(aca, "%s: %s\n", name, para_strerror(-ret));
                return ret;
        }
        para_printf(&aca->pbout, "%u\t%s\n", *(unsigned char*)bitnum_obj.data,
@@ -172,35 +168,31 @@ static int com_lsatt(struct command_context *cc, struct lls_parse_result *lpr)
 }
 EXPORT_SERVER_CMD_HANDLER(lsatt);
 
-struct addatt_event_data {
-       const char *name;
-       unsigned char bitnum;
-};
-
 static int com_addatt_callback(struct afs_callback_arg *aca)
 {
-       char *p;
-       int ret = 1;
+       const struct lls_command *cmd = SERVER_CMD_CMD_PTR(ADDATT);
+       int i, ret = 1;
        size_t len;
+       unsigned num_inputs;
 
-       for (
-               p = aca->query.data;
-               p < (char *)aca->query.data + aca->query.size;
-               p += len + 1
-       ) {
+       ret = lls(lls_deserialize_parse_result(aca->query.data, cmd, &aca->lpr));
+       assert(ret >= 0);
+       num_inputs = lls_num_inputs(aca->lpr);
+       for (i = 0; i < num_inputs; i++) {
+               const char *name = lls_input(i, aca->lpr);
                struct osl_object objs[NUM_ATT_COLUMNS];
                struct osl_row *row;
                unsigned char bitnum;
-               struct addatt_event_data aed;
 
-               len = strlen(p);
-               if (!len || p[len - 1] == '-' || p[len - 1] == '+') {
-                       para_printf(&aca->pbout, "invalid attribute name: %s\n", p);
+               len = strlen(name);
+               if (len == 0 || name[len - 1] == '-' || name[len - 1] == '+') {
+                       afs_error(aca, "invalid attribute name: %s\n", name);
                        continue;
                }
-               ret = get_attribute_bitnum_by_name(p, &bitnum);
+               ret = get_attribute_bitnum_by_name(name, &bitnum);
                if (ret >= 0) {
-                       para_printf(&aca->pbout, "attribute \"%s\" already exists\n", p);
+                       para_printf(&aca->pbout,
+                               "attribute \"%s\" already exists\n", name);
                        continue;
                }
                if (ret != -OSL_ERRNO_TO_PARA_ERROR(E_OSL_RB_KEY_NOT_FOUND)) /* error */
@@ -221,36 +213,37 @@ static int com_addatt_callback(struct afs_callback_arg *aca)
                        ret = -E_ATT_TABLE_FULL;
                        goto out;
                }
-               objs[ATTCOL_NAME].data = p;
+               objs[ATTCOL_NAME].data = (char *)name;
                objs[ATTCOL_NAME].size = len + 1;
                ret = osl(osl_add_row(attribute_table, objs));
                if (ret < 0)
                        goto out;
-               aed.name = p;
-               aed.bitnum = bitnum;
-               ret = afs_event(ATTRIBUTE_ADD, &aca->pbout, &aed);
+               ret = afs_event(ATTRIBUTE_ADD, &aca->pbout, NULL);
                if (ret < 0)
                        goto out;
                greatest_att_bitnum = PARA_MAX(greatest_att_bitnum, (int)bitnum);
        }
 out:
        if (ret < 0)
-               para_printf(&aca->pbout, "%s: %s\n", p, para_strerror(-ret));
+               afs_error(aca, "error while adding %s\n",
+                       lls_input(i, aca->lpr));
+       lls_free_parse_result(aca->lpr, cmd);
        return ret;
 }
 
-int com_addatt(struct command_context *cc)
+static int com_addatt(struct command_context *cc, struct lls_parse_result *lpr)
 {
-       int ret;
+       const struct lls_command *cmd = SERVER_CMD_CMD_PTR(ADDATT);
+       char *errctx;
+       int ret = lls(lls_check_arg_count(lpr, 1, 64, &errctx));
 
-       if (cc->argc < 2)
-               return -E_ATTR_SYNTAX;
-       ret = send_standard_callback_request(cc->argc - 1, cc->argv + 1,
-               com_addatt_callback, afs_cb_result_handler, cc);
-       if (ret < 0)
-               send_strerror(cc, -ret);
-       return ret;
+       if (ret < 0) {
+               send_errctx(cc, errctx);
+               return ret;
+       }
+       return send_lls_callback_request(com_addatt_callback, cmd, lpr, cc);
 }
+EXPORT_SERVER_CMD_HANDLER(addatt);
 
 static int com_mvatt_callback(struct afs_callback_arg *aca)
 {
@@ -275,7 +268,7 @@ static int com_mvatt_callback(struct afs_callback_arg *aca)
        ret = osl(osl_update_object(attribute_table, row, ATTCOL_NAME, &obj));
 out:
        if (ret < 0)
-               para_printf(&aca->pbout, "cannot rename %s to %s\n", old, new);
+               afs_error(aca, "cannot rename %s to %s\n", old, new);
        else
                ret = afs_event(ATTRIBUTE_RENAME, &aca->pbout, NULL);
        lls_free_parse_result(aca->lpr, cmd);
@@ -304,13 +297,13 @@ static int remove_attribute(struct osl_table *table, struct osl_row *row,
 
        ret = get_attribute_bitnum_by_name(name, &red.bitnum);
        if (ret < 0) {
-               para_printf(&aca->pbout, "cannot remove %s\n", name);
+               afs_error(aca, "cannot remove %s\n", name);
                return ret;
        }
        para_printf(&aca->pbout, "removing attribute %s\n", name);
        ret = osl(osl_del_row(table, row));
        if (ret < 0) {
-               para_printf(&aca->pbout, "cannot remove %s\n", name);
+               afs_error(aca, "cannot remove %s\n", name);
                return ret;
        }
        return afs_event(ATTRIBUTE_REMOVE, &aca->pbout, &red);
@@ -468,26 +461,12 @@ int attribute_check_callback(struct afs_callback_arg *aca)
        return aft_check_attributes(att_mask, &aca->pbout);
 }
 
-/**
- * Close the attribute table.
- *
- * \sa osl_close_table().
- */
 static void attribute_close(void)
 {
        osl_close_table(attribute_table, OSL_MARK_CLEAN);
        attribute_table = NULL;
 }
 
-/**
- * Open the attribute table.
- *
- * \param dir The database directory.
- *
- * \return Positive on success, negative on errors.
- *
- * \sa osl_open_table().
- */
 static int attribute_open(const char *dir)
 {
        int ret;
@@ -511,14 +490,9 @@ static int attribute_create(const char *dir)
        return osl(osl_create_table(&attribute_table_desc));
 }
 
-/**
- * Initialize the attribute table structure.
- *
- * \param t The table structure to initialize.
- */
-void attribute_init(struct afs_table *t)
-{
-       t->open = attribute_open;
-       t->close = attribute_close;
-       t->create = attribute_create;
-}
+/** The attribute table stores name/bitnum pairs. */
+const struct afs_table_operations attr_ops = { /* no event handler */
+       .open = attribute_open,
+       .close = attribute_close,
+       .create = attribute_create,
+};