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