1
0
mirror of https://github.com/elua/elua.git synced 2025-01-08 20:56:17 +08:00

the latest 'net' module broke support for console over TCP. Still investigating why. Until then I'll commit a version that at least compiles with BUILD_CON_TCP enabled

This commit is contained in:
Bogdan Marinescu 2008-09-22 22:09:12 +00:00
parent c1c5e58904
commit 9ab61f0e56
4 changed files with 40 additions and 22 deletions

View File

@ -40,7 +40,8 @@ typedef union
// eLua TCP/IP functions
int elua_net_socket( int type );
int elua_net_close( int s );
elua_net_size elua_net_recv( int s, luaL_Buffer *buf, elua_net_size maxsize, s16 readto, unsigned timer_id, u32 to_us );
elua_net_size elua_net_recvbuf( int s, luaL_Buffer *buf, elua_net_size maxsize, s16 readto, unsigned timer_id, u32 to_us );
elua_net_size elua_net_recv( int s, void *buf, elua_net_size maxsize, s16 readto, unsigned timer_id, u32 to_us );
elua_net_size elua_net_send( int s, const void* buf, elua_net_size len );
int elua_accept( u16 port, unsigned timer_id, u32 to_us, elua_net_ip* pfrom );
int elua_net_connect( int s, elua_net_ip addr, u16 port );

View File

@ -184,9 +184,10 @@ static int elua_uip_telnet_socket = -1;
// Returns the length of the buffer after processing
static void elua_uip_telnet_handle_input( struct elua_uip_state* s )
{
u8 *dptr = ( u8* )uip_appdata, *orig = ( u8* )s->ptr;
u8 *dptr = ( u8* )uip_appdata;
char *orig = ( char* )s->ptr;
int skip;
elua_net_size actlen = uip_datalen();
elua_net_size maxsize = s->len;
// Traverse the input buffer, skipping over TELNET sequences
while( ( dptr < ( u8* )uip_appdata + uip_datalen() ) && ( s->ptr - orig < s->len ) )
@ -202,24 +203,19 @@ static void elua_uip_telnet_handle_input( struct elua_uip_state* s )
{
// Check EOF indication
if( dptr[ 1 ] == TELNET_EOF )
{
*s->ptr ++ = STD_CTRLZ_CODE;
actlen ++;
}
skip = 2;
}
dptr += skip;
actlen -= skip;
}
}
if( s->ptr > orig )
{
if( ( s->len = s->ptr - orig ) < actlen )
s->res = ELUA_NET_ERR_OVERFLOW;
s->res = ELUA_NET_ERR_OK;
s->len = maxsize - ( s->ptr - orig );
uip_stop();
s->state = ELUA_UIP_STATE_IDLE;
}
return size;
}
// Utility function for TELNET: prepend all '\n' with '\r' in buffer
@ -354,6 +350,7 @@ void elua_uip_appcall()
{
uip_close();
s->state = ELUA_UIP_STATE_IDLE;
return;
}
// Handle data receive
@ -384,6 +381,7 @@ void elua_uip_appcall()
char *tptr = ( char* )uip_appdata;
char *last = ( char* )uip_appdata + temp - 1;
luaL_Buffer *pbuf = ( luaL_Buffer* )s->ptr;
char* dest = ( char* )s->ptr;
while( tptr <= last )
{
@ -394,7 +392,10 @@ void elua_uip_appcall()
}
if( *tptr != '\r' )
{
luaL_addchar( pbuf, *tptr );
if( s->res )
luaL_addchar( pbuf, *tptr );
else
*dest ++ = *tptr;
s->len --;
}
tptr ++;
@ -402,7 +403,10 @@ void elua_uip_appcall()
}
else
{
luaL_addlstring( ( luaL_Buffer* )s->ptr, ( const char* )uip_appdata, temp );
if( s->res )
luaL_addlstring( ( luaL_Buffer* )s->ptr, ( const char* )uip_appdata, temp );
else
memcpy( ( char* )s->ptr, ( const char* )uip_appdata, temp );
s->len -= temp;
}
@ -410,6 +414,7 @@ void elua_uip_appcall()
if( s->len == 0 || lastfound )
{
uip_stop();
s->res = ELUA_NET_ERR_OK;
s->state = ELUA_UIP_STATE_IDLE;
}
}
@ -450,11 +455,11 @@ void elua_uip_init( const struct uip_eth_addr *paddr )
#define ELUA_UIP_IS_SOCK_OK( sock ) ( elua_uip_configured && sock >= 0 && sock < UIP_CONNS )
static void elua_prep_socket_state( volatile struct elua_uip_state *pstate, void* buf, elua_net_size len, s16 readto, u8 state )
static void elua_prep_socket_state( volatile struct elua_uip_state *pstate, void* buf, elua_net_size len, s16 readto, u8 res, u8 state )
{
pstate->ptr = ( char* )buf;
pstate->len = len;
pstate->res = ELUA_NET_ERR_OK;
pstate->res = res;
pstate->readto = readto;
pstate->state = state;
}
@ -493,14 +498,14 @@ elua_net_size elua_net_send( int s, const void* buf, elua_net_size len )
return -1;
if( len == 0 )
return 0;
elua_prep_socket_state( pstate, ( void* )buf, len, ELUA_NET_NO_LASTCHAR, ELUA_UIP_STATE_SEND );
elua_prep_socket_state( pstate, ( void* )buf, len, ELUA_NET_NO_LASTCHAR, ELUA_NET_ERR_OK, ELUA_UIP_STATE_SEND );
platform_eth_force_interrupt();
while( pstate->state != ELUA_UIP_STATE_IDLE );
return len - pstate->len;
}
// Receive datain buf, upto "maxsize" bytes, or upto the 'readto' character if it's not -1
elua_net_size elua_net_recv( int s, luaL_Buffer* buf, elua_net_size maxsize, s16 readto, unsigned timer_id, u32 to_us )
// Internal "read" function
static elua_net_size elua_net_recv_internal( int s, void* buf, elua_net_size maxsize, s16 readto, unsigned timer_id, u32 to_us, int with_buffer )
{
volatile struct elua_uip_state *pstate = ( volatile struct elua_uip_state* )&( uip_conns[ s ].appstate );
u32 tmrstart = 0;
@ -509,7 +514,7 @@ elua_net_size elua_net_recv( int s, luaL_Buffer* buf, elua_net_size maxsize, s16
return -1;
if( maxsize == 0 )
return 0;
elua_prep_socket_state( pstate, buf, maxsize, readto, ELUA_UIP_STATE_RECV );
elua_prep_socket_state( pstate, buf, maxsize, readto, with_buffer, ELUA_UIP_STATE_RECV );
if( to_us > 0 )
tmrstart = platform_timer_op( timer_id, PLATFORM_TIMER_OP_START, 0 );
while( 1 )
@ -531,6 +536,18 @@ elua_net_size elua_net_recv( int s, luaL_Buffer* buf, elua_net_size maxsize, s16
return maxsize - pstate->len;
}
// Receive data in buf, upto "maxsize" bytes, or upto the 'readto' character if it's not -1
elua_net_size elua_net_recv( int s, void* buf, elua_net_size maxsize, s16 readto, unsigned timer_id, u32 to_us )
{
return elua_net_recv_internal( s, buf, maxsize, readto, timer_id, to_us, 0 );
}
// Same thing, but with a Lua buffer as argument
elua_net_size elua_net_recvbuf( int s, luaL_Buffer* buf, elua_net_size maxsize, s16 readto, unsigned timer_id, u32 to_us )
{
return elua_net_recv_internal( s, buf, maxsize, readto, timer_id, to_us, 1 );
}
// Return the socket associated with the "telnet" application (or -1 if it does
// not exist). The socket only exists if a client connected to the board.
int elua_net_get_telnet_socket()
@ -552,7 +569,7 @@ int elua_net_close( int s )
if( !ELUA_UIP_IS_SOCK_OK( s ) || !uip_conn_active( s ) )
return -1;
elua_prep_socket_state( pstate, NULL, 0, ELUA_NET_NO_LASTCHAR, ELUA_UIP_STATE_CLOSE );
elua_prep_socket_state( pstate, NULL, 0, ELUA_NET_NO_LASTCHAR, ELUA_NET_ERR_OK, ELUA_UIP_STATE_CLOSE );
platform_eth_force_interrupt();
while( pstate->state != ELUA_UIP_STATE_IDLE );
return pstate->res == ELUA_NET_ERR_OK ? 0 : -1;
@ -614,7 +631,7 @@ int elua_net_connect( int s, elua_net_ip addr, u16 port )
return -1;
// Initiate the connect call
uip_ipaddr( ipaddr, addr.ipbytes[ 0 ], addr.ipbytes[ 1 ], addr.ipbytes[ 2 ], addr.ipbytes[ 3 ] );
elua_prep_socket_state( pstate, NULL, 0, ELUA_NET_NO_LASTCHAR, ELUA_UIP_STATE_CONNECT );
elua_prep_socket_state( pstate, NULL, 0, ELUA_NET_NO_LASTCHAR, ELUA_NET_ERR_OK, ELUA_UIP_STATE_CONNECT );
if( uip_connect_socket( s, &ipaddr, htons( port ) ) == NULL )
return -1;
// And wait for it to finish

View File

@ -152,7 +152,7 @@ static int net_recv( lua_State *L )
}
// Initialize buffer
luaL_buffinit( L, &net_recv_buff );
elua_net_recv( sock, &net_recv_buff, maxsize, lastchar, timer_id, timeout );
elua_net_recvbuf( sock, &net_recv_buff, maxsize, lastchar, timer_id, timeout );
luaL_pushresult( &net_recv_buff );
lua_pushinteger( L, elua_net_get_last_err( sock ) );
return 2;

View File

@ -34,7 +34,7 @@ static _ssize_t std_read( struct _reent *r, int fd, void* vptr, size_t len )
actsize = 0;
while( 1 )
{
pktsize = elua_net_recv( sock, lptr, len );
pktsize = elua_net_recv( sock, lptr, len, -1, 0, 0 );
// Check EOF
for( j = 0; j < pktsize; j ++ )
if( lptr[ j ] == STD_CTRLZ_CODE )