nsswitch: add test for parallel NSS & libwbclient calls
[samba.git] / nsswitch / wins_freebsd.c
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 }