The routine shown in the following example is called by main() to list the contents of the group, table, and directory objects.
The routine demonstrates the use of callbacks also. It retrieves and displays
the membership of the group. The group membership list is not stored as the
contents of the object. So, the list is queried through the nis_lookup() instead of the nis_list() call. You must use
the "groups_dir" form of the group because nis_lookup() works on all types of NIS+ objects.
Example 9-6 NIS+ Routine to List Objects
void
list_objs(dir_name, table_name, grp_name)
nis_name dir_name, table_name, grp_name;
{
group_obj *tmp; /* only to make source more readable */
u_int i;
char grp_obj_name [NIS_MAXNAMELEN];
nis_result *cres;
char index_name [BUFFER_SIZE];
sprintf (grp_obj_name, "%s.groups_dir.%s",
nis_leaf_of (grp_name), nis_domain_of (grp_name));
printf ("\nGroup %s membership is: \n", grp_name);
cres = nis_lookup(grp_obj_name, 0);
if (cres->status != NIS_SUCCESS) {
nis_perror (cres->status, "Unable to lookup group object.");
exit(1);
}
tmp = &(NIS_RES_OBJECT(cres)->GR_data);
for (i = 0; i < tmp->gr_members.gr_members_len; ++i)
printf ("\t %s\n", tmp->gr_members.gr_members_val[i]);
(void) nis_freeresult (cres);
/*
* Display the contents of the foo domain without using
callbacks.
*/
printf ("\nContents of Directory %s are: \n", dir_name);
cres = nis_list (dir_name, 0, 0, 0);
if (cres->status != NIS_SUCCESS) {
nis_perror (cres->status,
"Unable to list Contents of
Directory foo.");
exit(1);
}
for (i = 0; i < NIS_RES_NUMOBJ(cres); ++i)
printf("\t%s\n", NIS_RES_OBJECT(cres)[i].zo_name);
(void) nis_freeresult (cres);
/*
* List the contents of the table we created using the callback
form
* of nis_list().
*/
printf ("\n Contents of Table %s are: \n", table_name);
cres = nis_list (table_name, 0, print_info, 0);
if(cres->status != NIS_CBRESULTS && cres->status !=
NIS_NOTFOUND){
nis_perror (cres->status,
"Listing entries using callback failed");
exit(1);
}
(void) nis_freeresult (cres);
/*
* List only one entry from the table we created. Use
* indexed names to do this retrieval.
*/
printf("\n Entry corresponding to id 1 is:\n");
/*
* The name of the column is usually extracted from the table
* object, which would have to be retrieved first.
*/
sprintf(index_name, "[Id=1],%s", table_name);
cres = nis_list (index_name, 0, print_info, 0);
if(cres->status != NIS_CBRESULTS && cres->status !=
NIS_NOTFOUND){
nis_perror (cres->status,
"Listing entry using indexed names and callback failed");
exit(1);
}
(void) nis_freeresult (cres);
}
|
The routine in the following table is called by cleanup()
to remove a directory object from the namespace. The routine also informs
the servers serving the directory about this deletion. Note that the memory
containing result structure, pointed to by cres,
must be freed after the result has been tested.
Example 9-7 NIS+ Routine to Remove Directory Objects
void
dir_remove(dir_name, srv_list, numservers)
nis_name dir_name;
nis_server *srv_list;
u_int numservers;
{
nis_result *cres;
nis_error err;
u_int i;
printf ("\nRemoving %s directory object from namespace ...
\n",
dir_name);
cres = nis_remove (dir_name, 0);
if (cres->status != NIS_SUCCESS) {
nis_perror (cres->status, "unable to remove directory");
exit (1);
}
(void) nis_freeresult (cres);
for (i = 0; i < numservers; ++i) {
err = nis_rmdir (dir_name, &srv_list[i]);
if (err != NIS_SUCCESS) {
nis_perror (err,
"unable to remove server from directory");
exit (1);
}
}
}
|
The following routine is called by main() to delete
all the objects that were created in this example. Note the use of the REM_MULTIPLE flag in the call to nis_remove_entry().
You must delete all entries from a table before the table itself can be deleted.
Example 9-8 NIS+ Routine to Remove All Objects
void
cleanup(local_princip, grp_name, table_name, dir_name, dirobj)
nis_name local_princip, grp_name, table_name, dir_name;
nis_object *dirobj;
{
char grp_dir_name [NIS_MAXNAMELEN];
char org_dir_name [NIS_MAXNAMELEN];
nis_error err;
nis_result *cres;
sprintf(grp_dir_name, "%s.%s", "groups_dir", dir_name);
sprintf(org_dir_name, "%s.%s", "org_dir", dir_name);
printf("\n\n\nStarting to Clean up ... \n");
printf("\n\nRemoving principal %s from group %s \n",
local_princip, grp_name);
err = nis_removemember (local_princip, grp_name);
if (err != NIS_SUCCESS) {
nis_perror (err,
"unable to delete local principal from group.");
exit (1);
}
/*
* Delete the admins group. We do not use the "groups_dir" form
* of the group name since this API is applicable to groups
only.
* It automatically embeds the groups_dir literal in the name
of
* the group.
*/
printf("\nRemoving %s group from namespace ... \n",
grp_name);
err = nis_destroygroup (grp_name);
if (err != NIS_SUCCESS) {
nis_perror (err, "unable to delete group.");
exit (1);
}
printf("\n Deleting all entries from table %s ... \n",
table_name);
cres = nis_remove_entry(table_name, 0, REM_MULTIPLE);
switch (cres->status) {
case NIS_SUCCESS:
case NIS_NOTFOUND:
break;
default:
nis_perror(cres->status, "Could not delete entries from
table");
exit(1);
}
(void) nis_freeresult (cres);
printf("\n Deleting table %s itself ... \n", table_name);
cres = nis_remove(table_name, 0);
if (cres->status != NIS_SUCCESS) {
nis_perror(cres->status, "Could not delete table.");
exit(1);
}
(void) nis_freeresult (cres);
/* delete the groups_dir, org_dir and foo directory objects.
*/
dir_remove (grp_dir_name,
dirobj->DI_data.do_servers.do_servers_val,
dirobj->DI_data.do_servers.do_servers_len);
dir_remove (org_dir_name,
dirobj->DI_data.do_servers.do_servers_val,
dirobj->DI_data.do_servers.do_servers_len);
dir_remove (dir_name, dirobj-
>DI_data.do_servers.do_servers_val,
dirobj->DI_data.do_servers.do_servers_len);
}
|