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: getservent_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 getservent_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 <sys/param.h> 337c478bd9Sstevel@tonic-gate #include <port_after.h> 347c478bd9Sstevel@tonic-gate 357c478bd9Sstevel@tonic-gate #ifdef SERV_R_RETURN 367c478bd9Sstevel@tonic-gate 377c478bd9Sstevel@tonic-gate static SERV_R_RETURN 387c478bd9Sstevel@tonic-gate copy_servent(struct servent *, struct servent *, SERV_R_COPY_ARGS); 397c478bd9Sstevel@tonic-gate 407c478bd9Sstevel@tonic-gate SERV_R_RETURN 417c478bd9Sstevel@tonic-gate getservbyname_r(const char *name, const char *proto, 427c478bd9Sstevel@tonic-gate struct servent *sptr, SERV_R_ARGS) { 437c478bd9Sstevel@tonic-gate struct servent *se = getservbyname(name, proto); 447c478bd9Sstevel@tonic-gate #ifdef SERV_R_SETANSWER 457c478bd9Sstevel@tonic-gate int n = 0; 467c478bd9Sstevel@tonic-gate 477c478bd9Sstevel@tonic-gate if (se == NULL || (n = copy_servent(se, sptr, SERV_R_COPY)) != 0) 487c478bd9Sstevel@tonic-gate *answerp = NULL; 497c478bd9Sstevel@tonic-gate else 507c478bd9Sstevel@tonic-gate *answerp = sptr; 517c478bd9Sstevel@tonic-gate 527c478bd9Sstevel@tonic-gate return (n); 537c478bd9Sstevel@tonic-gate #else 547c478bd9Sstevel@tonic-gate if (se == NULL) 557c478bd9Sstevel@tonic-gate return (SERV_R_BAD); 567c478bd9Sstevel@tonic-gate 577c478bd9Sstevel@tonic-gate return (copy_servent(se, sptr, SERV_R_COPY)); 587c478bd9Sstevel@tonic-gate #endif 597c478bd9Sstevel@tonic-gate } 607c478bd9Sstevel@tonic-gate 617c478bd9Sstevel@tonic-gate SERV_R_RETURN 627c478bd9Sstevel@tonic-gate getservbyport_r(int port, const char *proto, 637c478bd9Sstevel@tonic-gate struct servent *sptr, SERV_R_ARGS) { 647c478bd9Sstevel@tonic-gate struct servent *se = getservbyport(port, proto); 657c478bd9Sstevel@tonic-gate #ifdef SERV_R_SETANSWER 667c478bd9Sstevel@tonic-gate int n = 0; 677c478bd9Sstevel@tonic-gate 687c478bd9Sstevel@tonic-gate if (se == NULL || (n = copy_servent(se, sptr, SERV_R_COPY)) != 0) 697c478bd9Sstevel@tonic-gate *answerp = NULL; 707c478bd9Sstevel@tonic-gate else 717c478bd9Sstevel@tonic-gate *answerp = sptr; 727c478bd9Sstevel@tonic-gate 737c478bd9Sstevel@tonic-gate return (n); 747c478bd9Sstevel@tonic-gate #else 757c478bd9Sstevel@tonic-gate if (se == NULL) 767c478bd9Sstevel@tonic-gate return (SERV_R_BAD); 777c478bd9Sstevel@tonic-gate 787c478bd9Sstevel@tonic-gate return (copy_servent(se, sptr, SERV_R_COPY)); 797c478bd9Sstevel@tonic-gate #endif 807c478bd9Sstevel@tonic-gate } 817c478bd9Sstevel@tonic-gate 82*9525b14bSRao Shoaib /*% 837c478bd9Sstevel@tonic-gate * These assume a single context is in operation per thread. 847c478bd9Sstevel@tonic-gate * If this is not the case we will need to call irs directly 857c478bd9Sstevel@tonic-gate * rather than through the base functions. 867c478bd9Sstevel@tonic-gate */ 877c478bd9Sstevel@tonic-gate 887c478bd9Sstevel@tonic-gate SERV_R_RETURN 897c478bd9Sstevel@tonic-gate getservent_r(struct servent *sptr, SERV_R_ARGS) { 907c478bd9Sstevel@tonic-gate struct servent *se = getservent(); 917c478bd9Sstevel@tonic-gate #ifdef SERV_R_SETANSWER 927c478bd9Sstevel@tonic-gate int n = 0; 937c478bd9Sstevel@tonic-gate 947c478bd9Sstevel@tonic-gate if (se == NULL || (n = copy_servent(se, sptr, SERV_R_COPY)) != 0) 957c478bd9Sstevel@tonic-gate *answerp = NULL; 967c478bd9Sstevel@tonic-gate else 977c478bd9Sstevel@tonic-gate *answerp = sptr; 987c478bd9Sstevel@tonic-gate 997c478bd9Sstevel@tonic-gate return (n); 1007c478bd9Sstevel@tonic-gate #else 1017c478bd9Sstevel@tonic-gate if (se == NULL) 1027c478bd9Sstevel@tonic-gate return (SERV_R_BAD); 1037c478bd9Sstevel@tonic-gate 1047c478bd9Sstevel@tonic-gate return (copy_servent(se, sptr, SERV_R_COPY)); 1057c478bd9Sstevel@tonic-gate #endif 1067c478bd9Sstevel@tonic-gate } 1077c478bd9Sstevel@tonic-gate 1087c478bd9Sstevel@tonic-gate SERV_R_SET_RETURN 1097c478bd9Sstevel@tonic-gate #ifdef SERV_R_ENT_ARGS 1107c478bd9Sstevel@tonic-gate setservent_r(int stay_open, SERV_R_ENT_ARGS) 1117c478bd9Sstevel@tonic-gate #else 1127c478bd9Sstevel@tonic-gate setservent_r(int stay_open) 1137c478bd9Sstevel@tonic-gate #endif 1147c478bd9Sstevel@tonic-gate { 115*9525b14bSRao Shoaib #ifdef SERV_R_ENT_UNUSED 116*9525b14bSRao Shoaib SERV_R_ENT_UNUSED; 117*9525b14bSRao Shoaib #endif 1187c478bd9Sstevel@tonic-gate setservent(stay_open); 1197c478bd9Sstevel@tonic-gate #ifdef SERV_R_SET_RESULT 1207c478bd9Sstevel@tonic-gate return (SERV_R_SET_RESULT); 1217c478bd9Sstevel@tonic-gate #endif 1227c478bd9Sstevel@tonic-gate } 1237c478bd9Sstevel@tonic-gate 1247c478bd9Sstevel@tonic-gate SERV_R_END_RETURN 1257c478bd9Sstevel@tonic-gate #ifdef SERV_R_ENT_ARGS 1267c478bd9Sstevel@tonic-gate endservent_r(SERV_R_ENT_ARGS) 1277c478bd9Sstevel@tonic-gate #else 1287c478bd9Sstevel@tonic-gate endservent_r() 1297c478bd9Sstevel@tonic-gate #endif 1307c478bd9Sstevel@tonic-gate { 131*9525b14bSRao Shoaib #ifdef SERV_R_ENT_UNUSED 132*9525b14bSRao Shoaib SERV_R_ENT_UNUSED; 133*9525b14bSRao Shoaib #endif 1347c478bd9Sstevel@tonic-gate endservent(); 1357c478bd9Sstevel@tonic-gate SERV_R_END_RESULT(SERV_R_OK); 1367c478bd9Sstevel@tonic-gate } 1377c478bd9Sstevel@tonic-gate 1387c478bd9Sstevel@tonic-gate /* Private */ 1397c478bd9Sstevel@tonic-gate 1407c478bd9Sstevel@tonic-gate #ifndef SERVENT_DATA 1417c478bd9Sstevel@tonic-gate static SERV_R_RETURN 1427c478bd9Sstevel@tonic-gate copy_servent(struct servent *se, struct servent *sptr, SERV_R_COPY_ARGS) { 1437c478bd9Sstevel@tonic-gate char *cp; 1447c478bd9Sstevel@tonic-gate int i, n; 1457c478bd9Sstevel@tonic-gate int numptr, len; 1467c478bd9Sstevel@tonic-gate 1477c478bd9Sstevel@tonic-gate /* Find out the amount of space required to store the answer. */ 148*9525b14bSRao Shoaib numptr = 1; /*%< NULL ptr */ 1497c478bd9Sstevel@tonic-gate len = (char *)ALIGN(buf) - buf; 1507c478bd9Sstevel@tonic-gate for (i = 0; se->s_aliases[i]; i++, numptr++) { 1517c478bd9Sstevel@tonic-gate len += strlen(se->s_aliases[i]) + 1; 1527c478bd9Sstevel@tonic-gate } 1537c478bd9Sstevel@tonic-gate len += strlen(se->s_name) + 1; 1547c478bd9Sstevel@tonic-gate len += strlen(se->s_proto) + 1; 1557c478bd9Sstevel@tonic-gate len += numptr * sizeof(char*); 1567c478bd9Sstevel@tonic-gate 1577c478bd9Sstevel@tonic-gate if (len > (int)buflen) { 1587c478bd9Sstevel@tonic-gate errno = ERANGE; 1597c478bd9Sstevel@tonic-gate return (SERV_R_BAD); 1607c478bd9Sstevel@tonic-gate } 1617c478bd9Sstevel@tonic-gate 1627c478bd9Sstevel@tonic-gate /* copy port value */ 1637c478bd9Sstevel@tonic-gate sptr->s_port = se->s_port; 1647c478bd9Sstevel@tonic-gate 1657c478bd9Sstevel@tonic-gate cp = (char *)ALIGN(buf) + numptr * sizeof(char *); 1667c478bd9Sstevel@tonic-gate 1677c478bd9Sstevel@tonic-gate /* copy official name */ 1687c478bd9Sstevel@tonic-gate n = strlen(se->s_name) + 1; 1697c478bd9Sstevel@tonic-gate strcpy(cp, se->s_name); 1707c478bd9Sstevel@tonic-gate sptr->s_name = cp; 1717c478bd9Sstevel@tonic-gate cp += n; 1727c478bd9Sstevel@tonic-gate 1737c478bd9Sstevel@tonic-gate /* copy aliases */ 1747c478bd9Sstevel@tonic-gate sptr->s_aliases = (char **)ALIGN(buf); 1757c478bd9Sstevel@tonic-gate for (i = 0 ; se->s_aliases[i]; i++) { 1767c478bd9Sstevel@tonic-gate n = strlen(se->s_aliases[i]) + 1; 1777c478bd9Sstevel@tonic-gate strcpy(cp, se->s_aliases[i]); 1787c478bd9Sstevel@tonic-gate sptr->s_aliases[i] = cp; 1797c478bd9Sstevel@tonic-gate cp += n; 1807c478bd9Sstevel@tonic-gate } 1817c478bd9Sstevel@tonic-gate sptr->s_aliases[i] = NULL; 1827c478bd9Sstevel@tonic-gate 1837c478bd9Sstevel@tonic-gate /* copy proto */ 1847c478bd9Sstevel@tonic-gate n = strlen(se->s_proto) + 1; 1857c478bd9Sstevel@tonic-gate strcpy(cp, se->s_proto); 1867c478bd9Sstevel@tonic-gate sptr->s_proto = cp; 1877c478bd9Sstevel@tonic-gate cp += n; 1887c478bd9Sstevel@tonic-gate 1897c478bd9Sstevel@tonic-gate return (SERV_R_OK); 1907c478bd9Sstevel@tonic-gate } 1917c478bd9Sstevel@tonic-gate #else /* !SERVENT_DATA */ 1927c478bd9Sstevel@tonic-gate static int 1937c478bd9Sstevel@tonic-gate copy_servent(struct servent *se, struct servent *sptr, SERV_R_COPY_ARGS) { 1947c478bd9Sstevel@tonic-gate char *cp, *eob; 1957c478bd9Sstevel@tonic-gate int i, n; 1967c478bd9Sstevel@tonic-gate 1977c478bd9Sstevel@tonic-gate /* copy port value */ 1987c478bd9Sstevel@tonic-gate sptr->s_port = se->s_port; 1997c478bd9Sstevel@tonic-gate 2007c478bd9Sstevel@tonic-gate /* copy official name */ 201*9525b14bSRao Shoaib cp = sdptr->line; 202*9525b14bSRao Shoaib eob = sdptr->line + sizeof(sdptr->line); 2037c478bd9Sstevel@tonic-gate if ((n = strlen(se->s_name) + 1) < (eob - cp)) { 2047c478bd9Sstevel@tonic-gate strcpy(cp, se->s_name); 2057c478bd9Sstevel@tonic-gate sptr->s_name = cp; 2067c478bd9Sstevel@tonic-gate cp += n; 2077c478bd9Sstevel@tonic-gate } else { 2087c478bd9Sstevel@tonic-gate return (-1); 2097c478bd9Sstevel@tonic-gate } 2107c478bd9Sstevel@tonic-gate 2117c478bd9Sstevel@tonic-gate /* copy aliases */ 2127c478bd9Sstevel@tonic-gate i = 0; 213*9525b14bSRao Shoaib sptr->s_aliases = sdptr->serv_aliases; 2147c478bd9Sstevel@tonic-gate while (se->s_aliases[i] && i < (_MAXALIASES-1)) { 2157c478bd9Sstevel@tonic-gate if ((n = strlen(se->s_aliases[i]) + 1) < (eob - cp)) { 2167c478bd9Sstevel@tonic-gate strcpy(cp, se->s_aliases[i]); 2177c478bd9Sstevel@tonic-gate sptr->s_aliases[i] = cp; 2187c478bd9Sstevel@tonic-gate cp += n; 2197c478bd9Sstevel@tonic-gate } else { 2207c478bd9Sstevel@tonic-gate break; 2217c478bd9Sstevel@tonic-gate } 2227c478bd9Sstevel@tonic-gate i++; 2237c478bd9Sstevel@tonic-gate } 2247c478bd9Sstevel@tonic-gate sptr->s_aliases[i] = NULL; 2257c478bd9Sstevel@tonic-gate 2267c478bd9Sstevel@tonic-gate /* copy proto */ 2277c478bd9Sstevel@tonic-gate if ((n = strlen(se->s_proto) + 1) < (eob - cp)) { 2287c478bd9Sstevel@tonic-gate strcpy(cp, se->s_proto); 2297c478bd9Sstevel@tonic-gate sptr->s_proto = cp; 2307c478bd9Sstevel@tonic-gate cp += n; 2317c478bd9Sstevel@tonic-gate } else { 2327c478bd9Sstevel@tonic-gate return (-1); 2337c478bd9Sstevel@tonic-gate } 2347c478bd9Sstevel@tonic-gate 2357c478bd9Sstevel@tonic-gate return (SERV_R_OK); 2367c478bd9Sstevel@tonic-gate } 2377c478bd9Sstevel@tonic-gate #endif /* !SERVENT_DATA */ 2387c478bd9Sstevel@tonic-gate #else /*SERV_R_RETURN */ 2397c478bd9Sstevel@tonic-gate static int getservent_r_unknown_system = 0; 2407c478bd9Sstevel@tonic-gate #endif /*SERV_R_RETURN */ 2417c478bd9Sstevel@tonic-gate #endif /* !defined(_REENTRANT) || !defined(DO_PTHREADS) */ 242*9525b14bSRao Shoaib /*! \file */ 243