10Sstevel@tonic-gate /* 2*11038SRao.Shoaib@Sun.COM * Copyright (C) 2004, 2005, 2008 Internet Systems Consortium, Inc. ("ISC") 3*11038SRao.Shoaib@Sun.COM * Copyright (C) 1998, 1999, 2001, 2003 Internet Software Consortium. 40Sstevel@tonic-gate * 5*11038SRao.Shoaib@Sun.COM * Permission to use, copy, modify, and/or distribute this software for any 60Sstevel@tonic-gate * purpose with or without fee is hereby granted, provided that the above 70Sstevel@tonic-gate * copyright notice and this permission notice appear in all copies. 80Sstevel@tonic-gate * 9*11038SRao.Shoaib@Sun.COM * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 10*11038SRao.Shoaib@Sun.COM * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11*11038SRao.Shoaib@Sun.COM * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 12*11038SRao.Shoaib@Sun.COM * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13*11038SRao.Shoaib@Sun.COM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 14*11038SRao.Shoaib@Sun.COM * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15*11038SRao.Shoaib@Sun.COM * PERFORMANCE OF THIS SOFTWARE. 160Sstevel@tonic-gate */ 170Sstevel@tonic-gate 180Sstevel@tonic-gate #if defined(LIBC_SCCS) && !defined(lint) 19*11038SRao.Shoaib@Sun.COM static const char rcsid[] = "$Id: getnetgrent_r.c,v 1.14 2008/11/14 02:36:51 marka Exp $"; 200Sstevel@tonic-gate #endif /* LIBC_SCCS and not lint */ 210Sstevel@tonic-gate 220Sstevel@tonic-gate #include <port_before.h> 230Sstevel@tonic-gate #if !defined(_REENTRANT) || !defined(DO_PTHREADS) 240Sstevel@tonic-gate static int getnetgrent_r_not_required = 0; 250Sstevel@tonic-gate #else 260Sstevel@tonic-gate #include <errno.h> 270Sstevel@tonic-gate #include <string.h> 280Sstevel@tonic-gate #include <stdio.h> 290Sstevel@tonic-gate #include <sys/types.h> 300Sstevel@tonic-gate #include <netinet/in.h> 310Sstevel@tonic-gate #include <netdb.h> 320Sstevel@tonic-gate #include <stdlib.h> 330Sstevel@tonic-gate #include <port_after.h> 340Sstevel@tonic-gate 350Sstevel@tonic-gate #ifdef NGR_R_RETURN 36*11038SRao.Shoaib@Sun.COM #ifndef NGR_R_PRIVATE 37*11038SRao.Shoaib@Sun.COM #define NGR_R_PRIVATE 0 38*11038SRao.Shoaib@Sun.COM #endif 390Sstevel@tonic-gate 40*11038SRao.Shoaib@Sun.COM static NGR_R_RETURN 41*11038SRao.Shoaib@Sun.COM copy_protoent(NGR_R_CONST char **, NGR_R_CONST char **, NGR_R_CONST char **, 42*11038SRao.Shoaib@Sun.COM const char *, const char *, const char *, NGR_R_COPY_ARGS); 430Sstevel@tonic-gate 440Sstevel@tonic-gate NGR_R_RETURN 450Sstevel@tonic-gate innetgr_r(const char *netgroup, const char *host, const char *user, 460Sstevel@tonic-gate const char *domain) { 470Sstevel@tonic-gate char *ng, *ho, *us, *dom; 480Sstevel@tonic-gate 490Sstevel@tonic-gate DE_CONST(netgroup, ng); 500Sstevel@tonic-gate DE_CONST(host, ho); 510Sstevel@tonic-gate DE_CONST(user, us); 520Sstevel@tonic-gate DE_CONST(domain, dom); 530Sstevel@tonic-gate 540Sstevel@tonic-gate return (innetgr(ng, ho, us, dom)); 550Sstevel@tonic-gate } 560Sstevel@tonic-gate 57*11038SRao.Shoaib@Sun.COM /*% 580Sstevel@tonic-gate * These assume a single context is in operation per thread. 590Sstevel@tonic-gate * If this is not the case we will need to call irs directly 600Sstevel@tonic-gate * rather than through the base functions. 610Sstevel@tonic-gate */ 620Sstevel@tonic-gate 630Sstevel@tonic-gate NGR_R_RETURN 64*11038SRao.Shoaib@Sun.COM getnetgrent_r(NGR_R_CONST char **machinep, NGR_R_CONST char **userp, 65*11038SRao.Shoaib@Sun.COM NGR_R_CONST char **domainp, NGR_R_ARGS) 66*11038SRao.Shoaib@Sun.COM { 67*11038SRao.Shoaib@Sun.COM NGR_R_CONST char *mp, *up, *dp; 680Sstevel@tonic-gate int res = getnetgrent(&mp, &up, &dp); 690Sstevel@tonic-gate 70*11038SRao.Shoaib@Sun.COM if (res != 1) 710Sstevel@tonic-gate return (res); 720Sstevel@tonic-gate 730Sstevel@tonic-gate return (copy_protoent(machinep, userp, domainp, 740Sstevel@tonic-gate mp, up, dp, NGR_R_COPY)); 750Sstevel@tonic-gate } 760Sstevel@tonic-gate 77*11038SRao.Shoaib@Sun.COM #if NGR_R_PRIVATE == 2 78*11038SRao.Shoaib@Sun.COM struct private { 79*11038SRao.Shoaib@Sun.COM char *buf; 80*11038SRao.Shoaib@Sun.COM }; 81*11038SRao.Shoaib@Sun.COM 82*11038SRao.Shoaib@Sun.COM #endif 830Sstevel@tonic-gate NGR_R_SET_RETURN 84*11038SRao.Shoaib@Sun.COM #ifdef NGR_R_SET_ARGS 85*11038SRao.Shoaib@Sun.COM setnetgrent_r(NGR_R_SET_CONST char *netgroup, NGR_R_SET_ARGS) 860Sstevel@tonic-gate #else 87*11038SRao.Shoaib@Sun.COM setnetgrent_r(NGR_R_SET_CONST char *netgroup) 880Sstevel@tonic-gate #endif 890Sstevel@tonic-gate { 90*11038SRao.Shoaib@Sun.COM #if NGR_R_PRIVATE == 2 91*11038SRao.Shoaib@Sun.COM struct private *p; 92*11038SRao.Shoaib@Sun.COM #endif 93*11038SRao.Shoaib@Sun.COM char *tmp; 94*11038SRao.Shoaib@Sun.COM #if defined(NGR_R_SET_ARGS) && NGR_R_PRIVATE == 0 95*11038SRao.Shoaib@Sun.COM UNUSED(buf); 96*11038SRao.Shoaib@Sun.COM UNUSED(buflen); 97*11038SRao.Shoaib@Sun.COM #endif 98*11038SRao.Shoaib@Sun.COM 99*11038SRao.Shoaib@Sun.COM DE_CONST(netgroup, tmp); 100*11038SRao.Shoaib@Sun.COM setnetgrent(tmp); 101*11038SRao.Shoaib@Sun.COM 102*11038SRao.Shoaib@Sun.COM #if NGR_R_PRIVATE == 1 1030Sstevel@tonic-gate *buf = NULL; 104*11038SRao.Shoaib@Sun.COM #elif NGR_R_PRIVATE == 2 105*11038SRao.Shoaib@Sun.COM *buf = p = malloc(sizeof(struct private)); 106*11038SRao.Shoaib@Sun.COM if (p == NULL) 107*11038SRao.Shoaib@Sun.COM #ifdef NGR_R_SET_RESULT 108*11038SRao.Shoaib@Sun.COM return (NGR_R_BAD); 109*11038SRao.Shoaib@Sun.COM #else 110*11038SRao.Shoaib@Sun.COM return; 111*11038SRao.Shoaib@Sun.COM #endif 112*11038SRao.Shoaib@Sun.COM p->buf = NULL; 1130Sstevel@tonic-gate #endif 1140Sstevel@tonic-gate #ifdef NGR_R_SET_RESULT 1150Sstevel@tonic-gate return (NGR_R_SET_RESULT); 1160Sstevel@tonic-gate #endif 1170Sstevel@tonic-gate } 1180Sstevel@tonic-gate 1190Sstevel@tonic-gate NGR_R_END_RETURN 120*11038SRao.Shoaib@Sun.COM #ifdef NGR_R_END_ARGS 121*11038SRao.Shoaib@Sun.COM endnetgrent_r(NGR_R_END_ARGS) 1220Sstevel@tonic-gate #else 1230Sstevel@tonic-gate endnetgrent_r(void) 1240Sstevel@tonic-gate #endif 1250Sstevel@tonic-gate { 126*11038SRao.Shoaib@Sun.COM #if NGR_R_PRIVATE == 2 127*11038SRao.Shoaib@Sun.COM struct private *p = buf; 128*11038SRao.Shoaib@Sun.COM #endif 129*11038SRao.Shoaib@Sun.COM #if defined(NGR_R_SET_ARGS) && NGR_R_PRIVATE == 0 130*11038SRao.Shoaib@Sun.COM UNUSED(buf); 131*11038SRao.Shoaib@Sun.COM UNUSED(buflen); 132*11038SRao.Shoaib@Sun.COM #endif 133*11038SRao.Shoaib@Sun.COM 1340Sstevel@tonic-gate endnetgrent(); 135*11038SRao.Shoaib@Sun.COM #if NGR_R_PRIVATE == 1 1360Sstevel@tonic-gate if (*buf != NULL) 1370Sstevel@tonic-gate free(*buf); 1380Sstevel@tonic-gate *buf = NULL; 139*11038SRao.Shoaib@Sun.COM #elif NGR_R_PRIVATE == 2 140*11038SRao.Shoaib@Sun.COM if (p->buf != NULL) 141*11038SRao.Shoaib@Sun.COM free(p->buf); 142*11038SRao.Shoaib@Sun.COM free(p); 1430Sstevel@tonic-gate #endif 1440Sstevel@tonic-gate NGR_R_END_RESULT(NGR_R_OK); 1450Sstevel@tonic-gate } 1460Sstevel@tonic-gate 1470Sstevel@tonic-gate /* Private */ 1480Sstevel@tonic-gate 1490Sstevel@tonic-gate static int 150*11038SRao.Shoaib@Sun.COM copy_protoent(NGR_R_CONST char **machinep, NGR_R_CONST char **userp, 151*11038SRao.Shoaib@Sun.COM NGR_R_CONST char **domainp, const char *mp, const char *up, 152*11038SRao.Shoaib@Sun.COM const char *dp, NGR_R_COPY_ARGS) 153*11038SRao.Shoaib@Sun.COM { 154*11038SRao.Shoaib@Sun.COM #if NGR_R_PRIVATE == 2 155*11038SRao.Shoaib@Sun.COM struct private *p = buf; 156*11038SRao.Shoaib@Sun.COM #endif 1570Sstevel@tonic-gate char *cp; 1580Sstevel@tonic-gate int n; 1590Sstevel@tonic-gate int len; 1600Sstevel@tonic-gate 1610Sstevel@tonic-gate /* Find out the amount of space required to store the answer. */ 1620Sstevel@tonic-gate len = 0; 1630Sstevel@tonic-gate if (mp != NULL) len += strlen(mp) + 1; 1640Sstevel@tonic-gate if (up != NULL) len += strlen(up) + 1; 1650Sstevel@tonic-gate if (dp != NULL) len += strlen(dp) + 1; 166*11038SRao.Shoaib@Sun.COM 167*11038SRao.Shoaib@Sun.COM #if NGR_R_PRIVATE == 1 168*11038SRao.Shoaib@Sun.COM if (*buf != NULL) 169*11038SRao.Shoaib@Sun.COM free(*buf); 1700Sstevel@tonic-gate *buf = malloc(len); 1710Sstevel@tonic-gate if (*buf == NULL) 1720Sstevel@tonic-gate return(NGR_R_BAD); 1730Sstevel@tonic-gate cp = *buf; 174*11038SRao.Shoaib@Sun.COM #elif NGR_R_PRIVATE == 2 175*11038SRao.Shoaib@Sun.COM if (p->buf) 176*11038SRao.Shoaib@Sun.COM free(p->buf); 177*11038SRao.Shoaib@Sun.COM p->buf = malloc(len); 178*11038SRao.Shoaib@Sun.COM if (p->buf == NULL) 179*11038SRao.Shoaib@Sun.COM return(NGR_R_BAD); 180*11038SRao.Shoaib@Sun.COM cp = p->buf; 1810Sstevel@tonic-gate #else 1820Sstevel@tonic-gate if (len > (int)buflen) { 1830Sstevel@tonic-gate errno = ERANGE; 1840Sstevel@tonic-gate return (NGR_R_BAD); 1850Sstevel@tonic-gate } 1860Sstevel@tonic-gate cp = buf; 1870Sstevel@tonic-gate #endif 1880Sstevel@tonic-gate 1890Sstevel@tonic-gate if (mp != NULL) { 1900Sstevel@tonic-gate n = strlen(mp) + 1; 1910Sstevel@tonic-gate strcpy(cp, mp); 1920Sstevel@tonic-gate *machinep = cp; 1930Sstevel@tonic-gate cp += n; 1940Sstevel@tonic-gate } else 1950Sstevel@tonic-gate *machinep = NULL; 1960Sstevel@tonic-gate 1970Sstevel@tonic-gate if (up != NULL) { 1980Sstevel@tonic-gate n = strlen(up) + 1; 1990Sstevel@tonic-gate strcpy(cp, up); 2000Sstevel@tonic-gate *userp = cp; 2010Sstevel@tonic-gate cp += n; 2020Sstevel@tonic-gate } else 2030Sstevel@tonic-gate *userp = NULL; 2040Sstevel@tonic-gate 2050Sstevel@tonic-gate if (dp != NULL) { 2060Sstevel@tonic-gate n = strlen(dp) + 1; 2070Sstevel@tonic-gate strcpy(cp, dp); 2080Sstevel@tonic-gate *domainp = cp; 2090Sstevel@tonic-gate cp += n; 2100Sstevel@tonic-gate } else 2110Sstevel@tonic-gate *domainp = NULL; 2120Sstevel@tonic-gate 2130Sstevel@tonic-gate return (NGR_R_OK); 2140Sstevel@tonic-gate } 2150Sstevel@tonic-gate #else /* NGR_R_RETURN */ 2160Sstevel@tonic-gate static int getnetgrent_r_unknown_system = 0; 2170Sstevel@tonic-gate #endif /* NGR_R_RETURN */ 2180Sstevel@tonic-gate #endif /* !defined(_REENTRANT) || !defined(DO_PTHREADS) */ 219*11038SRao.Shoaib@Sun.COM /*! \file */ 220