libs/nixio: implement getproto(), getprotobyname() and getprotobynumber()
authorJo-Philipp Wich <jow@openwrt.org>
Fri, 12 Aug 2011 10:26:33 +0000 (10:26 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Fri, 12 Aug 2011 10:26:33 +0000 (10:26 +0000)
libs/nixio/Makefile
libs/nixio/docsrc/nixio.lua
libs/nixio/src/address.c
libs/nixio/src/nixio.c
libs/nixio/src/nixio.h

index fb91388..42d3666 100644 (file)
@@ -21,8 +21,8 @@ else
 endif
 
 NIXIO_OBJ = src/nixio.o src/socket.o src/sockopt.o src/bind.o src/address.o \
-           src/poll.o src/io.o src/file.o src/splice.o src/process.o src/syslog.o \
-           src/bit.o src/binary.o src/fs.o src/user.o \
+           src/protoent.o src/poll.o src/io.o src/file.o src/splice.o src/process.o \
+           src/syslog.o src/bit.o src/binary.o src/fs.o src/user.o \
            $(if $(NIXIO_TLS),src/tls-crypto.o src/tls-context.o src/tls-socket.o,)
 
 ifeq ($(NIXIO_TLS),axtls)
index 90331cf..1b434d7 100644 (file)
@@ -37,6 +37,39 @@ module "nixio"
 -- <li>ifindex = Interface Index (Linux, "packet"-family)</li>
 -- </ul>
 
+--- Get protocol entry by name.
+-- @usage This function returns nil if the given protocol is unknown.
+-- @class function
+-- @name nixio.getprotobyname
+-- @param name         protocol name to lookup
+-- @return                     Table containing the following fields: <ul>
+-- <li>name = Protocol Name</li>
+-- <li>proto = Protocol Number</li>
+-- <li>aliases = Table of alias names</li>
+-- </ul>
+
+--- Get protocol entry by number.
+-- @usage This function returns nil if the given protocol is unknown.
+-- @class function
+-- @name nixio.getprotobynumber
+-- @param proto                protocol number to lookup
+-- @return                     Table containing the following fields: <ul>
+-- <li>name = Protocol Name</li>
+-- <li>proto = Protocol Number</li>
+-- <li>aliases = Table of alias names</li>
+-- </ul>
+
+--- Get all or a specifc proto entry.
+-- @class function
+-- @name nixio.getproto
+-- @param proto                protocol number or name to lookup (optional)
+-- @return                     Table (or if no parameter is given, a table of tables)
+--                  containing the following fields: <ul>
+-- <li>name = Protocol Name</li>
+-- <li>proto = Protocol Number</li>
+-- <li>aliases = Table of alias names</li>
+-- </ul>
+
 --- Create a new socket and bind it to a network address.
 -- This function is a shortcut for calling nixio.socket and then bind()
 -- on the socket object.
@@ -431,4 +464,4 @@ module "nixio"
 -- @class function
 -- @name nixio.tls
 -- @param mode TLS-Mode ["client", "server"]
--- @return TLSContext Object
\ No newline at end of file
+-- @return TLSContext Object
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) {
index 70a77b4..ae81c6f 100644 (file)
@@ -22,7 +22,7 @@
 #include <errno.h>
 #include <signal.h>
 
-#define VERSION 0.3
+#define VERSION 0.4
 
 
 /* pushes nil, error number and errstring on the stack */
@@ -133,6 +133,7 @@ NIXIO_API int luaopen_nixio(lua_State *L) {
        nixio_open_sockopt(L);
        nixio_open_bind(L);
        nixio_open_address(L);
+       nixio_open_protoent(L);
        nixio_open_poll(L);
        nixio_open_io(L);
        nixio_open_splice(L);
index 2be197f..8802e92 100644 (file)
@@ -111,6 +111,7 @@ void nixio_open_socket(lua_State *L);
 void nixio_open_sockopt(lua_State *L);
 void nixio_open_bind(lua_State *L);
 void nixio_open_address(lua_State *L);
+void nixio_open_protoent(lua_State *L);
 void nixio_open_poll(lua_State *L);
 void nixio_open_io(lua_State *L);
 void nixio_open_splice(lua_State *L);