158f0484fSRodney W. Grimes /* 258f0484fSRodney W. Grimes * Copyright (c) 1983, 1993 358f0484fSRodney W. Grimes * The Regents of the University of California. All rights reserved. 458f0484fSRodney W. Grimes * 558f0484fSRodney W. Grimes * Redistribution and use in source and binary forms, with or without 658f0484fSRodney W. Grimes * modification, are permitted provided that the following conditions 758f0484fSRodney W. Grimes * are met: 858f0484fSRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 958f0484fSRodney W. Grimes * notice, this list of conditions and the following disclaimer. 1058f0484fSRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 1158f0484fSRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 1258f0484fSRodney W. Grimes * documentation and/or other materials provided with the distribution. 13*fbbd9655SWarner Losh * 3. Neither the name of the University nor the names of its contributors 1458f0484fSRodney W. Grimes * may be used to endorse or promote products derived from this software 1558f0484fSRodney W. Grimes * without specific prior written permission. 1658f0484fSRodney W. Grimes * 1758f0484fSRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 1858f0484fSRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1958f0484fSRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2058f0484fSRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2158f0484fSRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2258f0484fSRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2358f0484fSRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2458f0484fSRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2558f0484fSRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2658f0484fSRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2758f0484fSRodney W. Grimes * SUCH DAMAGE. 2858f0484fSRodney W. Grimes */ 2958f0484fSRodney W. Grimes 3058f0484fSRodney W. Grimes #if defined(LIBC_SCCS) && !defined(lint) 3158f0484fSRodney W. Grimes static char sccsid[] = "@(#)getprotoent.c 8.1 (Berkeley) 6/4/93"; 3258f0484fSRodney W. Grimes #endif /* LIBC_SCCS and not lint */ 338fb3f3f6SDavid E. O'Brien #include <sys/cdefs.h> 348fb3f3f6SDavid E. O'Brien __FBSDID("$FreeBSD$"); 3558f0484fSRodney W. Grimes 36d3ac2b30SHajimu UMEMOTO #include <sys/param.h> 3758f0484fSRodney W. Grimes #include <sys/socket.h> 38d3ac2b30SHajimu UMEMOTO #include <errno.h> 39d8f77b45SStefan Farfeleder #include <limits.h> 4058f0484fSRodney W. Grimes #include <netdb.h> 4106a99fe3SHajimu UMEMOTO #include <nsswitch.h> 4258f0484fSRodney W. Grimes #include <stdio.h> 4358f0484fSRodney W. Grimes #include <stdlib.h> 4458f0484fSRodney W. Grimes #include <string.h> 4592b6f7beSHajimu UMEMOTO #include "namespace.h" 4692b6f7beSHajimu UMEMOTO #include "reentrant.h" 4792b6f7beSHajimu UMEMOTO #include "un-namespace.h" 4892b6f7beSHajimu UMEMOTO #include "netdb_private.h" 4906a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 5006a99fe3SHajimu UMEMOTO #include "nscache.h" 5106a99fe3SHajimu UMEMOTO #endif 5206a99fe3SHajimu UMEMOTO #include "nss_tls.h" 5306a99fe3SHajimu UMEMOTO 5406a99fe3SHajimu UMEMOTO static const ns_src defaultsrc[] = { 5506a99fe3SHajimu UMEMOTO { NSSRC_FILES, NS_SUCCESS }, 5606a99fe3SHajimu UMEMOTO { NULL, 0 } 5706a99fe3SHajimu UMEMOTO }; 5858f0484fSRodney W. Grimes 59d3ac2b30SHajimu UMEMOTO NETDB_THREAD_ALLOC(protoent_data) 60d3ac2b30SHajimu UMEMOTO NETDB_THREAD_ALLOC(protodata) 6158f0484fSRodney W. Grimes 6292b6f7beSHajimu UMEMOTO static void 6392b6f7beSHajimu UMEMOTO protoent_data_clear(struct protoent_data *ped) 6492b6f7beSHajimu UMEMOTO { 6592b6f7beSHajimu UMEMOTO if (ped->fp) { 6692b6f7beSHajimu UMEMOTO fclose(ped->fp); 6792b6f7beSHajimu UMEMOTO ped->fp = NULL; 6892b6f7beSHajimu UMEMOTO } 6992b6f7beSHajimu UMEMOTO } 7092b6f7beSHajimu UMEMOTO 7192b6f7beSHajimu UMEMOTO static void 72d3ac2b30SHajimu UMEMOTO protoent_data_free(void *ptr) 7392b6f7beSHajimu UMEMOTO { 74d3ac2b30SHajimu UMEMOTO struct protoent_data *ped = ptr; 7592b6f7beSHajimu UMEMOTO 76d3ac2b30SHajimu UMEMOTO protoent_data_clear(ped); 77d3ac2b30SHajimu UMEMOTO free(ped); 7892b6f7beSHajimu UMEMOTO } 7992b6f7beSHajimu UMEMOTO 8092b6f7beSHajimu UMEMOTO static void 81d3ac2b30SHajimu UMEMOTO protodata_free(void *ptr) 8292b6f7beSHajimu UMEMOTO { 83d3ac2b30SHajimu UMEMOTO free(ptr); 8492b6f7beSHajimu UMEMOTO } 8592b6f7beSHajimu UMEMOTO 8606a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 8706a99fe3SHajimu UMEMOTO int 8806a99fe3SHajimu UMEMOTO __proto_id_func(char *buffer, size_t *buffer_size, va_list ap, 8906a99fe3SHajimu UMEMOTO void *cache_mdata) 9006a99fe3SHajimu UMEMOTO { 9106a99fe3SHajimu UMEMOTO char *name; 9206a99fe3SHajimu UMEMOTO int proto; 9306a99fe3SHajimu UMEMOTO 9406a99fe3SHajimu UMEMOTO size_t desired_size, size; 9506a99fe3SHajimu UMEMOTO enum nss_lookup_type lookup_type; 9606a99fe3SHajimu UMEMOTO int res = NS_UNAVAIL; 9706a99fe3SHajimu UMEMOTO 9806a99fe3SHajimu UMEMOTO lookup_type = (enum nss_lookup_type)cache_mdata; 9906a99fe3SHajimu UMEMOTO switch (lookup_type) { 10006a99fe3SHajimu UMEMOTO case nss_lt_name: 10106a99fe3SHajimu UMEMOTO name = va_arg(ap, char *); 10206a99fe3SHajimu UMEMOTO 10306a99fe3SHajimu UMEMOTO size = strlen(name); 10406a99fe3SHajimu UMEMOTO desired_size = sizeof(enum nss_lookup_type) + size + 1; 10506a99fe3SHajimu UMEMOTO if (desired_size > *buffer_size) { 10606a99fe3SHajimu UMEMOTO res = NS_RETURN; 10706a99fe3SHajimu UMEMOTO goto fin; 10806a99fe3SHajimu UMEMOTO } 10906a99fe3SHajimu UMEMOTO 11006a99fe3SHajimu UMEMOTO memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type)); 11106a99fe3SHajimu UMEMOTO memcpy(buffer + sizeof(enum nss_lookup_type), name, size + 1); 11206a99fe3SHajimu UMEMOTO 11306a99fe3SHajimu UMEMOTO res = NS_SUCCESS; 11406a99fe3SHajimu UMEMOTO break; 11506a99fe3SHajimu UMEMOTO case nss_lt_id: 11606a99fe3SHajimu UMEMOTO proto = va_arg(ap, int); 11706a99fe3SHajimu UMEMOTO 11806a99fe3SHajimu UMEMOTO desired_size = sizeof(enum nss_lookup_type) + sizeof(int); 11906a99fe3SHajimu UMEMOTO if (desired_size > *buffer_size) { 12006a99fe3SHajimu UMEMOTO res = NS_RETURN; 12106a99fe3SHajimu UMEMOTO goto fin; 12206a99fe3SHajimu UMEMOTO } 12306a99fe3SHajimu UMEMOTO 12406a99fe3SHajimu UMEMOTO memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type)); 12506a99fe3SHajimu UMEMOTO memcpy(buffer + sizeof(enum nss_lookup_type), &proto, 12606a99fe3SHajimu UMEMOTO sizeof(int)); 12706a99fe3SHajimu UMEMOTO 12806a99fe3SHajimu UMEMOTO res = NS_SUCCESS; 12906a99fe3SHajimu UMEMOTO break; 13006a99fe3SHajimu UMEMOTO default: 13106a99fe3SHajimu UMEMOTO /* should be unreachable */ 13206a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 13306a99fe3SHajimu UMEMOTO } 13406a99fe3SHajimu UMEMOTO 13506a99fe3SHajimu UMEMOTO fin: 13606a99fe3SHajimu UMEMOTO *buffer_size = desired_size; 13706a99fe3SHajimu UMEMOTO return (res); 13806a99fe3SHajimu UMEMOTO } 13906a99fe3SHajimu UMEMOTO 14006a99fe3SHajimu UMEMOTO 14106a99fe3SHajimu UMEMOTO int 14206a99fe3SHajimu UMEMOTO __proto_marshal_func(char *buffer, size_t *buffer_size, void *retval, 14306a99fe3SHajimu UMEMOTO va_list ap, void *cache_mdata) 14406a99fe3SHajimu UMEMOTO { 14506a99fe3SHajimu UMEMOTO char *name; 14606a99fe3SHajimu UMEMOTO int num; 14706a99fe3SHajimu UMEMOTO struct protoent *proto; 14806a99fe3SHajimu UMEMOTO char *orig_buf; 14906a99fe3SHajimu UMEMOTO size_t orig_buf_size; 15006a99fe3SHajimu UMEMOTO 15106a99fe3SHajimu UMEMOTO struct protoent new_proto; 15206a99fe3SHajimu UMEMOTO size_t desired_size, size, aliases_size; 15306a99fe3SHajimu UMEMOTO char *p; 15406a99fe3SHajimu UMEMOTO char **alias; 15506a99fe3SHajimu UMEMOTO 15606a99fe3SHajimu UMEMOTO switch ((enum nss_lookup_type)cache_mdata) { 15706a99fe3SHajimu UMEMOTO case nss_lt_name: 15806a99fe3SHajimu UMEMOTO name = va_arg(ap, char *); 15906a99fe3SHajimu UMEMOTO break; 16006a99fe3SHajimu UMEMOTO case nss_lt_id: 16106a99fe3SHajimu UMEMOTO num = va_arg(ap, int); 16206a99fe3SHajimu UMEMOTO break; 16306a99fe3SHajimu UMEMOTO case nss_lt_all: 16406a99fe3SHajimu UMEMOTO break; 16506a99fe3SHajimu UMEMOTO default: 16606a99fe3SHajimu UMEMOTO /* should be unreachable */ 16706a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 16806a99fe3SHajimu UMEMOTO } 16906a99fe3SHajimu UMEMOTO 17006a99fe3SHajimu UMEMOTO proto = va_arg(ap, struct protoent *); 17106a99fe3SHajimu UMEMOTO orig_buf = va_arg(ap, char *); 17206a99fe3SHajimu UMEMOTO orig_buf_size = va_arg(ap, size_t); 17306a99fe3SHajimu UMEMOTO 17406a99fe3SHajimu UMEMOTO desired_size = _ALIGNBYTES + sizeof(struct protoent) + sizeof(char *); 17506a99fe3SHajimu UMEMOTO if (proto->p_name != NULL) 17606a99fe3SHajimu UMEMOTO desired_size += strlen(proto->p_name) + 1; 17706a99fe3SHajimu UMEMOTO 17806a99fe3SHajimu UMEMOTO if (proto->p_aliases != NULL) { 17906a99fe3SHajimu UMEMOTO aliases_size = 0; 18006a99fe3SHajimu UMEMOTO for (alias = proto->p_aliases; *alias; ++alias) { 18106a99fe3SHajimu UMEMOTO desired_size += strlen(*alias) + 1; 18206a99fe3SHajimu UMEMOTO ++aliases_size; 18306a99fe3SHajimu UMEMOTO } 18406a99fe3SHajimu UMEMOTO 18506a99fe3SHajimu UMEMOTO desired_size += _ALIGNBYTES + (aliases_size + 1) * 18606a99fe3SHajimu UMEMOTO sizeof(char *); 18706a99fe3SHajimu UMEMOTO } 18806a99fe3SHajimu UMEMOTO 18906a99fe3SHajimu UMEMOTO if (*buffer_size < desired_size) { 19006a99fe3SHajimu UMEMOTO /* this assignment is here for future use */ 19106a99fe3SHajimu UMEMOTO *buffer_size = desired_size; 19206a99fe3SHajimu UMEMOTO return (NS_RETURN); 19306a99fe3SHajimu UMEMOTO } 19406a99fe3SHajimu UMEMOTO 19506a99fe3SHajimu UMEMOTO memcpy(&new_proto, proto, sizeof(struct protoent)); 19606a99fe3SHajimu UMEMOTO 19706a99fe3SHajimu UMEMOTO *buffer_size = desired_size; 19806a99fe3SHajimu UMEMOTO memset(buffer, 0, desired_size); 19906a99fe3SHajimu UMEMOTO p = buffer + sizeof(struct protoent) + sizeof(char *); 20006a99fe3SHajimu UMEMOTO memcpy(buffer + sizeof(struct protoent), &p, sizeof(char *)); 20106a99fe3SHajimu UMEMOTO p = (char *)_ALIGN(p); 20206a99fe3SHajimu UMEMOTO 20306a99fe3SHajimu UMEMOTO if (new_proto.p_name != NULL) { 20406a99fe3SHajimu UMEMOTO size = strlen(new_proto.p_name); 20506a99fe3SHajimu UMEMOTO memcpy(p, new_proto.p_name, size); 20606a99fe3SHajimu UMEMOTO new_proto.p_name = p; 20706a99fe3SHajimu UMEMOTO p += size + 1; 20806a99fe3SHajimu UMEMOTO } 20906a99fe3SHajimu UMEMOTO 21006a99fe3SHajimu UMEMOTO if (new_proto.p_aliases != NULL) { 21106a99fe3SHajimu UMEMOTO p = (char *)_ALIGN(p); 21206a99fe3SHajimu UMEMOTO memcpy(p, new_proto.p_aliases, sizeof(char *) * aliases_size); 21306a99fe3SHajimu UMEMOTO new_proto.p_aliases = (char **)p; 21406a99fe3SHajimu UMEMOTO p += sizeof(char *) * (aliases_size + 1); 21506a99fe3SHajimu UMEMOTO 21606a99fe3SHajimu UMEMOTO for (alias = new_proto.p_aliases; *alias; ++alias) { 21706a99fe3SHajimu UMEMOTO size = strlen(*alias); 21806a99fe3SHajimu UMEMOTO memcpy(p, *alias, size); 21906a99fe3SHajimu UMEMOTO *alias = p; 22006a99fe3SHajimu UMEMOTO p += size + 1; 22106a99fe3SHajimu UMEMOTO } 22206a99fe3SHajimu UMEMOTO } 22306a99fe3SHajimu UMEMOTO 22406a99fe3SHajimu UMEMOTO memcpy(buffer, &new_proto, sizeof(struct protoent)); 22506a99fe3SHajimu UMEMOTO return (NS_SUCCESS); 22606a99fe3SHajimu UMEMOTO } 22706a99fe3SHajimu UMEMOTO 22806a99fe3SHajimu UMEMOTO int 22906a99fe3SHajimu UMEMOTO __proto_unmarshal_func(char *buffer, size_t buffer_size, void *retval, 23006a99fe3SHajimu UMEMOTO va_list ap, void *cache_mdata) 23106a99fe3SHajimu UMEMOTO { 23206a99fe3SHajimu UMEMOTO char *name; 23306a99fe3SHajimu UMEMOTO int num; 23406a99fe3SHajimu UMEMOTO struct protoent *proto; 23506a99fe3SHajimu UMEMOTO char *orig_buf; 23606a99fe3SHajimu UMEMOTO size_t orig_buf_size; 23706a99fe3SHajimu UMEMOTO int *ret_errno; 23806a99fe3SHajimu UMEMOTO 23906a99fe3SHajimu UMEMOTO char *p; 24006a99fe3SHajimu UMEMOTO char **alias; 24106a99fe3SHajimu UMEMOTO 24206a99fe3SHajimu UMEMOTO switch ((enum nss_lookup_type)cache_mdata) { 24306a99fe3SHajimu UMEMOTO case nss_lt_name: 24406a99fe3SHajimu UMEMOTO name = va_arg(ap, char *); 24506a99fe3SHajimu UMEMOTO break; 24606a99fe3SHajimu UMEMOTO case nss_lt_id: 24706a99fe3SHajimu UMEMOTO num = va_arg(ap, int); 24806a99fe3SHajimu UMEMOTO break; 24906a99fe3SHajimu UMEMOTO case nss_lt_all: 25006a99fe3SHajimu UMEMOTO break; 25106a99fe3SHajimu UMEMOTO default: 25206a99fe3SHajimu UMEMOTO /* should be unreachable */ 25306a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 25406a99fe3SHajimu UMEMOTO } 25506a99fe3SHajimu UMEMOTO 25606a99fe3SHajimu UMEMOTO proto = va_arg(ap, struct protoent *); 25706a99fe3SHajimu UMEMOTO orig_buf = va_arg(ap, char *); 25806a99fe3SHajimu UMEMOTO orig_buf_size = va_arg(ap, size_t); 25906a99fe3SHajimu UMEMOTO ret_errno = va_arg(ap, int *); 26006a99fe3SHajimu UMEMOTO 26106a99fe3SHajimu UMEMOTO if (orig_buf_size < 26206a99fe3SHajimu UMEMOTO buffer_size - sizeof(struct protoent) - sizeof(char *)) { 26306a99fe3SHajimu UMEMOTO *ret_errno = ERANGE; 26406a99fe3SHajimu UMEMOTO return (NS_RETURN); 26506a99fe3SHajimu UMEMOTO } 26606a99fe3SHajimu UMEMOTO 26706a99fe3SHajimu UMEMOTO memcpy(proto, buffer, sizeof(struct protoent)); 26806a99fe3SHajimu UMEMOTO memcpy(&p, buffer + sizeof(struct protoent), sizeof(char *)); 26906a99fe3SHajimu UMEMOTO 27006a99fe3SHajimu UMEMOTO orig_buf = (char *)_ALIGN(orig_buf); 27106a99fe3SHajimu UMEMOTO memcpy(orig_buf, buffer + sizeof(struct protoent) + sizeof(char *) + 27206a99fe3SHajimu UMEMOTO _ALIGN(p) - (size_t)p, 27306a99fe3SHajimu UMEMOTO buffer_size - sizeof(struct protoent) - sizeof(char *) - 27406a99fe3SHajimu UMEMOTO _ALIGN(p) + (size_t)p); 27506a99fe3SHajimu UMEMOTO p = (char *)_ALIGN(p); 27606a99fe3SHajimu UMEMOTO 27706a99fe3SHajimu UMEMOTO NS_APPLY_OFFSET(proto->p_name, orig_buf, p, char *); 27806a99fe3SHajimu UMEMOTO if (proto->p_aliases != NULL) { 27906a99fe3SHajimu UMEMOTO NS_APPLY_OFFSET(proto->p_aliases, orig_buf, p, char **); 28006a99fe3SHajimu UMEMOTO 28106a99fe3SHajimu UMEMOTO for (alias = proto->p_aliases; *alias; ++alias) 28206a99fe3SHajimu UMEMOTO NS_APPLY_OFFSET(*alias, orig_buf, p, char *); 28306a99fe3SHajimu UMEMOTO } 28406a99fe3SHajimu UMEMOTO 28506a99fe3SHajimu UMEMOTO if (retval != NULL) 28606a99fe3SHajimu UMEMOTO *((struct protoent **)retval) = proto; 28706a99fe3SHajimu UMEMOTO 28806a99fe3SHajimu UMEMOTO return (NS_SUCCESS); 28906a99fe3SHajimu UMEMOTO } 29006a99fe3SHajimu UMEMOTO 29106a99fe3SHajimu UMEMOTO NSS_MP_CACHE_HANDLING(protocols); 29206a99fe3SHajimu UMEMOTO #endif /* NS_CACHING */ 29306a99fe3SHajimu UMEMOTO 294d3ac2b30SHajimu UMEMOTO int 295d3ac2b30SHajimu UMEMOTO __copy_protoent(struct protoent *pe, struct protoent *pptr, char *buf, 296d3ac2b30SHajimu UMEMOTO size_t buflen) 29792b6f7beSHajimu UMEMOTO { 298d3ac2b30SHajimu UMEMOTO char *cp; 299d3ac2b30SHajimu UMEMOTO int i, n; 300d3ac2b30SHajimu UMEMOTO int numptr, len; 30192b6f7beSHajimu UMEMOTO 302d3ac2b30SHajimu UMEMOTO /* Find out the amount of space required to store the answer. */ 303d3ac2b30SHajimu UMEMOTO numptr = 1; /* NULL ptr */ 304d3ac2b30SHajimu UMEMOTO len = (char *)ALIGN(buf) - buf; 305d3ac2b30SHajimu UMEMOTO for (i = 0; pe->p_aliases[i]; i++, numptr++) { 306d3ac2b30SHajimu UMEMOTO len += strlen(pe->p_aliases[i]) + 1; 307d3ac2b30SHajimu UMEMOTO } 308d3ac2b30SHajimu UMEMOTO len += strlen(pe->p_name) + 1; 309d3ac2b30SHajimu UMEMOTO len += numptr * sizeof(char*); 310d3ac2b30SHajimu UMEMOTO 311d3ac2b30SHajimu UMEMOTO if (len > (int)buflen) { 312d3ac2b30SHajimu UMEMOTO errno = ERANGE; 313d3ac2b30SHajimu UMEMOTO return (-1); 314d3ac2b30SHajimu UMEMOTO } 315d3ac2b30SHajimu UMEMOTO 316d3ac2b30SHajimu UMEMOTO /* copy protocol value*/ 317d3ac2b30SHajimu UMEMOTO pptr->p_proto = pe->p_proto; 318d3ac2b30SHajimu UMEMOTO 319d3ac2b30SHajimu UMEMOTO cp = (char *)ALIGN(buf) + numptr * sizeof(char *); 320d3ac2b30SHajimu UMEMOTO 321d3ac2b30SHajimu UMEMOTO /* copy official name */ 322d3ac2b30SHajimu UMEMOTO n = strlen(pe->p_name) + 1; 323d3ac2b30SHajimu UMEMOTO strcpy(cp, pe->p_name); 324d3ac2b30SHajimu UMEMOTO pptr->p_name = cp; 325d3ac2b30SHajimu UMEMOTO cp += n; 326d3ac2b30SHajimu UMEMOTO 327d3ac2b30SHajimu UMEMOTO /* copy aliases */ 328d3ac2b30SHajimu UMEMOTO pptr->p_aliases = (char **)ALIGN(buf); 329d3ac2b30SHajimu UMEMOTO for (i = 0 ; pe->p_aliases[i]; i++) { 330d3ac2b30SHajimu UMEMOTO n = strlen(pe->p_aliases[i]) + 1; 331d3ac2b30SHajimu UMEMOTO strcpy(cp, pe->p_aliases[i]); 332d3ac2b30SHajimu UMEMOTO pptr->p_aliases[i] = cp; 333d3ac2b30SHajimu UMEMOTO cp += n; 334d3ac2b30SHajimu UMEMOTO } 335d3ac2b30SHajimu UMEMOTO pptr->p_aliases[i] = NULL; 336d3ac2b30SHajimu UMEMOTO 337d3ac2b30SHajimu UMEMOTO return (0); 33892b6f7beSHajimu UMEMOTO } 33958f0484fSRodney W. Grimes 34058f0484fSRodney W. Grimes void 341d3ac2b30SHajimu UMEMOTO __setprotoent_p(int f, struct protoent_data *ped) 34258f0484fSRodney W. Grimes { 34392b6f7beSHajimu UMEMOTO if (ped->fp == NULL) 344a93705b0SJilles Tjoelker ped->fp = fopen(_PATH_PROTOCOLS, "re"); 34558f0484fSRodney W. Grimes else 34692b6f7beSHajimu UMEMOTO rewind(ped->fp); 34792b6f7beSHajimu UMEMOTO ped->stayopen |= f; 34858f0484fSRodney W. Grimes } 34958f0484fSRodney W. Grimes 35058f0484fSRodney W. Grimes void 351d3ac2b30SHajimu UMEMOTO __endprotoent_p(struct protoent_data *ped) 35258f0484fSRodney W. Grimes { 35392b6f7beSHajimu UMEMOTO if (ped->fp) { 35492b6f7beSHajimu UMEMOTO fclose(ped->fp); 35592b6f7beSHajimu UMEMOTO ped->fp = NULL; 35658f0484fSRodney W. Grimes } 35792b6f7beSHajimu UMEMOTO ped->stayopen = 0; 35858f0484fSRodney W. Grimes } 35958f0484fSRodney W. Grimes 36092b6f7beSHajimu UMEMOTO int 361d3ac2b30SHajimu UMEMOTO __getprotoent_p(struct protoent *pe, struct protoent_data *ped) 36258f0484fSRodney W. Grimes { 36358f0484fSRodney W. Grimes char *p; 36492b6f7beSHajimu UMEMOTO char *cp, **q, *endp; 36592b6f7beSHajimu UMEMOTO long l; 36658f0484fSRodney W. Grimes 367a93705b0SJilles Tjoelker if (ped->fp == NULL && (ped->fp = fopen(_PATH_PROTOCOLS, "re")) == NULL) 36892b6f7beSHajimu UMEMOTO return (-1); 36958f0484fSRodney W. Grimes again: 370a2a77501SHajimu UMEMOTO if ((p = fgets(ped->line, sizeof ped->line, ped->fp)) == NULL) 37192b6f7beSHajimu UMEMOTO return (-1); 37258f0484fSRodney W. Grimes if (*p == '#') 37358f0484fSRodney W. Grimes goto again; 37458f0484fSRodney W. Grimes cp = strpbrk(p, "#\n"); 3757b6cc404SMaxim Sobolev if (cp != NULL) 37658f0484fSRodney W. Grimes *cp = '\0'; 37792b6f7beSHajimu UMEMOTO pe->p_name = p; 37858f0484fSRodney W. Grimes cp = strpbrk(p, " \t"); 37958f0484fSRodney W. Grimes if (cp == NULL) 38058f0484fSRodney W. Grimes goto again; 38158f0484fSRodney W. Grimes *cp++ = '\0'; 38258f0484fSRodney W. Grimes while (*cp == ' ' || *cp == '\t') 38358f0484fSRodney W. Grimes cp++; 38458f0484fSRodney W. Grimes p = strpbrk(cp, " \t"); 38558f0484fSRodney W. Grimes if (p != NULL) 38658f0484fSRodney W. Grimes *p++ = '\0'; 38792b6f7beSHajimu UMEMOTO l = strtol(cp, &endp, 10); 38892b6f7beSHajimu UMEMOTO if (endp == cp || *endp != '\0' || l < 0 || l > USHRT_MAX) 38992b6f7beSHajimu UMEMOTO goto again; 39092b6f7beSHajimu UMEMOTO pe->p_proto = l; 39192b6f7beSHajimu UMEMOTO q = pe->p_aliases = ped->aliases; 39258f0484fSRodney W. Grimes if (p != NULL) { 39358f0484fSRodney W. Grimes cp = p; 39458f0484fSRodney W. Grimes while (cp && *cp) { 39558f0484fSRodney W. Grimes if (*cp == ' ' || *cp == '\t') { 39658f0484fSRodney W. Grimes cp++; 39758f0484fSRodney W. Grimes continue; 39858f0484fSRodney W. Grimes } 399a2a77501SHajimu UMEMOTO if (q < &ped->aliases[_MAXALIASES - 1]) 40058f0484fSRodney W. Grimes *q++ = cp; 40158f0484fSRodney W. Grimes cp = strpbrk(cp, " \t"); 40258f0484fSRodney W. Grimes if (cp != NULL) 40358f0484fSRodney W. Grimes *cp++ = '\0'; 40458f0484fSRodney W. Grimes } 40558f0484fSRodney W. Grimes } 40658f0484fSRodney W. Grimes *q = NULL; 40792b6f7beSHajimu UMEMOTO return (0); 40892b6f7beSHajimu UMEMOTO } 40992b6f7beSHajimu UMEMOTO 41006a99fe3SHajimu UMEMOTO static int 41106a99fe3SHajimu UMEMOTO files_getprotoent_r(void *retval, void *mdata, va_list ap) 412d3ac2b30SHajimu UMEMOTO { 413d3ac2b30SHajimu UMEMOTO struct protoent pe; 414d3ac2b30SHajimu UMEMOTO struct protoent_data *ped; 415d3ac2b30SHajimu UMEMOTO 41606a99fe3SHajimu UMEMOTO struct protoent *pptr; 41706a99fe3SHajimu UMEMOTO char *buffer; 41806a99fe3SHajimu UMEMOTO size_t buflen; 41906a99fe3SHajimu UMEMOTO int *errnop; 42006a99fe3SHajimu UMEMOTO 42106a99fe3SHajimu UMEMOTO pptr = va_arg(ap, struct protoent *); 42206a99fe3SHajimu UMEMOTO buffer = va_arg(ap, char *); 42306a99fe3SHajimu UMEMOTO buflen = va_arg(ap, size_t); 42406a99fe3SHajimu UMEMOTO errnop = va_arg(ap, int *); 42506a99fe3SHajimu UMEMOTO 426225edeacSHajimu UMEMOTO if ((ped = __protoent_data_init()) == NULL) { 427225edeacSHajimu UMEMOTO *errnop = errno; 428225edeacSHajimu UMEMOTO return (NS_NOTFOUND); 429225edeacSHajimu UMEMOTO } 430d3ac2b30SHajimu UMEMOTO 43106a99fe3SHajimu UMEMOTO if (__getprotoent_p(&pe, ped) != 0) { 43206a99fe3SHajimu UMEMOTO *errnop = errno; 43306a99fe3SHajimu UMEMOTO return (NS_NOTFOUND); 434d3ac2b30SHajimu UMEMOTO } 435d3ac2b30SHajimu UMEMOTO 43606a99fe3SHajimu UMEMOTO if (__copy_protoent(&pe, pptr, buffer, buflen) != 0) { 43706a99fe3SHajimu UMEMOTO *errnop = errno; 438225edeacSHajimu UMEMOTO return (NS_RETURN); 43906a99fe3SHajimu UMEMOTO } 44006a99fe3SHajimu UMEMOTO 44106a99fe3SHajimu UMEMOTO *((struct protoent **)retval) = pptr; 44206a99fe3SHajimu UMEMOTO return (NS_SUCCESS); 44306a99fe3SHajimu UMEMOTO } 44406a99fe3SHajimu UMEMOTO 44506a99fe3SHajimu UMEMOTO static int 44606a99fe3SHajimu UMEMOTO files_setprotoent(void *retval, void *mdata, va_list ap) 44706a99fe3SHajimu UMEMOTO { 44806a99fe3SHajimu UMEMOTO struct protoent_data *ped; 44906a99fe3SHajimu UMEMOTO int f; 45006a99fe3SHajimu UMEMOTO 45106a99fe3SHajimu UMEMOTO f = va_arg(ap, int); 45206a99fe3SHajimu UMEMOTO if ((ped = __protoent_data_init()) == NULL) 45306a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 45406a99fe3SHajimu UMEMOTO 45506a99fe3SHajimu UMEMOTO __setprotoent_p(f, ped); 45606a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 45706a99fe3SHajimu UMEMOTO } 45806a99fe3SHajimu UMEMOTO 45906a99fe3SHajimu UMEMOTO static int 46006a99fe3SHajimu UMEMOTO files_endprotoent(void *retval, void *mdata, va_list ap) 46192b6f7beSHajimu UMEMOTO { 462d3ac2b30SHajimu UMEMOTO struct protoent_data *ped; 46392b6f7beSHajimu UMEMOTO 464d3ac2b30SHajimu UMEMOTO if ((ped = __protoent_data_init()) == NULL) 46506a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 46606a99fe3SHajimu UMEMOTO 46706a99fe3SHajimu UMEMOTO __endprotoent_p(ped); 46806a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 46906a99fe3SHajimu UMEMOTO } 47006a99fe3SHajimu UMEMOTO 47106a99fe3SHajimu UMEMOTO int 47206a99fe3SHajimu UMEMOTO getprotoent_r(struct protoent *pptr, char *buffer, size_t buflen, 47306a99fe3SHajimu UMEMOTO struct protoent **result) 47406a99fe3SHajimu UMEMOTO { 47506a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 47606a99fe3SHajimu UMEMOTO static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER( 47706a99fe3SHajimu UMEMOTO protocols, (void *)nss_lt_all, 47806a99fe3SHajimu UMEMOTO __proto_marshal_func, __proto_unmarshal_func); 47906a99fe3SHajimu UMEMOTO #endif 48006a99fe3SHajimu UMEMOTO static const ns_dtab dtab[] = { 48106a99fe3SHajimu UMEMOTO { NSSRC_FILES, files_getprotoent_r, (void *)nss_lt_all }, 48206a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 48306a99fe3SHajimu UMEMOTO NS_CACHE_CB(&cache_info) 48406a99fe3SHajimu UMEMOTO #endif 48506a99fe3SHajimu UMEMOTO { NULL, NULL, NULL } 48606a99fe3SHajimu UMEMOTO }; 48706a99fe3SHajimu UMEMOTO int rv, ret_errno; 48806a99fe3SHajimu UMEMOTO 48906a99fe3SHajimu UMEMOTO ret_errno = 0; 49006a99fe3SHajimu UMEMOTO *result = NULL; 49106a99fe3SHajimu UMEMOTO rv = nsdispatch(result, dtab, NSDB_PROTOCOLS, "getprotoent_r", 49206a99fe3SHajimu UMEMOTO defaultsrc, pptr, buffer, buflen, &ret_errno); 49306a99fe3SHajimu UMEMOTO 494225edeacSHajimu UMEMOTO if (rv != NS_SUCCESS) { 495225edeacSHajimu UMEMOTO errno = ret_errno; 496c618a856SHajimu UMEMOTO return (ret_errno); 497225edeacSHajimu UMEMOTO } 49806a99fe3SHajimu UMEMOTO return (0); 49906a99fe3SHajimu UMEMOTO } 50006a99fe3SHajimu UMEMOTO 50106a99fe3SHajimu UMEMOTO void 50206a99fe3SHajimu UMEMOTO setprotoent(int stayopen) 50306a99fe3SHajimu UMEMOTO { 50406a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 50506a99fe3SHajimu UMEMOTO static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER( 50606a99fe3SHajimu UMEMOTO protocols, (void *)nss_lt_all, 50706a99fe3SHajimu UMEMOTO NULL, NULL); 50806a99fe3SHajimu UMEMOTO #endif 50906a99fe3SHajimu UMEMOTO 51006a99fe3SHajimu UMEMOTO static const ns_dtab dtab[] = { 51106a99fe3SHajimu UMEMOTO { NSSRC_FILES, files_setprotoent, NULL }, 51206a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 51306a99fe3SHajimu UMEMOTO NS_CACHE_CB(&cache_info) 51406a99fe3SHajimu UMEMOTO #endif 51506a99fe3SHajimu UMEMOTO { NULL, NULL, NULL } 51606a99fe3SHajimu UMEMOTO }; 51706a99fe3SHajimu UMEMOTO 51806a99fe3SHajimu UMEMOTO (void)nsdispatch(NULL, dtab, NSDB_PROTOCOLS, "setprotoent", defaultsrc, 51906a99fe3SHajimu UMEMOTO stayopen); 52092b6f7beSHajimu UMEMOTO } 52192b6f7beSHajimu UMEMOTO 52292b6f7beSHajimu UMEMOTO void 52392b6f7beSHajimu UMEMOTO endprotoent(void) 52492b6f7beSHajimu UMEMOTO { 52506a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 52606a99fe3SHajimu UMEMOTO static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER( 52706a99fe3SHajimu UMEMOTO protocols, (void *)nss_lt_all, 52806a99fe3SHajimu UMEMOTO NULL, NULL); 52906a99fe3SHajimu UMEMOTO #endif 53092b6f7beSHajimu UMEMOTO 53106a99fe3SHajimu UMEMOTO static const ns_dtab dtab[] = { 53206a99fe3SHajimu UMEMOTO { NSSRC_FILES, files_endprotoent, NULL }, 53306a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 53406a99fe3SHajimu UMEMOTO NS_CACHE_CB(&cache_info) 53506a99fe3SHajimu UMEMOTO #endif 53606a99fe3SHajimu UMEMOTO { NULL, NULL, NULL } 53706a99fe3SHajimu UMEMOTO }; 53806a99fe3SHajimu UMEMOTO 53906a99fe3SHajimu UMEMOTO (void)nsdispatch(NULL, dtab, NSDB_PROTOCOLS, "endprotoent", defaultsrc); 54092b6f7beSHajimu UMEMOTO } 54192b6f7beSHajimu UMEMOTO 54292b6f7beSHajimu UMEMOTO struct protoent * 54392b6f7beSHajimu UMEMOTO getprotoent(void) 54492b6f7beSHajimu UMEMOTO { 54592b6f7beSHajimu UMEMOTO struct protodata *pd; 546d3ac2b30SHajimu UMEMOTO struct protoent *rval; 54792b6f7beSHajimu UMEMOTO 54892b6f7beSHajimu UMEMOTO if ((pd = __protodata_init()) == NULL) 54992b6f7beSHajimu UMEMOTO return (NULL); 550d3ac2b30SHajimu UMEMOTO if (getprotoent_r(&pd->proto, pd->data, sizeof(pd->data), &rval) != 0) 55192b6f7beSHajimu UMEMOTO return (NULL); 552d3ac2b30SHajimu UMEMOTO return (rval); 55358f0484fSRodney W. Grimes } 554