Solaris ネーミングの管理

コンテキスト内のオブジェクトの検索

次の例は、特定の属性識別子と値によって、コンテキスト内のオブジェクトを検索する方法を示しています。

#include <stdio.h> 
#include <xfn/xfn.h> 
#include <string.h> 
#include <stdlib.h> 
/*  
 このルーチンは、指定された属性識別子と値を持つコンテキスト内の
 オブジェクトを検索します。 
*/ 
typedef struct fns_search_results { 	
 char *name; 	
 struct fns_search_results *next; 
} fns_search_results; 
static const char *attr_id_syntax = "fn_attr_syntax_ascii"; 
fns_search_results * 
fns_attr_search(const char *name, 	
 const char *attr_id, 	
 const char *attr_value) 
{ 	
 FN_status_t *status; 	
 FN_ctx_t *initial_context; 	
 FN_composite_name_t *context_name; 	
 FN_searchlist_t *search_list; 	
 FN_string_t *search_name; 	
 FN_attribute_t *attribute; 	
 FN_attrset_t *attrset; 	
 FN_identifier_t identifier, syntax; 	
 FN_attrvalue_t *values; 	
 unsigned stat; 	
 fns_search_results *head = 0, *current, *prev; 	
 int no_names = 0; 	
 context_name = 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 (0); 	
 } 	
 /* 検索する属性を持つ attrset のコンストラクト */ 	
 /* 最初に識別子 */ 	
 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); 	
 /* 次に属性値 */ 	
 values = (FN_attrvalue_t *) malloc(sizeof(FN_attrvalue_t)); 	
 values->length = strlen(attr_value);  
 values->contents = (void *) strdup(attr_value); 	
 /* 次に属性の作成 */ 
 attribute = fn_attribute_create(&identifier, &syntax); 	
 /* 次に属性値の作成 */ 	
 fn_attribute_add(attribute, values, 0); 	
 /* 次に attrset の作成と属性の追加 */ 	
 attrset = fn_attrset_create(); 	
 fn_attrset_add(attrset, attribute, 0); 	
 search_list = prelim_fn_attr_search(initial_context,   
  context_name, attrset, 0, 0, status); 	
 if (!fn_status_is_success(status)) { 		
  fprintf(stderr, "Unable to list names¥n"); 		
  return (0); 	
 } 	
 while (search_name = prelim_fn_searchlist_next(search_list, 	 
  0, 0, status)) { 		
  no_names++; 		
  current = (fns_search_results *)      
   malloc(sizeof(fns_search_results)); 		
  current->name = (char *) 		 
   malloc(strlen((char *) fn_string_str(search_name, &stat)) + 1); 		
 strcpy(current->name, (char *) fn_string_str(search_name, &stat)); 		
 current->next = 0; 		
 if (head) { 			
  prev->next = current;  		
  prev = current; 		
 } else { 			
  head = current; 			
  prev = current; 		
 } 		
 fn_string_destroy(search_name); 	
} 	
fn_searchlist_destroy(search_list); 	
fn_status_destroy(status); 	
fn_ctx_destroy(initial_context); 	
fn_attrset_destroy(attrset); 	
fn_attribute_destroy(attribute); 	
free(identifier.contents); 	
free(syntax.contents); 	
free(values->contents); 	
free(values); 
	return (head); 
}