static cyg_bool net_io_getc_nonblock(void* __ch_data, cyg_uint8* ch) { cyg_uint8 esc; if (!_net_io_getc_nonblock(__ch_data, ch)) return false; if (gdb_active || *ch != TELNET_IAC) return true; // Telnet escape - need to read/handle more while (!_net_io_getc_nonblock(__ch_data, &esc)) ; switch (esc) { case TELNET_IAC: // The other special case - escaped escape return true; case TELNET_IP: // Special case for ^C == Interrupt Process *ch = 0x03; // Just in case the other end needs synchronizing net_io_putc(__ch_data, TELNET_IAC); net_io_putc(__ch_data, TELNET_WONT); net_io_putc(__ch_data, TELNET_TM); net_io_flush(); return true; case TELNET_DO: // Telnet DO option while (!_net_io_getc_nonblock(__ch_data, &esc)) ; // Respond with WONT option net_io_putc(__ch_data, TELNET_IAC); net_io_putc(__ch_data, TELNET_WONT); net_io_putc(__ch_data, esc); return false; // Ignore this whole thing! case TELNET_WILL: // Telnet WILL option while (!_net_io_getc_nonblock(__ch_data, &esc)) ; // Respond with DONT option net_io_putc(__ch_data, TELNET_IAC); net_io_putc(__ch_data, TELNET_DONT); net_io_putc(__ch_data, esc); return false; // Ignore this whole thing! default: return false; } }
static void net_io_write(void* __ch_data, const cyg_uint8* __buf, cyg_uint32 __len) { int old_console; old_console = start_console(); diag_printf("%s.%d\n", __FUNCTION__, __LINE__); end_console(old_console); #if 0 CYGARC_HAL_SAVE_GP(); while(__len-- > 0) net_io_putc(__ch_data, *__buf++); CYGARC_HAL_RESTORE_GP(); #endif }