Add nsswitch support.
[dragonfly.git] / lib / libc / net / netdb_private.h
1 /*-
2  * Copyright (C) 2005 The FreeBSD Project.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
17  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23  * SUCH DAMAGE.
24  *
25  * $FreeBSD: src/lib/libc/net/netdb_private.h,v 1.13 2006/05/12 15:37:23 ume Exp $
26  */
27
28 #ifndef _NETDB_PRIVATE_H_
29 #define _NETDB_PRIVATE_H_
30
31 #include <stdio.h>                              /* XXX: for FILE */
32
33 #define NETDB_THREAD_ALLOC(name)                                        \
34 static struct name name;                                                \
35 static thread_key_t name##_key;                                         \
36 static once_t name##_init_once = ONCE_INITIALIZER;                      \
37 static int name##_thr_keycreated = 0;                                   \
38 \
39 static void name##_free(void *);                                        \
40 \
41 static void                                                             \
42 name##_keycreate(void)                                                  \
43 {                                                                       \
44         name##_thr_keycreated =                                         \
45             (thr_keycreate(&name##_key, name##_free) == 0);             \
46 }                                                                       \
47 \
48 struct name *                                                           \
49 __##name##_init(void)                                                   \
50 {                                                                       \
51         struct name *he;                                                \
52                                                                         \
53         if (thr_main() != 0)                                            \
54                 return (&name);                                         \
55         if (thr_once(&name##_init_once, name##_keycreate) != 0 ||       \
56             !name##_thr_keycreated)                                     \
57                 return (NULL);                                          \
58         if ((he = thr_getspecific(name##_key)) != NULL)                 \
59                 return (he);                                            \
60         if ((he = calloc(1, sizeof(*he))) == NULL)                      \
61                 return (NULL);                                          \
62         if (thr_setspecific(name##_key, he) == 0)                       \
63                 return (he);                                            \
64         free(he);                                                       \
65         return (NULL);                                                  \
66 }
67
68 #define _MAXALIASES     35
69 #define _MAXLINELEN     1024
70 #define _MAXADDRS       35
71 #define _HOSTBUFSIZE    (8 * 1024)
72 #define _NETBUFSIZE     1025
73
74 struct hostent_data {
75         uint32_t host_addr[4];                  /* IPv4 or IPv6 */
76         char *h_addr_ptrs[_MAXADDRS + 1];
77         char *host_aliases[_MAXALIASES];
78         char hostbuf[_HOSTBUFSIZE];
79         FILE *hostf;
80         int stayopen;
81 #ifdef YP
82         char *yp_domain;
83 #endif
84 };
85
86 struct netent_data {
87         char *net_aliases[_MAXALIASES];
88         char netbuf[_NETBUFSIZE];
89         FILE *netf;
90         int stayopen;
91 #ifdef YP
92         char *yp_domain;
93 #endif
94 };
95
96 struct protoent_data {
97         FILE *fp;
98         char *aliases[_MAXALIASES];
99         int stayopen;
100         char line[_MAXLINELEN + 1];
101 };
102
103 struct hostdata {
104         struct hostent host;
105         char data[sizeof(struct hostent_data)];
106 };
107
108 struct netdata {
109         struct netent net;
110         char data[sizeof(struct netent_data)];
111 };
112
113 struct protodata {
114         struct protoent proto;
115         char data[sizeof(struct protoent_data)];
116 };
117
118 struct hostdata *__hostdata_init(void);
119 struct hostent *__hostent_init(void);
120 struct hostent_data *__hostent_data_init(void);
121 struct netdata *__netdata_init(void);
122 struct netent_data *__netent_data_init(void);
123 struct protodata *__protodata_init(void);
124 struct protoent_data *__protoent_data_init(void);
125 int __copy_hostent(struct hostent *, struct hostent *, char *, size_t);
126 int __copy_netent(struct netent *, struct netent *, char *, size_t);
127 int __copy_protoent(struct protoent *, struct protoent *, char *, size_t);
128
129 void __endprotoent_p(struct protoent_data *);
130 int __getprotoent_p(struct protoent *, struct protoent_data *);
131 void __setprotoent_p(int, struct protoent_data *);
132 void _endhostdnsent(void);
133 void _endhosthtent(void);
134 void _endnetdnsent(void);
135 void _endnethtent(void);
136 struct hostent *_gethostbynisaddr(const char *, int, int);
137 struct hostent *_gethostbynisname(const char *, int);
138 void _map_v4v6_address(const char *, char *);
139 void _map_v4v6_hostent(struct hostent *, char **, int *);
140 void _sethostdnsent(int);
141 void _sethosthtent(int);
142 void _setnetdnsent(int);
143 void _setnethtent(int);
144
145 #endif /* _NETDB_PRIVATE_H_ */