📄 shell.c
字号:
lport = strtol(com->args[0], NULL, 10); if(inet_aton(com->args[1], &ipaddr) == -1) { sendstr(strerror(errno), com->conn); return ESYNTAX; } rport = strtol(com->args[2], NULL, 10); /* Find the first unused connection in conns. */ for(i = 0; i < NCONNS && conns[i] != NULL; i++); if(i == NCONNS) { sendstr("No more connections avaliable, sorry.\n", com->conn); return ESUCCESS; } sendstr("Setting up UDP 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(":", com->conn); netconn_write(com->conn, com->args[2], strlen(com->args[2]), NETCONN_COPY); sendstr("\n", com->conn); conns[i] = netconn_new(NETCONN_UDP); if(conns[i] == NULL) { sendstr("Could not create connection identifier (out of memory).\n", 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("\n", 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("\n", com->conn); return ESUCCESS; } sendstr("Connection set up, connection identifier is ", com->conn); sprintf(buffer, "%d\n", i); netconn_write(com->conn, buffer, strlen(buffer), NETCONN_COPY); return ESUCCESS;}/*-----------------------------------------------------------------------------------*/static s8_tcom_udpl(struct command *com){ struct ip_addr ipaddr; u16_t lport, rport; int i; err_t err; lport = strtol(com->args[0], NULL, 10); if(inet_aton(com->args[1], &ipaddr) == -1) { sendstr(strerror(errno), com->conn); return ESYNTAX; } rport = strtol(com->args[2], NULL, 10); /* Find the first unused connection in conns. */ for(i = 0; i < NCONNS && conns[i] != NULL; i++); if(i == NCONNS) { sendstr("No more connections avaliable, sorry.\n", com->conn); return ESUCCESS; } sendstr("Setting up UDP-Lite 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(":", com->conn); netconn_write(com->conn, com->args[2], strlen(com->args[2]), NETCONN_COPY); sendstr("\n", com->conn); conns[i] = netconn_new(NETCONN_UDPLITE); if(conns[i] == NULL) { sendstr("Could not create connection identifier (out of memory).\n", 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("\n", 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("\n", com->conn); return ESUCCESS; } sendstr("Connection set up, connection identifier is ", com->conn); sprintf(buffer, "%d\n", i); netconn_write(com->conn, buffer, strlen(buffer), NETCONN_COPY); return ESUCCESS;}/*-----------------------------------------------------------------------------------*/static s8_tcom_udpn(struct command *com){ struct ip_addr ipaddr; u16_t lport, rport; int i; err_t err; lport = strtol(com->args[0], NULL, 10); if(inet_aton(com->args[1], &ipaddr) == -1) { sendstr(strerror(errno), com->conn); return ESYNTAX; } rport = strtol(com->args[2], NULL, 10); /* Find the first unused connection in conns. */ for(i = 0; i < NCONNS && conns[i] != NULL; i++); if(i == NCONNS) { sendstr("No more connections avaliable, sorry.\n", com->conn); return ESUCCESS; } sendstr("Setting up UDP connection without checksums 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(":", com->conn); netconn_write(com->conn, com->args[2], strlen(com->args[2]), NETCONN_COPY); sendstr("\n", com->conn); conns[i] = netconn_new(NETCONN_UDPNOCHKSUM); if(conns[i] == NULL) { sendstr("Could not create connection identifier (out of memory).\n", 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("\n", 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("\n", com->conn); return ESUCCESS; } sendstr("Connection set up, connection identifier is ", com->conn); sprintf(buffer, "%d\n", i); netconn_write(com->conn, buffer, strlen(buffer), NETCONN_COPY); return ESUCCESS;}/*-----------------------------------------------------------------------------------*/static s8_tcom_udpb(struct command *com){ struct ip_addr ipaddr; u16_t lport, rport; int i; err_t err; struct ip_addr bcaddr; lport = strtol(com->args[0], NULL, 10); if(inet_aton(com->args[1], &ipaddr) == -1) { sendstr(strerror(errno), com->conn); return ESYNTAX; } rport = strtol(com->args[2], NULL, 10); /* Find the first unused connection in conns. */ for(i = 0; i < NCONNS && conns[i] != NULL; i++); if(i == NCONNS) { sendstr("No more connections avaliable, sorry.\n", 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("\n", com->conn); conns[i] = netconn_new(NETCONN_UDP); if(conns[i] == NULL) { sendstr("Could not create connection identifier (out of memory).\n", 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("\n", 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("\n", com->conn); return ESUCCESS; } sendstr("Connection set up, connection identifier is ", com->conn); sprintf(buffer, "%d\n", i); netconn_write(com->conn, buffer, strlen(buffer), NETCONN_COPY); return ESUCCESS;}/*-----------------------------------------------------------------------------------*/static s8_tcom_usnd(struct command *com){ int i; err_t err; struct netbuf *buf; char *mem; i = strtol(com->args[0], NULL, 10); if(i > NCONNS) { sendstr("Connection identifier too high.\n", com->conn); return ESUCCESS; } if(conns[i] == NULL) { sendstr("Connection identifier not in use.\n", com->conn); return ESUCCESS; } buf = netbuf_new(); mem = netbuf_alloc(buf, strlen(com->args[1]) + 1); if(mem == NULL) { sendstr("Could not allocate memory for sending.\n", com->conn); return ESUCCESS; } strncpy(mem, com->args[1], strlen(com->args[1]) + 1); 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("\n", com->conn); return ESUCCESS; } sendstr("Data sent.\n", com->conn); return ESUCCESS;}/*-----------------------------------------------------------------------------------*/static s8_tcom_help(struct command *com){ sendstr(help_msg, com->conn); return ESUCCESS;}/*-----------------------------------------------------------------------------------*/static s8_tparse_command(struct command *com, u32_t len){ u16_t i; u16_t bufp; if(strncmp(buffer, "open", 4) == 0) { com->exec = com_open; com->nargs = 2; } else if(strncmp(buffer, "lstn", 4) == 0) { com->exec = com_lstn; com->nargs = 1; } else if(strncmp(buffer, "acpt", 4) == 0) { com->exec = com_acpt; com->nargs = 1; } else if(strncmp(buffer, "clos", 4) == 0) { com->exec = com_clos; com->nargs = 1; } else if(strncmp(buffer, "stat", 4) == 0) { com->exec = com_stat; com->nargs = 0; } else if(strncmp(buffer, "send", 4) == 0) { com->exec = com_send; com->nargs = 2; } else if(strncmp(buffer, "recv", 4) == 0) { com->exec = com_recv; com->nargs = 1; } else if(strncmp(buffer, "udpc", 4) == 0) { com->exec = com_udpc; com->nargs = 3; } else if(strncmp(buffer, "udpb", 4) == 0) { com->exec = com_udpb; com->nargs = 2; } else if(strncmp(buffer, "udpl", 4) == 0) { com->exec = com_udpl; com->nargs = 3; } else if(strncmp(buffer, "udpn", 4) == 0) { com->exec = com_udpn; com->nargs = 3; } else if(strncmp(buffer, "usnd", 4) == 0) { com->exec = com_usnd; com->nargs = 2; } else if(strncmp(buffer, "help", 4) == 0) { com->exec = com_help; com->nargs = 0; } else if(strncmp(buffer, "quit", 4) == 0) { printf("quit\n"); 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] = &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 voiderror(s8_t err, struct netconn *conn){ switch(err) { case ESYNTAX: sendstr("## Syntax error\n", conn); break; case ETOOFEW: sendstr("## Too few arguments to command given\n", conn); break; case ETOOMANY: sendstr("## Too many arguments to command given\n", conn); break; }}/*-----------------------------------------------------------------------------------*/static voidprompt(struct netconn *conn){ sendstr("> ", conn);} /*-----------------------------------------------------------------------------------*/static voidshell_main(struct netconn *conn){ struct netbuf *buf; u32_t len; struct command com; s8_t err; int i; do { buf = netconn_recv(conn); if(buf != NULL) { netbuf_copy(buf, buffer, 1024); len = netbuf_len(buf); netbuf_delete(buf); if(len >= 4) { if(buffer[0] != 0xff && buffer[1] != 0xfe) { err = parse_command(&com, len); if(err == ESUCCESS) { com.conn = conn; err = com.exec(&com); } if(err != ESUCCESS) { error(err, conn); } if(err == ECLOSED) { printf("Closed\n"); error(err, conn); goto close; } } else { sendstr("\n\n" "lwIP simple interactive shell.\n" "(c) Copyright 2001, Swedish Institute of Computer Science.\n" "Written by Adam Dunkels.\n" "For help, try the \"help\" command.\n", conn); } } } if(buf != NULL) { prompt(conn); } } while(buf != NULL); printf("buf == NULL err %s\n", lwip_strerr(conn->err)); 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; conn = netconn_new(NETCONN_TCP); netconn_bind(conn, NULL, 23); netconn_listen(conn); while(1) { newconn = netconn_accept(conn); shell_main(newconn); netconn_delete(newconn); }}/*-----------------------------------------------------------------------------------*/voidshell_init(void) { sys_thread_new(shell_thread, NULL);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -