0,0 → 1,181 |
/** |
* \addtogroup telnetd |
* @{ |
*/ |
|
/** |
* \file |
* An example telnet server shell |
* \author Adam Dunkels <adam@dunkels.com> |
*/ |
|
/* |
* Copyright (c) 2003, Adam Dunkels. |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. The name of the author may not be used to endorse or promote |
* products derived from this software without specific prior |
* written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS |
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY |
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE |
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
* |
* This file is part of the Contiki desktop OS. |
* |
* $Id: telnetd-shell.c,v 1.1.2.1 2003/10/06 22:56:22 adam Exp $ |
* |
*/ |
|
#include "uip.h" |
#include "telnetd.h" |
#include <string.h> |
|
struct ptentry { |
char c; |
void (* pfunc)(struct telnetd_state *s, char *str); |
}; |
|
/*-----------------------------------------------------------------------------------*/ |
static void |
parse(struct telnetd_state *s, register char *str, struct ptentry *t) |
{ |
register struct ptentry *p; |
char *sstr; |
|
sstr = str; |
|
/* Loop over the parse table entries in t in order to find one that |
matches the first character in str. */ |
for(p = t; p->c != 0; ++p) { |
if(*str == p->c) { |
/* Skip rest of the characters up to the first space. */ |
while(*str != ' ') { |
++str; |
} |
|
/* Skip all spaces.*/ |
while(*str == ' ') { |
++str; |
} |
|
/* Call parse table entry function and return. */ |
p->pfunc(s, str); |
return; |
} |
} |
|
/* Did not find matching entry in parse table. We just call the |
default handler supplied by the caller and return. */ |
p->pfunc(s, str); |
} |
/*-----------------------------------------------------------------------------------*/ |
static void |
exitt(struct telnetd_state *s, char *str) |
{ |
telnetd_close(s); |
} |
/*-----------------------------------------------------------------------------------*/ |
static void |
inttostr(register char *str, unsigned int i) |
{ |
str[0] = '0' + i / 100; |
if(str[0] == '0') { |
str[0] = ' '; |
} |
str[1] = '0' + (i / 10) % 10; |
if(str[1] == '0') { |
str[1] = ' '; |
} |
str[2] = '0' + i % 10; |
str[3] = ' '; |
str[4] = 0; |
} |
/*-----------------------------------------------------------------------------------*/ |
static void |
stats(struct telnetd_state *s, char *strr) |
{ |
char str[10]; |
|
inttostr(str, uip_stat.ip.recv); |
telnetd_output(s, "IP packets received ", str); |
inttostr(str, uip_stat.ip.sent); |
telnetd_output(s, "IP packets sent ", str); |
inttostr(str, uip_stat.ip.drop); |
telnetd_output(s, "IP packets dropped ", str); |
|
inttostr(str, uip_stat.icmp.recv); |
telnetd_output(s, "ICMP packets received ", str); |
inttostr(str, uip_stat.icmp.sent); |
telnetd_output(s, "ICMP packets sent ", str); |
inttostr(str, uip_stat.icmp.drop); |
telnetd_output(s, "ICMP packets dropped ", str); |
|
inttostr(str, uip_stat.tcp.recv); |
telnetd_output(s, "TCP packets received ", str); |
inttostr(str, uip_stat.tcp.sent); |
telnetd_output(s, "TCP packets sent ", str); |
inttostr(str, uip_stat.tcp.drop); |
telnetd_output(s, "TCP packets dropped ", str); |
inttostr(str, uip_stat.tcp.rexmit); |
telnetd_output(s, "TCP packets retransmitted ", str); |
inttostr(str, uip_stat.tcp.synrst); |
telnetd_output(s, "TCP connection attempts ", str); |
} |
/*-----------------------------------------------------------------------------------*/ |
static void |
help(struct telnetd_state *s, char *str) |
{ |
telnetd_output(s, "Available commands:", ""); |
telnetd_output(s, "stats - show uIP statistics", ""); |
telnetd_output(s, "exit - exit shell", ""); |
telnetd_output(s, "? - show this help", ""); |
} |
/*-----------------------------------------------------------------------------------*/ |
static void |
none(struct telnetd_state *s, char *str) |
{ |
if(strlen(str) > 0) { |
telnetd_output(s, "Unknown command", ""); |
} |
} |
/*-----------------------------------------------------------------------------------*/ |
static struct ptentry configparsetab[] = |
{{'s', stats}, |
{'e', exitt}, |
{'?', help}, |
|
/* Default action */ |
{0, none}}; |
/*-----------------------------------------------------------------------------------*/ |
void |
telnetd_connected(struct telnetd_state *s) |
{ |
telnetd_output(s, "uIP command shell", ""); |
telnetd_output(s, "Type '?' for help", ""); |
telnetd_prompt(s, "uIP-0.9> "); |
} |
/*-----------------------------------------------------------------------------------*/ |
void |
telnetd_input(struct telnetd_state *s, char *cmd) |
{ |
parse(s, cmd, configparsetab); |
telnetd_prompt(s, "uIP-0.9> "); |
} |
/*-----------------------------------------------------------------------------------*/ |