次の例は、コンテキストをリスト表示するための 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); |