| /** | |
| * \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> "); | |
| } | |
| /*-----------------------------------------------------------------------------------*/ |