17c478bd9Sstevel@tonic-gate /* 2*9525b14bSRao Shoaib * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") 37c478bd9Sstevel@tonic-gate * Copyright (c) 1998-1999 by Internet Software Consortium. 47c478bd9Sstevel@tonic-gate * 57c478bd9Sstevel@tonic-gate * Permission to use, copy, modify, and distribute this software for any 67c478bd9Sstevel@tonic-gate * purpose with or without fee is hereby granted, provided that the above 77c478bd9Sstevel@tonic-gate * copyright notice and this permission notice appear in all copies. 87c478bd9Sstevel@tonic-gate * 9*9525b14bSRao Shoaib * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 10*9525b14bSRao Shoaib * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11*9525b14bSRao Shoaib * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR 12*9525b14bSRao Shoaib * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13*9525b14bSRao Shoaib * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14*9525b14bSRao Shoaib * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 15*9525b14bSRao Shoaib * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 167c478bd9Sstevel@tonic-gate */ 177c478bd9Sstevel@tonic-gate 187c478bd9Sstevel@tonic-gate #if defined(LIBC_SCCS) && !defined(lint) 19*9525b14bSRao Shoaib static const char rcsid[] = "$Id: getprotoent_r.c,v 1.6 2006/08/01 01:14:16 marka Exp $"; 207c478bd9Sstevel@tonic-gate #endif /* LIBC_SCCS and not lint */ 217c478bd9Sstevel@tonic-gate 227c478bd9Sstevel@tonic-gate #include <port_before.h> 237c478bd9Sstevel@tonic-gate #if !defined(_REENTRANT) || !defined(DO_PTHREADS) 247c478bd9Sstevel@tonic-gate static int getprotoent_r_not_required = 0; 257c478bd9Sstevel@tonic-gate #else 267c478bd9Sstevel@tonic-gate #include <errno.h> 277c478bd9Sstevel@tonic-gate #include <string.h> 287c478bd9Sstevel@tonic-gate #include <stdio.h> 297c478bd9Sstevel@tonic-gate #include <sys/types.h> 307c478bd9Sstevel@tonic-gate #include <netinet/in.h> 317c478bd9Sstevel@tonic-gate #include <netdb.h> 327c478bd9Sstevel@tonic-gate #include <port_after.h> 337c478bd9Sstevel@tonic-gate 347c478bd9Sstevel@tonic-gate #ifdef PROTO_R_RETURN 357c478bd9Sstevel@tonic-gate 367c478bd9Sstevel@tonic-gate static PROTO_R_RETURN 377c478bd9Sstevel@tonic-gate copy_protoent(struct protoent *, struct protoent *, PROTO_R_COPY_ARGS); 387c478bd9Sstevel@tonic-gate 397c478bd9Sstevel@tonic-gate PROTO_R_RETURN 407c478bd9Sstevel@tonic-gate getprotobyname_r(const char *name, struct protoent *pptr, PROTO_R_ARGS) { 417c478bd9Sstevel@tonic-gate struct protoent *pe = getprotobyname(name); 427c478bd9Sstevel@tonic-gate #ifdef PROTO_R_SETANSWER 437c478bd9Sstevel@tonic-gate int n = 0; 447c478bd9Sstevel@tonic-gate 457c478bd9Sstevel@tonic-gate if (pe == NULL || (n = copy_protoent(pe, pptr, PROTO_R_COPY)) != 0) 467c478bd9Sstevel@tonic-gate *answerp = NULL; 477c478bd9Sstevel@tonic-gate else 487c478bd9Sstevel@tonic-gate *answerp = pptr; 497c478bd9Sstevel@tonic-gate 507c478bd9Sstevel@tonic-gate return (n); 517c478bd9Sstevel@tonic-gate #else 527c478bd9Sstevel@tonic-gate if (pe == NULL) 537c478bd9Sstevel@tonic-gate return (PROTO_R_BAD); 547c478bd9Sstevel@tonic-gate 557c478bd9Sstevel@tonic-gate return (copy_protoent(pe, pptr, PROTO_R_COPY)); 567c478bd9Sstevel@tonic-gate #endif 577c478bd9Sstevel@tonic-gate } 587c478bd9Sstevel@tonic-gate 597c478bd9Sstevel@tonic-gate PROTO_R_RETURN 607c478bd9Sstevel@tonic-gate getprotobynumber_r(int proto, struct protoent *pptr, PROTO_R_ARGS) { 617c478bd9Sstevel@tonic-gate struct protoent *pe = getprotobynumber(proto); 627c478bd9Sstevel@tonic-gate #ifdef PROTO_R_SETANSWER 637c478bd9Sstevel@tonic-gate int n = 0; 647c478bd9Sstevel@tonic-gate 657c478bd9Sstevel@tonic-gate if (pe == NULL || (n = copy_protoent(pe, pptr, PROTO_R_COPY)) != 0) 667c478bd9Sstevel@tonic-gate *answerp = NULL; 677c478bd9Sstevel@tonic-gate else 687c478bd9Sstevel@tonic-gate *answerp = pptr; 697c478bd9Sstevel@tonic-gate 707c478bd9Sstevel@tonic-gate return (n); 717c478bd9Sstevel@tonic-gate #else 727c478bd9Sstevel@tonic-gate if (pe == NULL) 737c478bd9Sstevel@tonic-gate return (PROTO_R_BAD); 747c478bd9Sstevel@tonic-gate 757c478bd9Sstevel@tonic-gate return (copy_protoent(pe, pptr, PROTO_R_COPY)); 767c478bd9Sstevel@tonic-gate #endif 777c478bd9Sstevel@tonic-gate } 787c478bd9Sstevel@tonic-gate 79*9525b14bSRao Shoaib /*% 807c478bd9Sstevel@tonic-gate * These assume a single context is in operation per thread. 817c478bd9Sstevel@tonic-gate * If this is not the case we will need to call irs directly 827c478bd9Sstevel@tonic-gate * rather than through the base functions. 837c478bd9Sstevel@tonic-gate */ 847c478bd9Sstevel@tonic-gate 857c478bd9Sstevel@tonic-gate PROTO_R_RETURN 867c478bd9Sstevel@tonic-gate getprotoent_r(struct protoent *pptr, PROTO_R_ARGS) { 877c478bd9Sstevel@tonic-gate struct protoent *pe = getprotoent(); 887c478bd9Sstevel@tonic-gate #ifdef PROTO_R_SETANSWER 897c478bd9Sstevel@tonic-gate int n = 0; 907c478bd9Sstevel@tonic-gate 917c478bd9Sstevel@tonic-gate if (pe == NULL || (n = copy_protoent(pe, pptr, PROTO_R_COPY)) != 0) 927c478bd9Sstevel@tonic-gate *answerp = NULL; 937c478bd9Sstevel@tonic-gate else 947c478bd9Sstevel@tonic-gate *answerp = pptr; 957c478bd9Sstevel@tonic-gate 967c478bd9Sstevel@tonic-gate return (n); 977c478bd9Sstevel@tonic-gate #else 987c478bd9Sstevel@tonic-gate if (pe == NULL) 997c478bd9Sstevel@tonic-gate return (PROTO_R_BAD); 1007c478bd9Sstevel@tonic-gate 1017c478bd9Sstevel@tonic-gate return (copy_protoent(pe, pptr, PROTO_R_COPY)); 1027c478bd9Sstevel@tonic-gate #endif 1037c478bd9Sstevel@tonic-gate } 1047c478bd9Sstevel@tonic-gate 1057c478bd9Sstevel@tonic-gate PROTO_R_SET_RETURN 1067c478bd9Sstevel@tonic-gate #ifdef PROTO_R_ENT_ARGS 1077c478bd9Sstevel@tonic-gate setprotoent_r(int stay_open, PROTO_R_ENT_ARGS) 1087c478bd9Sstevel@tonic-gate #else 1097c478bd9Sstevel@tonic-gate setprotoent_r(int stay_open) 1107c478bd9Sstevel@tonic-gate #endif 1117c478bd9Sstevel@tonic-gate { 112*9525b14bSRao Shoaib #ifdef PROTO_R_ENT_UNUSED 113*9525b14bSRao Shoaib PROTO_R_ENT_UNUSED; 114*9525b14bSRao Shoaib #endif 1157c478bd9Sstevel@tonic-gate setprotoent(stay_open); 1167c478bd9Sstevel@tonic-gate #ifdef PROTO_R_SET_RESULT 1177c478bd9Sstevel@tonic-gate return (PROTO_R_SET_RESULT); 1187c478bd9Sstevel@tonic-gate #endif 1197c478bd9Sstevel@tonic-gate } 1207c478bd9Sstevel@tonic-gate 1217c478bd9Sstevel@tonic-gate PROTO_R_END_RETURN 1227c478bd9Sstevel@tonic-gate #ifdef PROTO_R_ENT_ARGS 1237c478bd9Sstevel@tonic-gate endprotoent_r(PROTO_R_ENT_ARGS) 1247c478bd9Sstevel@tonic-gate #else 1257c478bd9Sstevel@tonic-gate endprotoent_r() 1267c478bd9Sstevel@tonic-gate #endif 1277c478bd9Sstevel@tonic-gate { 128*9525b14bSRao Shoaib #ifdef PROTO_R_ENT_UNUSED 129*9525b14bSRao Shoaib PROTO_R_ENT_UNUSED; 130*9525b14bSRao Shoaib #endif 1317c478bd9Sstevel@tonic-gate endprotoent(); 1327c478bd9Sstevel@tonic-gate PROTO_R_END_RESULT(PROTO_R_OK); 1337c478bd9Sstevel@tonic-gate } 1347c478bd9Sstevel@tonic-gate 1357c478bd9Sstevel@tonic-gate /* Private */ 1367c478bd9Sstevel@tonic-gate 1377c478bd9Sstevel@tonic-gate #ifndef PROTOENT_DATA 1387c478bd9Sstevel@tonic-gate static PROTO_R_RETURN 1397c478bd9Sstevel@tonic-gate copy_protoent(struct protoent *pe, struct protoent *pptr, PROTO_R_COPY_ARGS) { 1407c478bd9Sstevel@tonic-gate char *cp; 1417c478bd9Sstevel@tonic-gate int i, n; 1427c478bd9Sstevel@tonic-gate int numptr, len; 1437c478bd9Sstevel@tonic-gate 1447c478bd9Sstevel@tonic-gate /* Find out the amount of space required to store the answer. */ 145*9525b14bSRao Shoaib numptr = 1; /*%< NULL ptr */ 1467c478bd9Sstevel@tonic-gate len = (char *)ALIGN(buf) - buf; 1477c478bd9Sstevel@tonic-gate for (i = 0; pe->p_aliases[i]; i++, numptr++) { 1487c478bd9Sstevel@tonic-gate len += strlen(pe->p_aliases[i]) + 1; 1497c478bd9Sstevel@tonic-gate } 1507c478bd9Sstevel@tonic-gate len += strlen(pe->p_name) + 1; 1517c478bd9Sstevel@tonic-gate len += numptr * sizeof(char*); 1527c478bd9Sstevel@tonic-gate 1537c478bd9Sstevel@tonic-gate if (len > (int)buflen) { 1547c478bd9Sstevel@tonic-gate errno = ERANGE; 1557c478bd9Sstevel@tonic-gate return (PROTO_R_BAD); 1567c478bd9Sstevel@tonic-gate } 1577c478bd9Sstevel@tonic-gate 1587c478bd9Sstevel@tonic-gate /* copy protocol value*/ 1597c478bd9Sstevel@tonic-gate pptr->p_proto = pe->p_proto; 1607c478bd9Sstevel@tonic-gate 1617c478bd9Sstevel@tonic-gate cp = (char *)ALIGN(buf) + numptr * sizeof(char *); 1627c478bd9Sstevel@tonic-gate 1637c478bd9Sstevel@tonic-gate /* copy official name */ 1647c478bd9Sstevel@tonic-gate n = strlen(pe->p_name) + 1; 1657c478bd9Sstevel@tonic-gate strcpy(cp, pe->p_name); 1667c478bd9Sstevel@tonic-gate pptr->p_name = cp; 1677c478bd9Sstevel@tonic-gate cp += n; 1687c478bd9Sstevel@tonic-gate 1697c478bd9Sstevel@tonic-gate /* copy aliases */ 1707c478bd9Sstevel@tonic-gate pptr->p_aliases = (char **)ALIGN(buf); 1717c478bd9Sstevel@tonic-gate for (i = 0 ; pe->p_aliases[i]; i++) { 1727c478bd9Sstevel@tonic-gate n = strlen(pe->p_aliases[i]) + 1; 1737c478bd9Sstevel@tonic-gate strcpy(cp, pe->p_aliases[i]); 1747c478bd9Sstevel@tonic-gate pptr->p_aliases[i] = cp; 1757c478bd9Sstevel@tonic-gate cp += n; 1767c478bd9Sstevel@tonic-gate } 1777c478bd9Sstevel@tonic-gate pptr->p_aliases[i] = NULL; 1787c478bd9Sstevel@tonic-gate 1797c478bd9Sstevel@tonic-gate return (PROTO_R_OK); 1807c478bd9Sstevel@tonic-gate } 1817c478bd9Sstevel@tonic-gate #else /* !PROTOENT_DATA */ 1827c478bd9Sstevel@tonic-gate static int 1837c478bd9Sstevel@tonic-gate copy_protoent(struct protoent *pe, struct protoent *pptr, PROTO_R_COPY_ARGS) { 1847c478bd9Sstevel@tonic-gate char *cp, *eob; 1857c478bd9Sstevel@tonic-gate int i, n; 1867c478bd9Sstevel@tonic-gate 1877c478bd9Sstevel@tonic-gate /* copy protocol value */ 1887c478bd9Sstevel@tonic-gate pptr->p_proto = pe->p_proto; 1897c478bd9Sstevel@tonic-gate 1907c478bd9Sstevel@tonic-gate /* copy official name */ 1917c478bd9Sstevel@tonic-gate cp = pdptr->line; 1927c478bd9Sstevel@tonic-gate eob = pdptr->line + sizeof(pdptr->line); 1937c478bd9Sstevel@tonic-gate if ((n = strlen(pe->p_name) + 1) < (eob - cp)) { 1947c478bd9Sstevel@tonic-gate strcpy(cp, pe->p_name); 1957c478bd9Sstevel@tonic-gate pptr->p_name = cp; 1967c478bd9Sstevel@tonic-gate cp += n; 1977c478bd9Sstevel@tonic-gate } else { 1987c478bd9Sstevel@tonic-gate return (-1); 1997c478bd9Sstevel@tonic-gate } 2007c478bd9Sstevel@tonic-gate 2017c478bd9Sstevel@tonic-gate /* copy aliases */ 2027c478bd9Sstevel@tonic-gate i = 0; 2037c478bd9Sstevel@tonic-gate pptr->p_aliases = pdptr->proto_aliases; 2047c478bd9Sstevel@tonic-gate while (pe->p_aliases[i] && i < (_MAXALIASES-1)) { 2057c478bd9Sstevel@tonic-gate if ((n = strlen(pe->p_aliases[i]) + 1) < (eob - cp)) { 2067c478bd9Sstevel@tonic-gate strcpy(cp, pe->p_aliases[i]); 2077c478bd9Sstevel@tonic-gate pptr->p_aliases[i] = cp; 2087c478bd9Sstevel@tonic-gate cp += n; 2097c478bd9Sstevel@tonic-gate } else { 2107c478bd9Sstevel@tonic-gate break; 2117c478bd9Sstevel@tonic-gate } 2127c478bd9Sstevel@tonic-gate i++; 2137c478bd9Sstevel@tonic-gate } 2147c478bd9Sstevel@tonic-gate pptr->p_aliases[i] = NULL; 2157c478bd9Sstevel@tonic-gate 2167c478bd9Sstevel@tonic-gate return (PROTO_R_OK); 2177c478bd9Sstevel@tonic-gate } 2187c478bd9Sstevel@tonic-gate #endif /* PROTOENT_DATA */ 2197c478bd9Sstevel@tonic-gate #else /* PROTO_R_RETURN */ 2207c478bd9Sstevel@tonic-gate static int getprotoent_r_unknown_system = 0; 2217c478bd9Sstevel@tonic-gate #endif /* PROTO_R_RETURN */ 2227c478bd9Sstevel@tonic-gate #endif /* !defined(_REENTRANT) || !defined(DO_PTHREADS) */ 223*9525b14bSRao Shoaib /*! \file */ 224