xref: /onnv-gate/usr/src/lib/libast/common/string/strgid.c (revision 12068:08a39a083754)
14887Schin /***********************************************************************
24887Schin *                                                                      *
34887Schin *               This software is part of the ast package               *
4*12068SRoger.Faulkner@Oracle.COM *          Copyright (c) 1985-2010 AT&T Intellectual Property          *
54887Schin *                      and is licensed under the                       *
64887Schin *                  Common Public License, Version 1.0                  *
78462SApril.Chin@Sun.COM *                    by AT&T Intellectual Property                     *
84887Schin *                                                                      *
94887Schin *                A copy of the License is available at                 *
104887Schin *            http://www.opensource.org/licenses/cpl1.0.txt             *
114887Schin *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
124887Schin *                                                                      *
134887Schin *              Information and Software Systems Research               *
144887Schin *                            AT&T Research                             *
154887Schin *                           Florham Park NJ                            *
164887Schin *                                                                      *
174887Schin *                 Glenn Fowler <gsf@research.att.com>                  *
184887Schin *                  David Korn <dgk@research.att.com>                   *
194887Schin *                   Phong Vo <kpv@research.att.com>                    *
204887Schin *                                                                      *
214887Schin ***********************************************************************/
224887Schin #pragma prototyped
234887Schin /*
244887Schin  * Glenn Fowler
254887Schin  * AT&T Bell Laboratories
264887Schin  *
274887Schin  * gid name -> number
284887Schin  */
294887Schin 
304887Schin #if defined(__STDPP__directive) && defined(__STDPP__hide)
314887Schin __STDPP__directive pragma pp:hide getgrgid getgrnam getpwnam
324887Schin #else
334887Schin #define getgrgid	______getgrgid
344887Schin #define getgrnam	______getgrnam
354887Schin #define getpwnam	______getpwnam
364887Schin #endif
374887Schin 
384887Schin #include <ast.h>
394887Schin #include <cdt.h>
404887Schin #include <pwd.h>
414887Schin #include <grp.h>
424887Schin 
434887Schin #if defined(__STDPP__directive) && defined(__STDPP__hide)
444887Schin __STDPP__directive pragma pp:nohide getgrgid getgrnam getpwnam
454887Schin #else
464887Schin #undef	getgrgid
474887Schin #undef	getgrnam
484887Schin #undef	getpwnam
494887Schin #endif
504887Schin 
514887Schin extern struct group*	getgrgid(gid_t);
524887Schin extern struct group*	getgrnam(const char*);
534887Schin extern struct passwd*	getpwnam(const char*);
544887Schin 
554887Schin typedef struct Id_s
564887Schin {
574887Schin 	Dtlink_t	link;
584887Schin 	int		id;
594887Schin 	char		name[1];
604887Schin } Id_t;
614887Schin 
624887Schin /*
634887Schin  * return gid number given gid/uid name
644887Schin  * gid attempted first, then uid->pw_gid
654887Schin  * -1 on first error for a given name
664887Schin  * -2 on subsequent errors for a given name
674887Schin  */
684887Schin 
694887Schin int
strgid(const char * name)704887Schin strgid(const char* name)
714887Schin {
724887Schin 	register Id_t*		ip;
734887Schin 	register struct group*	gr;
744887Schin 	register struct passwd*	pw;
754887Schin 	int			id;
764887Schin 	char*			e;
774887Schin 
784887Schin 	static Dt_t*		dict;
794887Schin 	static Dtdisc_t		disc;
804887Schin 
814887Schin 	if (!dict)
824887Schin 	{
834887Schin 		disc.key = offsetof(Id_t, name);
844887Schin 		dict = dtopen(&disc, Dthash);
854887Schin 	}
864887Schin 	else if (ip = (Id_t*)dtmatch(dict, name))
874887Schin 		return ip->id;
884887Schin 	if (gr = getgrnam(name))
894887Schin 		id = gr->gr_gid;
904887Schin 	else if (pw = getpwnam(name))
914887Schin 		id = pw->pw_gid;
924887Schin 	else
934887Schin 	{
944887Schin 		id = strtol(name, &e, 0);
954887Schin #if _WINIX
964887Schin 		if (!*e)
974887Schin 		{
984887Schin 			if (!getgrgid(id))
994887Schin 				id = -1;
1004887Schin 		}
1014887Schin 		else if (!streq(name, "sys"))
1024887Schin 			id = -1;
1034887Schin 		else if (gr = getgrnam("Administrators"))
1044887Schin 			id = gr->gr_gid;
1054887Schin 		else if (pw = getpwnam("Administrator"))
1064887Schin 			id = pw->pw_gid;
1074887Schin 		else
1084887Schin 			id = -1;
1094887Schin #else
1104887Schin 		if (*e || !getgrgid(id))
1114887Schin 			id = -1;
1124887Schin #endif
1134887Schin 	}
1144887Schin 	if (dict && (ip = newof(0, Id_t, 1, strlen(name))))
1154887Schin 	{
1164887Schin 		strcpy(ip->name, name);
1174887Schin 		ip->id = id >= 0 ? id : -2;
1184887Schin 		dtinsert(dict, ip);
1194887Schin 	}
1204887Schin 	return id;
1214887Schin }
122