Solaris ネーミングの管理

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

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

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