Changeset View
Changeset View
Standalone View
Standalone View
libexec/flua/modules/lposix.c
Show All 24 Lines | |||||
*/ | */ | ||||
#include <sys/cdefs.h> | #include <sys/cdefs.h> | ||||
__FBSDID("$FreeBSD$"); | __FBSDID("$FreeBSD$"); | ||||
#include <sys/stat.h> | #include <sys/stat.h> | ||||
#include <errno.h> | #include <errno.h> | ||||
#include <grp.h> | |||||
#include <pwd.h> | |||||
#include <string.h> | #include <string.h> | ||||
#include <unistd.h> | #include <unistd.h> | ||||
#include <lua.h> | #include <lua.h> | ||||
#include "lauxlib.h" | #include "lauxlib.h" | ||||
#include "lposix.h" | #include "lposix.h" | ||||
/* | /* | ||||
Show All 18 Lines | if (chmod(path, mode) == -1) { | ||||
lua_pushinteger(L, errno); | lua_pushinteger(L, errno); | ||||
return 3; | return 3; | ||||
} | } | ||||
lua_pushinteger(L, 0); | lua_pushinteger(L, 0); | ||||
return 1; | return 1; | ||||
} | } | ||||
static int | static int | ||||
lua_chown(lua_State *L) | |||||
{ | |||||
int n; | |||||
const char *path; | |||||
uid_t owner = (uid_t) -1; | |||||
gid_t group = (gid_t) -1; | |||||
n = lua_gettop(L); | |||||
luaL_argcheck(L, n > 1, n, | |||||
kevans: The official luaposix interface actually allows 2 or 3 args, nil for either user/group… | |||||
"chown takes at least two arguments"); | |||||
path = luaL_checkstring(L, 1); | |||||
if (lua_isinteger(L, 2)) | |||||
owner = (uid_t) lua_tointeger(L, 2); | |||||
Done Inline Actionss/2/3/? kevans: s/2/3/? | |||||
else if (lua_isstring(L, 2)) { | |||||
struct passwd *p = getpwnam(lua_tostring(L, 2)); | |||||
if (p != NULL) | |||||
owner = p->pw_uid; | |||||
else | |||||
return (luaL_argerror(L, 2, | |||||
lua_pushfstring(L, "unknown user %s", | |||||
lua_tostring(L, 2)))); | |||||
} else if (!lua_isnoneornil(L, 2)) { | |||||
const char *type = luaL_typename(L, 2); | |||||
return (luaL_argerror(L, 2, | |||||
lua_pushfstring(L, "integer or string expected, got %s", | |||||
type))); | |||||
} | |||||
if (lua_isinteger(L, 3)) | |||||
group = (gid_t) lua_tointeger(L, 3); | |||||
else if (lua_isstring(L, 3)) { | |||||
struct group *g = getgrnam(lua_tostring(L, 3)); | |||||
if (g != NULL) | |||||
group = g->gr_gid; | |||||
else | |||||
return (luaL_argerror(L, 3, | |||||
lua_pushfstring(L, "unknown user %s", | |||||
lua_tostring(L, 3)))); | |||||
} else if (!lua_isnoneornil(L, 3)) { | |||||
const char *type = luaL_typename(L, 3); | |||||
return (luaL_argerror(L, 3, | |||||
lua_pushfstring(L, "integer or string expected, got %s", | |||||
type))); | |||||
} | |||||
if (chown(path, owner, group) == -1) { | |||||
lua_pushnil(L); | |||||
lua_pushstring(L, strerror(errno)); | |||||
lua_pushinteger(L, errno); | |||||
return (3); | |||||
} | |||||
lua_pushinteger(L, 0); | |||||
return (1); | |||||
} | |||||
static int | |||||
lua_getpid(lua_State *L) | lua_getpid(lua_State *L) | ||||
{ | { | ||||
int n; | int n; | ||||
n = lua_gettop(L); | n = lua_gettop(L); | ||||
luaL_argcheck(L, n == 0, 1, "too many arguments"); | luaL_argcheck(L, n == 0, 1, "too many arguments"); | ||||
lua_pushinteger(L, getpid()); | lua_pushinteger(L, getpid()); | ||||
return 1; | return 1; | ||||
} | } | ||||
#define REG_SIMPLE(n) { #n, lua_ ## n } | #define REG_SIMPLE(n) { #n, lua_ ## n } | ||||
static const struct luaL_Reg sys_statlib[] = { | static const struct luaL_Reg sys_statlib[] = { | ||||
REG_SIMPLE(chmod), | REG_SIMPLE(chmod), | ||||
{ NULL, NULL }, | { NULL, NULL }, | ||||
}; | }; | ||||
static const struct luaL_Reg unistdlib[] = { | static const struct luaL_Reg unistdlib[] = { | ||||
REG_SIMPLE(getpid), | REG_SIMPLE(getpid), | ||||
REG_SIMPLE(chown), | |||||
{ NULL, NULL }, | { NULL, NULL }, | ||||
}; | }; | ||||
#undef REG_SIMPLE | #undef REG_SIMPLE | ||||
int | int | ||||
luaopen_posix_sys_stat(lua_State *L) | luaopen_posix_sys_stat(lua_State *L) | ||||
{ | { | ||||
luaL_newlib(L, sys_statlib); | luaL_newlib(L, sys_statlib); | ||||
Show All 9 Lines |
The official luaposix interface actually allows 2 or 3 args, nil for either user/group resulting in -1 -- IMO I think we should do the same. It technically also resolves strings if they're passed, though I don't feel as strongly about that.