The example below shows XFN operations to list a context.
#include <stdio.h>
#include <xfn/xfn.h>
#include <string.h>
#include <stdlib.h>
/*
This routine returns the list of names
bound under the given context (ctx_name).
Examples of ctx_name are "user", "thisorgunit/service",
host/alto/service, user/jsmit/service/calendar, etc.,
*/
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();
/* Obtain the initial context */
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 call to list names */
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);
}
/* Obtain the names individually */
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);
|