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 * gid name -> number 28 */ 29 30#if defined(__STDPP__directive) && defined(__STDPP__hide) 31__STDPP__directive pragma pp:hide getgrgid getgrnam getpwnam 32#else 33#define getgrgid ______getgrgid 34#define getgrnam ______getgrnam 35#define getpwnam ______getpwnam 36#endif 37 38#include <ast.h> 39#include <cdt.h> 40#include <pwd.h> 41#include <grp.h> 42 43#if defined(__STDPP__directive) && defined(__STDPP__hide) 44__STDPP__directive pragma pp:nohide getgrgid getgrnam getpwnam 45#else 46#undef getgrgid 47#undef getgrnam 48#undef getpwnam 49#endif 50 51extern struct group* getgrgid(gid_t); 52extern struct group* getgrnam(const char*); 53extern struct passwd* getpwnam(const char*); 54 55typedef struct Id_s 56{ 57 Dtlink_t link; 58 int id; 59 char name[1]; 60} Id_t; 61 62/* 63 * return gid number given gid/uid name 64 * gid attempted first, then uid->pw_gid 65 * -1 on first error for a given name 66 * -2 on subsequent errors for a given name 67 */ 68 69int 70strgid(const char* name) 71{ 72 register Id_t* ip; 73 register struct group* gr; 74 register struct passwd* pw; 75 int id; 76 char* e; 77 78 static Dt_t* dict; 79 static Dtdisc_t disc; 80 81 if (!dict) 82 { 83 disc.key = offsetof(Id_t, name); 84 dict = dtopen(&disc, Dthash); 85 } 86 else if (ip = (Id_t*)dtmatch(dict, name)) 87 return ip->id; 88 if (gr = getgrnam(name)) 89 id = gr->gr_gid; 90 else if (pw = getpwnam(name)) 91 id = pw->pw_gid; 92 else 93 { 94 id = strtol(name, &e, 0); 95#if _WINIX 96 if (!*e) 97 { 98 if (!getgrgid(id)) 99 id = -1; 100 } 101 else if (!streq(name, "sys")) 102 id = -1; 103 else if (gr = getgrnam("Administrators")) 104 id = gr->gr_gid; 105 else if (pw = getpwnam("Administrator")) 106 id = pw->pw_gid; 107 else 108 id = -1; 109#else 110 if (*e || !getgrgid(id)) 111 id = -1; 112#endif 113 } 114 if (dict && (ip = newof(0, Id_t, 1, strlen(name)))) 115 { 116 strcpy(ip->name, name); 117 ip->id = id >= 0 ? id : -2; 118 dtinsert(dict, ip); 119 } 120 return id; 121} 122