1/*********************************************************************** 2* * 3* This software is part of the ast package * 4* Copyright (c) 1985-2011 AT&T Intellectual Property * 5* and is licensed under the * 6* Common Public License, Version 1.0 * 7* by AT&T Intellectual Property * 8* * 9* A copy of the License is available at * 10* http://www.opensource.org/licenses/cpl1.0.txt * 11* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 12* * 13* Information and Software Systems Research * 14* AT&T Research * 15* Florham Park NJ * 16* * 17* Glenn Fowler <gsf@research.att.com> * 18* David Korn <dgk@research.att.com> * 19* Phong Vo <kpv@research.att.com> * 20* * 21***********************************************************************/ 22#pragma prototyped 23/* 24 * Glenn Fowler 25 * AT&T Bell Laboratories 26 * 27 * uid name -> number 28 */ 29 30#if defined(__STDPP__directive) && defined(__STDPP__hide) 31__STDPP__directive pragma pp:hide getpwnam getpwuid 32#else 33#define getpwnam ______getpwnam 34#define getpwuid ______getpwuid 35#endif 36 37#include <ast.h> 38#include <cdt.h> 39#include <pwd.h> 40 41#if defined(__STDPP__directive) && defined(__STDPP__hide) 42__STDPP__directive pragma pp:nohide getpwnam getpwuid 43#else 44#undef getpwnam 45#undef getpwuid 46#endif 47 48extern struct passwd* getpwnam(const char*); 49extern struct passwd* getpwuid(uid_t); 50 51typedef struct Id_s 52{ 53 Dtlink_t link; 54 int id; 55 char name[1]; 56} Id_t; 57 58/* 59 * return uid number given uid name 60 * -1 on first error for a given name 61 * -2 on subsequent errors for a given name 62 */ 63 64int 65struid(const char* name) 66{ 67 register Id_t* ip; 68 register struct passwd* pw; 69 int id; 70 char* e; 71 72 static Dt_t* dict; 73 static Dtdisc_t disc; 74 75 if (!dict) 76 { 77 disc.key = offsetof(Id_t, name); 78 dict = dtopen(&disc, Dthash); 79 } 80 else if (ip = (Id_t*)dtmatch(dict, name)) 81 return ip->id; 82 if (pw = getpwnam(name)) 83 id = pw->pw_uid; 84 else 85 { 86 id = strtol(name, &e, 0); 87#if _WINIX 88 if (!*e) 89 { 90 if (!getpwuid(id)) 91 id = -1; 92 } 93 else if (streq(name, "root") && (pw = getpwnam("Administrator"))) 94 id = pw->pw_uid; 95 else 96 id = -1; 97#else 98 if (*e || !getpwuid(id)) 99 id = -1; 100#endif 101 } 102 if (dict && (ip = newof(0, Id_t, 1, strlen(name)))) 103 { 104 strcpy(ip->name, name); 105 ip->id = id >= 0 ? id : -2; 106 dtinsert(dict, ip); 107 } 108 return id; 109} 110