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

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

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


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