Blame ext/posix/pwd.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
 Password Database Operations.
Packit 437b5e
Packit 437b5e
 Query the system password database.
Packit 437b5e
Packit 437b5e
@module posix.pwd
Packit 437b5e
*/
Packit 437b5e
Packit 437b5e
#include <config.h>
Packit 437b5e
Packit 437b5e
#include <pwd.h>
Packit 437b5e
#include <sys/types.h>
Packit 437b5e
#include <unistd.h>	/* for geteuid(2) */
Packit 437b5e
Packit 437b5e
#include "_helpers.c"
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Password record.
Packit 437b5e
@table PosixPasswd
Packit 437b5e
@string pw_name user's login name
Packit 437b5e
@int pw_uid unique user id
Packit 437b5e
@int pw_gid user's default group id
Packit 437b5e
@string pw_dir initial working directory
Packit 437b5e
@string pw_shell user's login shell path
Packit 437b5e
*/
Packit 437b5e
Packit 437b5e
static int
Packit 437b5e
pushpasswd(lua_State *L, struct passwd *p)
Packit 437b5e
{
Packit 437b5e
	if (!p)
Packit 437b5e
		return lua_pushnil(L), 1;
Packit 437b5e
Packit 437b5e
	lua_createtable(L, 0, 6);
Packit 437b5e
	setintegerfield(p, pw_uid);
Packit 437b5e
	setintegerfield(p, pw_gid);
Packit 437b5e
	setstringfield(p, pw_name);
Packit 437b5e
	setstringfield(p, pw_dir);
Packit 437b5e
	setstringfield(p, pw_shell);
Packit 437b5e
	setstringfield(p, pw_passwd);
Packit 437b5e
Packit 437b5e
	settypemetatable("PosixPasswd");
Packit 437b5e
	return 1;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Release password database resources.
Packit 437b5e
@function endpwent
Packit 437b5e
@see getpwent
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pendpwent(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	checknargs(L, 0);
Packit 437b5e
	endpwent();
Packit 437b5e
	return 0;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch next password entry.
Packit 437b5e
@function getpwent
Packit 437b5e
@treturn PosixPasswd next password record
Packit 437b5e
@see endpwent
Packit 437b5e
@usage
Packit 437b5e
  t = P.getpwent ()
Packit 437b5e
  while t ~= nil do
Packit 437b5e
    process (t)
Packit 437b5e
    t = P.getpwent ()
Packit 437b5e
  end
Packit 437b5e
  P.endpwent ()
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pgetpwent(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	struct passwd *p;
Packit 437b5e
	checknargs(L, 0);
Packit 437b5e
	p = getpwent();
Packit 437b5e
	if (!p && errno == 0)
Packit 437b5e
		endpwent();
Packit 437b5e
	return pushpasswd(L, p);
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch named user.
Packit 437b5e
@function getpwnam
Packit 437b5e
@string name user name
Packit 437b5e
@treturn PosixPasswd passwd record for *name*
Packit 437b5e
@usage
Packit 437b5e
  t = P.getpwnam "root"
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pgetpwnam(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	const char *name = luaL_checkstring(L, 1);
Packit 437b5e
	struct passwd *p;
Packit 437b5e
	checknargs(L, 1);
Packit 437b5e
Packit 437b5e
	errno = 0;	/* so we can recognise a successful empty result */
Packit 437b5e
	p = getpwnam (name);
Packit 437b5e
	if (!p && errno != 0)
Packit 437b5e
		return pusherror(L, "getpwnam");
Packit 437b5e
	return pushpasswd(L, p);
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Fetch password entry with given user id.
Packit 437b5e
@function getpwuid
Packit 437b5e
@int uid user id
Packit 437b5e
@treturn PosixPasswd passwd record for *uid*
Packit 437b5e
@usage
Packit 437b5e
  t = P.getpwuid (0)
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Pgetpwuid(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	uid_t uid = (uid_t) checkint(L, 1);
Packit 437b5e
	struct passwd *p;
Packit 437b5e
	checknargs(L, 1);
Packit 437b5e
Packit 437b5e
	errno = 0;	/* so we can recognise a successful empty result */
Packit 437b5e
	p = getpwuid(uid);
Packit 437b5e
	if (!p && errno != 0)
Packit 437b5e
		return pusherror(L, "getpwuid");
Packit 437b5e
	return pushpasswd(L, p);
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
/***
Packit 437b5e
Rewind next @{getpwent} back to start of database.
Packit 437b5e
@function setpwent
Packit 437b5e
@see getpwent
Packit 437b5e
*/
Packit 437b5e
static int
Packit 437b5e
Psetpwent(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	checknargs(L, 0);
Packit 437b5e
	setpwent();
Packit 437b5e
	return 0;
Packit 437b5e
}
Packit 437b5e
Packit 437b5e
Packit 437b5e
static const luaL_Reg posix_pwd_fns[] =
Packit 437b5e
{
Packit 437b5e
	LPOSIX_FUNC( Pendpwent		),
Packit 437b5e
	LPOSIX_FUNC( Pgetpwent		),
Packit 437b5e
	LPOSIX_FUNC( Pgetpwnam		),
Packit 437b5e
	LPOSIX_FUNC( Pgetpwuid		),
Packit 437b5e
	LPOSIX_FUNC( Psetpwent		),
Packit 437b5e
	{NULL, NULL}
Packit 437b5e
};
Packit 437b5e
Packit 437b5e
Packit 437b5e
LUALIB_API int
Packit 437b5e
luaopen_posix_pwd(lua_State *L)
Packit 437b5e
{
Packit 437b5e
	luaL_register(L, "posix.pwd", posix_pwd_fns);
Packit 437b5e
	lua_pushliteral(L, "posix.pwd for " LUA_VERSION " / " PACKAGE_STRING);
Packit 437b5e
	lua_setfield(L, -2, "version");
Packit 437b5e
Packit 437b5e
	return 1;
Packit 437b5e
}