X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=attribute.c;h=5f7188ee30b58ee84f5800d7059cbfb014e8c09a;hp=b130ab2989a0a3f0e439fe4942d9cdb5387da7a7;hb=0f1f782c51773b4db2597e07f4cba4cadf5eddf1;hpb=c2ac39f76d245816a919d94790672fb66e9a7253;ds=sidebyside diff --git a/attribute.c b/attribute.c index b130ab29..5f7188ee 100644 --- a/attribute.c +++ b/attribute.c @@ -71,7 +71,7 @@ static void find_greatest_att_bitnum(void) return; } } while (c--); - PARA_INFO_LOG("%s\n", "no attributes"); + PARA_INFO_LOG("no attributes\n"); greatest_att_bitnum = -E_NO_ATTRIBUTES; } @@ -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,21 +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 */ -// ret = mood_update_audio_file(aft_row, &old_afsi); -// if (ret < 0) -// return ret; + 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) { @@ -300,18 +304,15 @@ static int com_addatt_callback(const struct osl_object *query, para_printf(&pb, "invalid attribute name: %s\n", p); continue; } - objs[ATTCOL_BITNUM].size = 1; - objs[ATTCOL_NAME].data = p; - objs[ATTCOL_NAME].size = len + 1; - ret = osl_get_row(attribute_table, ATTCOL_NAME, - &objs[ATTCOL_NAME], &row); /* expected to fail FIXME: Use get_attribute_bitnum_by_name() */ + ret = get_attribute_bitnum_by_name(p, &bitnum); if (ret >= 0) { - para_printf(&pb, "attribute %s already exists\n", p); + para_printf(&pb, "attribute \"%s\" already exists\n", p); continue; } if (ret != -E_RB_KEY_NOT_FOUND) /* error */ goto out; - /* find smallest non-used attribute FIXME: Use find_greatest_att_bitnum() */ + objs[ATTCOL_BITNUM].size = 1; + /* find smallest unused attribute */ for (bitnum = 0; bitnum < 64; bitnum++) { objs[ATTCOL_BITNUM].data = &bitnum; ret = osl_get_row(attribute_table, ATTCOL_BITNUM, @@ -323,9 +324,11 @@ static int com_addatt_callback(const struct osl_object *query, /* this bit is already in use, try next bit */ } if (bitnum == 64) { - para_printf(&pb, "attribute table full\n"); + ret = -E_ATT_TABLE_FULL; goto out; } + objs[ATTCOL_NAME].data = p; + objs[ATTCOL_NAME].size = len + 1; ret = osl_add_row(attribute_table, objs); if (ret < 0) goto out; @@ -411,10 +414,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; }; @@ -523,8 +529,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}; @@ -556,8 +564,6 @@ err: /** * Close the attribute table. * - * \param flags Ususal flags that are passed to osl_close_table(). - * * \sa osl_close_table(). */ void attribute_close(void)