strgid.c revision 34f9b3eef6fdadbda0a846aa4d68691ac40eace5
6a67d144095c31bbafed93cec1619590157335eajvergara/***********************************************************************
6a67d144095c31bbafed93cec1619590157335eajvergara* *
6a67d144095c31bbafed93cec1619590157335eajvergara* This software is part of the ast package *
6a67d144095c31bbafed93cec1619590157335eajvergara* Copyright (c) 1985-2009 AT&T Intellectual Property *
6a67d144095c31bbafed93cec1619590157335eajvergara* and is licensed under the *
6a67d144095c31bbafed93cec1619590157335eajvergara* Common Public License, Version 1.0 *
6a67d144095c31bbafed93cec1619590157335eajvergara* by AT&T Intellectual Property *
6a67d144095c31bbafed93cec1619590157335eajvergara* *
6a67d144095c31bbafed93cec1619590157335eajvergara* A copy of the License is available at *
6a67d144095c31bbafed93cec1619590157335eajvergara* http://www.opensource.org/licenses/cpl1.0.txt *
6a67d144095c31bbafed93cec1619590157335eajvergara* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
6a67d144095c31bbafed93cec1619590157335eajvergara* *
6a67d144095c31bbafed93cec1619590157335eajvergara* Information and Software Systems Research *
6a67d144095c31bbafed93cec1619590157335eajvergara* AT&T Research *
6a67d144095c31bbafed93cec1619590157335eajvergara* Florham Park NJ *
6a67d144095c31bbafed93cec1619590157335eajvergara* *
6a67d144095c31bbafed93cec1619590157335eajvergara* Glenn Fowler <gsf@research.att.com> *
6a67d144095c31bbafed93cec1619590157335eajvergara* David Korn <dgk@research.att.com> *
f71f7a61dec7c9089378d14493ad564a1dedf0b5neil_a_wilson* Phong Vo <kpv@research.att.com> *
6a67d144095c31bbafed93cec1619590157335eajvergara* *
6a67d144095c31bbafed93cec1619590157335eajvergara***********************************************************************/
6a67d144095c31bbafed93cec1619590157335eajvergara#pragma prototyped
6a67d144095c31bbafed93cec1619590157335eajvergara/*
6a67d144095c31bbafed93cec1619590157335eajvergara * Glenn Fowler
d6c71e7b06ef8919af4c8186b4ffb08766c20a09neil_a_wilson * AT&T Bell Laboratories
6a67d144095c31bbafed93cec1619590157335eajvergara *
6a67d144095c31bbafed93cec1619590157335eajvergara * gid name -> number
6a67d144095c31bbafed93cec1619590157335eajvergara */
6a67d144095c31bbafed93cec1619590157335eajvergara
2401d3c2af505789c7c3b860a43e973f27731243jvergara#if defined(__STDPP__directive) && defined(__STDPP__hide)
6a67d144095c31bbafed93cec1619590157335eajvergara__STDPP__directive pragma pp:hide getgrgid getgrnam getpwnam
6a67d144095c31bbafed93cec1619590157335eajvergara#else
6a67d144095c31bbafed93cec1619590157335eajvergara#define getgrgid ______getgrgid
7b6b125d52edabd5b1c9134feef7aeae0e69499ekenneth_suter#define getgrnam ______getgrnam
7b6b125d52edabd5b1c9134feef7aeae0e69499ekenneth_suter#define getpwnam ______getpwnam
6a67d144095c31bbafed93cec1619590157335eajvergara#endif
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara#include <ast.h>
6a67d144095c31bbafed93cec1619590157335eajvergara#include <cdt.h>
6a67d144095c31bbafed93cec1619590157335eajvergara#include <pwd.h>
5b9085a87d43ed3ae0b149a9c79ba57723733185jvergara#include <grp.h>
6a67d144095c31bbafed93cec1619590157335eajvergara
0877596da3b90efc5fd39171cef80a2fb8ec395ekenneth_suter#if defined(__STDPP__directive) && defined(__STDPP__hide)
6a67d144095c31bbafed93cec1619590157335eajvergara__STDPP__directive pragma pp:nohide getgrgid getgrnam getpwnam
6a67d144095c31bbafed93cec1619590157335eajvergara#else
6a67d144095c31bbafed93cec1619590157335eajvergara#undef getgrgid
0877596da3b90efc5fd39171cef80a2fb8ec395ekenneth_suter#undef getgrnam
ffa279622cea61d6eec13e3df386bd3015388388jvergara#undef getpwnam
6a67d144095c31bbafed93cec1619590157335eajvergara#endif
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergaraextern struct group* getgrgid(gid_t);
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suterextern struct group* getgrnam(const char*);
6a67d144095c31bbafed93cec1619590157335eajvergaraextern struct passwd* getpwnam(const char*);
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergaratypedef struct Id_s
6a67d144095c31bbafed93cec1619590157335eajvergara{
6a67d144095c31bbafed93cec1619590157335eajvergara Dtlink_t link;
6a67d144095c31bbafed93cec1619590157335eajvergara int id;
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter char name[1];
6a67d144095c31bbafed93cec1619590157335eajvergara} Id_t;
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara/*
6a67d144095c31bbafed93cec1619590157335eajvergara * return gid number given gid/uid name
7b6b125d52edabd5b1c9134feef7aeae0e69499ekenneth_suter * gid attempted first, then uid->pw_gid
7b6b125d52edabd5b1c9134feef7aeae0e69499ekenneth_suter * -1 on first error for a given name
7b6b125d52edabd5b1c9134feef7aeae0e69499ekenneth_suter * -2 on subsequent errors for a given name
6a67d144095c31bbafed93cec1619590157335eajvergara */
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergaraint
6a67d144095c31bbafed93cec1619590157335eajvergarastrgid(const char* name)
6a67d144095c31bbafed93cec1619590157335eajvergara{
6a67d144095c31bbafed93cec1619590157335eajvergara register Id_t* ip;
6a67d144095c31bbafed93cec1619590157335eajvergara register struct group* gr;
6a67d144095c31bbafed93cec1619590157335eajvergara register struct passwd* pw;
6a67d144095c31bbafed93cec1619590157335eajvergara int id;
6a67d144095c31bbafed93cec1619590157335eajvergara char* e;
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara static Dt_t* dict;
3e6ff045d382a718a951d6305c8910ffc268f893kenneth_suter static Dtdisc_t disc;
6a67d144095c31bbafed93cec1619590157335eajvergara
6a67d144095c31bbafed93cec1619590157335eajvergara if (!dict)
6a67d144095c31bbafed93cec1619590157335eajvergara {
6a67d144095c31bbafed93cec1619590157335eajvergara disc.key = offsetof(Id_t, name);
6a67d144095c31bbafed93cec1619590157335eajvergara dict = dtopen(&disc, Dthash);
6a67d144095c31bbafed93cec1619590157335eajvergara }
857225469c51bedb8c0566aa7757800cfaac4075kenneth_suter else if (ip = (Id_t*)dtmatch(dict, name))
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter return ip->id;
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter if (gr = getgrnam(name))
2401d3c2af505789c7c3b860a43e973f27731243jvergara id = gr->gr_gid;
6a67d144095c31bbafed93cec1619590157335eajvergara else if (pw = getpwnam(name))
6a67d144095c31bbafed93cec1619590157335eajvergara id = pw->pw_gid;
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter else
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter {
6a67d144095c31bbafed93cec1619590157335eajvergara id = strtol(name, &e, 0);
857225469c51bedb8c0566aa7757800cfaac4075kenneth_suter#if _WINIX
6a67d144095c31bbafed93cec1619590157335eajvergara if (!*e)
6a67d144095c31bbafed93cec1619590157335eajvergara {
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter if (!getgrgid(id))
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter id = -1;
6a67d144095c31bbafed93cec1619590157335eajvergara }
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter else if (!streq(name, "sys"))
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter id = -1;
6a67d144095c31bbafed93cec1619590157335eajvergara else if (gr = getgrnam("Administrators"))
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter id = gr->gr_gid;
6a67d144095c31bbafed93cec1619590157335eajvergara else if (pw = getpwnam("Administrator"))
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter id = pw->pw_gid;
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter else
5b3741e0620fd2baaa974cecc2c2d953bb7d4fbbkenneth_suter id = -1;
6a67d144095c31bbafed93cec1619590157335eajvergara#else
6a67d144095c31bbafed93cec1619590157335eajvergara if (*e || !getgrgid(id))
5b9085a87d43ed3ae0b149a9c79ba57723733185jvergara id = -1;
6a67d144095c31bbafed93cec1619590157335eajvergara#endif
6a67d144095c31bbafed93cec1619590157335eajvergara }
6a67d144095c31bbafed93cec1619590157335eajvergara if (dict && (ip = newof(0, Id_t, 1, strlen(name))))
6a67d144095c31bbafed93cec1619590157335eajvergara {
6a67d144095c31bbafed93cec1619590157335eajvergara strcpy(ip->name, name);
6a67d144095c31bbafed93cec1619590157335eajvergara ip->id = id >= 0 ? id : -2;
6a67d144095c31bbafed93cec1619590157335eajvergara dtinsert(dict, ip);
6a67d144095c31bbafed93cec1619590157335eajvergara }
6a67d144095c31bbafed93cec1619590157335eajvergara return id;
6a67d144095c31bbafed93cec1619590157335eajvergara}
6a67d144095c31bbafed93cec1619590157335eajvergara