1 | /*
|
---|
2 | Unix SMB/CIFS implementation.
|
---|
3 |
|
---|
4 | Copyright (C) Timur I. Bakeyev 2007
|
---|
5 |
|
---|
6 | This library is free software; you can redistribute it and/or
|
---|
7 | modify it under the terms of the GNU Library General Public
|
---|
8 | License as published by the Free Software Foundation; either
|
---|
9 | version 2 of the License, or (at your option) any later version.
|
---|
10 |
|
---|
11 | This library is distributed in the hope that it will be useful,
|
---|
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
---|
14 | Library General Public License for more details.
|
---|
15 |
|
---|
16 | You should have received a copy of the GNU Library General Public
|
---|
17 | License along with this library; if not, write to the
|
---|
18 | Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
---|
19 | Boston, MA 02111-1307, USA.
|
---|
20 | */
|
---|
21 |
|
---|
22 | #include "winbind_client.h"
|
---|
23 |
|
---|
24 | extern enum nss_status _nss_wins_gethostbyname2_r(const char *name, int af, struct hostent *he,
|
---|
25 | char *buffer, size_t buflen, int *h_errnop);
|
---|
26 |
|
---|
27 | ns_mtab *nss_module_register(const char *source, unsigned int *, nss_module_unregister_fn *);
|
---|
28 |
|
---|
29 | NSS_METHOD_PROTOTYPE(__nss_wins_freebsd_gethostbyname2_r);
|
---|
30 |
|
---|
31 | static ns_mtab methods[] =
|
---|
32 | {
|
---|
33 | { NSDB_HOSTS, "getaddrinfo", NULL, NULL },
|
---|
34 | { NSDB_HOSTS, "ghbyname", NULL, NULL },
|
---|
35 | { NSDB_HOSTS, "ghbyaddr", NULL, NULL },
|
---|
36 | { NSDB_HOSTS, "gethostbyaddr_r", NULL, NULL },
|
---|
37 | { NSDB_HOSTS, "gethostbyname2_r", __nss_wins_freebsd_gethostbyname2_r, _nss_wins_gethostbyname2_r },
|
---|
38 | { NSDB_HOSTS, "getnetbyname_r", NULL, NULL },
|
---|
39 | { NSDB_HOSTS, "getnetbyaddr_r", NULL, NULL },
|
---|
40 | { NSDB_HOSTS, "gethostbyname", NULL, NULL },
|
---|
41 | { NSDB_HOSTS, "gethostbyaddr", NULL, NULL },
|
---|
42 | { NSDB_HOSTS, "getnetbyname", NULL, NULL },
|
---|
43 | { NSDB_HOSTS, "getnetbyaddr", NULL, NULL }
|
---|
44 | };
|
---|
45 |
|
---|
46 | int
|
---|
47 | __nss_wins_freebsd_gethostbyname2_r(void *retval, void *mdata, va_list ap)
|
---|
48 | {
|
---|
49 | int (*fn)(const char *, int, struct hostent *, char *, size_t, int *);
|
---|
50 | const char *hostname;
|
---|
51 | int af;
|
---|
52 | struct hostent *he;
|
---|
53 | char *buffer;
|
---|
54 | size_t buflen;
|
---|
55 | int *h_errnop;
|
---|
56 | enum nss_status status;
|
---|
57 |
|
---|
58 | fn = mdata;
|
---|
59 | hostname = va_arg(ap, const char *);
|
---|
60 | af = va_arg(ap, int);
|
---|
61 | he = va_arg(ap, struct hostent *);
|
---|
62 | buffer = va_arg(ap, char *);
|
---|
63 | buflen = va_arg(ap, size_t);
|
---|
64 | h_errnop = va_arg(ap, int *);
|
---|
65 |
|
---|
66 | status = fn(hostname, af, he, buffer, buflen, h_errnop);
|
---|
67 | status = __nss_compat_result(status, *h_errnop);
|
---|
68 | if (status == NS_SUCCESS)
|
---|
69 | *(struct hostent **)retval = he;
|
---|
70 |
|
---|
71 | return (status);
|
---|
72 | }
|
---|
73 |
|
---|
74 | ns_mtab *
|
---|
75 | nss_module_register(const char *source __unused, unsigned int *mtabsize,
|
---|
76 | nss_module_unregister_fn *unreg)
|
---|
77 | {
|
---|
78 | *mtabsize = sizeof(methods) / sizeof(methods[0]);
|
---|
79 | *unreg = NULL;
|
---|
80 | return (methods);
|
---|
81 | }
|
---|