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 * 3. All advertising materials mentioning features or use of this software 1458f0484fSRodney W. Grimes * must display the following acknowledgement: 1558f0484fSRodney W. Grimes * This product includes software developed by the University of 1658f0484fSRodney W. Grimes * California, Berkeley and its contributors. 1758f0484fSRodney W. Grimes * 4. Neither the name of the University nor the names of its contributors 1858f0484fSRodney W. Grimes * may be used to endorse or promote products derived from this software 1958f0484fSRodney W. Grimes * without specific prior written permission. 2058f0484fSRodney W. Grimes * 2158f0484fSRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2258f0484fSRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2358f0484fSRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2458f0484fSRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2558f0484fSRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2658f0484fSRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2758f0484fSRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2858f0484fSRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2958f0484fSRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3058f0484fSRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3158f0484fSRodney W. Grimes * SUCH DAMAGE. 3258f0484fSRodney W. Grimes */ 3358f0484fSRodney W. Grimes 3458f0484fSRodney W. Grimes #if defined(LIBC_SCCS) && !defined(lint) 3558f0484fSRodney W. Grimes static char sccsid[] = "@(#)getprotoent.c 8.1 (Berkeley) 6/4/93"; 3658f0484fSRodney W. Grimes #endif /* LIBC_SCCS and not lint */ 378fb3f3f6SDavid E. O'Brien #include <sys/cdefs.h> 388fb3f3f6SDavid E. O'Brien __FBSDID("$FreeBSD$"); 3958f0484fSRodney W. Grimes 40d3ac2b30SHajimu UMEMOTO #include <sys/param.h> 4158f0484fSRodney W. Grimes #include <sys/types.h> 4258f0484fSRodney W. Grimes #include <sys/socket.h> 43d3ac2b30SHajimu UMEMOTO #include <errno.h> 44d8f77b45SStefan Farfeleder #include <limits.h> 4558f0484fSRodney W. Grimes #include <netdb.h> 4606a99fe3SHajimu UMEMOTO #include <nsswitch.h> 4758f0484fSRodney W. Grimes #include <stdio.h> 4858f0484fSRodney W. Grimes #include <stdlib.h> 4958f0484fSRodney W. Grimes #include <string.h> 5092b6f7beSHajimu UMEMOTO #include "namespace.h" 5192b6f7beSHajimu UMEMOTO #include "reentrant.h" 5292b6f7beSHajimu UMEMOTO #include "un-namespace.h" 5392b6f7beSHajimu UMEMOTO #include "netdb_private.h" 5406a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 5506a99fe3SHajimu UMEMOTO #include "nscache.h" 5606a99fe3SHajimu UMEMOTO #endif 5706a99fe3SHajimu UMEMOTO #include "nss_tls.h" 5806a99fe3SHajimu UMEMOTO 5906a99fe3SHajimu UMEMOTO static const ns_src defaultsrc[] = { 6006a99fe3SHajimu UMEMOTO { NSSRC_FILES, NS_SUCCESS }, 6106a99fe3SHajimu UMEMOTO { NULL, 0 } 6206a99fe3SHajimu UMEMOTO }; 6358f0484fSRodney W. Grimes 64d3ac2b30SHajimu UMEMOTO NETDB_THREAD_ALLOC(protoent_data) 65d3ac2b30SHajimu UMEMOTO NETDB_THREAD_ALLOC(protodata) 6658f0484fSRodney W. Grimes 6792b6f7beSHajimu UMEMOTO static void 6892b6f7beSHajimu UMEMOTO protoent_data_clear(struct protoent_data *ped) 6992b6f7beSHajimu UMEMOTO { 7092b6f7beSHajimu UMEMOTO if (ped->fp) { 7192b6f7beSHajimu UMEMOTO fclose(ped->fp); 7292b6f7beSHajimu UMEMOTO ped->fp = NULL; 7392b6f7beSHajimu UMEMOTO } 7492b6f7beSHajimu UMEMOTO } 7592b6f7beSHajimu UMEMOTO 7692b6f7beSHajimu UMEMOTO static void 77d3ac2b30SHajimu UMEMOTO protoent_data_free(void *ptr) 7892b6f7beSHajimu UMEMOTO { 79d3ac2b30SHajimu UMEMOTO struct protoent_data *ped = ptr; 8092b6f7beSHajimu UMEMOTO 81d3ac2b30SHajimu UMEMOTO protoent_data_clear(ped); 82d3ac2b30SHajimu UMEMOTO free(ped); 8392b6f7beSHajimu UMEMOTO } 8492b6f7beSHajimu UMEMOTO 8592b6f7beSHajimu UMEMOTO static void 86d3ac2b30SHajimu UMEMOTO protodata_free(void *ptr) 8792b6f7beSHajimu UMEMOTO { 88d3ac2b30SHajimu UMEMOTO free(ptr); 8992b6f7beSHajimu UMEMOTO } 9092b6f7beSHajimu UMEMOTO 9106a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 9206a99fe3SHajimu UMEMOTO int 9306a99fe3SHajimu UMEMOTO __proto_id_func(char *buffer, size_t *buffer_size, va_list ap, 9406a99fe3SHajimu UMEMOTO void *cache_mdata) 9506a99fe3SHajimu UMEMOTO { 9606a99fe3SHajimu UMEMOTO char *name; 9706a99fe3SHajimu UMEMOTO int proto; 9806a99fe3SHajimu UMEMOTO 9906a99fe3SHajimu UMEMOTO size_t desired_size, size; 10006a99fe3SHajimu UMEMOTO enum nss_lookup_type lookup_type; 10106a99fe3SHajimu UMEMOTO int res = NS_UNAVAIL; 10206a99fe3SHajimu UMEMOTO 10306a99fe3SHajimu UMEMOTO lookup_type = (enum nss_lookup_type)cache_mdata; 10406a99fe3SHajimu UMEMOTO switch (lookup_type) { 10506a99fe3SHajimu UMEMOTO case nss_lt_name: 10606a99fe3SHajimu UMEMOTO name = va_arg(ap, char *); 10706a99fe3SHajimu UMEMOTO 10806a99fe3SHajimu UMEMOTO size = strlen(name); 10906a99fe3SHajimu UMEMOTO desired_size = sizeof(enum nss_lookup_type) + size + 1; 11006a99fe3SHajimu UMEMOTO if (desired_size > *buffer_size) { 11106a99fe3SHajimu UMEMOTO res = NS_RETURN; 11206a99fe3SHajimu UMEMOTO goto fin; 11306a99fe3SHajimu UMEMOTO } 11406a99fe3SHajimu UMEMOTO 11506a99fe3SHajimu UMEMOTO memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type)); 11606a99fe3SHajimu UMEMOTO memcpy(buffer + sizeof(enum nss_lookup_type), name, size + 1); 11706a99fe3SHajimu UMEMOTO 11806a99fe3SHajimu UMEMOTO res = NS_SUCCESS; 11906a99fe3SHajimu UMEMOTO break; 12006a99fe3SHajimu UMEMOTO case nss_lt_id: 12106a99fe3SHajimu UMEMOTO proto = va_arg(ap, int); 12206a99fe3SHajimu UMEMOTO 12306a99fe3SHajimu UMEMOTO desired_size = sizeof(enum nss_lookup_type) + sizeof(int); 12406a99fe3SHajimu UMEMOTO if (desired_size > *buffer_size) { 12506a99fe3SHajimu UMEMOTO res = NS_RETURN; 12606a99fe3SHajimu UMEMOTO goto fin; 12706a99fe3SHajimu UMEMOTO } 12806a99fe3SHajimu UMEMOTO 12906a99fe3SHajimu UMEMOTO memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type)); 13006a99fe3SHajimu UMEMOTO memcpy(buffer + sizeof(enum nss_lookup_type), &proto, 13106a99fe3SHajimu UMEMOTO sizeof(int)); 13206a99fe3SHajimu UMEMOTO 13306a99fe3SHajimu UMEMOTO res = NS_SUCCESS; 13406a99fe3SHajimu UMEMOTO break; 13506a99fe3SHajimu UMEMOTO default: 13606a99fe3SHajimu UMEMOTO /* should be unreachable */ 13706a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 13806a99fe3SHajimu UMEMOTO } 13906a99fe3SHajimu UMEMOTO 14006a99fe3SHajimu UMEMOTO fin: 14106a99fe3SHajimu UMEMOTO *buffer_size = desired_size; 14206a99fe3SHajimu UMEMOTO return (res); 14306a99fe3SHajimu UMEMOTO } 14406a99fe3SHajimu UMEMOTO 14506a99fe3SHajimu UMEMOTO 14606a99fe3SHajimu UMEMOTO int 14706a99fe3SHajimu UMEMOTO __proto_marshal_func(char *buffer, size_t *buffer_size, void *retval, 14806a99fe3SHajimu UMEMOTO va_list ap, void *cache_mdata) 14906a99fe3SHajimu UMEMOTO { 15006a99fe3SHajimu UMEMOTO char *name; 15106a99fe3SHajimu UMEMOTO int num; 15206a99fe3SHajimu UMEMOTO struct protoent *proto; 15306a99fe3SHajimu UMEMOTO char *orig_buf; 15406a99fe3SHajimu UMEMOTO size_t orig_buf_size; 15506a99fe3SHajimu UMEMOTO 15606a99fe3SHajimu UMEMOTO struct protoent new_proto; 15706a99fe3SHajimu UMEMOTO size_t desired_size, size, aliases_size; 15806a99fe3SHajimu UMEMOTO char *p; 15906a99fe3SHajimu UMEMOTO char **alias; 16006a99fe3SHajimu UMEMOTO 16106a99fe3SHajimu UMEMOTO switch ((enum nss_lookup_type)cache_mdata) { 16206a99fe3SHajimu UMEMOTO case nss_lt_name: 16306a99fe3SHajimu UMEMOTO name = va_arg(ap, char *); 16406a99fe3SHajimu UMEMOTO break; 16506a99fe3SHajimu UMEMOTO case nss_lt_id: 16606a99fe3SHajimu UMEMOTO num = va_arg(ap, int); 16706a99fe3SHajimu UMEMOTO break; 16806a99fe3SHajimu UMEMOTO case nss_lt_all: 16906a99fe3SHajimu UMEMOTO break; 17006a99fe3SHajimu UMEMOTO default: 17106a99fe3SHajimu UMEMOTO /* should be unreachable */ 17206a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 17306a99fe3SHajimu UMEMOTO } 17406a99fe3SHajimu UMEMOTO 17506a99fe3SHajimu UMEMOTO proto = va_arg(ap, struct protoent *); 17606a99fe3SHajimu UMEMOTO orig_buf = va_arg(ap, char *); 17706a99fe3SHajimu UMEMOTO orig_buf_size = va_arg(ap, size_t); 17806a99fe3SHajimu UMEMOTO 17906a99fe3SHajimu UMEMOTO desired_size = _ALIGNBYTES + sizeof(struct protoent) + sizeof(char *); 18006a99fe3SHajimu UMEMOTO if (proto->p_name != NULL) 18106a99fe3SHajimu UMEMOTO desired_size += strlen(proto->p_name) + 1; 18206a99fe3SHajimu UMEMOTO 18306a99fe3SHajimu UMEMOTO if (proto->p_aliases != NULL) { 18406a99fe3SHajimu UMEMOTO aliases_size = 0; 18506a99fe3SHajimu UMEMOTO for (alias = proto->p_aliases; *alias; ++alias) { 18606a99fe3SHajimu UMEMOTO desired_size += strlen(*alias) + 1; 18706a99fe3SHajimu UMEMOTO ++aliases_size; 18806a99fe3SHajimu UMEMOTO } 18906a99fe3SHajimu UMEMOTO 19006a99fe3SHajimu UMEMOTO desired_size += _ALIGNBYTES + (aliases_size + 1) * 19106a99fe3SHajimu UMEMOTO sizeof(char *); 19206a99fe3SHajimu UMEMOTO } 19306a99fe3SHajimu UMEMOTO 19406a99fe3SHajimu UMEMOTO if (*buffer_size < desired_size) { 19506a99fe3SHajimu UMEMOTO /* this assignment is here for future use */ 19606a99fe3SHajimu UMEMOTO *buffer_size = desired_size; 19706a99fe3SHajimu UMEMOTO return (NS_RETURN); 19806a99fe3SHajimu UMEMOTO } 19906a99fe3SHajimu UMEMOTO 20006a99fe3SHajimu UMEMOTO memcpy(&new_proto, proto, sizeof(struct protoent)); 20106a99fe3SHajimu UMEMOTO 20206a99fe3SHajimu UMEMOTO *buffer_size = desired_size; 20306a99fe3SHajimu UMEMOTO memset(buffer, 0, desired_size); 20406a99fe3SHajimu UMEMOTO p = buffer + sizeof(struct protoent) + sizeof(char *); 20506a99fe3SHajimu UMEMOTO memcpy(buffer + sizeof(struct protoent), &p, sizeof(char *)); 20606a99fe3SHajimu UMEMOTO p = (char *)_ALIGN(p); 20706a99fe3SHajimu UMEMOTO 20806a99fe3SHajimu UMEMOTO if (new_proto.p_name != NULL) { 20906a99fe3SHajimu UMEMOTO size = strlen(new_proto.p_name); 21006a99fe3SHajimu UMEMOTO memcpy(p, new_proto.p_name, size); 21106a99fe3SHajimu UMEMOTO new_proto.p_name = p; 21206a99fe3SHajimu UMEMOTO p += size + 1; 21306a99fe3SHajimu UMEMOTO } 21406a99fe3SHajimu UMEMOTO 21506a99fe3SHajimu UMEMOTO if (new_proto.p_aliases != NULL) { 21606a99fe3SHajimu UMEMOTO p = (char *)_ALIGN(p); 21706a99fe3SHajimu UMEMOTO memcpy(p, new_proto.p_aliases, sizeof(char *) * aliases_size); 21806a99fe3SHajimu UMEMOTO new_proto.p_aliases = (char **)p; 21906a99fe3SHajimu UMEMOTO p += sizeof(char *) * (aliases_size + 1); 22006a99fe3SHajimu UMEMOTO 22106a99fe3SHajimu UMEMOTO for (alias = new_proto.p_aliases; *alias; ++alias) { 22206a99fe3SHajimu UMEMOTO size = strlen(*alias); 22306a99fe3SHajimu UMEMOTO memcpy(p, *alias, size); 22406a99fe3SHajimu UMEMOTO *alias = p; 22506a99fe3SHajimu UMEMOTO p += size + 1; 22606a99fe3SHajimu UMEMOTO } 22706a99fe3SHajimu UMEMOTO } 22806a99fe3SHajimu UMEMOTO 22906a99fe3SHajimu UMEMOTO memcpy(buffer, &new_proto, sizeof(struct protoent)); 23006a99fe3SHajimu UMEMOTO return (NS_SUCCESS); 23106a99fe3SHajimu UMEMOTO } 23206a99fe3SHajimu UMEMOTO 23306a99fe3SHajimu UMEMOTO int 23406a99fe3SHajimu UMEMOTO __proto_unmarshal_func(char *buffer, size_t buffer_size, void *retval, 23506a99fe3SHajimu UMEMOTO va_list ap, void *cache_mdata) 23606a99fe3SHajimu UMEMOTO { 23706a99fe3SHajimu UMEMOTO char *name; 23806a99fe3SHajimu UMEMOTO int num; 23906a99fe3SHajimu UMEMOTO struct protoent *proto; 24006a99fe3SHajimu UMEMOTO char *orig_buf; 24106a99fe3SHajimu UMEMOTO size_t orig_buf_size; 24206a99fe3SHajimu UMEMOTO int *ret_errno; 24306a99fe3SHajimu UMEMOTO 24406a99fe3SHajimu UMEMOTO char *p; 24506a99fe3SHajimu UMEMOTO char **alias; 24606a99fe3SHajimu UMEMOTO 24706a99fe3SHajimu UMEMOTO switch ((enum nss_lookup_type)cache_mdata) { 24806a99fe3SHajimu UMEMOTO case nss_lt_name: 24906a99fe3SHajimu UMEMOTO name = va_arg(ap, char *); 25006a99fe3SHajimu UMEMOTO break; 25106a99fe3SHajimu UMEMOTO case nss_lt_id: 25206a99fe3SHajimu UMEMOTO num = va_arg(ap, int); 25306a99fe3SHajimu UMEMOTO break; 25406a99fe3SHajimu UMEMOTO case nss_lt_all: 25506a99fe3SHajimu UMEMOTO break; 25606a99fe3SHajimu UMEMOTO default: 25706a99fe3SHajimu UMEMOTO /* should be unreachable */ 25806a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 25906a99fe3SHajimu UMEMOTO } 26006a99fe3SHajimu UMEMOTO 26106a99fe3SHajimu UMEMOTO proto = va_arg(ap, struct protoent *); 26206a99fe3SHajimu UMEMOTO orig_buf = va_arg(ap, char *); 26306a99fe3SHajimu UMEMOTO orig_buf_size = va_arg(ap, size_t); 26406a99fe3SHajimu UMEMOTO ret_errno = va_arg(ap, int *); 26506a99fe3SHajimu UMEMOTO 26606a99fe3SHajimu UMEMOTO if (orig_buf_size < 26706a99fe3SHajimu UMEMOTO buffer_size - sizeof(struct protoent) - sizeof(char *)) { 26806a99fe3SHajimu UMEMOTO *ret_errno = ERANGE; 26906a99fe3SHajimu UMEMOTO return (NS_RETURN); 27006a99fe3SHajimu UMEMOTO } 27106a99fe3SHajimu UMEMOTO 27206a99fe3SHajimu UMEMOTO memcpy(proto, buffer, sizeof(struct protoent)); 27306a99fe3SHajimu UMEMOTO memcpy(&p, buffer + sizeof(struct protoent), sizeof(char *)); 27406a99fe3SHajimu UMEMOTO 27506a99fe3SHajimu UMEMOTO orig_buf = (char *)_ALIGN(orig_buf); 27606a99fe3SHajimu UMEMOTO memcpy(orig_buf, buffer + sizeof(struct protoent) + sizeof(char *) + 27706a99fe3SHajimu UMEMOTO _ALIGN(p) - (size_t)p, 27806a99fe3SHajimu UMEMOTO buffer_size - sizeof(struct protoent) - sizeof(char *) - 27906a99fe3SHajimu UMEMOTO _ALIGN(p) + (size_t)p); 28006a99fe3SHajimu UMEMOTO p = (char *)_ALIGN(p); 28106a99fe3SHajimu UMEMOTO 28206a99fe3SHajimu UMEMOTO NS_APPLY_OFFSET(proto->p_name, orig_buf, p, char *); 28306a99fe3SHajimu UMEMOTO if (proto->p_aliases != NULL) { 28406a99fe3SHajimu UMEMOTO NS_APPLY_OFFSET(proto->p_aliases, orig_buf, p, char **); 28506a99fe3SHajimu UMEMOTO 28606a99fe3SHajimu UMEMOTO for (alias = proto->p_aliases; *alias; ++alias) 28706a99fe3SHajimu UMEMOTO NS_APPLY_OFFSET(*alias, orig_buf, p, char *); 28806a99fe3SHajimu UMEMOTO } 28906a99fe3SHajimu UMEMOTO 29006a99fe3SHajimu UMEMOTO if (retval != NULL) 29106a99fe3SHajimu UMEMOTO *((struct protoent **)retval) = proto; 29206a99fe3SHajimu UMEMOTO 29306a99fe3SHajimu UMEMOTO return (NS_SUCCESS); 29406a99fe3SHajimu UMEMOTO } 29506a99fe3SHajimu UMEMOTO 29606a99fe3SHajimu UMEMOTO NSS_MP_CACHE_HANDLING(protocols); 29706a99fe3SHajimu UMEMOTO #endif /* NS_CACHING */ 29806a99fe3SHajimu UMEMOTO 299d3ac2b30SHajimu UMEMOTO int 300d3ac2b30SHajimu UMEMOTO __copy_protoent(struct protoent *pe, struct protoent *pptr, char *buf, 301d3ac2b30SHajimu UMEMOTO size_t buflen) 30292b6f7beSHajimu UMEMOTO { 303d3ac2b30SHajimu UMEMOTO char *cp; 304d3ac2b30SHajimu UMEMOTO int i, n; 305d3ac2b30SHajimu UMEMOTO int numptr, len; 30692b6f7beSHajimu UMEMOTO 307d3ac2b30SHajimu UMEMOTO /* Find out the amount of space required to store the answer. */ 308d3ac2b30SHajimu UMEMOTO numptr = 1; /* NULL ptr */ 309d3ac2b30SHajimu UMEMOTO len = (char *)ALIGN(buf) - buf; 310d3ac2b30SHajimu UMEMOTO for (i = 0; pe->p_aliases[i]; i++, numptr++) { 311d3ac2b30SHajimu UMEMOTO len += strlen(pe->p_aliases[i]) + 1; 312d3ac2b30SHajimu UMEMOTO } 313d3ac2b30SHajimu UMEMOTO len += strlen(pe->p_name) + 1; 314d3ac2b30SHajimu UMEMOTO len += numptr * sizeof(char*); 315d3ac2b30SHajimu UMEMOTO 316d3ac2b30SHajimu UMEMOTO if (len > (int)buflen) { 317d3ac2b30SHajimu UMEMOTO errno = ERANGE; 318d3ac2b30SHajimu UMEMOTO return (-1); 319d3ac2b30SHajimu UMEMOTO } 320d3ac2b30SHajimu UMEMOTO 321d3ac2b30SHajimu UMEMOTO /* copy protocol value*/ 322d3ac2b30SHajimu UMEMOTO pptr->p_proto = pe->p_proto; 323d3ac2b30SHajimu UMEMOTO 324d3ac2b30SHajimu UMEMOTO cp = (char *)ALIGN(buf) + numptr * sizeof(char *); 325d3ac2b30SHajimu UMEMOTO 326d3ac2b30SHajimu UMEMOTO /* copy official name */ 327d3ac2b30SHajimu UMEMOTO n = strlen(pe->p_name) + 1; 328d3ac2b30SHajimu UMEMOTO strcpy(cp, pe->p_name); 329d3ac2b30SHajimu UMEMOTO pptr->p_name = cp; 330d3ac2b30SHajimu UMEMOTO cp += n; 331d3ac2b30SHajimu UMEMOTO 332d3ac2b30SHajimu UMEMOTO /* copy aliases */ 333d3ac2b30SHajimu UMEMOTO pptr->p_aliases = (char **)ALIGN(buf); 334d3ac2b30SHajimu UMEMOTO for (i = 0 ; pe->p_aliases[i]; i++) { 335d3ac2b30SHajimu UMEMOTO n = strlen(pe->p_aliases[i]) + 1; 336d3ac2b30SHajimu UMEMOTO strcpy(cp, pe->p_aliases[i]); 337d3ac2b30SHajimu UMEMOTO pptr->p_aliases[i] = cp; 338d3ac2b30SHajimu UMEMOTO cp += n; 339d3ac2b30SHajimu UMEMOTO } 340d3ac2b30SHajimu UMEMOTO pptr->p_aliases[i] = NULL; 341d3ac2b30SHajimu UMEMOTO 342d3ac2b30SHajimu UMEMOTO return (0); 34392b6f7beSHajimu UMEMOTO } 34458f0484fSRodney W. Grimes 34558f0484fSRodney W. Grimes void 346d3ac2b30SHajimu UMEMOTO __setprotoent_p(int f, struct protoent_data *ped) 34758f0484fSRodney W. Grimes { 34892b6f7beSHajimu UMEMOTO if (ped->fp == NULL) 34992b6f7beSHajimu UMEMOTO ped->fp = fopen(_PATH_PROTOCOLS, "r"); 35058f0484fSRodney W. Grimes else 35192b6f7beSHajimu UMEMOTO rewind(ped->fp); 35292b6f7beSHajimu UMEMOTO ped->stayopen |= f; 35358f0484fSRodney W. Grimes } 35458f0484fSRodney W. Grimes 35558f0484fSRodney W. Grimes void 356d3ac2b30SHajimu UMEMOTO __endprotoent_p(struct protoent_data *ped) 35758f0484fSRodney W. Grimes { 35892b6f7beSHajimu UMEMOTO if (ped->fp) { 35992b6f7beSHajimu UMEMOTO fclose(ped->fp); 36092b6f7beSHajimu UMEMOTO ped->fp = NULL; 36158f0484fSRodney W. Grimes } 36292b6f7beSHajimu UMEMOTO ped->stayopen = 0; 36358f0484fSRodney W. Grimes } 36458f0484fSRodney W. Grimes 36592b6f7beSHajimu UMEMOTO int 366d3ac2b30SHajimu UMEMOTO __getprotoent_p(struct protoent *pe, struct protoent_data *ped) 36758f0484fSRodney W. Grimes { 36858f0484fSRodney W. Grimes char *p; 36992b6f7beSHajimu UMEMOTO char *cp, **q, *endp; 37092b6f7beSHajimu UMEMOTO long l; 37158f0484fSRodney W. Grimes 37292b6f7beSHajimu UMEMOTO if (ped->fp == NULL && (ped->fp = fopen(_PATH_PROTOCOLS, "r")) == NULL) 37392b6f7beSHajimu UMEMOTO return (-1); 37458f0484fSRodney W. Grimes again: 375a2a77501SHajimu UMEMOTO if ((p = fgets(ped->line, sizeof ped->line, ped->fp)) == NULL) 37692b6f7beSHajimu UMEMOTO return (-1); 37758f0484fSRodney W. Grimes if (*p == '#') 37858f0484fSRodney W. Grimes goto again; 37958f0484fSRodney W. Grimes cp = strpbrk(p, "#\n"); 3807b6cc404SMaxim Sobolev if (cp != NULL) 38158f0484fSRodney W. Grimes *cp = '\0'; 38292b6f7beSHajimu UMEMOTO pe->p_name = p; 38358f0484fSRodney W. Grimes cp = strpbrk(p, " \t"); 38458f0484fSRodney W. Grimes if (cp == NULL) 38558f0484fSRodney W. Grimes goto again; 38658f0484fSRodney W. Grimes *cp++ = '\0'; 38758f0484fSRodney W. Grimes while (*cp == ' ' || *cp == '\t') 38858f0484fSRodney W. Grimes cp++; 38958f0484fSRodney W. Grimes p = strpbrk(cp, " \t"); 39058f0484fSRodney W. Grimes if (p != NULL) 39158f0484fSRodney W. Grimes *p++ = '\0'; 39292b6f7beSHajimu UMEMOTO l = strtol(cp, &endp, 10); 39392b6f7beSHajimu UMEMOTO if (endp == cp || *endp != '\0' || l < 0 || l > USHRT_MAX) 39492b6f7beSHajimu UMEMOTO goto again; 39592b6f7beSHajimu UMEMOTO pe->p_proto = l; 39692b6f7beSHajimu UMEMOTO q = pe->p_aliases = ped->aliases; 39758f0484fSRodney W. Grimes if (p != NULL) { 39858f0484fSRodney W. Grimes cp = p; 39958f0484fSRodney W. Grimes while (cp && *cp) { 40058f0484fSRodney W. Grimes if (*cp == ' ' || *cp == '\t') { 40158f0484fSRodney W. Grimes cp++; 40258f0484fSRodney W. Grimes continue; 40358f0484fSRodney W. Grimes } 404a2a77501SHajimu UMEMOTO if (q < &ped->aliases[_MAXALIASES - 1]) 40558f0484fSRodney W. Grimes *q++ = cp; 40658f0484fSRodney W. Grimes cp = strpbrk(cp, " \t"); 40758f0484fSRodney W. Grimes if (cp != NULL) 40858f0484fSRodney W. Grimes *cp++ = '\0'; 40958f0484fSRodney W. Grimes } 41058f0484fSRodney W. Grimes } 41158f0484fSRodney W. Grimes *q = NULL; 41292b6f7beSHajimu UMEMOTO return (0); 41392b6f7beSHajimu UMEMOTO } 41492b6f7beSHajimu UMEMOTO 41506a99fe3SHajimu UMEMOTO static int 41606a99fe3SHajimu UMEMOTO files_getprotoent_r(void *retval, void *mdata, va_list ap) 417d3ac2b30SHajimu UMEMOTO { 418d3ac2b30SHajimu UMEMOTO struct protoent pe; 419d3ac2b30SHajimu UMEMOTO struct protoent_data *ped; 420d3ac2b30SHajimu UMEMOTO 42106a99fe3SHajimu UMEMOTO struct protoent *pptr; 42206a99fe3SHajimu UMEMOTO char *buffer; 42306a99fe3SHajimu UMEMOTO size_t buflen; 42406a99fe3SHajimu UMEMOTO int *errnop; 42506a99fe3SHajimu UMEMOTO 42606a99fe3SHajimu UMEMOTO pptr = va_arg(ap, struct protoent *); 42706a99fe3SHajimu UMEMOTO buffer = va_arg(ap, char *); 42806a99fe3SHajimu UMEMOTO buflen = va_arg(ap, size_t); 42906a99fe3SHajimu UMEMOTO errnop = va_arg(ap, int *); 43006a99fe3SHajimu UMEMOTO 431d3ac2b30SHajimu UMEMOTO if ((ped = __protoent_data_init()) == NULL) 432d3ac2b30SHajimu UMEMOTO return (-1); 433d3ac2b30SHajimu UMEMOTO 43406a99fe3SHajimu UMEMOTO if (__getprotoent_p(&pe, ped) != 0) { 43506a99fe3SHajimu UMEMOTO *errnop = errno; 43606a99fe3SHajimu UMEMOTO return (NS_NOTFOUND); 437d3ac2b30SHajimu UMEMOTO } 438d3ac2b30SHajimu UMEMOTO 43906a99fe3SHajimu UMEMOTO if (__copy_protoent(&pe, pptr, buffer, buflen) != 0) { 44006a99fe3SHajimu UMEMOTO *errnop = errno; 44106a99fe3SHajimu UMEMOTO return (NS_NOTFOUND); 44206a99fe3SHajimu UMEMOTO } 44306a99fe3SHajimu UMEMOTO 44406a99fe3SHajimu UMEMOTO *((struct protoent **)retval) = pptr; 44506a99fe3SHajimu UMEMOTO return (NS_SUCCESS); 44606a99fe3SHajimu UMEMOTO } 44706a99fe3SHajimu UMEMOTO 44806a99fe3SHajimu UMEMOTO static int 44906a99fe3SHajimu UMEMOTO files_setprotoent(void *retval, void *mdata, va_list ap) 45006a99fe3SHajimu UMEMOTO { 45106a99fe3SHajimu UMEMOTO struct protoent_data *ped; 45206a99fe3SHajimu UMEMOTO int f; 45306a99fe3SHajimu UMEMOTO 45406a99fe3SHajimu UMEMOTO f = va_arg(ap, int); 45506a99fe3SHajimu UMEMOTO if ((ped = __protoent_data_init()) == NULL) 45606a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 45706a99fe3SHajimu UMEMOTO 45806a99fe3SHajimu UMEMOTO __setprotoent_p(f, ped); 45906a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 46006a99fe3SHajimu UMEMOTO } 46106a99fe3SHajimu UMEMOTO 46206a99fe3SHajimu UMEMOTO static int 46306a99fe3SHajimu UMEMOTO files_endprotoent(void *retval, void *mdata, va_list ap) 46492b6f7beSHajimu UMEMOTO { 465d3ac2b30SHajimu UMEMOTO struct protoent_data *ped; 46692b6f7beSHajimu UMEMOTO 467d3ac2b30SHajimu UMEMOTO if ((ped = __protoent_data_init()) == NULL) 46806a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 46906a99fe3SHajimu UMEMOTO 47006a99fe3SHajimu UMEMOTO __endprotoent_p(ped); 47106a99fe3SHajimu UMEMOTO return (NS_UNAVAIL); 47206a99fe3SHajimu UMEMOTO } 47306a99fe3SHajimu UMEMOTO 47406a99fe3SHajimu UMEMOTO int 47506a99fe3SHajimu UMEMOTO getprotoent_r(struct protoent *pptr, char *buffer, size_t buflen, 47606a99fe3SHajimu UMEMOTO struct protoent **result) 47706a99fe3SHajimu UMEMOTO { 47806a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 47906a99fe3SHajimu UMEMOTO static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER( 48006a99fe3SHajimu UMEMOTO protocols, (void *)nss_lt_all, 48106a99fe3SHajimu UMEMOTO __proto_marshal_func, __proto_unmarshal_func); 48206a99fe3SHajimu UMEMOTO #endif 48306a99fe3SHajimu UMEMOTO static const ns_dtab dtab[] = { 48406a99fe3SHajimu UMEMOTO { NSSRC_FILES, files_getprotoent_r, (void *)nss_lt_all }, 48506a99fe3SHajimu UMEMOTO #ifdef NS_CACHING 48606a99fe3SHajimu UMEMOTO NS_CACHE_CB(&cache_info) 48706a99fe3SHajimu UMEMOTO #endif 48806a99fe3SHajimu UMEMOTO { NULL, NULL, NULL } 48906a99fe3SHajimu UMEMOTO }; 49006a99fe3SHajimu UMEMOTO int rv, ret_errno; 49106a99fe3SHajimu UMEMOTO 49206a99fe3SHajimu UMEMOTO ret_errno = 0; 49306a99fe3SHajimu UMEMOTO *result = NULL; 49406a99fe3SHajimu UMEMOTO rv = nsdispatch(result, dtab, NSDB_PROTOCOLS, "getprotoent_r", 49506a99fe3SHajimu UMEMOTO defaultsrc, pptr, buffer, buflen, &ret_errno); 49606a99fe3SHajimu UMEMOTO 49706a99fe3SHajimu UMEMOTO if (rv == NS_SUCCESS) 49806a99fe3SHajimu UMEMOTO return (0); 49906a99fe3SHajimu UMEMOTO else 50006a99fe3SHajimu UMEMOTO return (ret_errno); 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