|
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 |
}
|