1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
#ident "$Id$"
/*
* lookup_nisplus.c
*
* Module for Linux automountd to access a NIS+ automount map
*/
#include <stdio.h>
#include <malloc.h>
#include <errno.h>
#include <unistd.h>
#include <syslog.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <rpc/rpc.h>
#include <rpc/xdr.h>
#include <rpcsvc/nis.h>
#include <rpcsvc/ypclnt.h>
#define MODULE_LOOKUP
#include "automount.h"
#define MAPFMT_DEFAULT "sun"
#define MODPREFIX "lookup(nisplus): "
struct lookup_context {
char *domainname;
char *mapname;
struct parse_mod *parse;
};
int lookup_version = AUTOFS_LOOKUP_VERSION; /* Required by protocol */
int lookup_init(char *mapfmt, int argc, char **argv, void **context)
{
struct lookup_context *ctxt;
int err;
if ( !(*context = ctxt = malloc(sizeof(struct lookup_context))) ) {
syslog(LOG_CRIT, MODPREFIX "%m");
return 1;
}
if ( argc < 1 ) {
syslog(LOG_CRIT, MODPREFIX "No map name");
return 1;
}
ctxt->mapname = argv[0];
err = yp_get_default_domain(&ctxt->domainname);
if ( err ) {
syslog(LOG_CRIT, MODPREFIX "map %s: %s\n", ctxt->mapname, yperr_string(err));
return 1;
}
if ( !mapfmt )
mapfmt = MAPFMT_DEFAULT;
return !(ctxt->parse = open_parse(mapfmt,MODPREFIX,argc-1,argv+1));
}
int lookup_mount(char *root, char *name, int name_len, void *context)
{
struct lookup_context *ctxt = (struct lookup_context *) context;
char tablename[strlen (name) + strlen (ctxt->mapname) +
strlen (ctxt->domainname) + 20];
nis_result *result;
int rv;
syslog(LOG_DEBUG, MODPREFIX "looking up %s", name);
sprintf (tablename, "[key=%s],%s.org_dir.%s.", name, ctxt->mapname,
ctxt->domainname);
result = nis_list (tablename, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL);
if (result->status != NIS_SUCCESS && result->status != NIS_S_SUCCESS) {
/* Try to get the "*" entry if there is one - note that we *don't*
modify "name" so & -> the name we used, not "*" */
sprintf (tablename, "[key=*],%s.org_dir.%s.", ctxt->mapname,
ctxt->domainname);
result = nis_list (tablename, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL);
}
if (result->status != NIS_SUCCESS && result->status != NIS_S_SUCCESS) {
syslog(LOG_NOTICE, MODPREFIX "lookup for %s failed: %s", name,
nis_sperrno (result->status));
return 1;
}
syslog(LOG_DEBUG, MODPREFIX "%s -> %s", name,
NIS_RES_OBJECT(result)->EN_data.en_cols.en_cols_val[1].ec_value.ec_value_val);
rv = ctxt->parse->parse_mount(root,name,name_len,
NIS_RES_OBJECT(result)->EN_data.en_cols.en_cols_val[1].ec_value.ec_value_val,
ctxt->parse->context);
return rv;
}
int lookup_done(void *context)
{
struct lookup_context *ctxt = (struct lookup_context *) context;
int rv = close_parse(ctxt->parse);
free(ctxt);
return rv;
}
|