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