次の例は、オブジェクト属性の追加、削除、変更を示しています。
#include <stdio.h> #include <xfn/xfn.h> /* このルーチンは名前付きオブジェクトに関連付けられた属性を変更する。 変更としては、 FN_ATTR_OP_ADD FN_ATTR_OP_ADD_EXCLUSIVE FN_ATTR_OP_REMOVE FN_ATTR_OP_ADD_VALUES FN_ATTR_OP_REMOVE_VALUES が有効である。 この関数は属性値が文字列であることを前提とする。 関数の使用例として、以下に "James Smith" という値を持つ識別子 "realname" の属性を、ユーザーオブジェクト "user/jsmith" に追加する。 fns_attr_modify( "user/jsmith", "realname", "James Smith", FN_ATTR_OP_ADD); 次の関数は識別子 "location" の属性をプリンタオブジェクト "thisorgunit/service/printer/color" から削除する。 fns_attr_modify( "thisorgunit/service/printer/color", "location", NULL, FN_ATTR_OP_REMOVE); */ static const char *attr_id_syntax = "fn_attr_syntax_ascii"; void fns_attr_modify(const char *name, const char *attr_id, const char *attr_value, unsigned int operation) { FN_composite_name_t *name_comp; FN_identifier_t identifier, syntax; FN_attrvalue_t *values; FN_attribute_t *attribute; FN_status_t *status; FN_ctx_t *initial_context; name_comp = fn_composite_name_from_str((unsigned char *) name); status = fn_status_create(); /* 初期コンテキストの獲得 */ initial_context = fn_ctx_handle_from_initial(0, status); if (!fn_status_is_success(status)) { fprintf(stderr, "Unable to obtain intial context¥n"); return; } /* 追加する属性の作成 */ /* 最初に識別子 */ identifier.format = FN_ID_STRING; identifier.length = strlen(attr_id); identifier.contents = (void *) strdup(attr_id); /* 次に構文 */ syntax.format = FN_ID_STRING; syntax.length = strlen(attr_id_syntax); syntax.contents = (void *) strdup(attr_id_syntax); /* 次に属性値 */ if (attr_value) { values = (FN_attrvalue_t *) malloc(sizeof(FN_attrvalue_t)); values->length = strlen(attr_value); values->contents = (void *) strdup(attr_value); } else values = NULL; /* 次に属性の作成 */ attribute = fn_attribute_create(&identifier, &syntax); /*次に属性値の追加 */ if (values) fn_attribute_add(attribute, values, 0); /* XFN オペレーションの実行 */ fn_attr_modify(initial_context, name_comp, operation, attribute, 0, status); if (!fn_status_is_success(status)) fprintf(stderr, "Unable to perform attribute operation¥n"); fn_ctx_destroy(initial_context); fn_status_destroy(status); fn_composite_name_destroy(name_comp); fn_attibute_destroy(attribute); free(identifier.contents); free(syntax.contents); if (values) { free(values->contents); free(values); ] ]