Blame src/lib/libast/string/struid.c

Packit 992a25
/***********************************************************************
Packit 992a25
*                                                                      *
Packit 992a25
*               This software is part of the ast package               *
Packit 992a25
*          Copyright (c) 1985-2011 AT&T Intellectual Property          *
Packit 992a25
*                      and is licensed under the                       *
Packit 992a25
*                 Eclipse Public License, Version 1.0                  *
Packit 992a25
*                    by AT&T Intellectual Property                     *
Packit 992a25
*                                                                      *
Packit 992a25
*                A copy of the License is available at                 *
Packit 992a25
*          http://www.eclipse.org/org/documents/epl-v10.html           *
Packit 992a25
*         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
Packit 992a25
*                                                                      *
Packit 992a25
*              Information and Software Systems Research               *
Packit 992a25
*                            AT&T Research                             *
Packit 992a25
*                           Florham Park NJ                            *
Packit 992a25
*                                                                      *
Packit 992a25
*                 Glenn Fowler <gsf@research.att.com>                  *
Packit 992a25
*                  David Korn <dgk@research.att.com>                   *
Packit 992a25
*                   Phong Vo <kpv@research.att.com>                    *
Packit 992a25
*                                                                      *
Packit 992a25
***********************************************************************/
Packit 992a25
#pragma prototyped
Packit 992a25
/*
Packit 992a25
 * Glenn Fowler
Packit 992a25
 * AT&T Bell Laboratories
Packit 992a25
 *
Packit 992a25
 * uid name -> number
Packit 992a25
 */
Packit 992a25
Packit 992a25
#if defined(__STDPP__directive) && defined(__STDPP__hide)
Packit 992a25
__STDPP__directive pragma pp:hide getpwnam getpwuid
Packit 992a25
#else
Packit 992a25
#define getpwnam	______getpwnam
Packit 992a25
#define getpwuid	______getpwuid
Packit 992a25
#endif
Packit 992a25
Packit 992a25
#include <ast.h>
Packit 992a25
#include <cdt.h>
Packit 992a25
#include <pwd.h>
Packit 992a25
Packit 992a25
#if defined(__STDPP__directive) && defined(__STDPP__hide)
Packit 992a25
__STDPP__directive pragma pp:nohide getpwnam getpwuid
Packit 992a25
#else
Packit 992a25
#undef	getpwnam
Packit 992a25
#undef	getpwuid
Packit 992a25
#endif
Packit 992a25
Packit 992a25
extern struct passwd*	getpwnam(const char*);
Packit 992a25
extern struct passwd*	getpwuid(uid_t);
Packit 992a25
Packit 992a25
typedef struct Id_s
Packit 992a25
{
Packit 992a25
	Dtlink_t	link;
Packit 992a25
	int		id;
Packit 992a25
	char		name[1];
Packit 992a25
} Id_t;
Packit 992a25
Packit 992a25
/*
Packit 992a25
 * return uid number given uid name
Packit 992a25
 * -1 on first error for a given name
Packit 992a25
 * -2 on subsequent errors for a given name
Packit 992a25
 */
Packit 992a25
Packit 992a25
int
Packit 992a25
struid(const char* name)
Packit 992a25
{
Packit 992a25
	register Id_t*		ip;
Packit 992a25
	register struct passwd*	pw;
Packit 992a25
	int			id;
Packit 992a25
	char*			e;
Packit 992a25
Packit 992a25
	static Dt_t*		dict;
Packit 992a25
	static Dtdisc_t		disc;
Packit 992a25
Packit 992a25
	if (!dict)
Packit 992a25
	{
Packit 992a25
		disc.key = offsetof(Id_t, name);
Packit 992a25
		dict = dtopen(&disc, Dtset);
Packit 992a25
	}
Packit 992a25
	else if (ip = (Id_t*)dtmatch(dict, name))
Packit 992a25
		return ip->id;
Packit 992a25
	if (pw = getpwnam(name))
Packit 992a25
		id = pw->pw_uid;
Packit 992a25
	else
Packit 992a25
	{
Packit 992a25
		id = strtol(name, &e, 0);
Packit 992a25
#if _WINIX
Packit 992a25
		if (!*e)
Packit 992a25
		{
Packit 992a25
			if (!getpwuid(id))
Packit 992a25
				id = -1;
Packit 992a25
		}
Packit 992a25
		else if (streq(name, "root") && (pw = getpwnam("Administrator")))
Packit 992a25
			id = pw->pw_uid;
Packit 992a25
		else
Packit 992a25
			id = -1;
Packit 992a25
#else
Packit 992a25
		if (*e || !getpwuid(id))
Packit 992a25
			id = -1;
Packit 992a25
#endif
Packit 992a25
	}
Packit 992a25
	if (dict && (ip = newof(0, Id_t, 1, strlen(name))))
Packit 992a25
	{
Packit 992a25
		strcpy(ip->name, name);
Packit 992a25
		ip->id = id >= 0 ? id : -2;
Packit 992a25
		dtinsert(dict, ip);
Packit 992a25
	}
Packit 992a25
	return id;
Packit 992a25
}