getgrent.c revision 36e852a172cba914383d7341c988128b2c667fbd
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* nis/getgrent.c -- "nis" backend for nsswitch "group" database
*/
#include <grp.h>
#include <pwd.h>
#include "nis_common.h"
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
static nss_status_t
void *a;
{
}
static nss_status_t
void *a;
{
return (NSS_NOTFOUND);
}
/*
* Validates group entry replacing gid > MAXUID by GID_NOBODY.
*/
int
{
/* +/- entries valid for compat source only */
return (NSS_STR_PARSE_SUCCESS);
continue;
continue;
return (NSS_STR_PARSE_PARSE);
return (NSS_STR_PARSE_PARSE);
return (NSS_STR_PARSE_SUCCESS);
if (newlinelen > linelen) {
/* need a larger buffer */
return (NSS_STR_PARSE_ERANGE);
/* Replace ephemeral ids by ID_NOBODY in the new buffer */
*linelenp = newlinelen;
return (NSS_STR_PARSE_SUCCESS);
}
/* Replace ephemeral gid by GID_NOBODY in the same buffer */
*linelenp = newlinelen;
return (NSS_STR_PARSE_SUCCESS);
}
static nss_status_t
getbymember(be, a)
void *a;
{
/*
* not in NIS
* If we don't do this, a hung name-service may cause
* a root login or su to hang.
*/
return (NSS_NOTFOUND);
}
switch (netid_lookup(argp)) {
case NSS_SUCCESS:
/*
* Return SUCESS only if array is full. Explained
* in <nss_dbdefs.h>.
*/
: NSS_NOTFOUND);
case NSS_NOTFOUND:
case NSS_UNAVAIL:
/*
* Failover to group map search if no luck with netid.
*/
break;
case NSS_TRYAGAIN:
return (NSS_TRYAGAIN);
}
}
}
static nis_backend_op_t group_ops[] = {
};
/*ARGSUSED*/
{
return (_nss_nis_constr(group_ops,
"group.byname"));
}
/*
* Add gid to gid_array if it's not already there. gid_array must have room
* for one more entry. Return new size of array.
*/
static int
{
int i = 0;
for (i = 0; i < numgids; i++) {
return (numgids);
}
}
return (numgids);
}
/*
* Given buf, a null-terminated string containing the result of a successful
* netid lookup, add the gids to the gid_array. The string may contain extra
* whitesapce. On parse error, the valid portion of the gid_array is not
* modified.
*/
static int
{
int numgids = *numgids_ptr;
char *buf_next;
long value;
/* Scan past "<uid>:" */
buf++;
}
if (*buf++ != ':') {
return (NSS_STR_PARSE_PARSE);
}
/* buf should now point to a comma-separated list of gids */
errno = 0;
return (NSS_STR_PARSE_PARSE);
return (NSS_STR_PARSE_ERANGE);
}
}
if (*buf == ',') {
buf++;
}
}
*numgids_ptr = numgids;
return (NSS_STR_PARSE_SUCCESS);
}
/*
* Perform a lookup in the netid map. Fill in the gid_array if successful.
* Return values are like those for _nss_nis_lookup().
*/
static nss_status_t
{
const char *domain = _nss_nis_domain();
char pwbuf[NSS_BUFLEN_PASSWD];
char *val;
int vallen;
int parse_res;
char *lasts;
/*
* Need to build up the netname for the user manually. Can't use
* user2netname() rpc library call, since that does all sorts of
* extra stuff based upon its own private name-service switch.
*
* Note that "root" has no user netname so return in error.
*/
return (NSS_UNAVAIL);
}
return (NSS_UNAVAIL);
}
return (res);
}
return ((parse_res == NSS_STR_PARSE_SUCCESS)
? NSS_SUCCESS : NSS_NOTFOUND);
}