Solaris のシステム管理 (ネーミングとディレクトリサービス : FNS、NIS+ 編)

オブジェクト属性の追加、削除、変更

次の例は、オブジェクト属性の追加、削除、変更を示しています。


#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);
 ]
]