libs/nixio: implement getproto(), getprotobyname() and getprotobynumber()
[project/luci.git] / libs / nixio / src / address.c
index eff05e3..98bba01 100644 (file)
@@ -493,22 +493,67 @@ static int nixio_getifaddrs(lua_State *L) {
 }
 #endif
 
+/**
+ * protoent conversion helper
+ */
+static int nixio__pushprotoent(lua_State *L, struct protoent *e) {
+       int i;
+       if (e) {
+               lua_newtable(L);
+
+               lua_pushstring(L, e->p_name);
+               lua_setfield(L, -2, "name");
+
+               lua_pushnumber(L, e->p_proto);
+               lua_setfield(L, -2, "proto");
+
+               lua_newtable(L);
+               for (i = 0; e->p_aliases[i]; i++) {
+                       lua_pushstring(L, e->p_aliases[i]);
+                       lua_rawseti(L, -2, i+1);
+               }
+               lua_setfield(L, -2, "aliases");
+               return 1;
+       } else {
+               return 0;
+       }
+}
+
+/**
+ * getprotobyname(name)
+ */
+static int nixio_getprotobyname(lua_State *L) {
+       const char *name = luaL_checkstring(L, 1);
+       struct protoent *res = getprotobyname(name);
+       return nixio__pushprotoent(L, res);
+}
+
+/**
+ * getprotobynumber(proto)
+ */
+static int nixio_getprotobynumber(lua_State *L) {
+       int proto = luaL_checkinteger(L, 1);
+       struct protoent *res = getprotobynumber(proto);
+       return nixio__pushprotoent(L, res);
+}
 
 /* module table */
 static const luaL_reg R[] = {
 #if defined(__linux__) || defined(BSD)
-       {"getifaddrs",  nixio_getifaddrs},
+       {"getifaddrs",                  nixio_getifaddrs},
 #endif
-       {"getaddrinfo", nixio_getaddrinfo},
-       {"getnameinfo", nixio_getnameinfo},
-       {NULL,                  NULL}
+       {"getaddrinfo",                 nixio_getaddrinfo},
+       {"getnameinfo",                 nixio_getnameinfo},
+       {"getprotobyname",              nixio_getprotobyname},
+       {"getprotobynumber",    nixio_getprotobynumber},
+       {NULL,                                  NULL}
 };
 
 /* object table */
 static const luaL_reg M[] = {
-       {"getsockname", nixio_sock_getsockname},
-       {"getpeername", nixio_sock_getpeername},
-       {NULL,                  NULL}
+       {"getsockname",                 nixio_sock_getsockname},
+       {"getpeername",                 nixio_sock_getpeername},
+       {NULL,                                  NULL}
 };
 
 void nixio_open_address(lua_State *L) {