1 |
--- ./nss/bsdnss.c.orig 2009-08-10 16:06:22.000000000 +0000 |
2 |
+++ ./nss/bsdnss.c 2009-08-10 15:58:04.000000000 +0000 |
3 |
@@ -0,0 +1,157 @@ |
4 |
+#include <errno.h> |
5 |
+#include <sys/param.h> |
6 |
+#include <netinet/in.h> |
7 |
+#include <pwd.h> |
8 |
+#include <grp.h> |
9 |
+#include <nss.h> |
10 |
+#include <netdb.h> |
11 |
+ |
12 |
+#define BUFFER_SIZE 1024 |
13 |
+ |
14 |
+extern enum nss_status _nss_ldap_getgrent_r(struct group *, char *, size_t, |
15 |
+ int *); |
16 |
+extern enum nss_status _nss_ldap_getgrnam_r(const char *, struct group *, |
17 |
+ char *, size_t, int *); |
18 |
+extern enum nss_status _nss_ldap_getgrgid_r(gid_t gid, struct group *, char *, |
19 |
+ size_t, int *); |
20 |
+extern enum nss_status _nss_ldap_setgrent(void); |
21 |
+extern enum nss_status _nss_ldap_endgrent(void); |
22 |
+ |
23 |
+extern enum nss_status _nss_ldap_getpwent_r(struct passwd *, char *, size_t, |
24 |
+ int *); |
25 |
+extern enum nss_status _nss_ldap_getpwnam_r(const char *, struct passwd *, |
26 |
+ char *, size_t, int *); |
27 |
+extern enum nss_status _nss_ldap_getpwuid_r(gid_t gid, struct passwd *, char *, |
28 |
+ size_t, int *); |
29 |
+extern enum nss_status _nss_ldap_setpwent(void); |
30 |
+extern enum nss_status _nss_ldap_endpwent(void); |
31 |
+ |
32 |
+extern enum nss_status _nss_ldap_gethostbyname_r (const char *name, struct hostent * result, |
33 |
+ char *buffer, size_t buflen, int *errnop, |
34 |
+ int *h_errnop); |
35 |
+ |
36 |
+extern enum nss_status _nss_ldap_gethostbyname2_r (const char *name, int af, struct hostent * result, |
37 |
+ char *buffer, size_t buflen, int *errnop, |
38 |
+ int *h_errnop); |
39 |
+extern enum nss_status _nss_ldap_gethostbyaddr_r (struct in_addr * addr, int len, int type, |
40 |
+ struct hostent * result, char *buffer, |
41 |
+ size_t buflen, int *errnop, int *h_errnop); |
42 |
+ |
43 |
+NSS_METHOD_PROTOTYPE(__nss_compat_getgrnam_r); |
44 |
+NSS_METHOD_PROTOTYPE(__nss_compat_getgrgid_r); |
45 |
+NSS_METHOD_PROTOTYPE(__nss_compat_getgrent_r); |
46 |
+NSS_METHOD_PROTOTYPE(__nss_compat_setgrent); |
47 |
+NSS_METHOD_PROTOTYPE(__nss_compat_endgrent); |
48 |
+ |
49 |
+NSS_METHOD_PROTOTYPE(__nss_compat_getpwnam_r); |
50 |
+NSS_METHOD_PROTOTYPE(__nss_compat_getpwuid_r); |
51 |
+NSS_METHOD_PROTOTYPE(__nss_compat_getpwent_r); |
52 |
+NSS_METHOD_PROTOTYPE(__nss_compat_setpwent); |
53 |
+NSS_METHOD_PROTOTYPE(__nss_compat_endpwent); |
54 |
+ |
55 |
+NSS_METHOD_PROTOTYPE(__nss_compat_gethostbyname); |
56 |
+NSS_METHOD_PROTOTYPE(__nss_compat_gethostbyname2); |
57 |
+NSS_METHOD_PROTOTYPE(__nss_compat_gethostbyaddr); |
58 |
+ |
59 |
+static ns_mtab methods[] = { |
60 |
+{ NSDB_GROUP, "getgrnam_r", __nss_compat_getgrnam_r, _nss_ldap_getgrnam_r }, |
61 |
+{ NSDB_GROUP, "getgrgid_r", __nss_compat_getgrgid_r, _nss_ldap_getgrgid_r }, |
62 |
+{ NSDB_GROUP, "getgrent_r", __nss_compat_getgrent_r, _nss_ldap_getgrent_r }, |
63 |
+{ NSDB_GROUP, "setgrent", __nss_compat_setgrent, _nss_ldap_setgrent }, |
64 |
+{ NSDB_GROUP, "endgrent", __nss_compat_endgrent, _nss_ldap_endgrent }, |
65 |
+ |
66 |
+{ NSDB_PASSWD, "getpwnam_r", __nss_compat_getpwnam_r, _nss_ldap_getpwnam_r }, |
67 |
+{ NSDB_PASSWD, "getpwuid_r", __nss_compat_getpwuid_r, _nss_ldap_getpwuid_r }, |
68 |
+{ NSDB_PASSWD, "getpwent_r", __nss_compat_getpwent_r, _nss_ldap_getpwent_r }, |
69 |
+{ NSDB_PASSWD, "setpwent", __nss_compat_setpwent, _nss_ldap_setpwent }, |
70 |
+{ NSDB_PASSWD, "endpwent", __nss_compat_endpwent, _nss_ldap_endpwent }, |
71 |
+ |
72 |
+{ NSDB_HOSTS, "gethostbyname", __nss_compat_gethostbyname, _nss_ldap_gethostbyname_r }, |
73 |
+{ NSDB_HOSTS, "gethostbyaddr", __nss_compat_gethostbyaddr, _nss_ldap_gethostbyaddr_r }, |
74 |
+{ NSDB_HOSTS, "gethostbyname2", __nss_compat_gethostbyname2, _nss_ldap_gethostbyname2_r }, |
75 |
+ |
76 |
+{ NSDB_GROUP_COMPAT, "getgrnam_r", __nss_compat_getgrnam_r, _nss_ldap_getgrnam_r }, |
77 |
+{ NSDB_GROUP_COMPAT, "getgrgid_r", __nss_compat_getgrgid_r, _nss_ldap_getgrgid_r }, |
78 |
+{ NSDB_GROUP_COMPAT, "getgrent_r", __nss_compat_getgrent_r, _nss_ldap_getgrent_r }, |
79 |
+{ NSDB_GROUP_COMPAT, "setgrent", __nss_compat_setgrent, _nss_ldap_setgrent }, |
80 |
+{ NSDB_GROUP_COMPAT, "endgrent", __nss_compat_endgrent, _nss_ldap_endgrent }, |
81 |
+ |
82 |
+{ NSDB_PASSWD_COMPAT, "getpwnam_r", __nss_compat_getpwnam_r, _nss_ldap_getpwnam_r }, |
83 |
+{ NSDB_PASSWD_COMPAT, "getpwuid_r", __nss_compat_getpwuid_r, _nss_ldap_getpwuid_r }, |
84 |
+{ NSDB_PASSWD_COMPAT, "getpwent_r", __nss_compat_getpwent_r, _nss_ldap_getpwent_r }, |
85 |
+{ NSDB_PASSWD_COMPAT, "setpwent", __nss_compat_setpwent, _nss_ldap_setpwent }, |
86 |
+{ NSDB_PASSWD_COMPAT, "endpwent", __nss_compat_endpwent, _nss_ldap_endpwent }, |
87 |
+ |
88 |
+}; |
89 |
+ |
90 |
+ |
91 |
+int __nss_compat_gethostbyname(void *retval, void *mdata, va_list ap) |
92 |
+{ |
93 |
+ enum nss_status (*fn)(const char *, struct hostent *, char *, size_t, int *, int *); |
94 |
+ const char *name; |
95 |
+ struct hostent *result; |
96 |
+ char buffer[BUFFER_SIZE]; |
97 |
+ int errnop; |
98 |
+ int h_errnop; |
99 |
+ int af; |
100 |
+ enum nss_status status; |
101 |
+ fn = mdata; |
102 |
+ name = va_arg(ap, const char*); |
103 |
+ af = va_arg(ap,int); |
104 |
+ result = va_arg(ap,struct hostent *); |
105 |
+ status = fn(name, result, buffer, sizeof(buffer), &errnop, &h_errnop); |
106 |
+ status = __nss_compat_result(status,errnop); |
107 |
+ h_errno = h_errnop; |
108 |
+ return (status); |
109 |
+} |
110 |
+ |
111 |
+int __nss_compat_gethostbyname2(void *retval, void *mdata, va_list ap) |
112 |
+{ |
113 |
+ enum nss_status (*fn)(const char *, struct hostent *, char *, size_t, int *, int *); |
114 |
+ const char *name; |
115 |
+ struct hostent *result; |
116 |
+ char buffer[BUFFER_SIZE]; |
117 |
+ int errnop; |
118 |
+ int h_errnop; |
119 |
+ int af; |
120 |
+ enum nss_status status; |
121 |
+ fn = mdata; |
122 |
+ name = va_arg(ap, const char*); |
123 |
+ af = va_arg(ap,int); |
124 |
+ result = va_arg(ap,struct hostent *); |
125 |
+ status = fn(name, result, buffer, sizeof(buffer), &errnop, &h_errnop); |
126 |
+ status = __nss_compat_result(status,errnop); |
127 |
+ h_errno = h_errnop; |
128 |
+ return (status); |
129 |
+} |
130 |
+ |
131 |
+int __nss_compat_gethostbyaddr(void *retval, void *mdata, va_list ap) |
132 |
+{ |
133 |
+ struct in_addr *addr; |
134 |
+ int len; |
135 |
+ int type; |
136 |
+ struct hostent *result; |
137 |
+ char buffer[BUFFER_SIZE]; |
138 |
+ int errnop; |
139 |
+ int h_errnop; |
140 |
+ enum nss_status (*fn)(struct in_addr *, int, int, struct hostent *, char *, size_t, int *, int *); |
141 |
+ enum nss_status status; |
142 |
+ fn = mdata; |
143 |
+ addr = va_arg(ap, struct in_addr*); |
144 |
+ len = va_arg(ap,int); |
145 |
+ type = va_arg(ap,int); |
146 |
+ result = va_arg(ap, struct hostent*); |
147 |
+ status = fn(addr, len, type, result, buffer, sizeof(buffer), &errnop, &h_errnop); |
148 |
+ status = __nss_compat_result(status,errnop); |
149 |
+ h_errno = h_errnop; |
150 |
+ return (status); |
151 |
+} |
152 |
+ |
153 |
+ns_mtab * |
154 |
+nss_module_register(const char *source, unsigned int *mtabsize, |
155 |
+ nss_module_unregister_fn *unreg) |
156 |
+{ |
157 |
+ *mtabsize = sizeof(methods)/sizeof(methods[0]); |
158 |
+ *unreg = NULL; |
159 |
+ return (methods); |
160 |
+} |