1/* 2 * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") 3 * Copyright (c) 1996,1999 by Internet Software Consortium. 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 15 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18#if !defined(LINT) && !defined(CODECENTER) 19static const char rcsid[] = "$Id: getpwent.c,v 1.3 2005/04/27 04:56:26 sra Exp $"; 20#endif 21 22/* Imports */ 23 24#include "port_before.h" 25 26#if !defined(WANT_IRS_PW) || defined(__BIND_NOSTATIC) 27static int __bind_irs_pw_unneeded; 28#else 29 30#include <sys/types.h> 31 32#include <netinet/in.h> 33#include <arpa/nameser.h> 34 35#include <errno.h> 36#include <pwd.h> 37#include <resolv.h> 38#include <stdio.h> 39#include <string.h> 40 41#include <irs.h> 42 43#include "port_after.h" 44 45#include "irs_data.h" 46 47/* Forward */ 48 49static struct net_data * init(void); 50 51/* Public */ 52 53struct passwd * 54getpwent(void) { 55 struct net_data *net_data = init(); 56 57 return (getpwent_p(net_data)); 58} 59 60struct passwd * 61getpwnam(const char *name) { 62 struct net_data *net_data = init(); 63 64 return (getpwnam_p(name, net_data)); 65} 66 67struct passwd * 68getpwuid(uid_t uid) { 69 struct net_data *net_data = init(); 70 71 return (getpwuid_p(uid, net_data)); 72} 73 74int 75setpassent(int stayopen) { 76 struct net_data *net_data = init(); 77 78 return (setpassent_p(stayopen, net_data)); 79} 80 81#ifdef SETPWENT_VOID 82void 83setpwent() { 84 struct net_data *net_data = init(); 85 86 setpwent_p(net_data); 87} 88#else 89int 90setpwent() { 91 struct net_data *net_data = init(); 92 93 return (setpwent_p(net_data)); 94} 95#endif 96 97void 98endpwent() { 99 struct net_data *net_data = init(); 100 101 endpwent_p(net_data); 102} 103 104/* Shared private. */ 105 106struct passwd * 107getpwent_p(struct net_data *net_data) { 108 struct irs_pw *pw; 109 110 if (!net_data || !(pw = net_data->pw)) 111 return (NULL); 112 net_data->pw_last = (*pw->next)(pw); 113 return (net_data->pw_last); 114} 115 116struct passwd * 117getpwnam_p(const char *name, struct net_data *net_data) { 118 struct irs_pw *pw; 119 120 if (!net_data || !(pw = net_data->pw)) 121 return (NULL); 122 if (net_data->pw_stayopen && net_data->pw_last && 123 !strcmp(net_data->pw_last->pw_name, name)) 124 return (net_data->pw_last); 125 net_data->pw_last = (*pw->byname)(pw, name); 126 if (!net_data->pw_stayopen) 127 endpwent(); 128 return (net_data->pw_last); 129} 130 131struct passwd * 132getpwuid_p(uid_t uid, struct net_data *net_data) { 133 struct irs_pw *pw; 134 135 if (!net_data || !(pw = net_data->pw)) 136 return (NULL); 137 if (net_data->pw_stayopen && net_data->pw_last && 138 net_data->pw_last->pw_uid == uid) 139 return (net_data->pw_last); 140 net_data->pw_last = (*pw->byuid)(pw, uid); 141 if (!net_data->pw_stayopen) 142 endpwent(); 143 return (net_data->pw_last); 144} 145 146int 147setpassent_p(int stayopen, struct net_data *net_data) { 148 struct irs_pw *pw; 149 150 if (!net_data || !(pw = net_data->pw)) 151 return (0); 152 (*pw->rewind)(pw); 153 net_data->pw_stayopen = (stayopen != 0); 154 if (stayopen == 0) 155 net_data_minimize(net_data); 156 return (1); 157} 158 159#ifdef SETPWENT_VOID 160void 161setpwent_p(struct net_data *net_data) { 162 (void) setpassent_p(0, net_data); 163} 164#else 165int 166setpwent_p(struct net_data *net_data) { 167 return (setpassent_p(0, net_data)); 168} 169#endif 170 171void 172endpwent_p(struct net_data *net_data) { 173 struct irs_pw *pw; 174 175 if ((net_data != NULL) && ((pw = net_data->pw) != NULL)) 176 (*pw->minimize)(pw); 177} 178 179/* Private */ 180 181static struct net_data * 182init() { 183 struct net_data *net_data; 184 if (!(net_data = net_data_init(NULL))) 185 goto error; 186 if (!net_data->pw) { 187 net_data->pw = (*net_data->irs->pw_map)(net_data->irs); 188 189 if (!net_data->pw || !net_data->res) { 190 error: 191 errno = EIO; 192 return (NULL); 193 } 194 (*net_data->pw->res_set)(net_data->pw, net_data->res, NULL); 195 } 196 197 return (net_data); 198} 199 200#endif /* WANT_IRS_PW */ 201/*! \file */ 202