/*============================================================================== * - T_shell() * * - the shell task entry */ void T_shell () { char usr_cmd_line[_CMD_LEN_MAX]; char *start_cmd = NULL; banner(); _shell_cmd_init(); /* i, exit ... */ yaffs_init(); /* cd, ls, pwd ... */ vi_cmd_init(); /* vi */ net_init(); tetris_cmd_init(); /* tetris */ lian_cmd_init(); /* lianliankan */ date_cmd_init(); /* show and set date */ cal_cmd_init(); /* calculator expression */ gui_init(); ios_init(); media_init(); wtd_cmd_init(); #if 0 fat_cmd_init(); /* fatls */ usb_cmd_init(); /* usb.start ... */ #endif serial_puts("\n-> "); FOREVER { _get_cmd_line(usr_cmd_line); start_cmd = _del_front_space(usr_cmd_line); /* * cmd_line have no char except blank */ if (strlen(start_cmd) == 0) { serial_puts("-> "); continue; } /* * deal with cmd_line */ if (cmd_do(start_cmd) == CMD_EXIT) { serial_puts("\nAu Revoir!\n"); break; } else { serial_puts("\n-> "); } } }
void* _packet_handler(void* arg) { struct _packet* p = (struct _packet*) arg; yldynb_t cmd; yldynb_t data; assert(p); yldynb_init(&cmd, 256); yldynb_init(&data, 4096); if (0 > pdu_parser(&cmd, &data, p->data, p->sz)) goto done; if (0 > cmd_do(yldynb_buf(&cmd), yldynb_buf(&data), yldynb_sz(&data))) goto done; done: yldynb_clean(&cmd); yldynb_clean(&data); free(p->data); free(p); return NULL; }
/*============================================================================== * - T_telnet_server_start() * * - fake telnet server task */ void T_telnet_server_start () { int socket_id; struct sockaddr_in serv_addr; struct sockaddr_in clnt_addr; char recv_buff[256]; int recv_len; socklen_t addr_len = sizeof(struct sockaddr_in); int lwip_ret; char *start_cmd; socket_id = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (socket_id < 0) { serial_printf("telnet: socket() failed!\n"); return; } memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_len = sizeof(struct sockaddr_in); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(TELNET_PORT); serv_addr.sin_addr.s_addr = INADDR_ANY; lwip_ret = bind(socket_id, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); if (lwip_ret < 0) { serial_printf("telnet: bind() failed!\n"); goto over; } FOREVER { recv_len = recvfrom (socket_id, recv_buff, sizeof(recv_buff), 0, (struct sockaddr *)&clnt_addr, &addr_len); if (recv_len <= 0) { if (errno != ETIMEDOUT && errno != EWOULDBLOCK) { serial_printf("telnet: recvfrom () failed!\n"); goto over; } continue; } _G_telnet_open = 1; /* when serial_putc() stor in _G_telnet_buffer */ _G_telnet_buf_context = 0; /* clear output buffer */ /* * delete user input head space char */ recv_buff[recv_len] = '\0'; /* terminal user data */ start_cmd = recv_buff; while (isspace(*start_cmd)) { start_cmd++; } if (strlen(start_cmd) == 0) { /* cmd_line have no char except blank */ serial_puts("-> "); } else { /* deal with cmd_line */ if ((strncmp(start_cmd, "vi", 2)) == 0 && ((strlen(start_cmd) == 2) || (isspace(start_cmd[2])))) { /* is "vi" command */ serial_puts("\nDon't use VI!"); } else { cmd_do(start_cmd); } serial_puts("\n-> "); } sendto (socket_id, _G_telnet_buffer, _G_telnet_buf_context, 0, (const struct sockaddr *)&clnt_addr, addr_len); _G_telnet_open = 0; /* when serial_putc() not stor int _G_telnet_buffer */ } over: _G_telnet_open = 0; close(socket_id); }