This routine is called by main() to create the group
object. Because nis_creategroup() works only on group objects,
the "groups_dir" literal is not needed in the group name.
Example 9-2 NIS+ Routine to Create Group Objects
void
grp_create (grp_name)
nis_name grp_name;
{
nis_error err;
printf ("\n Adding %s group to namespace ... \n", grp_name);
err = nis_creategroup (grp_name, 0);
if (err != NIS_SUCCESS) {
nis_perror (err, "unable to create group.");
exit (1);
}
}
|
The routine shown in the following example is called by main() to create a table object laid out as shown in the following table.
Table 9-3 NIS+ Table Objects
| Column1 | Column2 |
Name: | id | name |
Attributes: | Searchable, Text | Searchable, Text |
Access Rights | ----rmcdr---r--- | ----rmcdr---r--- |
The TA_SEARCHABLE constant indicates to the service
that the column is searchable. Only TEXT (the default)
columns are searchable. TA_CASE indicates to the service
that the column value is to be treated in a case-insensitive manner during
searches.
Example 9-3 NIS+ Routine to Create Table Objects
#define TABLE_MAXCOLS 2
#define TABLE_COLSEP ':'
#define TABLE_PATH 0
void
tbl_create (dirobj, table_name)
nis_object *dirobj; /* need to use some of the fields */
nis_name table_name;
{
nis_result *cres;
static nis_object tblobj;
static table_col tbl_cols[TABLE_MAXCOLS] = {
{"Id", TA_SEARCHABLE | TA_CASE, DEFAULT_RIGHTS},
{"Name", TA_SEARCHABLE | TA_CASE, DEFAULT_RIGHTS}
};
tblobj.zo_owner = dirobj->zo_owner;
tblobj.zo_group = dirobj->zo_group;
tblobj.zo_access = DEFAULT_RIGHTS; /* macro defined in nis.h */
tblobj.zo_data.zo_type = TABLE_OBJ; /* enumerated type in nis.h */
tblobj.TA_data.ta_type = TABLE_TYPE;
tblobj.TA_data.ta_maxcol = TABLE_MAXCOLS;
tblobj.TA_data.ta_sep = TABLE_COLSEP;
tblobj.TA_data.ta_path = TABLE_PATH;
tblobj.TA_data.ta_cols.ta_cols_len =
tblobj.TA_data.ta_maxcol; /* ALWAYS ! */
tblobj.TA_data.ta_cols.ta_cols_val = tbl_cols;
/*
* Use a fully qualified table name i.e. the "org_dir" literal
should
* be embedded in the table name. This is necessary because
nis_add
* operates on all types of NIS+ objects and needs the full path
name
* if a table is created.
*/
printf ("\n Creating table %s ... \n", table_name);
cres = nis_add (table_name, &tblobj);
if (cres->status != NIS_SUCCESS) {
nis_perror (cres->status, "unable to add table.");
exit (1);
}
(void) nis_freeresult (cres);
}
|
The routine shown in the following example is called by main() to add entry objects to the table object. Two entries are added
to the table object. Note that the column width in both entries is set to
include the NULL character for a string terminator.
Example 9-4 NIS+ Routine to Add Objects to Table
#define MAXENTRIES 2
void
stuff_table(table_name)
nis_name table_name;
{
int i;
nis_object entdata;
nis_result *cres;
static entry_col ent_col_data[MAXENTRIES][TABLE_MAXCOLS] = {
{0, 2, "1", 0, 5, "John"},
{0, 2, "2", 0, 5, "Mary"}
};
printf ("\n Adding entries to table ... \n");
/*
* Look up the table object first since the entries being added
* should have the same owner, group owner and access rights as
* the table they go in.
*/
cres = nis_lookup (table_name, 0);
if (cres->status != NIS_SUCCESS) {
nis_perror (cres->status, "Unable to lookup table");
exit(1);
}
entdata.zo_owner = NIS_RES_OBJECT (cres)->zo_owner;
entdata.zo_group = NIS_RES_OBJECT (cres)->zo_group;
entdata.zo_access = NIS_RES_OBJECT (cres)->zo_access;
/* Free cres, so that it can be reused. */
(void) nis_freeresult (cres);
entdata.zo_data.zo_type = ENTRY_OBJ; /* enumerated type in
nis.h */
entdata.EN_data.en_type = TABLE_TYPE;
entdata.EN_data.en_cols.en_cols_len = TABLE_MAXCOLS;
for (i = 0; i < MAXENTRIES; ++i) {
entdata.EN_data.en_cols.en_cols_val = &ent_col_data[i][0];
cres = nis_add_entry (table_name, &entdata, 0);
if (cres->status != NIS_SUCCESS) {
nis_perror (cres->status, "unable to add entry.");
exit (1);
}
(void) nis_freeresult (cres);
}
}
|
The routine shown in the following example is the print function for
the nis_list() call. When list_objs()
calls nis_list(), a pointer to print_info()
is one of the calling arguments. Each time the service calls this function,
it prints the contents of the entry object. The return value indicates to
the library to call with the next entry from the table.
Example 9-5 NIS+ Routine for nis_list Call
int
print_info (name, entry, cbdata)
nis_name name; /* Unused */
nis_object *entry; /* The NIS+ entry object */
void *cbdata; /* Unused */
{
static u_int firsttime = 1;
entry_col *tmp; /* only to make source more readable */
u_int i, terminal;
if (firsttime) {
printf ("\tId.\t\t\tName\n");
printf ("\t---\t\t\t----\n");
firsttime = 0;
}
for (i = 0; i < entry->EN_data.en_cols.en_cols_len; ++i) {
tmp = &entry->EN_data.en_cols.en_cols_val[i];
terminal = tmp->ec_value.ec_value_len;
tmp->ec_value.ec_value_val[terminal] = '\0';
}
/*
* ENTRY_VAL is a macro that returns the value of a specific
* column value of a specified entry.
*/
printf("\t%s\t\t\t%s\n", ENTRY_VAL (entry, 0),
ENTRY_VAL (entry, 1));
return (0); /* always ask for more */
}
|