Blame ext/posix/grp.c

Packit 437b5e
/*
Packit 437b5e
 * POSIX library for Lua 5.1, 5.2 & 5.3.
Packit 437b5e
 * (c) Gary V. Vaughan <gary@vaughan.pe>, 2013-2015
Packit 437b5e
 * (c) Reuben Thomas <rrt@sc3d.org> 2010-2013
Packit 437b5e
 * (c) Natanael Copa <natanael.copa@gmail.com> 2008-2010
Packit 437b5e
 * Clean up and bug fixes by Leo Razoumov <slonik.az@gmail.com> 2006-10-11
Packit 437b5e
 * Luiz Henrique de Figueiredo <lhf@tecgraf.puc-rio.br> 07 Apr 2006 23:17:49
Packit 437b5e
 * Based on original by Claudio Terra for Lua 3.x.
Packit 437b5e
 * With contributions by Roberto Ierusalimschy.
Packit 437b5e
 * With documentation from Steve Donovan 2012
Packit 437b5e
 */
Packit 437b5e
/***
Packit 437b5e
 Group Database Operations.
Packit 437b5e
Packit 437b5e
 Query the system group database.
Packit 437b5e
Packit 437b5e
@see posix.pwd
Packit 437b5e
@module posix.grp
Packit 437b5e
*/
Packit 437b5e
Packit 437b5e
#include <config.h>
Packit 437b5e
Packit 437b5e
#include <grp.h>
Packit 437b5e
Packit 437b5e
#include "_helpers.c"
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Group record.
Packit 437b5e
@table PosixGroup
Packit 437b5e
@string gr_name name of group
Packit 437b5e
@int gr_gid unique group id
Packit 437b5e
@tfield list gr_mem a list of group members
Packit 437b5e
*/
Packit 437b5e
Packit 437b5e
static int
Packit 437b5e
pushgroup(lua_State *L, struct group *g)
Packit 437b5e
{
Packit 437b5e
	if (!g)
Packit 437b5e
		return lua_pushnil(L), 1;
Packit 437b5e
Packit 437b5e
	lua_createtable(L, 0, 3);
Packit 437b5e
	setintegerfield(g, gr_gid);
Packit 437b5e
	setstringfield(g, gr_name);
Packit 437b5e
	if (g->gr_mem)
Packit 437b5e
	{
Packit 437b5e
		int i;
Packit 437b5e
		lua_newtable(L);
Packit 437b5e
		for (i = 0; g->gr_mem[i] != NULL; i++)
Packit 437b5e
		{
Packit 437b5e
			lua_pushstring(L, g->gr_mem[i]);
Packit 437b5e
			lua_rawseti(L, -2, i + 1);
Packit 437b5e
		}
Packit 437b5e
		lua_setfield(L, -2, "gr_mem");
Packit 437b5e
	}
Packit 437b5e
Packit 437b5e
	settypemetatable("PosixGroup");
Packit 437b5e
	return 1;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Release group database resources.
Packit 437b5e
@function endgrent
Packit 437b5e
@see getgrent
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pendgrent(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	checknargs(L, 0);
Packit 437b5e
	endgrent();
Packit 437b5e
	return 0;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch next group.
Packit 437b5e
@function getgrent
Packit 437b5e
@treturn PosixGroup next group record
Packit 437b5e
@see endgrent
Packit 437b5e
@usage
Packit 437b5e
  t = P.getgrent ()
Packit 437b5e
  while t ~= nil do
Packit 437b5e
    process (t)
Packit 437b5e
    t = P.getgrent ()
Packit 437b5e
  end
Packit 437b5e
  P.endgrent ()
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pgetgrent(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	struct group *g;
Packit 437b5e
	checknargs(L, 0);
Packit 437b5e
	g = getgrent();
Packit 437b5e
	if (!g && errno == 0)
Packit 437b5e
		endgrent();
Packit 437b5e
	return pushgroup(L, g);
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch group with given group id.
Packit 437b5e
@function getgrgid
Packit 437b5e
@int gid group id
Packit 437b5e
@treturn PosixGroup group record for *gid*
Packit 437b5e
@usage
Packit 437b5e
  t = P.getgrgid (0)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pgetgrgid(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	gid_t gid = (gid_t) checkint(L, 1);
Packit 437b5e
	struct group *g;
Packit 437b5e
	checknargs(L, 1);
Packit 437b5e
Packit 437b5e
	errno = 0;	/* so we can recognise a successful empty result */
Packit 437b5e
	g = getgrgid(gid);
Packit 437b5e
	if (!g && errno != 0)
Packit 437b5e
		return pusherror(L, "getgrgid");
Packit 437b5e
	return pushgroup(L, g);
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch named group.
Packit 437b5e
@function getgrnam
Packit 437b5e
@string name group name
Packit 437b5e
@treturn PosixGroup group record for *name*
Packit 437b5e
@usage
Packit 437b5e
  t = P.getgrnam "wheel"
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pgetgrnam(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	const char *name = luaL_checkstring(L, 1);
Packit 437b5e
	struct group *g;
Packit 437b5e
	checknargs(L, 1);
Packit 437b5e
Packit 437b5e
	errno = 0;	/* so we can recognise a successful empty result */
Packit 437b5e
	g = getgrnam (name);
Packit 437b5e
	if (!g && errno != 0)
Packit 437b5e
		return pusherror(L, "getgrnam");
Packit 437b5e
	return pushgroup(L, g);
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Rewind next @{getgrent} back to start of database.
Packit 437b5e
@function setgrent
Packit 437b5e
@see getgrent
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Psetgrent(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	checknargs(L, 0);
Packit 437b5e
	setgrent();
Packit 437b5e
	return 0;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
static const luaL_Reg posix_grp_fns[] =
Packit 437b5e
{
Packit 437b5e
	LPOSIX_FUNC( Pendgrent		),
Packit 437b5e
	LPOSIX_FUNC( Pgetgrent		),
Packit 437b5e
	LPOSIX_FUNC( Pgetgrgid		),
Packit 437b5e
	LPOSIX_FUNC( Pgetgrnam		),
Packit 437b5e
	LPOSIX_FUNC( Psetgrent		),
Packit 437b5e
	{NULL, NULL}
Packit 437b5e
};
Packit 437b5e
Packit 437b5e
Packit 437b5e
LUALIB_API int
Packit 437b5e
luaopen_posix_grp(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	luaL_register(L, "posix.grp", posix_grp_fns);
Packit 437b5e
	lua_pushliteral(L, "posix.grp for " LUA_VERSION " / " PACKAGE_STRING);
Packit 437b5e
	lua_setfield(L, -2, "version");
Packit 437b5e
Packit 437b5e
	return 1;
Packit 437b5e
}