#include <lua.h> /* Low level lua C API */
#include <lauxlib.h> /* Higher level C API */
+#ifdef HAVE_POLL
+#include <poll.h> /* poll structures and defines */
+#endif
+
#include "../vlc.h"
#include "../libs.h"
{
vlc_object_t *p_this = vlclua_get_this( L );
int **ppi_fd = (int**)luaL_checkudata( L, 1, "net_listen" );
- mtime_t i_wait = luaL_optint( L, 2, -1 ); /* default to block */
- int i_fd = net_Accept( p_this, *ppi_fd, i_wait );
+ 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;
}
{ "recv", vlclua_net_recv },
{ "select", vlclua_net_select },
{ "fd_set_new", vlclua_fd_set_new },
- { "fd_read", vlclua_fd_read },
- { "fd_write", vlclua_fd_write },
+ { "read", vlclua_fd_read },
+ { "write", vlclua_fd_write },
{ "stat", vlclua_stat }, /* Not really "net" */
{ "opendir", vlclua_opendir }, /* Not really "net" */
{ NULL, NULL }