* POSIX support functions for Lua
*/
-#define MODULE_VERSION "0.3.0"
+#define MODULE_VERSION "0.3.1"
#include <stdlib.h>
#include <unistd.h>
#include <syslog.h>
#include <pwd.h>
+#include <grp.h>
#include <string.h>
#include <errno.h>
}
/* Close stdin, stdout, stderr */
-/* close(0);
+ close(0);
close(1);
close(2);
-*/
+
/* Final fork, use it wisely */
if(fork())
exit(0);
const char * const facility_strings[] = {
"auth",
+#if !(defined(sun) || defined(__sun))
"authpriv",
+#endif
"cron",
"daemon",
+#if !(defined(sun) || defined(__sun))
"ftp",
+#endif
"kern",
"local0",
"local1",
};
int facility_constants[] = {
LOG_AUTH,
+#if !(defined(sun) || defined(__sun))
LOG_AUTHPRIV,
+#endif
LOG_CRON,
LOG_DAEMON,
+#if !(defined(sun) || defined(__sun))
LOG_FTP,
+#endif
LOG_KERN,
LOG_LOCAL0,
LOG_LOCAL1,
LOG_INFO,
LOG_NOTICE,
LOG_WARNING,
- LOG_EMERG,
+ LOG_CRIT,
-1
};
int lc_syslog_log(lua_State* L)
return 2;
}
+int lc_setgid(lua_State* L)
+{
+ int gid = -1;
+ if(lua_gettop(L) < 1)
+ return 0;
+ if(!lua_isnumber(L, 1) && lua_tostring(L, 1))
+ {
+ /* Passed GID is actually a string, so look up the GID */
+ struct group *g;
+ g = getgrnam(lua_tostring(L, 1));
+ if(!g)
+ {
+ lua_pushboolean(L, 0);
+ lua_pushstring(L, "no-such-group");
+ return 2;
+ }
+ gid = g->gr_gid;
+ }
+ else
+ {
+ gid = lua_tonumber(L, 1);
+ }
+
+ if(gid>-1)
+ {
+ /* Ok, attempt setgid */
+ errno = 0;
+ if(setgid(gid))
+ {
+ /* Fail */
+ lua_pushboolean(L, 0);
+ switch(errno)
+ {
+ case EINVAL:
+ lua_pushstring(L, "invalid-gid");
+ break;
+ case EPERM:
+ lua_pushstring(L, "permission-denied");
+ break;
+ default:
+ lua_pushstring(L, "unknown-error");
+ }
+ return 2;
+ }
+ else
+ {
+ /* Success! */
+ lua_pushboolean(L, 1);
+ return 1;
+ }
+ }
+
+ /* Seems we couldn't find a valid GID to switch to */
+ lua_pushboolean(L, 0);
+ lua_pushstring(L, "invalid-gid");
+ return 2;
+}
+
/* Like POSIX's setrlimit()/getrlimit() API functions.
*
* Syntax:
if (!strcmp(s, "CPU")) return RLIMIT_CPU;
if (!strcmp(s, "DATA")) return RLIMIT_DATA;
if (!strcmp(s, "FSIZE")) return RLIMIT_FSIZE;
- if (!strcmp(s, "MEMLOCK")) return RLIMIT_MEMLOCK;
if (!strcmp(s, "NOFILE")) return RLIMIT_NOFILE;
+ if (!strcmp(s, "STACK")) return RLIMIT_STACK;
+#if !(defined(sun) || defined(__sun))
+ if (!strcmp(s, "MEMLOCK")) return RLIMIT_MEMLOCK;
if (!strcmp(s, "NPROC")) return RLIMIT_NPROC;
if (!strcmp(s, "RSS")) return RLIMIT_RSS;
- if (!strcmp(s, "STACK")) return RLIMIT_STACK;
+#endif
return -1;
}
return 3;
}
+void lc_abort(lua_State* L)
+{
+ abort();
+}
+
/* Register functions */
int luaopen_util_pposix(lua_State *L)
{
lua_newtable(L);
+ lua_pushcfunction(L, lc_abort);
+ lua_setfield(L, -2, "abort");
+
lua_pushcfunction(L, lc_daemonize);
lua_setfield(L, -2, "daemonize");
lua_pushcfunction(L, lc_getuid);
lua_setfield(L, -2, "getuid");
+ lua_pushcfunction(L, lc_getgid);
+ lua_setfield(L, -2, "getgid");
lua_pushcfunction(L, lc_setuid);
lua_setfield(L, -2, "setuid");
+ lua_pushcfunction(L, lc_setgid);
+ lua_setfield(L, -2, "setgid");
lua_pushcfunction(L, lc_setrlimit);
lua_setfield(L, -2, "setrlimit");