X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=attribute.c;h=cc810467d825acf860346afeaac035aaf496f665;hb=b635d7d83e5475ae471536ce9275be14e18fd539;hp=6740e4743ec111e1279d3c876f9f39f9120ce0eb;hpb=4d719c981dcaf28fdbf3a8416064f9c26a22f13f;p=paraslash.git diff --git a/attribute.c b/attribute.c index 6740e474..cc810467 100644 --- a/attribute.c +++ b/attribute.c @@ -250,13 +250,13 @@ static int com_setatt_callback(const struct osl_object *query, (long long unsigned)del_mask); for (; p < (char *)query->data + query->size; p += len + 1) { /* TODO: fnmatch */ struct afs_info old_afsi, new_afsi; - struct osl_row *aft_row; + struct afsi_change_event_data aced = {.old_afsi = &old_afsi}; len = strlen(p); - ret = aft_get_row_of_path(p, &aft_row); + ret = aft_get_row_of_path(p, &aced.aft_row); if (ret < 0) return ret; - ret = get_afsi_object_of_row(aft_row, &obj); + ret = get_afsi_object_of_row(aced.aft_row, &obj); if (ret < 0) return ret; ret = load_afsi(&old_afsi, &obj); @@ -266,19 +266,25 @@ static int com_setatt_callback(const struct osl_object *query, new_afsi.attributes |= add_mask; new_afsi.attributes &= ~del_mask; save_afsi(&new_afsi, &obj); /* in-place update */ - // FIXME: Event? + afs_event(AFSI_CHANGE, NULL, &aced); } return 1; } int com_setatt(__a_unused int fd, int argc, char * const * const argv) { - if (argc < 2) + if (argc < 3) return -E_ATTR_SYNTAX; return send_standard_callback_request(argc - 1, argv + 1, com_setatt_callback, NULL); } +struct addatt_event_data { + const char *name; + unsigned char bitnum; +}; + + static int com_addatt_callback(const struct osl_object *query, struct osl_object *result) { @@ -409,10 +415,13 @@ int com_mvatt(int fd, int argc, char * const * const argv) return ret; } - +/** Data passed to the action handler of com_rmatt(). */ struct remove_attribute_action_data { + /** Message buffer. */ struct para_buffer pb; + /** Numver of attributes removed. */ int num_removed; + /** Bitwise "or" of the removed attributes. */ uint64_t mask_of_removed_atts; }; @@ -521,8 +530,10 @@ int get_attribute_text(uint64_t *atts, const char *delim, char **text) const uint64_t one = 1; *text = NULL; - if (greatest_att_bitnum < 0) /* no attributes available */ + if (greatest_att_bitnum < 0) { /* no attributes available */ + *text = para_strdup("(no attributes available)"); return 1; + } for (i = 0; i <= greatest_att_bitnum; i++) { unsigned char bn = i; struct osl_object obj = {.data = &bn, .size = 1};