Rework LuCI build system
[project/luci.git] / libs / luci-lib-nixio / src / user.c
diff --git a/libs/luci-lib-nixio/src/user.c b/libs/luci-lib-nixio/src/user.c
new file mode 100644 (file)
index 0000000..b701bac
--- /dev/null
@@ -0,0 +1,263 @@
+/*
+ * nixio - Linux I/O library for lua
+ *
+ *   Copyright (C) 2009 Steven Barth <steven@midlink.org>
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+#include "nixio.h"
+#include <sys/types.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/param.h>
+
+#ifndef __WINNT__
+
+#include <grp.h>
+#include <pwd.h>
+
+#ifndef BSD
+#ifndef NO_SHADOW
+#include <shadow.h>
+#endif
+#include <crypt.h>
+#endif
+
+int nixio__check_group(lua_State *L, int idx) {
+       if (lua_isnumber(L, idx)) {
+               return lua_tointeger(L, idx);
+       } else if (lua_isstring(L, idx)) {
+               struct group *g = getgrnam(lua_tostring(L, idx));
+               return (!g) ? -1 : g->gr_gid;
+       } else {
+               return luaL_argerror(L, idx, "supported values: <groupname>, <gid>");
+       }
+}
+
+int nixio__check_user(lua_State *L, int idx) {
+       if (lua_isnumber(L, idx)) {
+               return lua_tointeger(L, idx);
+       } else if (lua_isstring(L, idx)) {
+               struct passwd *p = getpwnam(lua_tostring(L, idx));
+               return (!p) ? -1 : p->pw_uid;
+       } else {
+               return luaL_argerror(L, idx, "supported values: <username>, <uid>");
+       }
+}
+
+
+static int nixio__push_group(lua_State *L, struct group *gr) {
+       lua_createtable(L, 0, 4);
+       lua_pushstring(L, gr->gr_name);
+       lua_setfield(L, -2, "name");
+       lua_pushstring(L, gr->gr_passwd);
+       lua_setfield(L, -2, "passwd");
+       lua_pushinteger(L, gr->gr_gid);
+       lua_setfield(L, -2, "gid");
+       lua_newtable(L);
+
+       for (int i=0; gr->gr_mem[i]; i++) {
+               lua_pushstring(L, gr->gr_mem[i]);
+               lua_rawseti(L, -2, i+1);
+       }
+
+       lua_setfield(L, -2, "mem");
+       return 1;
+}
+
+static int nixio_getgr(lua_State *L) {
+       struct group *gr;
+       errno = 0;
+       if (lua_isnumber(L, 1)) {
+               gr = getgrgid(lua_tointeger(L, 1));
+       } else if (lua_isstring(L, 1)) {
+               gr = getgrnam(lua_tostring(L, 1));
+       } else if (lua_isnoneornil(L, 1)) {
+               lua_newtable(L);
+               int i = 0;
+
+               setgrent();
+               while ((gr = getgrent())) {
+                       nixio__push_group(L, gr);
+                       lua_rawseti(L, -2, ++i);
+               }
+
+               if (errno) {
+                       return nixio__perror(L);
+               }
+
+               endgrent();
+               return 1;
+       } else {
+               return luaL_argerror(L, 1, "supported values: <groupname>, <gid>");
+       }
+
+       if (!gr) {
+               return nixio__perror(L);
+       } else {
+               return nixio__push_group(L, gr);
+       }
+}
+
+static int nixio__push_passwd(lua_State *L, struct passwd *pw) {
+       lua_createtable(L, 0, 7);
+       lua_pushstring(L, pw->pw_name);
+       lua_setfield(L, -2, "name");
+       lua_pushstring(L, pw->pw_passwd);
+       lua_setfield(L, -2, "passwd");
+       lua_pushinteger(L, pw->pw_gid);
+       lua_setfield(L, -2, "gid");
+       lua_pushinteger(L, pw->pw_uid);
+       lua_setfield(L, -2, "uid");
+       lua_pushstring(L, pw->pw_dir);
+       lua_setfield(L, -2, "dir");
+       lua_pushstring(L, pw->pw_gecos);
+       lua_setfield(L, -2, "gecos");
+       lua_pushstring(L, pw->pw_shell);
+       lua_setfield(L, -2, "shell");
+       return 1;
+}
+
+static int nixio_getpw(lua_State *L) {
+       struct passwd *pw;
+       errno = 0;
+       if (lua_isnumber(L, 1)) {
+               pw = getpwuid(lua_tointeger(L, 1));
+       } else if (lua_isstring(L, 1)) {
+               pw = getpwnam(lua_tostring(L, 1));
+       } else if (lua_isnoneornil(L, 1)) {
+               lua_newtable(L);
+               int i = 0;
+
+               setpwent();
+               while ((pw = getpwent())) {
+                       nixio__push_passwd(L, pw);
+                       lua_rawseti(L, -2, ++i);
+               }
+
+               if (errno) {
+                       return nixio__perror(L);
+               }
+
+               endpwent();
+               return 1;
+       } else {
+               return luaL_argerror(L, 1, "supported values: <username>, <uid>");
+       }
+
+       if (!pw) {
+               return nixio__perror(L);
+       } else {
+               return nixio__push_passwd(L, pw);
+       }
+}
+
+#ifndef BSD
+#ifndef NO_SHADOW
+static int nixio__push_spwd(lua_State *L, struct spwd *sp) {
+       lua_createtable(L, 0, 9);
+       lua_pushstring(L, sp->sp_namp);
+       lua_setfield(L, -2, "namp");
+       lua_pushinteger(L, sp->sp_expire);
+       lua_setfield(L, -2, "expire");
+       lua_pushinteger(L, sp->sp_flag);
+       lua_setfield(L, -2, "flag");
+       lua_pushinteger(L, sp->sp_inact);
+       lua_setfield(L, -2, "inact");
+       lua_pushinteger(L, sp->sp_lstchg);
+       lua_setfield(L, -2, "lstchg");
+       lua_pushinteger(L, sp->sp_max);
+       lua_setfield(L, -2, "max");
+       lua_pushinteger(L, sp->sp_min);
+       lua_setfield(L, -2, "min");
+       lua_pushinteger(L, sp->sp_warn);
+       lua_setfield(L, -2, "warn");
+       lua_pushstring(L, sp->sp_pwdp);
+       lua_setfield(L, -2, "pwdp");
+       return 1;
+}
+
+static int nixio_getsp(lua_State *L) {
+       struct spwd *sp;
+       errno = 0;
+       if (lua_isstring(L, 1)) {
+               sp = getspnam(lua_tostring(L, 1));
+       } else if (lua_isnoneornil(L, 1)) {
+               lua_newtable(L);
+               int i = 0;
+
+               setspent();
+               while ((sp = getspent())) {
+                       nixio__push_spwd(L, sp);
+                       lua_rawseti(L, -2, ++i);
+               }
+
+               if (errno) {
+                       return nixio__perror(L);
+               }
+
+               endspent();
+               return 1;
+       } else {
+               return luaL_argerror(L, 1, "supported values: <username>");
+       }
+
+       if (!sp) {
+               return nixio__perror(L);
+       } else {
+               return nixio__push_spwd(L, sp);
+       }
+}
+#endif /* !NO_SHADOW */
+#endif /* !BSD */
+
+static int nixio_crypt(lua_State *L) {
+       const char *key = luaL_checkstring(L, 1);
+       const char *salt = luaL_checkstring(L, 2);
+       const char *hash = crypt(key, salt);
+
+       if (hash) {
+               lua_pushstring(L, hash);
+       } else {
+               lua_pushnil(L);
+       }
+
+       return 1;
+}
+
+
+/* module table */
+static const luaL_reg R[] = {
+       {"crypt",               nixio_crypt},
+       {"getgr",               nixio_getgr},
+       {"getpw",               nixio_getpw},
+#ifndef BSD
+#ifndef NO_SHADOW
+       {"getsp",               nixio_getsp},
+#endif
+#endif
+       {NULL,                  NULL}
+};
+
+#else /* __WINNT__ */
+
+static const luaL_reg R[] = {
+               {NULL,                  NULL}
+};
+
+#endif
+
+void nixio_open_user(lua_State *L) {
+       luaL_register(L, NULL, R);
+}