11363f04cSPaul Traina /*- 21363f04cSPaul Traina * Copyright (c) 1994, Garrett Wollman 31363f04cSPaul Traina * 41363f04cSPaul Traina * Redistribution and use in source and binary forms, with or without 51363f04cSPaul Traina * modification, are permitted provided that the following conditions 61363f04cSPaul Traina * are met: 71363f04cSPaul Traina * 1. Redistributions of source code must retain the above copyright 81363f04cSPaul Traina * notice, this list of conditions and the following disclaimer. 91363f04cSPaul Traina * 2. Redistributions in binary form must reproduce the above copyright 101363f04cSPaul Traina * notice, this list of conditions and the following disclaimer in the 111363f04cSPaul Traina * documentation and/or other materials provided with the distribution. 121363f04cSPaul Traina * 131363f04cSPaul Traina * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND 141363f04cSPaul Traina * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 151363f04cSPaul Traina * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 161363f04cSPaul Traina * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 171363f04cSPaul Traina * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 181363f04cSPaul Traina * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 191363f04cSPaul Traina * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 201363f04cSPaul Traina * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 211363f04cSPaul Traina * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 221363f04cSPaul Traina * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 231363f04cSPaul Traina * SUCH DAMAGE. 241363f04cSPaul Traina */ 251363f04cSPaul Traina 26333fc21eSDavid E. O'Brien #include <sys/cdefs.h> 27333fc21eSDavid E. O'Brien __FBSDID("$FreeBSD$"); 281363f04cSPaul Traina 29c5774e2dSJacques Vidrine #include "namespace.h" 30a2a77501SHajimu UMEMOTO #include "reentrant.h" 311363f04cSPaul Traina #include <sys/param.h> 321363f04cSPaul Traina #include <sys/socket.h> 331363f04cSPaul Traina #include <netinet/in.h> 341363f04cSPaul Traina #include <arpa/inet.h> 351363f04cSPaul Traina #include <netdb.h> 361363f04cSPaul Traina #include <stdio.h> 371363f04cSPaul Traina #include <ctype.h> 38d3ac2b30SHajimu UMEMOTO #include <errno.h> 39a2a77501SHajimu UMEMOTO #include <stdlib.h> 401363f04cSPaul Traina #include <string.h> 41248aee62SJacques Vidrine #include <stdarg.h> 42248aee62SJacques Vidrine #include <nsswitch.h> 43c5774e2dSJacques Vidrine #include "un-namespace.h" 44bcb131aaSHajimu UMEMOTO #include "netdb_private.h" 4506a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 4606a99fe3SHajimu UMEMOTO #include "nscache.h" 4706a99fe3SHajimu UMEMOTO #endif 481363f04cSPaul Traina 49*32223c1bSPedro F. Giffuni /* Network lookup order if nsswitch.conf is broken or nonexistent */ 50248aee62SJacques Vidrine static const ns_src default_src[] = { 51248aee62SJacques Vidrine { NSSRC_FILES, NS_SUCCESS }, 52248aee62SJacques Vidrine { NSSRC_DNS, NS_SUCCESS }, 53248aee62SJacques Vidrine { 0 } 541363f04cSPaul Traina }; 551363f04cSPaul Traina 56d3ac2b30SHajimu UMEMOTO NETDB_THREAD_ALLOC(netent_data) 57d3ac2b30SHajimu UMEMOTO NETDB_THREAD_ALLOC(netdata) 58d3ac2b30SHajimu UMEMOTO 5906a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 6006a99fe3SHajimu UMEMOTO static int 6106a99fe3SHajimu UMEMOTO net_id_func(char *buffer, size_t *buffer_size, va_list ap, void *cache_mdata) 6206a99fe3SHajimu UMEMOTO { 6306a99fe3SHajimu UMEMOTO char *name; 6406a99fe3SHajimu UMEMOTO uint32_t net; 6506a99fe3SHajimu UMEMOTO int type; 6606a99fe3SHajimu UMEMOTO 6706a99fe3SHajimu UMEMOTO size_t desired_size, size; 6806a99fe3SHajimu UMEMOTO enum nss_lookup_type lookup_type; 6906a99fe3SHajimu UMEMOTO int res = NS_UNAVAIL; 7006a99fe3SHajimu UMEMOTO 7106a99fe3SHajimu UMEMOTO lookup_type = (enum nss_lookup_type)cache_mdata; 7206a99fe3SHajimu UMEMOTO switch (lookup_type) { 7306a99fe3SHajimu UMEMOTO case nss_lt_name: 7406a99fe3SHajimu UMEMOTO name = va_arg(ap, char *); 7506a99fe3SHajimu UMEMOTO 7606a99fe3SHajimu UMEMOTO size = strlen(name); 7706a99fe3SHajimu UMEMOTO desired_size = sizeof(enum nss_lookup_type) + size + 1; 7806a99fe3SHajimu UMEMOTO if (desired_size > *buffer_size) { 7906a99fe3SHajimu UMEMOTO res = NS_RETURN; 8006a99fe3SHajimu UMEMOTO goto fin; 8106a99fe3SHajimu UMEMOTO } 8206a99fe3SHajimu UMEMOTO 8306a99fe3SHajimu UMEMOTO memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type)); 8406a99fe3SHajimu UMEMOTO memcpy(buffer + sizeof(enum nss_lookup_type), name, size + 1); 8506a99fe3SHajimu UMEMOTO 8606a99fe3SHajimu UMEMOTO res = NS_SUCCESS; 8706a99fe3SHajimu UMEMOTO break; 8806a99fe3SHajimu UMEMOTO case nss_lt_id: 8906a99fe3SHajimu UMEMOTO net = va_arg(ap, uint32_t); 9006a99fe3SHajimu UMEMOTO type = va_arg(ap, int); 9106a99fe3SHajimu UMEMOTO 9206a99fe3SHajimu UMEMOTO desired_size = sizeof(enum nss_lookup_type) + 9306a99fe3SHajimu UMEMOTO sizeof(uint32_t) + sizeof(int); 9406a99fe3SHajimu UMEMOTO if (desired_size > *buffer_size) { 9506a99fe3SHajimu UMEMOTO res = NS_RETURN; 9606a99fe3SHajimu UMEMOTO goto fin; 9706a99fe3SHajimu UMEMOTO } 9806a99fe3SHajimu UMEMOTO 9906a99fe3SHajimu UMEMOTO memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type)); 10006a99fe3SHajimu UMEMOTO memcpy(buffer + sizeof(enum nss_lookup_type), &net, 10106a99fe3SHajimu UMEMOTO sizeof(uint32_t)); 10206a99fe3SHajimu UMEMOTO memcpy(buffer + sizeof(enum nss_lookup_type) + sizeof(uint32_t), 10306a99fe3SHajimu UMEMOTO &type, sizeof(int)); 10406a99fe3SHajimu UMEMOTO 10506a99fe3SHajimu UMEMOTO res = NS_SUCCESS; 10606a99fe3SHajimu UMEMOTO break; 10706a99fe3SHajimu UMEMOTO default: 10806a99fe3SHajimu UMEMOTO /* should be unreachable */ 10906a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 11006a99fe3SHajimu UMEMOTO } 11106a99fe3SHajimu UMEMOTO 11206a99fe3SHajimu UMEMOTO fin: 11306a99fe3SHajimu UMEMOTO *buffer_size = desired_size; 11406a99fe3SHajimu UMEMOTO return (res); 11506a99fe3SHajimu UMEMOTO } 11606a99fe3SHajimu UMEMOTO 11706a99fe3SHajimu UMEMOTO 11806a99fe3SHajimu UMEMOTO static int 11906a99fe3SHajimu UMEMOTO net_marshal_func(char *buffer, size_t *buffer_size, void *retval, va_list ap, 12006a99fe3SHajimu UMEMOTO void *cache_mdata) 12106a99fe3SHajimu UMEMOTO { 12206a99fe3SHajimu UMEMOTO char *name; 12306a99fe3SHajimu UMEMOTO uint32_t net; 12406a99fe3SHajimu UMEMOTO int type; 12506a99fe3SHajimu UMEMOTO struct netent *ne; 12606a99fe3SHajimu UMEMOTO char *orig_buf; 12706a99fe3SHajimu UMEMOTO size_t orig_buf_size; 12806a99fe3SHajimu UMEMOTO 12906a99fe3SHajimu UMEMOTO struct netent new_ne; 13006a99fe3SHajimu UMEMOTO size_t desired_size, size, aliases_size; 13106a99fe3SHajimu UMEMOTO char *p; 13206a99fe3SHajimu UMEMOTO char **alias; 13306a99fe3SHajimu UMEMOTO 13406a99fe3SHajimu UMEMOTO switch ((enum nss_lookup_type)cache_mdata) { 13506a99fe3SHajimu UMEMOTO case nss_lt_name: 13606a99fe3SHajimu UMEMOTO name = va_arg(ap, char *); 13706a99fe3SHajimu UMEMOTO break; 13806a99fe3SHajimu UMEMOTO case nss_lt_id: 13906a99fe3SHajimu UMEMOTO net = va_arg(ap, uint32_t); 14006a99fe3SHajimu UMEMOTO type = va_arg(ap, int); 14106a99fe3SHajimu UMEMOTO break; 14206a99fe3SHajimu UMEMOTO case nss_lt_all: 14306a99fe3SHajimu UMEMOTO break; 14406a99fe3SHajimu UMEMOTO default: 14506a99fe3SHajimu UMEMOTO /* should be unreachable */ 14606a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 14706a99fe3SHajimu UMEMOTO } 14806a99fe3SHajimu UMEMOTO 14906a99fe3SHajimu UMEMOTO ne = va_arg(ap, struct netent *); 15006a99fe3SHajimu UMEMOTO orig_buf = va_arg(ap, char *); 15106a99fe3SHajimu UMEMOTO orig_buf_size = va_arg(ap, size_t); 15206a99fe3SHajimu UMEMOTO 15306a99fe3SHajimu UMEMOTO desired_size = _ALIGNBYTES + sizeof(struct netent) + sizeof(char *); 15406a99fe3SHajimu UMEMOTO if (ne->n_name != NULL) 15506a99fe3SHajimu UMEMOTO desired_size += strlen(ne->n_name) + 1; 15606a99fe3SHajimu UMEMOTO 15706a99fe3SHajimu UMEMOTO if (ne->n_aliases != NULL) { 15806a99fe3SHajimu UMEMOTO aliases_size = 0; 15906a99fe3SHajimu UMEMOTO for (alias = ne->n_aliases; *alias; ++alias) { 16006a99fe3SHajimu UMEMOTO desired_size += strlen(*alias) + 1; 16106a99fe3SHajimu UMEMOTO ++aliases_size; 16206a99fe3SHajimu UMEMOTO } 16306a99fe3SHajimu UMEMOTO 16406a99fe3SHajimu UMEMOTO desired_size += _ALIGNBYTES + 16506a99fe3SHajimu UMEMOTO (aliases_size + 1) * sizeof(char *); 16606a99fe3SHajimu UMEMOTO } 16706a99fe3SHajimu UMEMOTO 16806a99fe3SHajimu UMEMOTO if (*buffer_size < desired_size) { 16906a99fe3SHajimu UMEMOTO /* this assignment is here for future use */ 17006a99fe3SHajimu UMEMOTO *buffer_size = desired_size; 17106a99fe3SHajimu UMEMOTO return (NS_RETURN); 17206a99fe3SHajimu UMEMOTO } 17306a99fe3SHajimu UMEMOTO 17406a99fe3SHajimu UMEMOTO memcpy(&new_ne, ne, sizeof(struct netent)); 17506a99fe3SHajimu UMEMOTO 17606a99fe3SHajimu UMEMOTO *buffer_size = desired_size; 17706a99fe3SHajimu UMEMOTO memset(buffer, 0, desired_size); 17806a99fe3SHajimu UMEMOTO p = buffer + sizeof(struct netent) + sizeof(char *); 17906a99fe3SHajimu UMEMOTO memcpy(buffer + sizeof(struct netent), &p, sizeof(char *)); 18006a99fe3SHajimu UMEMOTO p = (char *)_ALIGN(p); 18106a99fe3SHajimu UMEMOTO 18206a99fe3SHajimu UMEMOTO if (new_ne.n_name != NULL) { 18306a99fe3SHajimu UMEMOTO size = strlen(new_ne.n_name); 18406a99fe3SHajimu UMEMOTO memcpy(p, new_ne.n_name, size); 18506a99fe3SHajimu UMEMOTO new_ne.n_name = p; 18606a99fe3SHajimu UMEMOTO p += size + 1; 18706a99fe3SHajimu UMEMOTO } 18806a99fe3SHajimu UMEMOTO 18906a99fe3SHajimu UMEMOTO if (new_ne.n_aliases != NULL) { 19006a99fe3SHajimu UMEMOTO p = (char *)_ALIGN(p); 19106a99fe3SHajimu UMEMOTO memcpy(p, new_ne.n_aliases, sizeof(char *) * aliases_size); 19206a99fe3SHajimu UMEMOTO new_ne.n_aliases = (char **)p; 19306a99fe3SHajimu UMEMOTO p += sizeof(char *) * (aliases_size + 1); 19406a99fe3SHajimu UMEMOTO 19506a99fe3SHajimu UMEMOTO for (alias = new_ne.n_aliases; *alias; ++alias) { 19606a99fe3SHajimu UMEMOTO size = strlen(*alias); 19706a99fe3SHajimu UMEMOTO memcpy(p, *alias, size); 19806a99fe3SHajimu UMEMOTO *alias = p; 19906a99fe3SHajimu UMEMOTO p += size + 1; 20006a99fe3SHajimu UMEMOTO } 20106a99fe3SHajimu UMEMOTO } 20206a99fe3SHajimu UMEMOTO 20306a99fe3SHajimu UMEMOTO memcpy(buffer, &new_ne, sizeof(struct netent)); 20406a99fe3SHajimu UMEMOTO return (NS_SUCCESS); 20506a99fe3SHajimu UMEMOTO } 20606a99fe3SHajimu UMEMOTO 20706a99fe3SHajimu UMEMOTO static int 20806a99fe3SHajimu UMEMOTO net_unmarshal_func(char *buffer, size_t buffer_size, void *retval, va_list ap, 20906a99fe3SHajimu UMEMOTO void *cache_mdata) 21006a99fe3SHajimu UMEMOTO { 21106a99fe3SHajimu UMEMOTO char *name; 21206a99fe3SHajimu UMEMOTO uint32_t net; 21306a99fe3SHajimu UMEMOTO int type; 21406a99fe3SHajimu UMEMOTO struct netent *ne; 21506a99fe3SHajimu UMEMOTO char *orig_buf; 21606a99fe3SHajimu UMEMOTO size_t orig_buf_size; 21706a99fe3SHajimu UMEMOTO int *ret_errno; 21806a99fe3SHajimu UMEMOTO 21906a99fe3SHajimu UMEMOTO char *p; 22006a99fe3SHajimu UMEMOTO char **alias; 22106a99fe3SHajimu UMEMOTO 22206a99fe3SHajimu UMEMOTO switch ((enum nss_lookup_type)cache_mdata) { 22306a99fe3SHajimu UMEMOTO case nss_lt_name: 22406a99fe3SHajimu UMEMOTO name = va_arg(ap, char *); 22506a99fe3SHajimu UMEMOTO break; 22606a99fe3SHajimu UMEMOTO case nss_lt_id: 22706a99fe3SHajimu UMEMOTO net = va_arg(ap, uint32_t); 22806a99fe3SHajimu UMEMOTO type = va_arg(ap, int); 22906a99fe3SHajimu UMEMOTO break; 23006a99fe3SHajimu UMEMOTO case nss_lt_all: 23106a99fe3SHajimu UMEMOTO break; 23206a99fe3SHajimu UMEMOTO default: 23306a99fe3SHajimu UMEMOTO /* should be unreachable */ 23406a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 23506a99fe3SHajimu UMEMOTO } 23606a99fe3SHajimu UMEMOTO 23706a99fe3SHajimu UMEMOTO ne = va_arg(ap, struct netent *); 23806a99fe3SHajimu UMEMOTO orig_buf = va_arg(ap, char *); 23906a99fe3SHajimu UMEMOTO orig_buf_size = va_arg(ap, size_t); 24006a99fe3SHajimu UMEMOTO ret_errno = va_arg(ap, int *); 24106a99fe3SHajimu UMEMOTO 24206a99fe3SHajimu UMEMOTO if (orig_buf_size < 24306a99fe3SHajimu UMEMOTO buffer_size - sizeof(struct netent) - sizeof(char *)) { 24406a99fe3SHajimu UMEMOTO *ret_errno = ERANGE; 24506a99fe3SHajimu UMEMOTO return (NS_RETURN); 24606a99fe3SHajimu UMEMOTO } 24706a99fe3SHajimu UMEMOTO 24806a99fe3SHajimu UMEMOTO memcpy(ne, buffer, sizeof(struct netent)); 24906a99fe3SHajimu UMEMOTO memcpy(&p, buffer + sizeof(struct netent), sizeof(char *)); 25006a99fe3SHajimu UMEMOTO 25106a99fe3SHajimu UMEMOTO orig_buf = (char *)_ALIGN(orig_buf); 25206a99fe3SHajimu UMEMOTO memcpy(orig_buf, buffer + sizeof(struct netent) + sizeof(char *) + 25306a99fe3SHajimu UMEMOTO _ALIGN(p) - (size_t)p, 25406a99fe3SHajimu UMEMOTO buffer_size - sizeof(struct netent) - sizeof(char *) - 25506a99fe3SHajimu UMEMOTO _ALIGN(p) + (size_t)p); 25606a99fe3SHajimu UMEMOTO p = (char *)_ALIGN(p); 25706a99fe3SHajimu UMEMOTO 25806a99fe3SHajimu UMEMOTO NS_APPLY_OFFSET(ne->n_name, orig_buf, p, char *); 25906a99fe3SHajimu UMEMOTO if (ne->n_aliases != NULL) { 26006a99fe3SHajimu UMEMOTO NS_APPLY_OFFSET(ne->n_aliases, orig_buf, p, char **); 26106a99fe3SHajimu UMEMOTO 26206a99fe3SHajimu UMEMOTO for (alias = ne->n_aliases; *alias; ++alias) 26306a99fe3SHajimu UMEMOTO NS_APPLY_OFFSET(*alias, orig_buf, p, char *); 26406a99fe3SHajimu UMEMOTO } 26506a99fe3SHajimu UMEMOTO 26606a99fe3SHajimu UMEMOTO if (retval != NULL) 26706a99fe3SHajimu UMEMOTO *((struct netent **)retval) = ne; 26806a99fe3SHajimu UMEMOTO 26906a99fe3SHajimu UMEMOTO return (NS_SUCCESS); 27006a99fe3SHajimu UMEMOTO } 27106a99fe3SHajimu UMEMOTO #endif /* NS_CACHING */ 27206a99fe3SHajimu UMEMOTO 273d3ac2b30SHajimu UMEMOTO static void 274d3ac2b30SHajimu UMEMOTO netent_data_free(void *ptr) 275d3ac2b30SHajimu UMEMOTO { 276d3ac2b30SHajimu UMEMOTO struct netent_data *ned = ptr; 277d3ac2b30SHajimu UMEMOTO 278d3ac2b30SHajimu UMEMOTO if (ned == NULL) 279d3ac2b30SHajimu UMEMOTO return; 280d3ac2b30SHajimu UMEMOTO ned->stayopen = 0; 281d3ac2b30SHajimu UMEMOTO _endnethtent(ned); 282d3ac2b30SHajimu UMEMOTO free(ned); 283d3ac2b30SHajimu UMEMOTO } 284a2a77501SHajimu UMEMOTO 285a2a77501SHajimu UMEMOTO static void 286a2a77501SHajimu UMEMOTO netdata_free(void *ptr) 2871363f04cSPaul Traina { 288d3ac2b30SHajimu UMEMOTO free(ptr); 289a2a77501SHajimu UMEMOTO } 290a2a77501SHajimu UMEMOTO 291a2a77501SHajimu UMEMOTO int 292d3ac2b30SHajimu UMEMOTO __copy_netent(struct netent *ne, struct netent *nptr, char *buf, size_t buflen) 293a2a77501SHajimu UMEMOTO { 294d3ac2b30SHajimu UMEMOTO char *cp; 295d3ac2b30SHajimu UMEMOTO int i, n; 296d3ac2b30SHajimu UMEMOTO int numptr, len; 2971363f04cSPaul Traina 298d3ac2b30SHajimu UMEMOTO /* Find out the amount of space required to store the answer. */ 299d3ac2b30SHajimu UMEMOTO numptr = 1; /* NULL ptr */ 300d3ac2b30SHajimu UMEMOTO len = (char *)ALIGN(buf) - buf; 301d3ac2b30SHajimu UMEMOTO for (i = 0; ne->n_aliases[i]; i++, numptr++) { 302d3ac2b30SHajimu UMEMOTO len += strlen(ne->n_aliases[i]) + 1; 303d3ac2b30SHajimu UMEMOTO } 304d3ac2b30SHajimu UMEMOTO len += strlen(ne->n_name) + 1; 305d3ac2b30SHajimu UMEMOTO len += numptr * sizeof(char*); 306d3ac2b30SHajimu UMEMOTO 307d3ac2b30SHajimu UMEMOTO if (len > (int)buflen) { 308d3ac2b30SHajimu UMEMOTO errno = ERANGE; 309d3ac2b30SHajimu UMEMOTO return (-1); 310d3ac2b30SHajimu UMEMOTO } 311d3ac2b30SHajimu UMEMOTO 312d3ac2b30SHajimu UMEMOTO /* copy net value and type */ 313d3ac2b30SHajimu UMEMOTO nptr->n_addrtype = ne->n_addrtype; 314d3ac2b30SHajimu UMEMOTO nptr->n_net = ne->n_net; 315d3ac2b30SHajimu UMEMOTO 316d3ac2b30SHajimu UMEMOTO cp = (char *)ALIGN(buf) + numptr * sizeof(char *); 317d3ac2b30SHajimu UMEMOTO 318d3ac2b30SHajimu UMEMOTO /* copy official name */ 319d3ac2b30SHajimu UMEMOTO n = strlen(ne->n_name) + 1; 320d3ac2b30SHajimu UMEMOTO strcpy(cp, ne->n_name); 321d3ac2b30SHajimu UMEMOTO nptr->n_name = cp; 322d3ac2b30SHajimu UMEMOTO cp += n; 323d3ac2b30SHajimu UMEMOTO 324d3ac2b30SHajimu UMEMOTO /* copy aliases */ 325d3ac2b30SHajimu UMEMOTO nptr->n_aliases = (char **)ALIGN(buf); 326d3ac2b30SHajimu UMEMOTO for (i = 0 ; ne->n_aliases[i]; i++) { 327d3ac2b30SHajimu UMEMOTO n = strlen(ne->n_aliases[i]) + 1; 328d3ac2b30SHajimu UMEMOTO strcpy(cp, ne->n_aliases[i]); 329d3ac2b30SHajimu UMEMOTO nptr->n_aliases[i] = cp; 330d3ac2b30SHajimu UMEMOTO cp += n; 331d3ac2b30SHajimu UMEMOTO } 332d3ac2b30SHajimu UMEMOTO nptr->n_aliases[i] = NULL; 333d3ac2b30SHajimu UMEMOTO 334d3ac2b30SHajimu UMEMOTO return (0); 335d3ac2b30SHajimu UMEMOTO } 336d3ac2b30SHajimu UMEMOTO 337d3ac2b30SHajimu UMEMOTO int 338d3ac2b30SHajimu UMEMOTO getnetbyname_r(const char *name, struct netent *ne, char *buffer, 339d3ac2b30SHajimu UMEMOTO size_t buflen, struct netent **result, int *h_errorp) 340d3ac2b30SHajimu UMEMOTO { 34106a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 34206a99fe3SHajimu UMEMOTO static const nss_cache_info cache_info = 34306a99fe3SHajimu UMEMOTO NS_COMMON_CACHE_INFO_INITIALIZER( 34406a99fe3SHajimu UMEMOTO networks, (void *)nss_lt_name, 34506a99fe3SHajimu UMEMOTO net_id_func, net_marshal_func, net_unmarshal_func); 34606a99fe3SHajimu UMEMOTO #endif 347248aee62SJacques Vidrine static const ns_dtab dtab[] = { 348248aee62SJacques Vidrine NS_FILES_CB(_ht_getnetbyname, NULL) 349248aee62SJacques Vidrine { NSSRC_DNS, _dns_getnetbyname, NULL }, 350248aee62SJacques Vidrine NS_NIS_CB(_nis_getnetbyname, NULL) /* force -DHESIOD */ 35106a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 35206a99fe3SHajimu UMEMOTO NS_CACHE_CB(&cache_info) 35306a99fe3SHajimu UMEMOTO #endif 354248aee62SJacques Vidrine { 0 } 355248aee62SJacques Vidrine }; 356225edeacSHajimu UMEMOTO int rval, ret_errno = 0; 357248aee62SJacques Vidrine 358d3ac2b30SHajimu UMEMOTO rval = _nsdispatch((void *)result, dtab, NSDB_NETWORKS, 359d3ac2b30SHajimu UMEMOTO "getnetbyname_r", default_src, name, ne, buffer, buflen, 360d3ac2b30SHajimu UMEMOTO &ret_errno, h_errorp); 361248aee62SJacques Vidrine 362225edeacSHajimu UMEMOTO if (rval != NS_SUCCESS) { 363225edeacSHajimu UMEMOTO errno = ret_errno; 364225edeacSHajimu UMEMOTO return ((ret_errno != 0) ? ret_errno : -1); 365225edeacSHajimu UMEMOTO } 366225edeacSHajimu UMEMOTO return (0); 3671363f04cSPaul Traina } 3681363f04cSPaul Traina 369a2a77501SHajimu UMEMOTO int 370d3ac2b30SHajimu UMEMOTO getnetbyaddr_r(uint32_t addr, int af, struct netent *ne, char *buffer, 371d3ac2b30SHajimu UMEMOTO size_t buflen, struct netent **result, int *h_errorp) 3721363f04cSPaul Traina { 37306a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 37406a99fe3SHajimu UMEMOTO static const nss_cache_info cache_info = 37506a99fe3SHajimu UMEMOTO NS_COMMON_CACHE_INFO_INITIALIZER( 37606a99fe3SHajimu UMEMOTO networks, (void *)nss_lt_id, 37706a99fe3SHajimu UMEMOTO net_id_func, net_marshal_func, net_unmarshal_func); 37806a99fe3SHajimu UMEMOTO #endif 379248aee62SJacques Vidrine static const ns_dtab dtab[] = { 380248aee62SJacques Vidrine NS_FILES_CB(_ht_getnetbyaddr, NULL) 381248aee62SJacques Vidrine { NSSRC_DNS, _dns_getnetbyaddr, NULL }, 382248aee62SJacques Vidrine NS_NIS_CB(_nis_getnetbyaddr, NULL) /* force -DHESIOD */ 38306a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 38406a99fe3SHajimu UMEMOTO NS_CACHE_CB(&cache_info) 38506a99fe3SHajimu UMEMOTO #endif 386248aee62SJacques Vidrine { 0 } 387248aee62SJacques Vidrine }; 388225edeacSHajimu UMEMOTO int rval, ret_errno = 0; 3891363f04cSPaul Traina 390d3ac2b30SHajimu UMEMOTO rval = _nsdispatch((void *)result, dtab, NSDB_NETWORKS, 391d3ac2b30SHajimu UMEMOTO "getnetbyaddr_r", default_src, addr, af, ne, buffer, buflen, 392d3ac2b30SHajimu UMEMOTO &ret_errno, h_errorp); 393248aee62SJacques Vidrine 394225edeacSHajimu UMEMOTO if (rval != NS_SUCCESS) { 395225edeacSHajimu UMEMOTO errno = ret_errno; 396225edeacSHajimu UMEMOTO return ((ret_errno != 0) ? ret_errno : -1); 397225edeacSHajimu UMEMOTO } 398225edeacSHajimu UMEMOTO return (0); 3991363f04cSPaul Traina } 400a2a77501SHajimu UMEMOTO 401a2a77501SHajimu UMEMOTO struct netent * 402a2a77501SHajimu UMEMOTO getnetbyname(const char *name) 403a2a77501SHajimu UMEMOTO { 404a2a77501SHajimu UMEMOTO struct netdata *nd; 405d3ac2b30SHajimu UMEMOTO struct netent *rval; 406d3ac2b30SHajimu UMEMOTO int ret_h_errno; 407a2a77501SHajimu UMEMOTO 408a2a77501SHajimu UMEMOTO if ((nd = __netdata_init()) == NULL) 409d3ac2b30SHajimu UMEMOTO return (NULL); 410d3ac2b30SHajimu UMEMOTO if (getnetbyname_r(name, &nd->net, nd->data, sizeof(nd->data), &rval, 411d3ac2b30SHajimu UMEMOTO &ret_h_errno) != 0) 412d3ac2b30SHajimu UMEMOTO return (NULL); 413d3ac2b30SHajimu UMEMOTO return (rval); 414a2a77501SHajimu UMEMOTO } 415a2a77501SHajimu UMEMOTO 416a2a77501SHajimu UMEMOTO struct netent * 417036ae3ddSHajimu UMEMOTO getnetbyaddr(uint32_t addr, int af) 418a2a77501SHajimu UMEMOTO { 419a2a77501SHajimu UMEMOTO struct netdata *nd; 420d3ac2b30SHajimu UMEMOTO struct netent *rval; 421d3ac2b30SHajimu UMEMOTO int ret_h_errno; 422a2a77501SHajimu UMEMOTO 423a2a77501SHajimu UMEMOTO if ((nd = __netdata_init()) == NULL) 424d3ac2b30SHajimu UMEMOTO return (NULL); 425d3ac2b30SHajimu UMEMOTO if (getnetbyaddr_r(addr, af, &nd->net, nd->data, sizeof(nd->data), 426d3ac2b30SHajimu UMEMOTO &rval, &ret_h_errno) != 0) 427d3ac2b30SHajimu UMEMOTO return (NULL); 428d3ac2b30SHajimu UMEMOTO return (rval); 429a2a77501SHajimu UMEMOTO } 430a2a77501SHajimu UMEMOTO 431a2a77501SHajimu UMEMOTO void 432a2a77501SHajimu UMEMOTO setnetent(int stayopen) 433a2a77501SHajimu UMEMOTO { 434d3ac2b30SHajimu UMEMOTO struct netent_data *ned; 435a2a77501SHajimu UMEMOTO 436d3ac2b30SHajimu UMEMOTO if ((ned = __netent_data_init()) == NULL) 437a2a77501SHajimu UMEMOTO return; 438d3ac2b30SHajimu UMEMOTO _setnethtent(stayopen, ned); 439d3ac2b30SHajimu UMEMOTO _setnetdnsent(stayopen); 440a2a77501SHajimu UMEMOTO } 441a2a77501SHajimu UMEMOTO 442a2a77501SHajimu UMEMOTO void 443a2a77501SHajimu UMEMOTO endnetent(void) 444a2a77501SHajimu UMEMOTO { 445d3ac2b30SHajimu UMEMOTO struct netent_data *ned; 446a2a77501SHajimu UMEMOTO 447d3ac2b30SHajimu UMEMOTO if ((ned = __netent_data_init()) == NULL) 448a2a77501SHajimu UMEMOTO return; 449d3ac2b30SHajimu UMEMOTO _endnethtent(ned); 450d3ac2b30SHajimu UMEMOTO _endnetdnsent(); 451a2a77501SHajimu UMEMOTO } 452