1 /*********************************************************************** 2 * * 3 * This software is part of the ast package * 4 * Copyright (c) 1985-2009 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 51 extern struct group* getgrgid(gid_t); 52 extern struct group* getgrnam(const char*); 53 extern struct passwd* getpwnam(const char*); 54 55 typedef 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 69 int 70 strgid(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