Solaris ネーミングの管理

コンテキストに割り当てられた名前のリスト表示

次の例は、コンテキストをリスト表示するための XFN 操作を示しています。

#include <stdio.h> 
#include <xfn/xfn.h> 
#include <string.h> 
#include <stdlib.h> 
/*  
 このルーチンは与えられたコンテキスト (ctx_name) の下で
 割り当てられた名前のリストを返す。
 ctx_name の例としては "user"、"thisorgunit/service"、
 host/alto/service、user/jsmit/service/calendar などがある 
*/ 
typedef struct fns_listing {
 char *name;
 struct fns_listing *next;
} fns_listing; 
fns_listing * 
fns_list_names(const char *ctx_name)
{ 	
 FN_status_t *status; 	
 FN_ctx_t *initial_context; 	
 FN_composite_name_t *context_name;  
 FN_namelist_t *name_list; 	
 FN_string_t *name; 	
 unsigned int stat; 	
 fns_listing *head = 0, *current, *prev; 	
 int no_names = 0; 	
 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); 	
 } 	
 context_name = fn_composite_name_from_str((unsigned char *)
                    ctx_name); 	
 /* FNS によるリスト名の呼び出し */ 	
 name_list = fn_ctx_list_names(initial_context, context_name,
               status);  
 if (!fn_status_is_success(status)) { 		
  fprintf(stderr, "Unable to list names¥n"); 		
  return (0); 	
 } 	
 /* 名前を個々に呼び出す */ 	
 while (name = fn_namelist_next(name_list, status)) { 		
  no_names++; 		
 current = (fns_listing *) malloc(sizeof(fns_listing)); 		
 current->name = (char *) 		 
  malloc(strlen((char *) fn_string_str(name, &stat)) + 1); 		
 strcpy(current->name, (char *) fn_string_str(name, &stat)); 	 
 current->next = 0; 		
 if (head) { 			
  prev->next = current; 			
  prev = current; 		
 } else { 			
  head = current; 			
  prev = current; 		
 } 		
 fn_string_destroy(name); 	
} 	
fn_namelist_destroy(name_list); 	
fn_status_destroy(status); 	
fn_ctx_destroy(initial_context); 	
return (head);