X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fmisc%2Flua%2Flibs%2Fnet.c;h=6d2c30a16a8d75bea51e97fcb90f8c8490d3e545;hb=28e52ddb9b8a1ae76eba086114ecf0bca90383ee;hp=321da9ef27728b5f3c85bed7ff43d6919a4a8ae1;hpb=84e1b303e36f5159eab5dce8291a5348837b99f0;p=vlc diff --git a/modules/misc/lua/libs/net.c b/modules/misc/lua/libs/net.c index 321da9ef27..6d2c30a16a 100644 --- a/modules/misc/lua/libs/net.c +++ b/modules/misc/lua/libs/net.c @@ -39,6 +39,10 @@ #include /* Low level lua C API */ #include /* Higher level C API */ +#ifdef HAVE_POLL +#include /* poll structures and defines */ +#endif + #include "../vlc.h" #include "../libs.h" @@ -121,7 +125,36 @@ static int vlclua_net_accept( lua_State *L ) { vlc_object_t *p_this = vlclua_get_this( L ); int **ppi_fd = (int**)luaL_checkudata( L, 1, "net_listen" ); - int i_fd = net_Accept( p_this, *ppi_fd ); + int *pi_fd = *ppi_fd; + int i_timeout = luaL_optint( L, 2, -1 ); /* block is default */ + + /* Implement net_Accept with timeout */ + int i_fd = -1; + + unsigned int i_count = 1; + while( pi_fd[i_count] != -1 ) + i_count++; + + struct pollfd ufd[i_count+1]; + unsigned int i; + for( i = 0; i < i_count; i++ ) + { + ufd[i].fd = pi_fd[i]; + ufd[i].events = POLLIN; + } + + if( poll( ufd, i_count, i_timeout ) > 0 ) + { + for( i = 0; i < i_count; i++ ) + { + if( !ufd[i].revents ) continue; + i_fd = net_AcceptSingle( p_this, ufd[i].fd ); + if( i_fd == -1 ) continue; + memmove( pi_fd + i, pi_fd + i + 1, i_count - (i + 1) ); + pi_fd[i_count - 1] = ufd[i].fd; + } + } + lua_pushinteger( L, i_fd ); return 1; }