1*8a16b7a1SPedro F. Giffuni /*- 2*8a16b7a1SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 3*8a16b7a1SPedro F. Giffuni * 458f0484fSRodney W. Grimes * Copyright (c) 1983, 1993 558f0484fSRodney W. Grimes * The Regents of the University of California. All rights reserved. 658f0484fSRodney W. Grimes * 758f0484fSRodney W. Grimes * Redistribution and use in source and binary forms, with or without 858f0484fSRodney W. Grimes * modification, are permitted provided that the following conditions 958f0484fSRodney W. Grimes * are met: 1058f0484fSRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 1158f0484fSRodney W. Grimes * notice, this list of conditions and the following disclaimer. 1258f0484fSRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 1358f0484fSRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 1458f0484fSRodney W. Grimes * documentation and/or other materials provided with the distribution. 15fbbd9655SWarner Losh * 3. Neither the name of the University nor the names of its contributors 1658f0484fSRodney W. Grimes * may be used to endorse or promote products derived from this software 1758f0484fSRodney W. Grimes * without specific prior written permission. 1858f0484fSRodney W. Grimes * 1958f0484fSRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2058f0484fSRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2158f0484fSRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2258f0484fSRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2358f0484fSRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2458f0484fSRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2558f0484fSRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2658f0484fSRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2758f0484fSRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2858f0484fSRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2958f0484fSRodney W. Grimes * SUCH DAMAGE. 3058f0484fSRodney W. Grimes */ 3158f0484fSRodney W. Grimes 3258f0484fSRodney W. Grimes #if defined(LIBC_SCCS) && !defined(lint) 3358f0484fSRodney W. Grimes static char sccsid[] = "@(#)getprotoent.c 8.1 (Berkeley) 6/4/93"; 3458f0484fSRodney W. Grimes #endif /* LIBC_SCCS and not lint */ 358fb3f3f6SDavid E. O'Brien #include <sys/cdefs.h> 368fb3f3f6SDavid E. O'Brien __FBSDID("$FreeBSD$"); 3758f0484fSRodney W. Grimes 38d3ac2b30SHajimu UMEMOTO #include <sys/param.h> 3958f0484fSRodney W. Grimes #include <sys/socket.h> 40d3ac2b30SHajimu UMEMOTO #include <errno.h> 41d8f77b45SStefan Farfeleder #include <limits.h> 4258f0484fSRodney W. Grimes #include <netdb.h> 4306a99fe3SHajimu UMEMOTO #include <nsswitch.h> 4458f0484fSRodney W. Grimes #include <stdio.h> 4558f0484fSRodney W. Grimes #include <stdlib.h> 4658f0484fSRodney W. Grimes #include <string.h> 4792b6f7beSHajimu UMEMOTO #include "namespace.h" 4892b6f7beSHajimu UMEMOTO #include "reentrant.h" 4992b6f7beSHajimu UMEMOTO #include "un-namespace.h" 5092b6f7beSHajimu UMEMOTO #include "netdb_private.h" 5106a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 5206a99fe3SHajimu UMEMOTO #include "nscache.h" 5306a99fe3SHajimu UMEMOTO #endif 5406a99fe3SHajimu UMEMOTO #include "nss_tls.h" 5506a99fe3SHajimu UMEMOTO 5606a99fe3SHajimu UMEMOTO static const ns_src defaultsrc[] = { 5706a99fe3SHajimu UMEMOTO { NSSRC_FILES, NS_SUCCESS }, 5806a99fe3SHajimu UMEMOTO { NULL, 0 } 5906a99fe3SHajimu UMEMOTO }; 6058f0484fSRodney W. Grimes 61d3ac2b30SHajimu UMEMOTO NETDB_THREAD_ALLOC(protoent_data) 62d3ac2b30SHajimu UMEMOTO NETDB_THREAD_ALLOC(protodata) 6358f0484fSRodney W. Grimes 6492b6f7beSHajimu UMEMOTO static void 6592b6f7beSHajimu UMEMOTO protoent_data_clear(struct protoent_data *ped) 6692b6f7beSHajimu UMEMOTO { 6792b6f7beSHajimu UMEMOTO if (ped->fp) { 6892b6f7beSHajimu UMEMOTO fclose(ped->fp); 6992b6f7beSHajimu UMEMOTO ped->fp = NULL; 7092b6f7beSHajimu UMEMOTO } 7192b6f7beSHajimu UMEMOTO } 7292b6f7beSHajimu UMEMOTO 7392b6f7beSHajimu UMEMOTO static void 74d3ac2b30SHajimu UMEMOTO protoent_data_free(void *ptr) 7592b6f7beSHajimu UMEMOTO { 76d3ac2b30SHajimu UMEMOTO struct protoent_data *ped = ptr; 7792b6f7beSHajimu UMEMOTO 78d3ac2b30SHajimu UMEMOTO protoent_data_clear(ped); 79d3ac2b30SHajimu UMEMOTO free(ped); 8092b6f7beSHajimu UMEMOTO } 8192b6f7beSHajimu UMEMOTO 8292b6f7beSHajimu UMEMOTO static void 83d3ac2b30SHajimu UMEMOTO protodata_free(void *ptr) 8492b6f7beSHajimu UMEMOTO { 85d3ac2b30SHajimu UMEMOTO free(ptr); 8692b6f7beSHajimu UMEMOTO } 8792b6f7beSHajimu UMEMOTO 8806a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 8906a99fe3SHajimu UMEMOTO int 9006a99fe3SHajimu UMEMOTO __proto_id_func(char *buffer, size_t *buffer_size, va_list ap, 9106a99fe3SHajimu UMEMOTO void *cache_mdata) 9206a99fe3SHajimu UMEMOTO { 9306a99fe3SHajimu UMEMOTO char *name; 9406a99fe3SHajimu UMEMOTO int proto; 9506a99fe3SHajimu UMEMOTO 9606a99fe3SHajimu UMEMOTO size_t desired_size, size; 9706a99fe3SHajimu UMEMOTO enum nss_lookup_type lookup_type; 9806a99fe3SHajimu UMEMOTO int res = NS_UNAVAIL; 9906a99fe3SHajimu UMEMOTO 10006a99fe3SHajimu UMEMOTO lookup_type = (enum nss_lookup_type)cache_mdata; 10106a99fe3SHajimu UMEMOTO switch (lookup_type) { 10206a99fe3SHajimu UMEMOTO case nss_lt_name: 10306a99fe3SHajimu UMEMOTO name = va_arg(ap, char *); 10406a99fe3SHajimu UMEMOTO 10506a99fe3SHajimu UMEMOTO size = strlen(name); 10606a99fe3SHajimu UMEMOTO desired_size = sizeof(enum nss_lookup_type) + size + 1; 10706a99fe3SHajimu UMEMOTO if (desired_size > *buffer_size) { 10806a99fe3SHajimu UMEMOTO res = NS_RETURN; 10906a99fe3SHajimu UMEMOTO goto fin; 11006a99fe3SHajimu UMEMOTO } 11106a99fe3SHajimu UMEMOTO 11206a99fe3SHajimu UMEMOTO memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type)); 11306a99fe3SHajimu UMEMOTO memcpy(buffer + sizeof(enum nss_lookup_type), name, size + 1); 11406a99fe3SHajimu UMEMOTO 11506a99fe3SHajimu UMEMOTO res = NS_SUCCESS; 11606a99fe3SHajimu UMEMOTO break; 11706a99fe3SHajimu UMEMOTO case nss_lt_id: 11806a99fe3SHajimu UMEMOTO proto = va_arg(ap, int); 11906a99fe3SHajimu UMEMOTO 12006a99fe3SHajimu UMEMOTO desired_size = sizeof(enum nss_lookup_type) + sizeof(int); 12106a99fe3SHajimu UMEMOTO if (desired_size > *buffer_size) { 12206a99fe3SHajimu UMEMOTO res = NS_RETURN; 12306a99fe3SHajimu UMEMOTO goto fin; 12406a99fe3SHajimu UMEMOTO } 12506a99fe3SHajimu UMEMOTO 12606a99fe3SHajimu UMEMOTO memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type)); 12706a99fe3SHajimu UMEMOTO memcpy(buffer + sizeof(enum nss_lookup_type), &proto, 12806a99fe3SHajimu UMEMOTO sizeof(int)); 12906a99fe3SHajimu UMEMOTO 13006a99fe3SHajimu UMEMOTO res = NS_SUCCESS; 13106a99fe3SHajimu UMEMOTO break; 13206a99fe3SHajimu UMEMOTO default: 13306a99fe3SHajimu UMEMOTO /* should be unreachable */ 13406a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 13506a99fe3SHajimu UMEMOTO } 13606a99fe3SHajimu UMEMOTO 13706a99fe3SHajimu UMEMOTO fin: 13806a99fe3SHajimu UMEMOTO *buffer_size = desired_size; 13906a99fe3SHajimu UMEMOTO return (res); 14006a99fe3SHajimu UMEMOTO } 14106a99fe3SHajimu UMEMOTO 14206a99fe3SHajimu UMEMOTO 14306a99fe3SHajimu UMEMOTO int 14406a99fe3SHajimu UMEMOTO __proto_marshal_func(char *buffer, size_t *buffer_size, void *retval, 14506a99fe3SHajimu UMEMOTO va_list ap, void *cache_mdata) 14606a99fe3SHajimu UMEMOTO { 14706a99fe3SHajimu UMEMOTO char *name; 14806a99fe3SHajimu UMEMOTO int num; 14906a99fe3SHajimu UMEMOTO struct protoent *proto; 15006a99fe3SHajimu UMEMOTO char *orig_buf; 15106a99fe3SHajimu UMEMOTO size_t orig_buf_size; 15206a99fe3SHajimu UMEMOTO 15306a99fe3SHajimu UMEMOTO struct protoent new_proto; 15406a99fe3SHajimu UMEMOTO size_t desired_size, size, aliases_size; 15506a99fe3SHajimu UMEMOTO char *p; 15606a99fe3SHajimu UMEMOTO char **alias; 15706a99fe3SHajimu UMEMOTO 15806a99fe3SHajimu UMEMOTO switch ((enum nss_lookup_type)cache_mdata) { 15906a99fe3SHajimu UMEMOTO case nss_lt_name: 16006a99fe3SHajimu UMEMOTO name = va_arg(ap, char *); 16106a99fe3SHajimu UMEMOTO break; 16206a99fe3SHajimu UMEMOTO case nss_lt_id: 16306a99fe3SHajimu UMEMOTO num = va_arg(ap, int); 16406a99fe3SHajimu UMEMOTO break; 16506a99fe3SHajimu UMEMOTO case nss_lt_all: 16606a99fe3SHajimu UMEMOTO break; 16706a99fe3SHajimu UMEMOTO default: 16806a99fe3SHajimu UMEMOTO /* should be unreachable */ 16906a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 17006a99fe3SHajimu UMEMOTO } 17106a99fe3SHajimu UMEMOTO 17206a99fe3SHajimu UMEMOTO proto = va_arg(ap, struct protoent *); 17306a99fe3SHajimu UMEMOTO orig_buf = va_arg(ap, char *); 17406a99fe3SHajimu UMEMOTO orig_buf_size = va_arg(ap, size_t); 17506a99fe3SHajimu UMEMOTO 17606a99fe3SHajimu UMEMOTO desired_size = _ALIGNBYTES + sizeof(struct protoent) + sizeof(char *); 17706a99fe3SHajimu UMEMOTO if (proto->p_name != NULL) 17806a99fe3SHajimu UMEMOTO desired_size += strlen(proto->p_name) + 1; 17906a99fe3SHajimu UMEMOTO 18006a99fe3SHajimu UMEMOTO if (proto->p_aliases != NULL) { 18106a99fe3SHajimu UMEMOTO aliases_size = 0; 18206a99fe3SHajimu UMEMOTO for (alias = proto->p_aliases; *alias; ++alias) { 18306a99fe3SHajimu UMEMOTO desired_size += strlen(*alias) + 1; 18406a99fe3SHajimu UMEMOTO ++aliases_size; 18506a99fe3SHajimu UMEMOTO } 18606a99fe3SHajimu UMEMOTO 18706a99fe3SHajimu UMEMOTO desired_size += _ALIGNBYTES + (aliases_size + 1) * 18806a99fe3SHajimu UMEMOTO sizeof(char *); 18906a99fe3SHajimu UMEMOTO } 19006a99fe3SHajimu UMEMOTO 19106a99fe3SHajimu UMEMOTO if (*buffer_size < desired_size) { 19206a99fe3SHajimu UMEMOTO /* this assignment is here for future use */ 19306a99fe3SHajimu UMEMOTO *buffer_size = desired_size; 19406a99fe3SHajimu UMEMOTO return (NS_RETURN); 19506a99fe3SHajimu UMEMOTO } 19606a99fe3SHajimu UMEMOTO 19706a99fe3SHajimu UMEMOTO memcpy(&new_proto, proto, sizeof(struct protoent)); 19806a99fe3SHajimu UMEMOTO 19906a99fe3SHajimu UMEMOTO *buffer_size = desired_size; 20006a99fe3SHajimu UMEMOTO memset(buffer, 0, desired_size); 20106a99fe3SHajimu UMEMOTO p = buffer + sizeof(struct protoent) + sizeof(char *); 20206a99fe3SHajimu UMEMOTO memcpy(buffer + sizeof(struct protoent), &p, sizeof(char *)); 20306a99fe3SHajimu UMEMOTO p = (char *)_ALIGN(p); 20406a99fe3SHajimu UMEMOTO 20506a99fe3SHajimu UMEMOTO if (new_proto.p_name != NULL) { 20606a99fe3SHajimu UMEMOTO size = strlen(new_proto.p_name); 20706a99fe3SHajimu UMEMOTO memcpy(p, new_proto.p_name, size); 20806a99fe3SHajimu UMEMOTO new_proto.p_name = p; 20906a99fe3SHajimu UMEMOTO p += size + 1; 21006a99fe3SHajimu UMEMOTO } 21106a99fe3SHajimu UMEMOTO 21206a99fe3SHajimu UMEMOTO if (new_proto.p_aliases != NULL) { 21306a99fe3SHajimu UMEMOTO p = (char *)_ALIGN(p); 21406a99fe3SHajimu UMEMOTO memcpy(p, new_proto.p_aliases, sizeof(char *) * aliases_size); 21506a99fe3SHajimu UMEMOTO new_proto.p_aliases = (char **)p; 21606a99fe3SHajimu UMEMOTO p += sizeof(char *) * (aliases_size + 1); 21706a99fe3SHajimu UMEMOTO 21806a99fe3SHajimu UMEMOTO for (alias = new_proto.p_aliases; *alias; ++alias) { 21906a99fe3SHajimu UMEMOTO size = strlen(*alias); 22006a99fe3SHajimu UMEMOTO memcpy(p, *alias, size); 22106a99fe3SHajimu UMEMOTO *alias = p; 22206a99fe3SHajimu UMEMOTO p += size + 1; 22306a99fe3SHajimu UMEMOTO } 22406a99fe3SHajimu UMEMOTO } 22506a99fe3SHajimu UMEMOTO 22606a99fe3SHajimu UMEMOTO memcpy(buffer, &new_proto, sizeof(struct protoent)); 22706a99fe3SHajimu UMEMOTO return (NS_SUCCESS); 22806a99fe3SHajimu UMEMOTO } 22906a99fe3SHajimu UMEMOTO 23006a99fe3SHajimu UMEMOTO int 23106a99fe3SHajimu UMEMOTO __proto_unmarshal_func(char *buffer, size_t buffer_size, void *retval, 23206a99fe3SHajimu UMEMOTO va_list ap, void *cache_mdata) 23306a99fe3SHajimu UMEMOTO { 23406a99fe3SHajimu UMEMOTO char *name; 23506a99fe3SHajimu UMEMOTO int num; 23606a99fe3SHajimu UMEMOTO struct protoent *proto; 23706a99fe3SHajimu UMEMOTO char *orig_buf; 23806a99fe3SHajimu UMEMOTO size_t orig_buf_size; 23906a99fe3SHajimu UMEMOTO int *ret_errno; 24006a99fe3SHajimu UMEMOTO 24106a99fe3SHajimu UMEMOTO char *p; 24206a99fe3SHajimu UMEMOTO char **alias; 24306a99fe3SHajimu UMEMOTO 24406a99fe3SHajimu UMEMOTO switch ((enum nss_lookup_type)cache_mdata) { 24506a99fe3SHajimu UMEMOTO case nss_lt_name: 24606a99fe3SHajimu UMEMOTO name = va_arg(ap, char *); 24706a99fe3SHajimu UMEMOTO break; 24806a99fe3SHajimu UMEMOTO case nss_lt_id: 24906a99fe3SHajimu UMEMOTO num = va_arg(ap, int); 25006a99fe3SHajimu UMEMOTO break; 25106a99fe3SHajimu UMEMOTO case nss_lt_all: 25206a99fe3SHajimu UMEMOTO break; 25306a99fe3SHajimu UMEMOTO default: 25406a99fe3SHajimu UMEMOTO /* should be unreachable */ 25506a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 25606a99fe3SHajimu UMEMOTO } 25706a99fe3SHajimu UMEMOTO 25806a99fe3SHajimu UMEMOTO proto = va_arg(ap, struct protoent *); 25906a99fe3SHajimu UMEMOTO orig_buf = va_arg(ap, char *); 26006a99fe3SHajimu UMEMOTO orig_buf_size = va_arg(ap, size_t); 26106a99fe3SHajimu UMEMOTO ret_errno = va_arg(ap, int *); 26206a99fe3SHajimu UMEMOTO 26306a99fe3SHajimu UMEMOTO if (orig_buf_size < 26406a99fe3SHajimu UMEMOTO buffer_size - sizeof(struct protoent) - sizeof(char *)) { 26506a99fe3SHajimu UMEMOTO *ret_errno = ERANGE; 26606a99fe3SHajimu UMEMOTO return (NS_RETURN); 26706a99fe3SHajimu UMEMOTO } 26806a99fe3SHajimu UMEMOTO 26906a99fe3SHajimu UMEMOTO memcpy(proto, buffer, sizeof(struct protoent)); 27006a99fe3SHajimu UMEMOTO memcpy(&p, buffer + sizeof(struct protoent), sizeof(char *)); 27106a99fe3SHajimu UMEMOTO 27206a99fe3SHajimu UMEMOTO orig_buf = (char *)_ALIGN(orig_buf); 27306a99fe3SHajimu UMEMOTO memcpy(orig_buf, buffer + sizeof(struct protoent) + sizeof(char *) + 27406a99fe3SHajimu UMEMOTO _ALIGN(p) - (size_t)p, 27506a99fe3SHajimu UMEMOTO buffer_size - sizeof(struct protoent) - sizeof(char *) - 27606a99fe3SHajimu UMEMOTO _ALIGN(p) + (size_t)p); 27706a99fe3SHajimu UMEMOTO p = (char *)_ALIGN(p); 27806a99fe3SHajimu UMEMOTO 27906a99fe3SHajimu UMEMOTO NS_APPLY_OFFSET(proto->p_name, orig_buf, p, char *); 28006a99fe3SHajimu UMEMOTO if (proto->p_aliases != NULL) { 28106a99fe3SHajimu UMEMOTO NS_APPLY_OFFSET(proto->p_aliases, orig_buf, p, char **); 28206a99fe3SHajimu UMEMOTO 28306a99fe3SHajimu UMEMOTO for (alias = proto->p_aliases; *alias; ++alias) 28406a99fe3SHajimu UMEMOTO NS_APPLY_OFFSET(*alias, orig_buf, p, char *); 28506a99fe3SHajimu UMEMOTO } 28606a99fe3SHajimu UMEMOTO 28706a99fe3SHajimu UMEMOTO if (retval != NULL) 28806a99fe3SHajimu UMEMOTO *((struct protoent **)retval) = proto; 28906a99fe3SHajimu UMEMOTO 29006a99fe3SHajimu UMEMOTO return (NS_SUCCESS); 29106a99fe3SHajimu UMEMOTO } 29206a99fe3SHajimu UMEMOTO 29306a99fe3SHajimu UMEMOTO NSS_MP_CACHE_HANDLING(protocols); 29406a99fe3SHajimu UMEMOTO #endif /* NS_CACHING */ 29506a99fe3SHajimu UMEMOTO 296d3ac2b30SHajimu UMEMOTO int 297d3ac2b30SHajimu UMEMOTO __copy_protoent(struct protoent *pe, struct protoent *pptr, char *buf, 298d3ac2b30SHajimu UMEMOTO size_t buflen) 29992b6f7beSHajimu UMEMOTO { 300d3ac2b30SHajimu UMEMOTO char *cp; 301d3ac2b30SHajimu UMEMOTO int i, n; 302d3ac2b30SHajimu UMEMOTO int numptr, len; 30392b6f7beSHajimu UMEMOTO 304d3ac2b30SHajimu UMEMOTO /* Find out the amount of space required to store the answer. */ 305d3ac2b30SHajimu UMEMOTO numptr = 1; /* NULL ptr */ 306d3ac2b30SHajimu UMEMOTO len = (char *)ALIGN(buf) - buf; 307d3ac2b30SHajimu UMEMOTO for (i = 0; pe->p_aliases[i]; i++, numptr++) { 308d3ac2b30SHajimu UMEMOTO len += strlen(pe->p_aliases[i]) + 1; 309d3ac2b30SHajimu UMEMOTO } 310d3ac2b30SHajimu UMEMOTO len += strlen(pe->p_name) + 1; 311d3ac2b30SHajimu UMEMOTO len += numptr * sizeof(char*); 312d3ac2b30SHajimu UMEMOTO 313d3ac2b30SHajimu UMEMOTO if (len > (int)buflen) { 314d3ac2b30SHajimu UMEMOTO errno = ERANGE; 315d3ac2b30SHajimu UMEMOTO return (-1); 316d3ac2b30SHajimu UMEMOTO } 317d3ac2b30SHajimu UMEMOTO 318d3ac2b30SHajimu UMEMOTO /* copy protocol value*/ 319d3ac2b30SHajimu UMEMOTO pptr->p_proto = pe->p_proto; 320d3ac2b30SHajimu UMEMOTO 321d3ac2b30SHajimu UMEMOTO cp = (char *)ALIGN(buf) + numptr * sizeof(char *); 322d3ac2b30SHajimu UMEMOTO 323d3ac2b30SHajimu UMEMOTO /* copy official name */ 324d3ac2b30SHajimu UMEMOTO n = strlen(pe->p_name) + 1; 325d3ac2b30SHajimu UMEMOTO strcpy(cp, pe->p_name); 326d3ac2b30SHajimu UMEMOTO pptr->p_name = cp; 327d3ac2b30SHajimu UMEMOTO cp += n; 328d3ac2b30SHajimu UMEMOTO 329d3ac2b30SHajimu UMEMOTO /* copy aliases */ 330d3ac2b30SHajimu UMEMOTO pptr->p_aliases = (char **)ALIGN(buf); 331d3ac2b30SHajimu UMEMOTO for (i = 0 ; pe->p_aliases[i]; i++) { 332d3ac2b30SHajimu UMEMOTO n = strlen(pe->p_aliases[i]) + 1; 333d3ac2b30SHajimu UMEMOTO strcpy(cp, pe->p_aliases[i]); 334d3ac2b30SHajimu UMEMOTO pptr->p_aliases[i] = cp; 335d3ac2b30SHajimu UMEMOTO cp += n; 336d3ac2b30SHajimu UMEMOTO } 337d3ac2b30SHajimu UMEMOTO pptr->p_aliases[i] = NULL; 338d3ac2b30SHajimu UMEMOTO 339d3ac2b30SHajimu UMEMOTO return (0); 34092b6f7beSHajimu UMEMOTO } 34158f0484fSRodney W. Grimes 34258f0484fSRodney W. Grimes void 343d3ac2b30SHajimu UMEMOTO __setprotoent_p(int f, struct protoent_data *ped) 34458f0484fSRodney W. Grimes { 34592b6f7beSHajimu UMEMOTO if (ped->fp == NULL) 346a93705b0SJilles Tjoelker ped->fp = fopen(_PATH_PROTOCOLS, "re"); 34758f0484fSRodney W. Grimes else 34892b6f7beSHajimu UMEMOTO rewind(ped->fp); 34992b6f7beSHajimu UMEMOTO ped->stayopen |= f; 35058f0484fSRodney W. Grimes } 35158f0484fSRodney W. Grimes 35258f0484fSRodney W. Grimes void 353d3ac2b30SHajimu UMEMOTO __endprotoent_p(struct protoent_data *ped) 35458f0484fSRodney W. Grimes { 35592b6f7beSHajimu UMEMOTO if (ped->fp) { 35692b6f7beSHajimu UMEMOTO fclose(ped->fp); 35792b6f7beSHajimu UMEMOTO ped->fp = NULL; 35858f0484fSRodney W. Grimes } 35992b6f7beSHajimu UMEMOTO ped->stayopen = 0; 36058f0484fSRodney W. Grimes } 36158f0484fSRodney W. Grimes 36292b6f7beSHajimu UMEMOTO int 363d3ac2b30SHajimu UMEMOTO __getprotoent_p(struct protoent *pe, struct protoent_data *ped) 36458f0484fSRodney W. Grimes { 36558f0484fSRodney W. Grimes char *p; 36692b6f7beSHajimu UMEMOTO char *cp, **q, *endp; 36792b6f7beSHajimu UMEMOTO long l; 36858f0484fSRodney W. Grimes 369a93705b0SJilles Tjoelker if (ped->fp == NULL && (ped->fp = fopen(_PATH_PROTOCOLS, "re")) == NULL) 37092b6f7beSHajimu UMEMOTO return (-1); 37158f0484fSRodney W. Grimes again: 372a2a77501SHajimu UMEMOTO if ((p = fgets(ped->line, sizeof ped->line, ped->fp)) == NULL) 37392b6f7beSHajimu UMEMOTO return (-1); 37458f0484fSRodney W. Grimes if (*p == '#') 37558f0484fSRodney W. Grimes goto again; 37658f0484fSRodney W. Grimes cp = strpbrk(p, "#\n"); 3777b6cc404SMaxim Sobolev if (cp != NULL) 37858f0484fSRodney W. Grimes *cp = '\0'; 37992b6f7beSHajimu UMEMOTO pe->p_name = p; 38058f0484fSRodney W. Grimes cp = strpbrk(p, " \t"); 38158f0484fSRodney W. Grimes if (cp == NULL) 38258f0484fSRodney W. Grimes goto again; 38358f0484fSRodney W. Grimes *cp++ = '\0'; 38458f0484fSRodney W. Grimes while (*cp == ' ' || *cp == '\t') 38558f0484fSRodney W. Grimes cp++; 38658f0484fSRodney W. Grimes p = strpbrk(cp, " \t"); 38758f0484fSRodney W. Grimes if (p != NULL) 38858f0484fSRodney W. Grimes *p++ = '\0'; 38992b6f7beSHajimu UMEMOTO l = strtol(cp, &endp, 10); 39092b6f7beSHajimu UMEMOTO if (endp == cp || *endp != '\0' || l < 0 || l > USHRT_MAX) 39192b6f7beSHajimu UMEMOTO goto again; 39292b6f7beSHajimu UMEMOTO pe->p_proto = l; 39392b6f7beSHajimu UMEMOTO q = pe->p_aliases = ped->aliases; 39458f0484fSRodney W. Grimes if (p != NULL) { 39558f0484fSRodney W. Grimes cp = p; 39658f0484fSRodney W. Grimes while (cp && *cp) { 39758f0484fSRodney W. Grimes if (*cp == ' ' || *cp == '\t') { 39858f0484fSRodney W. Grimes cp++; 39958f0484fSRodney W. Grimes continue; 40058f0484fSRodney W. Grimes } 401a2a77501SHajimu UMEMOTO if (q < &ped->aliases[_MAXALIASES - 1]) 40258f0484fSRodney W. Grimes *q++ = cp; 40358f0484fSRodney W. Grimes cp = strpbrk(cp, " \t"); 40458f0484fSRodney W. Grimes if (cp != NULL) 40558f0484fSRodney W. Grimes *cp++ = '\0'; 40658f0484fSRodney W. Grimes } 40758f0484fSRodney W. Grimes } 40858f0484fSRodney W. Grimes *q = NULL; 40992b6f7beSHajimu UMEMOTO return (0); 41092b6f7beSHajimu UMEMOTO } 41192b6f7beSHajimu UMEMOTO 41206a99fe3SHajimu UMEMOTO static int 41306a99fe3SHajimu UMEMOTO files_getprotoent_r(void *retval, void *mdata, va_list ap) 414d3ac2b30SHajimu UMEMOTO { 415d3ac2b30SHajimu UMEMOTO struct protoent pe; 416d3ac2b30SHajimu UMEMOTO struct protoent_data *ped; 417d3ac2b30SHajimu UMEMOTO 41806a99fe3SHajimu UMEMOTO struct protoent *pptr; 41906a99fe3SHajimu UMEMOTO char *buffer; 42006a99fe3SHajimu UMEMOTO size_t buflen; 42106a99fe3SHajimu UMEMOTO int *errnop; 42206a99fe3SHajimu UMEMOTO 42306a99fe3SHajimu UMEMOTO pptr = va_arg(ap, struct protoent *); 42406a99fe3SHajimu UMEMOTO buffer = va_arg(ap, char *); 42506a99fe3SHajimu UMEMOTO buflen = va_arg(ap, size_t); 42606a99fe3SHajimu UMEMOTO errnop = va_arg(ap, int *); 42706a99fe3SHajimu UMEMOTO 428225edeacSHajimu UMEMOTO if ((ped = __protoent_data_init()) == NULL) { 429225edeacSHajimu UMEMOTO *errnop = errno; 430225edeacSHajimu UMEMOTO return (NS_NOTFOUND); 431225edeacSHajimu UMEMOTO } 432d3ac2b30SHajimu UMEMOTO 43306a99fe3SHajimu UMEMOTO if (__getprotoent_p(&pe, ped) != 0) { 43406a99fe3SHajimu UMEMOTO *errnop = errno; 43506a99fe3SHajimu UMEMOTO return (NS_NOTFOUND); 436d3ac2b30SHajimu UMEMOTO } 437d3ac2b30SHajimu UMEMOTO 43806a99fe3SHajimu UMEMOTO if (__copy_protoent(&pe, pptr, buffer, buflen) != 0) { 43906a99fe3SHajimu UMEMOTO *errnop = errno; 440225edeacSHajimu UMEMOTO return (NS_RETURN); 44106a99fe3SHajimu UMEMOTO } 44206a99fe3SHajimu UMEMOTO 44306a99fe3SHajimu UMEMOTO *((struct protoent **)retval) = pptr; 44406a99fe3SHajimu UMEMOTO return (NS_SUCCESS); 44506a99fe3SHajimu UMEMOTO } 44606a99fe3SHajimu UMEMOTO 44706a99fe3SHajimu UMEMOTO static int 44806a99fe3SHajimu UMEMOTO files_setprotoent(void *retval, void *mdata, va_list ap) 44906a99fe3SHajimu UMEMOTO { 45006a99fe3SHajimu UMEMOTO struct protoent_data *ped; 45106a99fe3SHajimu UMEMOTO int f; 45206a99fe3SHajimu UMEMOTO 45306a99fe3SHajimu UMEMOTO f = va_arg(ap, int); 45406a99fe3SHajimu UMEMOTO if ((ped = __protoent_data_init()) == NULL) 45506a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 45606a99fe3SHajimu UMEMOTO 45706a99fe3SHajimu UMEMOTO __setprotoent_p(f, ped); 45806a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 45906a99fe3SHajimu UMEMOTO } 46006a99fe3SHajimu UMEMOTO 46106a99fe3SHajimu UMEMOTO static int 46206a99fe3SHajimu UMEMOTO files_endprotoent(void *retval, void *mdata, va_list ap) 46392b6f7beSHajimu UMEMOTO { 464d3ac2b30SHajimu UMEMOTO struct protoent_data *ped; 46592b6f7beSHajimu UMEMOTO 466d3ac2b30SHajimu UMEMOTO if ((ped = __protoent_data_init()) == NULL) 46706a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 46806a99fe3SHajimu UMEMOTO 46906a99fe3SHajimu UMEMOTO __endprotoent_p(ped); 47006a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 47106a99fe3SHajimu UMEMOTO } 47206a99fe3SHajimu UMEMOTO 47306a99fe3SHajimu UMEMOTO int 47406a99fe3SHajimu UMEMOTO getprotoent_r(struct protoent *pptr, char *buffer, size_t buflen, 47506a99fe3SHajimu UMEMOTO struct protoent **result) 47606a99fe3SHajimu UMEMOTO { 47706a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 47806a99fe3SHajimu UMEMOTO static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER( 47906a99fe3SHajimu UMEMOTO protocols, (void *)nss_lt_all, 48006a99fe3SHajimu UMEMOTO __proto_marshal_func, __proto_unmarshal_func); 48106a99fe3SHajimu UMEMOTO #endif 48206a99fe3SHajimu UMEMOTO static const ns_dtab dtab[] = { 48306a99fe3SHajimu UMEMOTO { NSSRC_FILES, files_getprotoent_r, (void *)nss_lt_all }, 48406a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 48506a99fe3SHajimu UMEMOTO NS_CACHE_CB(&cache_info) 48606a99fe3SHajimu UMEMOTO #endif 48706a99fe3SHajimu UMEMOTO { NULL, NULL, NULL } 48806a99fe3SHajimu UMEMOTO }; 48906a99fe3SHajimu UMEMOTO int rv, ret_errno; 49006a99fe3SHajimu UMEMOTO 49106a99fe3SHajimu UMEMOTO ret_errno = 0; 49206a99fe3SHajimu UMEMOTO *result = NULL; 49306a99fe3SHajimu UMEMOTO rv = nsdispatch(result, dtab, NSDB_PROTOCOLS, "getprotoent_r", 49406a99fe3SHajimu UMEMOTO defaultsrc, pptr, buffer, buflen, &ret_errno); 49506a99fe3SHajimu UMEMOTO 496225edeacSHajimu UMEMOTO if (rv != NS_SUCCESS) { 497225edeacSHajimu UMEMOTO errno = ret_errno; 498c618a856SHajimu UMEMOTO return (ret_errno); 499225edeacSHajimu UMEMOTO } 50006a99fe3SHajimu UMEMOTO return (0); 50106a99fe3SHajimu UMEMOTO } 50206a99fe3SHajimu UMEMOTO 50306a99fe3SHajimu UMEMOTO void 50406a99fe3SHajimu UMEMOTO setprotoent(int stayopen) 50506a99fe3SHajimu UMEMOTO { 50606a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 50706a99fe3SHajimu UMEMOTO static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER( 50806a99fe3SHajimu UMEMOTO protocols, (void *)nss_lt_all, 50906a99fe3SHajimu UMEMOTO NULL, NULL); 51006a99fe3SHajimu UMEMOTO #endif 51106a99fe3SHajimu UMEMOTO 51206a99fe3SHajimu UMEMOTO static const ns_dtab dtab[] = { 51306a99fe3SHajimu UMEMOTO { NSSRC_FILES, files_setprotoent, NULL }, 51406a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 51506a99fe3SHajimu UMEMOTO NS_CACHE_CB(&cache_info) 51606a99fe3SHajimu UMEMOTO #endif 51706a99fe3SHajimu UMEMOTO { NULL, NULL, NULL } 51806a99fe3SHajimu UMEMOTO }; 51906a99fe3SHajimu UMEMOTO 52006a99fe3SHajimu UMEMOTO (void)nsdispatch(NULL, dtab, NSDB_PROTOCOLS, "setprotoent", defaultsrc, 52106a99fe3SHajimu UMEMOTO stayopen); 52292b6f7beSHajimu UMEMOTO } 52392b6f7beSHajimu UMEMOTO 52492b6f7beSHajimu UMEMOTO void 52592b6f7beSHajimu UMEMOTO endprotoent(void) 52692b6f7beSHajimu UMEMOTO { 52706a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 52806a99fe3SHajimu UMEMOTO static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER( 52906a99fe3SHajimu UMEMOTO protocols, (void *)nss_lt_all, 53006a99fe3SHajimu UMEMOTO NULL, NULL); 53106a99fe3SHajimu UMEMOTO #endif 53292b6f7beSHajimu UMEMOTO 53306a99fe3SHajimu UMEMOTO static const ns_dtab dtab[] = { 53406a99fe3SHajimu UMEMOTO { NSSRC_FILES, files_endprotoent, NULL }, 53506a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 53606a99fe3SHajimu UMEMOTO NS_CACHE_CB(&cache_info) 53706a99fe3SHajimu UMEMOTO #endif 53806a99fe3SHajimu UMEMOTO { NULL, NULL, NULL } 53906a99fe3SHajimu UMEMOTO }; 54006a99fe3SHajimu UMEMOTO 54106a99fe3SHajimu UMEMOTO (void)nsdispatch(NULL, dtab, NSDB_PROTOCOLS, "endprotoent", defaultsrc); 54292b6f7beSHajimu UMEMOTO } 54392b6f7beSHajimu UMEMOTO 54492b6f7beSHajimu UMEMOTO struct protoent * 54592b6f7beSHajimu UMEMOTO getprotoent(void) 54692b6f7beSHajimu UMEMOTO { 54792b6f7beSHajimu UMEMOTO struct protodata *pd; 548d3ac2b30SHajimu UMEMOTO struct protoent *rval; 54992b6f7beSHajimu UMEMOTO 55092b6f7beSHajimu UMEMOTO if ((pd = __protodata_init()) == NULL) 55192b6f7beSHajimu UMEMOTO return (NULL); 552d3ac2b30SHajimu UMEMOTO if (getprotoent_r(&pd->proto, pd->data, sizeof(pd->data), &rval) != 0) 55392b6f7beSHajimu UMEMOTO return (NULL); 554d3ac2b30SHajimu UMEMOTO return (rval); 55558f0484fSRodney W. Grimes } 556