#pragma ident "@(#)ns_generic.c 1.33 05/06/08 SMI"
#include <stdio.h>
#include <syslog.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <assert.h>
#include <mntopts.h>
#include "autofs.h"
#include "automount.h"
#include "auto_mntopts.h"
struct ns_info {
char *ns_name;
void (*ns_init)();
int (*ns_getmapent)();
int (*ns_loadmaster)();
int (*ns_loaddirect)();
int (*ns_getmapkeys)();
};
static struct ns_info ns_info[] = {
{ "files", init_files, getmapent_files,
loadmaster_files, loaddirect_files,
getmapkeys_files },
{ "ds", init_ds, getmapent_ds,
loadmaster_ds, loaddirect_ds,
getmapkeys_ds },
{ NULL, NULL, NULL, NULL, NULL, NULL }
};
void
ns_setup(char **stack, char ***stkptr)
{
struct ns_info *nsp;
for (nsp = ns_info; nsp->ns_name; nsp++) {
nsp->ns_init(stack, stkptr);
}
}
int
getmapent(key, mapname, ml, stack, stkptr, iswildcard, isrestricted)
char *key, *mapname;
struct mapline *ml;
char **stack, ***stkptr;
bool_t *iswildcard;
bool_t isrestricted;
{
int ns_err = __NSW_SUCCESS;
struct ns_info *nsp;
if (*mapname == '/')
return (getmapent_files(key, mapname, ml, stack, stkptr,
iswildcard, isrestricted));
for (nsp = ns_info; nsp->ns_name; nsp++) {
ns_err = nsp->ns_getmapent(key, mapname, ml, stack, stkptr,
iswildcard, isrestricted);
if (ns_err == __NSW_SUCCESS)
return (__NSW_SUCCESS);
}
return (__NSW_UNAVAIL);
}
int
loadmaster_map(mapname, defopts, stack, stkptr)
char *mapname, *defopts;
char **stack, ***stkptr;
{
int ns_err = __NSW_SUCCESS;
struct ns_info *nsp;
if (*mapname == '/')
return (loadmaster_files(mapname, defopts, stack, stkptr));
for (nsp = ns_info; nsp->ns_name; nsp++) {
ns_err = nsp->ns_loadmaster(mapname, defopts, stack, stkptr);
if (ns_err == __NSW_SUCCESS)
return (__NSW_SUCCESS);
}
return (__NSW_UNAVAIL);
}
int
loaddirect_map(mapname, localmap, defopts, stack, stkptr)
char *mapname, *localmap, *defopts;
char **stack, ***stkptr;
{
int ns_err = __NSW_SUCCESS;
struct ns_info *nsp;
if (*mapname == '/')
return (loaddirect_files(mapname, localmap, defopts,
stack, stkptr));
if (strcmp(mapname, "-static") == 0) {
return (loaddirect_static(localmap, defopts, stack, stkptr));
}
for (nsp = ns_info; nsp->ns_name; nsp++) {
ns_err = nsp->ns_loaddirect(mapname, localmap, defopts, stack,
stkptr);
if (ns_err == __NSW_SUCCESS)
return (__NSW_SUCCESS);
}
return (__NSW_UNAVAIL);
}
static int
gethostkeys(struct dir_entry **list, int *error, int *cache_time)
{
char **p;
struct dir_entry *last = NULL;
struct hostent *ent;
*cache_time = RDDIR_CACHE_TIME * 2;
*error = 0;
if (trace > 1)
trace_prt(1, "gethostkeys called\n");
sethostent(1);
while ((ent = gethostent()) != NULL) {
if (add_dir_entry(ent->h_name, list, &last)) {
*error = ENOMEM;
goto done;
}
if (ent->h_aliases == NULL)
goto done;
for (p = ent->h_aliases; *p != 0; p++) {
if (strcmp(*p, ent->h_name) != 0) {
if (add_dir_entry(*p, list, &last)) {
*error = ENOMEM;
goto done;
}
}
}
assert(last != NULL);
}
done: if (*list != NULL) {
*error = 0;
}
endhostent();
return (__NSW_SUCCESS);
}
int
getmapkeys(mapname, list, error, cache_time, stack, stkptr)
char *mapname;
struct dir_entry **list;
int *error;
int *cache_time;
char **stack, ***stkptr;
{
int ns_err = __NSW_SUCCESS;
int success = 0;
struct ns_info *nsp;
if (*mapname == '/')
return (getmapkeys_files(mapname, list, error, cache_time,
stack, stkptr));
if (strcmp(mapname, "-hosts") == 0) {
return (gethostkeys(list, error, cache_time));
}
if (strcmp(mapname, "-static") == 0) {
pr_msg("-static is a collection of direct maps");
return (__NSW_UNAVAIL);
}
if (strcmp(mapname, "-fstab") == 0) {
return (getfstabkeys(list, error, cache_time));
}
for (nsp = ns_info; nsp->ns_name; nsp++) {
ns_err = nsp->ns_getmapkeys(mapname, list, error,
cache_time, stack, stkptr);
if (*error == 0) {
success++;
}
if (ns_err != __NSW_UNAVAIL)
ns_err = __NSW_NOTFOUND;
}
if (success) {
*error = 0;
};
return (success ? __NSW_SUCCESS : __NSW_NOTFOUND);
}