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. 1358f0484fSRodney W. Grimes * 4. 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/types.h> 3858f0484fSRodney W. Grimes #include <sys/socket.h> 39d3ac2b30SHajimu UMEMOTO #include <errno.h> 40d8f77b45SStefan Farfeleder #include <limits.h> 4158f0484fSRodney W. Grimes #include <netdb.h> 4206a99fe3SHajimu UMEMOTO #include <nsswitch.h> 4358f0484fSRodney W. Grimes #include <stdio.h> 4458f0484fSRodney W. Grimes #include <stdlib.h> 4558f0484fSRodney W. Grimes #include <string.h> 4692b6f7beSHajimu UMEMOTO #include "namespace.h" 4792b6f7beSHajimu UMEMOTO #include "reentrant.h" 4892b6f7beSHajimu UMEMOTO #include "un-namespace.h" 4992b6f7beSHajimu UMEMOTO #include "netdb_private.h" 5006a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 5106a99fe3SHajimu UMEMOTO #include "nscache.h" 5206a99fe3SHajimu UMEMOTO #endif 5306a99fe3SHajimu UMEMOTO #include "nss_tls.h" 5406a99fe3SHajimu UMEMOTO 5506a99fe3SHajimu UMEMOTO static const ns_src defaultsrc[] = { 5606a99fe3SHajimu UMEMOTO { NSSRC_FILES, NS_SUCCESS }, 5706a99fe3SHajimu UMEMOTO { NULL, 0 } 5806a99fe3SHajimu UMEMOTO }; 5958f0484fSRodney W. Grimes 60d3ac2b30SHajimu UMEMOTO NETDB_THREAD_ALLOC(protoent_data) 61d3ac2b30SHajimu UMEMOTO NETDB_THREAD_ALLOC(protodata) 6258f0484fSRodney W. Grimes 6392b6f7beSHajimu UMEMOTO static void 6492b6f7beSHajimu UMEMOTO protoent_data_clear(struct protoent_data *ped) 6592b6f7beSHajimu UMEMOTO { 6692b6f7beSHajimu UMEMOTO if (ped->fp) { 6792b6f7beSHajimu UMEMOTO fclose(ped->fp); 6892b6f7beSHajimu UMEMOTO ped->fp = NULL; 6992b6f7beSHajimu UMEMOTO } 7092b6f7beSHajimu UMEMOTO } 7192b6f7beSHajimu UMEMOTO 7292b6f7beSHajimu UMEMOTO static void 73d3ac2b30SHajimu UMEMOTO protoent_data_free(void *ptr) 7492b6f7beSHajimu UMEMOTO { 75d3ac2b30SHajimu UMEMOTO struct protoent_data *ped = ptr; 7692b6f7beSHajimu UMEMOTO 77d3ac2b30SHajimu UMEMOTO protoent_data_clear(ped); 78d3ac2b30SHajimu UMEMOTO free(ped); 7992b6f7beSHajimu UMEMOTO } 8092b6f7beSHajimu UMEMOTO 8192b6f7beSHajimu UMEMOTO static void 82d3ac2b30SHajimu UMEMOTO protodata_free(void *ptr) 8392b6f7beSHajimu UMEMOTO { 84d3ac2b30SHajimu UMEMOTO free(ptr); 8592b6f7beSHajimu UMEMOTO } 8692b6f7beSHajimu UMEMOTO 8706a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 8806a99fe3SHajimu UMEMOTO int 8906a99fe3SHajimu UMEMOTO __proto_id_func(char *buffer, size_t *buffer_size, va_list ap, 9006a99fe3SHajimu UMEMOTO void *cache_mdata) 9106a99fe3SHajimu UMEMOTO { 9206a99fe3SHajimu UMEMOTO char *name; 9306a99fe3SHajimu UMEMOTO int proto; 9406a99fe3SHajimu UMEMOTO 9506a99fe3SHajimu UMEMOTO size_t desired_size, size; 9606a99fe3SHajimu UMEMOTO enum nss_lookup_type lookup_type; 9706a99fe3SHajimu UMEMOTO int res = NS_UNAVAIL; 9806a99fe3SHajimu UMEMOTO 9906a99fe3SHajimu UMEMOTO lookup_type = (enum nss_lookup_type)cache_mdata; 10006a99fe3SHajimu UMEMOTO switch (lookup_type) { 10106a99fe3SHajimu UMEMOTO case nss_lt_name: 10206a99fe3SHajimu UMEMOTO name = va_arg(ap, char *); 10306a99fe3SHajimu UMEMOTO 10406a99fe3SHajimu UMEMOTO size = strlen(name); 10506a99fe3SHajimu UMEMOTO desired_size = sizeof(enum nss_lookup_type) + size + 1; 10606a99fe3SHajimu UMEMOTO if (desired_size > *buffer_size) { 10706a99fe3SHajimu UMEMOTO res = NS_RETURN; 10806a99fe3SHajimu UMEMOTO goto fin; 10906a99fe3SHajimu UMEMOTO } 11006a99fe3SHajimu UMEMOTO 11106a99fe3SHajimu UMEMOTO memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type)); 11206a99fe3SHajimu UMEMOTO memcpy(buffer + sizeof(enum nss_lookup_type), name, size + 1); 11306a99fe3SHajimu UMEMOTO 11406a99fe3SHajimu UMEMOTO res = NS_SUCCESS; 11506a99fe3SHajimu UMEMOTO break; 11606a99fe3SHajimu UMEMOTO case nss_lt_id: 11706a99fe3SHajimu UMEMOTO proto = va_arg(ap, int); 11806a99fe3SHajimu UMEMOTO 11906a99fe3SHajimu UMEMOTO desired_size = sizeof(enum nss_lookup_type) + sizeof(int); 12006a99fe3SHajimu UMEMOTO if (desired_size > *buffer_size) { 12106a99fe3SHajimu UMEMOTO res = NS_RETURN; 12206a99fe3SHajimu UMEMOTO goto fin; 12306a99fe3SHajimu UMEMOTO } 12406a99fe3SHajimu UMEMOTO 12506a99fe3SHajimu UMEMOTO memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type)); 12606a99fe3SHajimu UMEMOTO memcpy(buffer + sizeof(enum nss_lookup_type), &proto, 12706a99fe3SHajimu UMEMOTO sizeof(int)); 12806a99fe3SHajimu UMEMOTO 12906a99fe3SHajimu UMEMOTO res = NS_SUCCESS; 13006a99fe3SHajimu UMEMOTO break; 13106a99fe3SHajimu UMEMOTO default: 13206a99fe3SHajimu UMEMOTO /* should be unreachable */ 13306a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 13406a99fe3SHajimu UMEMOTO } 13506a99fe3SHajimu UMEMOTO 13606a99fe3SHajimu UMEMOTO fin: 13706a99fe3SHajimu UMEMOTO *buffer_size = desired_size; 13806a99fe3SHajimu UMEMOTO return (res); 13906a99fe3SHajimu UMEMOTO } 14006a99fe3SHajimu UMEMOTO 14106a99fe3SHajimu UMEMOTO 14206a99fe3SHajimu UMEMOTO int 14306a99fe3SHajimu UMEMOTO __proto_marshal_func(char *buffer, size_t *buffer_size, void *retval, 14406a99fe3SHajimu UMEMOTO va_list ap, void *cache_mdata) 14506a99fe3SHajimu UMEMOTO { 14606a99fe3SHajimu UMEMOTO char *name; 14706a99fe3SHajimu UMEMOTO int num; 14806a99fe3SHajimu UMEMOTO struct protoent *proto; 14906a99fe3SHajimu UMEMOTO char *orig_buf; 15006a99fe3SHajimu UMEMOTO size_t orig_buf_size; 15106a99fe3SHajimu UMEMOTO 15206a99fe3SHajimu UMEMOTO struct protoent new_proto; 15306a99fe3SHajimu UMEMOTO size_t desired_size, size, aliases_size; 15406a99fe3SHajimu UMEMOTO char *p; 15506a99fe3SHajimu UMEMOTO char **alias; 15606a99fe3SHajimu UMEMOTO 15706a99fe3SHajimu UMEMOTO switch ((enum nss_lookup_type)cache_mdata) { 15806a99fe3SHajimu UMEMOTO case nss_lt_name: 15906a99fe3SHajimu UMEMOTO name = va_arg(ap, char *); 16006a99fe3SHajimu UMEMOTO break; 16106a99fe3SHajimu UMEMOTO case nss_lt_id: 16206a99fe3SHajimu UMEMOTO num = va_arg(ap, int); 16306a99fe3SHajimu UMEMOTO break; 16406a99fe3SHajimu UMEMOTO case nss_lt_all: 16506a99fe3SHajimu UMEMOTO break; 16606a99fe3SHajimu UMEMOTO default: 16706a99fe3SHajimu UMEMOTO /* should be unreachable */ 16806a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 16906a99fe3SHajimu UMEMOTO } 17006a99fe3SHajimu UMEMOTO 17106a99fe3SHajimu UMEMOTO proto = va_arg(ap, struct protoent *); 17206a99fe3SHajimu UMEMOTO orig_buf = va_arg(ap, char *); 17306a99fe3SHajimu UMEMOTO orig_buf_size = va_arg(ap, size_t); 17406a99fe3SHajimu UMEMOTO 17506a99fe3SHajimu UMEMOTO desired_size = _ALIGNBYTES + sizeof(struct protoent) + sizeof(char *); 17606a99fe3SHajimu UMEMOTO if (proto->p_name != NULL) 17706a99fe3SHajimu UMEMOTO desired_size += strlen(proto->p_name) + 1; 17806a99fe3SHajimu UMEMOTO 17906a99fe3SHajimu UMEMOTO if (proto->p_aliases != NULL) { 18006a99fe3SHajimu UMEMOTO aliases_size = 0; 18106a99fe3SHajimu UMEMOTO for (alias = proto->p_aliases; *alias; ++alias) { 18206a99fe3SHajimu UMEMOTO desired_size += strlen(*alias) + 1; 18306a99fe3SHajimu UMEMOTO ++aliases_size; 18406a99fe3SHajimu UMEMOTO } 18506a99fe3SHajimu UMEMOTO 18606a99fe3SHajimu UMEMOTO desired_size += _ALIGNBYTES + (aliases_size + 1) * 18706a99fe3SHajimu UMEMOTO sizeof(char *); 18806a99fe3SHajimu UMEMOTO } 18906a99fe3SHajimu UMEMOTO 19006a99fe3SHajimu UMEMOTO if (*buffer_size < desired_size) { 19106a99fe3SHajimu UMEMOTO /* this assignment is here for future use */ 19206a99fe3SHajimu UMEMOTO *buffer_size = desired_size; 19306a99fe3SHajimu UMEMOTO return (NS_RETURN); 19406a99fe3SHajimu UMEMOTO } 19506a99fe3SHajimu UMEMOTO 19606a99fe3SHajimu UMEMOTO memcpy(&new_proto, proto, sizeof(struct protoent)); 19706a99fe3SHajimu UMEMOTO 19806a99fe3SHajimu UMEMOTO *buffer_size = desired_size; 19906a99fe3SHajimu UMEMOTO memset(buffer, 0, desired_size); 20006a99fe3SHajimu UMEMOTO p = buffer + sizeof(struct protoent) + sizeof(char *); 20106a99fe3SHajimu UMEMOTO memcpy(buffer + sizeof(struct protoent), &p, sizeof(char *)); 20206a99fe3SHajimu UMEMOTO p = (char *)_ALIGN(p); 20306a99fe3SHajimu UMEMOTO 20406a99fe3SHajimu UMEMOTO if (new_proto.p_name != NULL) { 20506a99fe3SHajimu UMEMOTO size = strlen(new_proto.p_name); 20606a99fe3SHajimu UMEMOTO memcpy(p, new_proto.p_name, size); 20706a99fe3SHajimu UMEMOTO new_proto.p_name = p; 20806a99fe3SHajimu UMEMOTO p += size + 1; 20906a99fe3SHajimu UMEMOTO } 21006a99fe3SHajimu UMEMOTO 21106a99fe3SHajimu UMEMOTO if (new_proto.p_aliases != NULL) { 21206a99fe3SHajimu UMEMOTO p = (char *)_ALIGN(p); 21306a99fe3SHajimu UMEMOTO memcpy(p, new_proto.p_aliases, sizeof(char *) * aliases_size); 21406a99fe3SHajimu UMEMOTO new_proto.p_aliases = (char **)p; 21506a99fe3SHajimu UMEMOTO p += sizeof(char *) * (aliases_size + 1); 21606a99fe3SHajimu UMEMOTO 21706a99fe3SHajimu UMEMOTO for (alias = new_proto.p_aliases; *alias; ++alias) { 21806a99fe3SHajimu UMEMOTO size = strlen(*alias); 21906a99fe3SHajimu UMEMOTO memcpy(p, *alias, size); 22006a99fe3SHajimu UMEMOTO *alias = p; 22106a99fe3SHajimu UMEMOTO p += size + 1; 22206a99fe3SHajimu UMEMOTO } 22306a99fe3SHajimu UMEMOTO } 22406a99fe3SHajimu UMEMOTO 22506a99fe3SHajimu UMEMOTO memcpy(buffer, &new_proto, sizeof(struct protoent)); 22606a99fe3SHajimu UMEMOTO return (NS_SUCCESS); 22706a99fe3SHajimu UMEMOTO } 22806a99fe3SHajimu UMEMOTO 22906a99fe3SHajimu UMEMOTO int 23006a99fe3SHajimu UMEMOTO __proto_unmarshal_func(char *buffer, size_t buffer_size, void *retval, 23106a99fe3SHajimu UMEMOTO va_list ap, void *cache_mdata) 23206a99fe3SHajimu UMEMOTO { 23306a99fe3SHajimu UMEMOTO char *name; 23406a99fe3SHajimu UMEMOTO int num; 23506a99fe3SHajimu UMEMOTO struct protoent *proto; 23606a99fe3SHajimu UMEMOTO char *orig_buf; 23706a99fe3SHajimu UMEMOTO size_t orig_buf_size; 23806a99fe3SHajimu UMEMOTO int *ret_errno; 23906a99fe3SHajimu UMEMOTO 24006a99fe3SHajimu UMEMOTO char *p; 24106a99fe3SHajimu UMEMOTO char **alias; 24206a99fe3SHajimu UMEMOTO 24306a99fe3SHajimu UMEMOTO switch ((enum nss_lookup_type)cache_mdata) { 24406a99fe3SHajimu UMEMOTO case nss_lt_name: 24506a99fe3SHajimu UMEMOTO name = va_arg(ap, char *); 24606a99fe3SHajimu UMEMOTO break; 24706a99fe3SHajimu UMEMOTO case nss_lt_id: 24806a99fe3SHajimu UMEMOTO num = va_arg(ap, int); 24906a99fe3SHajimu UMEMOTO break; 25006a99fe3SHajimu UMEMOTO case nss_lt_all: 25106a99fe3SHajimu UMEMOTO break; 25206a99fe3SHajimu UMEMOTO default: 25306a99fe3SHajimu UMEMOTO /* should be unreachable */ 25406a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 25506a99fe3SHajimu UMEMOTO } 25606a99fe3SHajimu UMEMOTO 25706a99fe3SHajimu UMEMOTO proto = va_arg(ap, struct protoent *); 25806a99fe3SHajimu UMEMOTO orig_buf = va_arg(ap, char *); 25906a99fe3SHajimu UMEMOTO orig_buf_size = va_arg(ap, size_t); 26006a99fe3SHajimu UMEMOTO ret_errno = va_arg(ap, int *); 26106a99fe3SHajimu UMEMOTO 26206a99fe3SHajimu UMEMOTO if (orig_buf_size < 26306a99fe3SHajimu UMEMOTO buffer_size - sizeof(struct protoent) - sizeof(char *)) { 26406a99fe3SHajimu UMEMOTO *ret_errno = ERANGE; 26506a99fe3SHajimu UMEMOTO return (NS_RETURN); 26606a99fe3SHajimu UMEMOTO } 26706a99fe3SHajimu UMEMOTO 26806a99fe3SHajimu UMEMOTO memcpy(proto, buffer, sizeof(struct protoent)); 26906a99fe3SHajimu UMEMOTO memcpy(&p, buffer + sizeof(struct protoent), sizeof(char *)); 27006a99fe3SHajimu UMEMOTO 27106a99fe3SHajimu UMEMOTO orig_buf = (char *)_ALIGN(orig_buf); 27206a99fe3SHajimu UMEMOTO memcpy(orig_buf, buffer + sizeof(struct protoent) + sizeof(char *) + 27306a99fe3SHajimu UMEMOTO _ALIGN(p) - (size_t)p, 27406a99fe3SHajimu UMEMOTO buffer_size - sizeof(struct protoent) - sizeof(char *) - 27506a99fe3SHajimu UMEMOTO _ALIGN(p) + (size_t)p); 27606a99fe3SHajimu UMEMOTO p = (char *)_ALIGN(p); 27706a99fe3SHajimu UMEMOTO 27806a99fe3SHajimu UMEMOTO NS_APPLY_OFFSET(proto->p_name, orig_buf, p, char *); 27906a99fe3SHajimu UMEMOTO if (proto->p_aliases != NULL) { 28006a99fe3SHajimu UMEMOTO NS_APPLY_OFFSET(proto->p_aliases, orig_buf, p, char **); 28106a99fe3SHajimu UMEMOTO 28206a99fe3SHajimu UMEMOTO for (alias = proto->p_aliases; *alias; ++alias) 28306a99fe3SHajimu UMEMOTO NS_APPLY_OFFSET(*alias, orig_buf, p, char *); 28406a99fe3SHajimu UMEMOTO } 28506a99fe3SHajimu UMEMOTO 28606a99fe3SHajimu UMEMOTO if (retval != NULL) 28706a99fe3SHajimu UMEMOTO *((struct protoent **)retval) = proto; 28806a99fe3SHajimu UMEMOTO 28906a99fe3SHajimu UMEMOTO return (NS_SUCCESS); 29006a99fe3SHajimu UMEMOTO } 29106a99fe3SHajimu UMEMOTO 29206a99fe3SHajimu UMEMOTO NSS_MP_CACHE_HANDLING(protocols); 29306a99fe3SHajimu UMEMOTO #endif /* NS_CACHING */ 29406a99fe3SHajimu UMEMOTO 295d3ac2b30SHajimu UMEMOTO int 296d3ac2b30SHajimu UMEMOTO __copy_protoent(struct protoent *pe, struct protoent *pptr, char *buf, 297d3ac2b30SHajimu UMEMOTO size_t buflen) 29892b6f7beSHajimu UMEMOTO { 299d3ac2b30SHajimu UMEMOTO char *cp; 300d3ac2b30SHajimu UMEMOTO int i, n; 301d3ac2b30SHajimu UMEMOTO int numptr, len; 30292b6f7beSHajimu UMEMOTO 303d3ac2b30SHajimu UMEMOTO /* Find out the amount of space required to store the answer. */ 304d3ac2b30SHajimu UMEMOTO numptr = 1; /* NULL ptr */ 305d3ac2b30SHajimu UMEMOTO len = (char *)ALIGN(buf) - buf; 306d3ac2b30SHajimu UMEMOTO for (i = 0; pe->p_aliases[i]; i++, numptr++) { 307d3ac2b30SHajimu UMEMOTO len += strlen(pe->p_aliases[i]) + 1; 308d3ac2b30SHajimu UMEMOTO } 309d3ac2b30SHajimu UMEMOTO len += strlen(pe->p_name) + 1; 310d3ac2b30SHajimu UMEMOTO len += numptr * sizeof(char*); 311d3ac2b30SHajimu UMEMOTO 312d3ac2b30SHajimu UMEMOTO if (len > (int)buflen) { 313d3ac2b30SHajimu UMEMOTO errno = ERANGE; 314d3ac2b30SHajimu UMEMOTO return (-1); 315d3ac2b30SHajimu UMEMOTO } 316d3ac2b30SHajimu UMEMOTO 317d3ac2b30SHajimu UMEMOTO /* copy protocol value*/ 318d3ac2b30SHajimu UMEMOTO pptr->p_proto = pe->p_proto; 319d3ac2b30SHajimu UMEMOTO 320d3ac2b30SHajimu UMEMOTO cp = (char *)ALIGN(buf) + numptr * sizeof(char *); 321d3ac2b30SHajimu UMEMOTO 322d3ac2b30SHajimu UMEMOTO /* copy official name */ 323d3ac2b30SHajimu UMEMOTO n = strlen(pe->p_name) + 1; 324d3ac2b30SHajimu UMEMOTO strcpy(cp, pe->p_name); 325d3ac2b30SHajimu UMEMOTO pptr->p_name = cp; 326d3ac2b30SHajimu UMEMOTO cp += n; 327d3ac2b30SHajimu UMEMOTO 328d3ac2b30SHajimu UMEMOTO /* copy aliases */ 329d3ac2b30SHajimu UMEMOTO pptr->p_aliases = (char **)ALIGN(buf); 330d3ac2b30SHajimu UMEMOTO for (i = 0 ; pe->p_aliases[i]; i++) { 331d3ac2b30SHajimu UMEMOTO n = strlen(pe->p_aliases[i]) + 1; 332d3ac2b30SHajimu UMEMOTO strcpy(cp, pe->p_aliases[i]); 333d3ac2b30SHajimu UMEMOTO pptr->p_aliases[i] = cp; 334d3ac2b30SHajimu UMEMOTO cp += n; 335d3ac2b30SHajimu UMEMOTO } 336d3ac2b30SHajimu UMEMOTO pptr->p_aliases[i] = NULL; 337d3ac2b30SHajimu UMEMOTO 338d3ac2b30SHajimu UMEMOTO return (0); 33992b6f7beSHajimu UMEMOTO } 34058f0484fSRodney W. Grimes 34158f0484fSRodney W. Grimes void 342d3ac2b30SHajimu UMEMOTO __setprotoent_p(int f, struct protoent_data *ped) 34358f0484fSRodney W. Grimes { 34492b6f7beSHajimu UMEMOTO if (ped->fp == NULL) 34592b6f7beSHajimu UMEMOTO ped->fp = fopen(_PATH_PROTOCOLS, "r"); 34658f0484fSRodney W. Grimes else 34792b6f7beSHajimu UMEMOTO rewind(ped->fp); 34892b6f7beSHajimu UMEMOTO ped->stayopen |= f; 34958f0484fSRodney W. Grimes } 35058f0484fSRodney W. Grimes 35158f0484fSRodney W. Grimes void 352d3ac2b30SHajimu UMEMOTO __endprotoent_p(struct protoent_data *ped) 35358f0484fSRodney W. Grimes { 35492b6f7beSHajimu UMEMOTO if (ped->fp) { 35592b6f7beSHajimu UMEMOTO fclose(ped->fp); 35692b6f7beSHajimu UMEMOTO ped->fp = NULL; 35758f0484fSRodney W. Grimes } 35892b6f7beSHajimu UMEMOTO ped->stayopen = 0; 35958f0484fSRodney W. Grimes } 36058f0484fSRodney W. Grimes 36192b6f7beSHajimu UMEMOTO int 362d3ac2b30SHajimu UMEMOTO __getprotoent_p(struct protoent *pe, struct protoent_data *ped) 36358f0484fSRodney W. Grimes { 36458f0484fSRodney W. Grimes char *p; 36592b6f7beSHajimu UMEMOTO char *cp, **q, *endp; 36692b6f7beSHajimu UMEMOTO long l; 36758f0484fSRodney W. Grimes 36892b6f7beSHajimu UMEMOTO if (ped->fp == NULL && (ped->fp = fopen(_PATH_PROTOCOLS, "r")) == NULL) 36992b6f7beSHajimu UMEMOTO return (-1); 37058f0484fSRodney W. Grimes again: 371a2a77501SHajimu UMEMOTO if ((p = fgets(ped->line, sizeof ped->line, ped->fp)) == NULL) 37292b6f7beSHajimu UMEMOTO return (-1); 37358f0484fSRodney W. Grimes if (*p == '#') 37458f0484fSRodney W. Grimes goto again; 37558f0484fSRodney W. Grimes cp = strpbrk(p, "#\n"); 3767b6cc404SMaxim Sobolev if (cp != NULL) 37758f0484fSRodney W. Grimes *cp = '\0'; 37892b6f7beSHajimu UMEMOTO pe->p_name = p; 37958f0484fSRodney W. Grimes cp = strpbrk(p, " \t"); 38058f0484fSRodney W. Grimes if (cp == NULL) 38158f0484fSRodney W. Grimes goto again; 38258f0484fSRodney W. Grimes *cp++ = '\0'; 38358f0484fSRodney W. Grimes while (*cp == ' ' || *cp == '\t') 38458f0484fSRodney W. Grimes cp++; 38558f0484fSRodney W. Grimes p = strpbrk(cp, " \t"); 38658f0484fSRodney W. Grimes if (p != NULL) 38758f0484fSRodney W. Grimes *p++ = '\0'; 38892b6f7beSHajimu UMEMOTO l = strtol(cp, &endp, 10); 38992b6f7beSHajimu UMEMOTO if (endp == cp || *endp != '\0' || l < 0 || l > USHRT_MAX) 39092b6f7beSHajimu UMEMOTO goto again; 39192b6f7beSHajimu UMEMOTO pe->p_proto = l; 39292b6f7beSHajimu UMEMOTO q = pe->p_aliases = ped->aliases; 39358f0484fSRodney W. Grimes if (p != NULL) { 39458f0484fSRodney W. Grimes cp = p; 39558f0484fSRodney W. Grimes while (cp && *cp) { 39658f0484fSRodney W. Grimes if (*cp == ' ' || *cp == '\t') { 39758f0484fSRodney W. Grimes cp++; 39858f0484fSRodney W. Grimes continue; 39958f0484fSRodney W. Grimes } 400a2a77501SHajimu UMEMOTO if (q < &ped->aliases[_MAXALIASES - 1]) 40158f0484fSRodney W. Grimes *q++ = cp; 40258f0484fSRodney W. Grimes cp = strpbrk(cp, " \t"); 40358f0484fSRodney W. Grimes if (cp != NULL) 40458f0484fSRodney W. Grimes *cp++ = '\0'; 40558f0484fSRodney W. Grimes } 40658f0484fSRodney W. Grimes } 40758f0484fSRodney W. Grimes *q = NULL; 40892b6f7beSHajimu UMEMOTO return (0); 40992b6f7beSHajimu UMEMOTO } 41092b6f7beSHajimu UMEMOTO 41106a99fe3SHajimu UMEMOTO static int 41206a99fe3SHajimu UMEMOTO files_getprotoent_r(void *retval, void *mdata, va_list ap) 413d3ac2b30SHajimu UMEMOTO { 414d3ac2b30SHajimu UMEMOTO struct protoent pe; 415d3ac2b30SHajimu UMEMOTO struct protoent_data *ped; 416d3ac2b30SHajimu UMEMOTO 41706a99fe3SHajimu UMEMOTO struct protoent *pptr; 41806a99fe3SHajimu UMEMOTO char *buffer; 41906a99fe3SHajimu UMEMOTO size_t buflen; 42006a99fe3SHajimu UMEMOTO int *errnop; 42106a99fe3SHajimu UMEMOTO 42206a99fe3SHajimu UMEMOTO pptr = va_arg(ap, struct protoent *); 42306a99fe3SHajimu UMEMOTO buffer = va_arg(ap, char *); 42406a99fe3SHajimu UMEMOTO buflen = va_arg(ap, size_t); 42506a99fe3SHajimu UMEMOTO errnop = va_arg(ap, int *); 42606a99fe3SHajimu UMEMOTO 427225edeacSHajimu UMEMOTO if ((ped = __protoent_data_init()) == NULL) { 428225edeacSHajimu UMEMOTO *errnop = errno; 429225edeacSHajimu UMEMOTO return (NS_NOTFOUND); 430225edeacSHajimu UMEMOTO } 431d3ac2b30SHajimu UMEMOTO 43206a99fe3SHajimu UMEMOTO if (__getprotoent_p(&pe, ped) != 0) { 43306a99fe3SHajimu UMEMOTO *errnop = errno; 43406a99fe3SHajimu UMEMOTO return (NS_NOTFOUND); 435d3ac2b30SHajimu UMEMOTO } 436d3ac2b30SHajimu UMEMOTO 43706a99fe3SHajimu UMEMOTO if (__copy_protoent(&pe, pptr, buffer, buflen) != 0) { 43806a99fe3SHajimu UMEMOTO *errnop = errno; 439225edeacSHajimu UMEMOTO return (NS_RETURN); 44006a99fe3SHajimu UMEMOTO } 44106a99fe3SHajimu UMEMOTO 44206a99fe3SHajimu UMEMOTO *((struct protoent **)retval) = pptr; 44306a99fe3SHajimu UMEMOTO return (NS_SUCCESS); 44406a99fe3SHajimu UMEMOTO } 44506a99fe3SHajimu UMEMOTO 44606a99fe3SHajimu UMEMOTO static int 44706a99fe3SHajimu UMEMOTO files_setprotoent(void *retval, void *mdata, va_list ap) 44806a99fe3SHajimu UMEMOTO { 44906a99fe3SHajimu UMEMOTO struct protoent_data *ped; 45006a99fe3SHajimu UMEMOTO int f; 45106a99fe3SHajimu UMEMOTO 45206a99fe3SHajimu UMEMOTO f = va_arg(ap, int); 45306a99fe3SHajimu UMEMOTO if ((ped = __protoent_data_init()) == NULL) 45406a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 45506a99fe3SHajimu UMEMOTO 45606a99fe3SHajimu UMEMOTO __setprotoent_p(f, ped); 45706a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 45806a99fe3SHajimu UMEMOTO } 45906a99fe3SHajimu UMEMOTO 46006a99fe3SHajimu UMEMOTO static int 46106a99fe3SHajimu UMEMOTO files_endprotoent(void *retval, void *mdata, va_list ap) 46292b6f7beSHajimu UMEMOTO { 463d3ac2b30SHajimu UMEMOTO struct protoent_data *ped; 46492b6f7beSHajimu UMEMOTO 465d3ac2b30SHajimu UMEMOTO if ((ped = __protoent_data_init()) == NULL) 46606a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 46706a99fe3SHajimu UMEMOTO 46806a99fe3SHajimu UMEMOTO __endprotoent_p(ped); 46906a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 47006a99fe3SHajimu UMEMOTO } 47106a99fe3SHajimu UMEMOTO 47206a99fe3SHajimu UMEMOTO int 47306a99fe3SHajimu UMEMOTO getprotoent_r(struct protoent *pptr, char *buffer, size_t buflen, 47406a99fe3SHajimu UMEMOTO struct protoent **result) 47506a99fe3SHajimu UMEMOTO { 47606a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 47706a99fe3SHajimu UMEMOTO static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER( 47806a99fe3SHajimu UMEMOTO protocols, (void *)nss_lt_all, 47906a99fe3SHajimu UMEMOTO __proto_marshal_func, __proto_unmarshal_func); 48006a99fe3SHajimu UMEMOTO #endif 48106a99fe3SHajimu UMEMOTO static const ns_dtab dtab[] = { 48206a99fe3SHajimu UMEMOTO { NSSRC_FILES, files_getprotoent_r, (void *)nss_lt_all }, 48306a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 48406a99fe3SHajimu UMEMOTO NS_CACHE_CB(&cache_info) 48506a99fe3SHajimu UMEMOTO #endif 48606a99fe3SHajimu UMEMOTO { NULL, NULL, NULL } 48706a99fe3SHajimu UMEMOTO }; 48806a99fe3SHajimu UMEMOTO int rv, ret_errno; 48906a99fe3SHajimu UMEMOTO 49006a99fe3SHajimu UMEMOTO ret_errno = 0; 49106a99fe3SHajimu UMEMOTO *result = NULL; 49206a99fe3SHajimu UMEMOTO rv = nsdispatch(result, dtab, NSDB_PROTOCOLS, "getprotoent_r", 49306a99fe3SHajimu UMEMOTO defaultsrc, pptr, buffer, buflen, &ret_errno); 49406a99fe3SHajimu UMEMOTO 495225edeacSHajimu UMEMOTO if (rv != NS_SUCCESS) { 496225edeacSHajimu UMEMOTO errno = ret_errno; 497*c618a856SHajimu UMEMOTO return (ret_errno); 498225edeacSHajimu UMEMOTO } 49906a99fe3SHajimu UMEMOTO return (0); 50006a99fe3SHajimu UMEMOTO } 50106a99fe3SHajimu UMEMOTO 50206a99fe3SHajimu UMEMOTO void 50306a99fe3SHajimu UMEMOTO setprotoent(int stayopen) 50406a99fe3SHajimu UMEMOTO { 50506a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 50606a99fe3SHajimu UMEMOTO static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER( 50706a99fe3SHajimu UMEMOTO protocols, (void *)nss_lt_all, 50806a99fe3SHajimu UMEMOTO NULL, NULL); 50906a99fe3SHajimu UMEMOTO #endif 51006a99fe3SHajimu UMEMOTO 51106a99fe3SHajimu UMEMOTO static const ns_dtab dtab[] = { 51206a99fe3SHajimu UMEMOTO { NSSRC_FILES, files_setprotoent, NULL }, 51306a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 51406a99fe3SHajimu UMEMOTO NS_CACHE_CB(&cache_info) 51506a99fe3SHajimu UMEMOTO #endif 51606a99fe3SHajimu UMEMOTO { NULL, NULL, NULL } 51706a99fe3SHajimu UMEMOTO }; 51806a99fe3SHajimu UMEMOTO 51906a99fe3SHajimu UMEMOTO (void)nsdispatch(NULL, dtab, NSDB_PROTOCOLS, "setprotoent", defaultsrc, 52006a99fe3SHajimu UMEMOTO stayopen); 52192b6f7beSHajimu UMEMOTO } 52292b6f7beSHajimu UMEMOTO 52392b6f7beSHajimu UMEMOTO void 52492b6f7beSHajimu UMEMOTO endprotoent(void) 52592b6f7beSHajimu UMEMOTO { 52606a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 52706a99fe3SHajimu UMEMOTO static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER( 52806a99fe3SHajimu UMEMOTO protocols, (void *)nss_lt_all, 52906a99fe3SHajimu UMEMOTO NULL, NULL); 53006a99fe3SHajimu UMEMOTO #endif 53192b6f7beSHajimu UMEMOTO 53206a99fe3SHajimu UMEMOTO static const ns_dtab dtab[] = { 53306a99fe3SHajimu UMEMOTO { NSSRC_FILES, files_endprotoent, NULL }, 53406a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 53506a99fe3SHajimu UMEMOTO NS_CACHE_CB(&cache_info) 53606a99fe3SHajimu UMEMOTO #endif 53706a99fe3SHajimu UMEMOTO { NULL, NULL, NULL } 53806a99fe3SHajimu UMEMOTO }; 53906a99fe3SHajimu UMEMOTO 54006a99fe3SHajimu UMEMOTO (void)nsdispatch(NULL, dtab, NSDB_PROTOCOLS, "endprotoent", defaultsrc); 54192b6f7beSHajimu UMEMOTO } 54292b6f7beSHajimu UMEMOTO 54392b6f7beSHajimu UMEMOTO struct protoent * 54492b6f7beSHajimu UMEMOTO getprotoent(void) 54592b6f7beSHajimu UMEMOTO { 54692b6f7beSHajimu UMEMOTO struct protodata *pd; 547d3ac2b30SHajimu UMEMOTO struct protoent *rval; 54892b6f7beSHajimu UMEMOTO 54992b6f7beSHajimu UMEMOTO if ((pd = __protodata_init()) == NULL) 55092b6f7beSHajimu UMEMOTO return (NULL); 551d3ac2b30SHajimu UMEMOTO if (getprotoent_r(&pd->proto, pd->data, sizeof(pd->data), &rval) != 0) 55292b6f7beSHajimu UMEMOTO return (NULL); 553d3ac2b30SHajimu UMEMOTO return (rval); 55458f0484fSRodney W. Grimes } 555