📄 shell.c
字号:
sendstr("(debugging must be turned on for error message to appear)", com->conn);
#endif /* LWIP_DEBUG */
sendstr(NEWLINE, com->conn);
return ESUCCESS;
}
err = netconn_bind(conns[i], IP_ADDR_ANY, lport);
if (err != ERR_OK) {
netconn_delete(conns[i]);
conns[i] = NULL;
sendstr("Could not bind: ", com->conn);
#ifdef LWIP_DEBUG
sendstr(lwip_strerr(err), com->conn);
#else
sendstr("(debugging must be turned on for error message to appear)", com->conn);
#endif /* LWIP_DEBUG */
sendstr(NEWLINE, com->conn);
return ESUCCESS;
}
sendstr("Connection set up, connection identifier is ", com->conn);
snprintf((char *)buffer, sizeof(buffer), "%d"NEWLINE, i);
netconn_write(com->conn, buffer, strlen((const char *)buffer), NETCONN_COPY);
return ESUCCESS;
}
/*-----------------------------------------------------------------------------------*/
static s8_t
com_udpb(struct command *com)
{
ip_addr_t ipaddr;
u16_t lport, rport;
int i;
err_t err;
ip_addr_t bcaddr;
long tmp;
tmp = strtol(com->args[0], NULL, 10);
if((tmp < 0) || (tmp > 0xffff)) {
sendstr("Invalid port number."NEWLINE, com->conn);
return ESUCCESS;
}
lport = (u16_t)tmp;
if (ipaddr_aton(com->args[1], &ipaddr) == -1) {
sendstr(strerror(errno), com->conn);
return ESYNTAX;
}
tmp = strtol(com->args[2], NULL, 10);
if((tmp < 0) || (tmp > 0xffff)) {
sendstr("Invalid port number."NEWLINE, com->conn);
return ESUCCESS;
}
rport = (u16_t)tmp;
/* Find the first unused connection in conns. */
for(i = 0; i < NCONNS && conns[i] != NULL; i++);
if (i == NCONNS) {
sendstr("No more connections available, sorry."NEWLINE, com->conn);
return ESUCCESS;
}
sendstr("Setting up UDP broadcast connection from port ", com->conn);
netconn_write(com->conn, com->args[0], strlen(com->args[0]), NETCONN_COPY);
sendstr(" to ", com->conn);
netconn_write(com->conn, com->args[1], strlen(com->args[1]), NETCONN_COPY);
sendstr(NEWLINE, com->conn);
conns[i] = netconn_new(NETCONN_UDP);
if (conns[i] == NULL) {
sendstr("Could not create connection identifier (out of memory)."NEWLINE, com->conn);
return ESUCCESS;
}
err = netconn_connect(conns[i], &ipaddr, rport);
if (err != ERR_OK) {
netconn_delete(conns[i]);
conns[i] = NULL;
sendstr("Could not connect to remote host: ", com->conn);
#ifdef LWIP_DEBUG
sendstr(lwip_strerr(err), com->conn);
#else
sendstr("(debugging must be turned on for error message to appear)", com->conn);
#endif /* LWIP_DEBUG */
sendstr(NEWLINE, com->conn);
return ESUCCESS;
}
IP4_ADDR(&bcaddr, 255,255,255,255);
err = netconn_bind(conns[i], &bcaddr, lport);
if (err != ERR_OK) {
netconn_delete(conns[i]);
conns[i] = NULL;
sendstr("Could not bind: ", com->conn);
#ifdef LWIP_DEBUG
sendstr(lwip_strerr(err), com->conn);
#else
sendstr("(debugging must be turned on for error message to appear)", com->conn);
#endif /* LWIP_DEBUG */
sendstr(NEWLINE, com->conn);
return ESUCCESS;
}
sendstr("Connection set up, connection identifier is ", com->conn);
snprintf((char *)buffer, sizeof(buffer), "%d"NEWLINE, i);
netconn_write(com->conn, buffer, strlen((const char *)buffer), NETCONN_COPY);
return ESUCCESS;
}
/*-----------------------------------------------------------------------------------*/
static s8_t
com_usnd(struct command *com)
{
long i;
err_t err;
struct netbuf *buf;
char *mem;
u16_t len;
size_t tmp;
i = strtol(com->args[0], NULL, 10);
if (i > NCONNS) {
sendstr("Connection identifier too high."NEWLINE, com->conn);
return ESUCCESS;
}
if (conns[i] == NULL) {
sendstr("Connection identifier not in use."NEWLINE, com->conn);
return ESUCCESS;
}
tmp = strlen(com->args[1]) + 1;
if (tmp > 0xffff) {
sendstr("Invalid length."NEWLINE, com->conn);
return ESUCCESS;
}
len = (u16_t)tmp;
buf = netbuf_new();
mem = (char *)netbuf_alloc(buf, len);
if (mem == NULL) {
sendstr("Could not allocate memory for sending."NEWLINE, com->conn);
return ESUCCESS;
}
strncpy(mem, com->args[1], len);
err = netconn_send(conns[i], buf);
netbuf_delete(buf);
if (err != ERR_OK) {
sendstr("Could not send data: ", com->conn);
#ifdef LWIP_DEBUG
sendstr(lwip_strerr(err), com->conn);
#else
sendstr("(debugging must be turned on for error message to appear)", com->conn);
#endif /* LWIP_DEBUG */
sendstr(NEWLINE, com->conn);
return ESUCCESS;
}
sendstr("Data sent."NEWLINE, com->conn);
return ESUCCESS;
}
/*-----------------------------------------------------------------------------------*/
static s8_t
com_help(struct command *com)
{
sendstr(help_msg1, com->conn);
sendstr(help_msg2, com->conn);
return ESUCCESS;
}
/*-----------------------------------------------------------------------------------*/
static s8_t
parse_command(struct command *com, u32_t len)
{
u16_t i;
u16_t bufp;
if (strncmp((const char *)buffer, "open", 4) == 0) {
com->exec = com_open;
com->nargs = 2;
} else if (strncmp((const char *)buffer, "lstn", 4) == 0) {
com->exec = com_lstn;
com->nargs = 1;
} else if (strncmp((const char *)buffer, "acpt", 4) == 0) {
com->exec = com_acpt;
com->nargs = 1;
} else if (strncmp((const char *)buffer, "clos", 4) == 0) {
com->exec = com_clos;
com->nargs = 1;
#if LWIP_STATS
} else if (strncmp((const char *)buffer, "stat", 4) == 0) {
com->exec = com_stat;
com->nargs = 0;
#endif
} else if (strncmp((const char *)buffer, "send", 4) == 0) {
com->exec = com_send;
com->nargs = 2;
} else if (strncmp((const char *)buffer, "recv", 4) == 0) {
com->exec = com_recv;
com->nargs = 1;
} else if (strncmp((const char *)buffer, "udpc", 4) == 0) {
com->exec = com_udpc;
com->nargs = 3;
} else if (strncmp((const char *)buffer, "udpb", 4) == 0) {
com->exec = com_udpb;
com->nargs = 2;
} else if (strncmp((const char *)buffer, "udpl", 4) == 0) {
com->exec = com_udpl;
com->nargs = 3;
} else if (strncmp((const char *)buffer, "udpn", 4) == 0) {
com->exec = com_udpn;
com->nargs = 3;
} else if (strncmp((const char *)buffer, "usnd", 4) == 0) {
com->exec = com_usnd;
com->nargs = 2;
} else if (strncmp((const char *)buffer, "help", 4) == 0) {
com->exec = com_help;
com->nargs = 0;
} else if (strncmp((const char *)buffer, "quit", 4) == 0) {
printf("quit"NEWLINE);
return ECLOSED;
} else {
return ESYNTAX;
}
if (com->nargs == 0) {
return ESUCCESS;
}
bufp = 0;
for(; bufp < len && buffer[bufp] != ' '; bufp++);
for(i = 0; i < 10; i++) {
for(; bufp < len && buffer[bufp] == ' '; bufp++);
if (buffer[bufp] == '\r' ||
buffer[bufp] == '\n') {
buffer[bufp] = 0;
if (i < com->nargs - 1) {
return ETOOFEW;
}
if (i > com->nargs - 1) {
return ETOOMANY;
}
break;
}
if (bufp > len) {
return ETOOFEW;
}
com->args[i] = (char *)&buffer[bufp];
for(; bufp < len && buffer[bufp] != ' ' && buffer[bufp] != '\r' &&
buffer[bufp] != '\n'; bufp++) {
if (buffer[bufp] == '\\') {
buffer[bufp] = ' ';
}
}
if (bufp > len) {
return ESYNTAX;
}
buffer[bufp] = 0;
bufp++;
if (i == com->nargs - 1) {
break;
}
}
return ESUCCESS;
}
/*-----------------------------------------------------------------------------------*/
static void
shell_error(s8_t err, struct netconn *conn)
{
switch (err) {
case ESYNTAX:
sendstr("## Syntax error"NEWLINE, conn);
break;
case ETOOFEW:
sendstr("## Too few arguments to command given"NEWLINE, conn);
break;
case ETOOMANY:
sendstr("## Too many arguments to command given"NEWLINE, conn);
break;
case ECLOSED:
sendstr("## Connection closed"NEWLINE, conn);
break;
default:
/* unknown error, don't assert here */
break;
}
}
/*-----------------------------------------------------------------------------------*/
static void
prompt(struct netconn *conn)
{
sendstr("> ", conn);
}
/*-----------------------------------------------------------------------------------*/
static void
shell_main(struct netconn *conn)
{
struct pbuf *p;
u16_t len = 0, cur_len;
struct command com;
s8_t err;
int i;
err_t ret;
#if SHELL_ECHO
void *echomem;
#endif /* SHELL_ECHO */
do {
ret = netconn_recv_tcp_pbuf(conn, &p);
if (ret == ERR_OK) {
pbuf_copy_partial(p, &buffer[len], BUFSIZE - len, 0);
cur_len = p->tot_len;
len += cur_len;
#if SHELL_ECHO
echomem = mem_malloc(cur_len);
if (echomem != NULL) {
pbuf_copy_partial(p, echomem, cur_len, 0);
netconn_write(conn, echomem, cur_len, NETCONN_COPY);
mem_free(echomem);
}
#endif /* SHELL_ECHO */
pbuf_free(p);
if (((len > 0) && ((buffer[len-1] == '\r') || (buffer[len-1] == '\n'))) ||
(len >= BUFSIZE)) {
if (buffer[0] != 0xff &&
buffer[1] != 0xfe) {
err = parse_command(&com, len);
if (err == ESUCCESS) {
com.conn = conn;
err = com.exec(&com);
}
if (err == ECLOSED) {
printf("Closed"NEWLINE);
shell_error(err, conn);
goto close;
}
if (err != ESUCCESS) {
shell_error(err, conn);
}
} else {
sendstr(NEWLINE NEWLINE
"lwIP simple interactive shell."NEWLINE
"(c) Copyright 2001, Swedish Institute of Computer Science."NEWLINE
"Written by Adam Dunkels."NEWLINE
"For help, try the \"help\" command."NEWLINE, conn);
}
if (ret == ERR_OK) {
prompt(conn);
}
len = 0;
}
}
} while (ret == ERR_OK);
printf("err %s"NEWLINE, lwip_strerr(ret));
close:
netconn_close(conn);
for(i = 0; i < NCONNS; i++) {
if (conns[i] != NULL) {
netconn_delete(conns[i]);
}
conns[i] = NULL;
}
}
/*-----------------------------------------------------------------------------------*/
static void
shell_thread(void *arg)
{
struct netconn *conn, *newconn;
err_t err;
LWIP_UNUSED_ARG(arg);
conn = netconn_new(NETCONN_TCP);
netconn_bind(conn, NULL, 23);
netconn_listen(conn);
while (1) {
err = netconn_accept(conn, &newconn);
if (err == ERR_OK) {
shell_main(newconn);
netconn_delete(newconn);
}
}
}
/*-----------------------------------------------------------------------------------*/
void
shell_init(void)
{
sys_thread_new("shell_thread", shell_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
}
#endif /* LWIP_NETCONN */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -