--- a/libs/nixio/src/io.c 2010-08-10 22:26:11.920381434 +0200 +++ b/libs/nixio/src/io.c 2010-08-11 11:28:09.724417190 +0200 @@ -35,19 +35,35 @@ if (to) { argoff += 2; - const char *address = luaL_checkstring(L, 3); - struct sockaddr_storage addrstor; - addr = (struct sockaddr*)&addrstor; + if (sock->domain == AF_INET || sock->domain == AF_INET6) { + const char *address = luaL_checkstring(L, 3); + struct sockaddr_storage addrstor; + addr = (struct sockaddr*)&addrstor; - nixio_addr naddr; - memset(&naddr, 0, sizeof(naddr)); - strncpy(naddr.host, address, sizeof(naddr.host) - 1); - naddr.port = (uint16_t)luaL_checkinteger(L, 4); - naddr.family = sock->domain; + nixio_addr naddr; + memset(&naddr, 0, sizeof(naddr)); + strncpy(naddr.host, address, sizeof(naddr.host) - 1); + naddr.port = (uint16_t)luaL_checkinteger(L, 4); + naddr.family = sock->domain; - if (nixio__addr_write(&naddr, addr)) { - return nixio__perror_s(L); + if (nixio__addr_write(&naddr, addr)) { + return nixio__perror_s(L); + } + } + +#ifndef __WINNT__ + else if (sock->domain == AF_UNIX) { + size_t pathlen; + const char *path = luaL_checklstring(L, 3, &pathlen); + + struct sockaddr_un addr_un; + addr_un.sun_family = AF_UNIX; + luaL_argcheck(L, pathlen < sizeof(addr_un.sun_path), 3, "out of range"); + strncpy(addr_un.sun_path, path, sizeof(addr_un.sun_path)); + + addr = (struct sockaddr*)&addr_un; } +#endif } size_t len; @@ -104,15 +120,22 @@ nixio_sock *sock = nixio__checksock(L); char buffer[NIXIO_BUFFERSIZE]; struct sockaddr_storage addrobj; + struct sockaddr_un addrobj_un; + struct sockaddr *addr; + socklen_t alen; uint req = luaL_checkinteger(L, 2); int readc; - if (from && sock->domain != AF_INET && sock->domain != AF_INET6) { - return luaL_argerror(L, 1, "supported families: inet, inet6"); + if (sock->domain == AF_INET || sock->domain == AF_INET6) { + addr = (from) ? (struct sockaddr*)&addrobj : NULL; + alen = (from) ? sizeof(addrobj) : 0; } - - struct sockaddr *addr = (from) ? (struct sockaddr*)&addrobj : NULL; - socklen_t alen = (from) ? sizeof(addrobj) : 0; +#ifndef __WINNT__ + else if (sock->domain == AF_UNIX) { + addr = (from) ? (struct sockaddr*)&addrobj_un : NULL; + alen = (from) ? sizeof(addrobj_un) : 0; + } +#endif /* We limit the readsize to NIXIO_BUFFERSIZE */ req = (req > NIXIO_BUFFERSIZE) ? NIXIO_BUFFERSIZE : req; @@ -137,7 +160,8 @@ if (!from) { return 1; - } else { + } + else if (sock->domain == AF_INET || sock->domain == AF_INET6) { nixio_addr naddr; if (!nixio__addr_parse(&naddr, (struct sockaddr *)&addrobj)) { lua_pushstring(L, naddr.host); @@ -147,6 +171,12 @@ return 1; } } +#ifndef __WINNT__ + else if (sock->domain == AF_UNIX) { + lua_pushstring(L, addrobj_un.sun_path); + return 2; + } +#endif } }