int run_command(char* cmdline) { char* argv[BUFFER_SIZE]; int argc = tokenize(cmdline, argv); if (argc == 0) { return 0; } if (strcmp(argv[0], "wait") == 0) { return cmd_wait(argc, argv); } else if (strcmp(argv[0], "ls") == 0) { return cmd_ls(argc, argv); } else if (strcmp(argv[0], "cp") == 0) { return cmd_cp(argc, argv); } else if (strcmp(argv[0], "show") == 0) { return cmd_show(argc, argv); } else if (strcmp(argv[0], "rm") == 0) { return cmd_rm(argc, argv); } else if (strcmp(argv[0], "cmp") == 0) { return cmd_cmp(argc, argv); } else if (strcmp(argv[0], "echo") == 0) { return cmd_echo(argc, argv); } else if (strcmp(argv[0], "exit") == 0) { syscall_exit(0); return 1; // not reached } else { int k = strlen(argv[argc-1]); if (argv[argc-1][k-1] == '&') { argv[argc-1][k-1] = '\0'; return background_run(cmdline); } else { return cmd_run(cmdline); } } }
void TConsole::cmd_current_experiment(string arg) { stringstream buf; buf.str(arg); string exp_name; buf>>exp_name; if(exp_name=="") cmd_echo(cur_exp_name); else if(Experiments(exp_name)==0) throw string("Experiment '"+exp_name+"' doesn't exist"); else cur_exp_name=exp_name; }
/******************************************************************** * モニタコマンド受信と実行. ******************************************************************** */ void ProcessIO(void) { // 返答パケットが空であること、かつ、 // 処理対象の受信データがある. { //if((ToPcRdy == 0)) { //受信データがあれば、受信データを受け取る. PacketToPC.raw[0]=Cmd0; // CMD ECHOBACK #if APPLICATION_MODE #if PICAVR_WRITER //コマンドに対応する処理を呼び出す. if(Cmd0 >= HIDASP_PAGE_TX) {cmd_avrspx();} // AVRライターコマンド. else #endif if(Cmd0 >= PICSPX_SETADRS24){cmd_picspx();} // PICライターコマンド. else #endif switch(Cmd0) { case HIDASP_PEEK: {cmd_peek();break;} // メモリー読み出し. case HIDASP_POKE: {cmd_poke();break;} // メモリー書き込み. case HIDASP_JMP: {cmd_exec( BSWAP32(PacketFromPC.adrs),BSWAP16(PacketFromPC.size) ); break;} // 実行. case HIDASP_PAGE_ERASE:{cmd_page_erase();break;} //Flash消去. case HIDASP_PAGE_WRITE:{cmd_page_write();break;} //Flash書込. case HIDASP_FLASH_LOCK:{cmd_flash_lock();break;} //FlashLock. case HIDASP_SET_MODE: {cmd_set_mode();break;} case HIDASP_SAMPLING: {cmd_sampling();break;} case HIDASP_TEST: {cmd_echo();break;} // 接続テスト. #if APPLICATION_MODE case HIDASP_GET_STRING:{cmd_get_string();break;} case HIDASP_USER_CMD: {cmd_user_cmd();break;} #endif default: break; } } // 必要なら、返答パケットをインタラプト転送(EP1)でホストPCに返却する. if( ToPcRdy ) { USBputpacket(PacketToPC.raw,PACKET_SIZE); ToPcRdy = 0; if(poll_mode!=0) { if(mHIDRxIsBusy()) { //コマンドが来ない限り送り続ける. make_report(); } } } }
//--------------------------------------------------------------------------------------------- void debug_port_interrupt_handler(void) { char c; if (USART_GetITStatus(USART1, USART_IT_TXE) == SET) { if (xQueueReceiveFromISR(txchars_queue, &c, NULL) == pdPASS) { USART_SendData(USART1, c); } else { USART_ITConfig(USART1, USART_IT_TXE, DISABLE); } } if (USART_GetITStatus(USART1, USART_IT_RXNE)) { c = USART_ReceiveData(USART1); cmd_echo(c); } }
int run_command(char* cmdline) { char* argv[BUFFER_SIZE]; int argc = tokenize(cmdline, argv); if (argc == 0) { return 0; } if (strcmp(argv[0], "wait") == 0) { return cmd_wait(argc, argv); } else if (strcmp(argv[0], "ls") == 0) { return cmd_ls(argc, argv); } else if (strcmp(argv[0], "cp") == 0) { return cmd_cp(argc, argv); } else if (strcmp(argv[0], "show") == 0) { return cmd_show(argc, argv); } else if (strcmp(argv[0], "rm") == 0) { return cmd_rm(argc, argv); } else if (strcmp(argv[0], "pwd") == 0) { return cmd_pwd(argc, argv); } else if (strcmp(argv[0], "cd") == 0) { return cmd_cd(argc, argv); } else if (strcmp(argv[0], "cmp") == 0) { return cmd_cmp(argc, argv); } else if (strcmp(argv[0], "echo") == 0) { return cmd_echo(argc, argv); } else if (strcmp(argv[0], "mkdir") == 0) { return cmd_mkdir(argc, argv); } else if (strcmp(argv[0], "rmdir") == 0) { return cmd_rmdir(argc, argv); } else { int k = strlen(argv[argc-1]); if (argv[argc-1][k-1] == '&') { argv[argc-1][k-1] = '\0'; return background_run(cmdline); } else { return cmd_run(cmdline); } } }
/******************************************************************** * モニタコマンド受信と実行. ******************************************************************** */ void ProcessIO(void) { // 返答パケットが空であること、かつ、 // 処理対象の受信データがある. if((ToPcRdy == 0) && (USBHandleBusy(USBGenericOutHandle)==0) ) { //受信データがあれば、受信データを受け取る. memcpy64((char*)&PacketFromPC,(char*)OUTPacket); //次の読み込みを発行する. USBGenericOutHandle = USBGenRead(USBGEN_EP_NUM,(BYTE*)&OUTPacket ,USBGEN_EP_SIZE); PacketToPC.raw[0]=Cmd0; // CMD ECHOBACK //コマンドに対応する処理を呼び出す. if(Cmd0==HIDASP_PEEK) {cmd_peek();} // メモリー読み出し. else if(Cmd0==HIDASP_POKE) {cmd_poke();} // メモリー書き込み. else if(Cmd0==HIDASP_JMP) {cmd_exec();} // 実行. else if(Cmd0==HIDASP_TEST) {cmd_echo();} // 接続テスト. else if(Cmd0==HIDASP_GET_STRING){cmd_get_string();} else if(Cmd0==HIDASP_USER_CMD) {cmd_user_cmd();} else if(Cmd0==HIDASP_SET_MODE) {cmd_set_mode();} } // 必要なら、返答パケットをバルク転送(EP1)でホストPCに返却する. if( ToPcRdy ) { if(!USBHandleBusy(USBGenericInHandle)) { memcpy64(INPacket,(char*)&PacketToPC); USBGenericInHandle=USBGenWrite(USBGEN_EP_NUM,(BYTE*)INPacket,USBGEN_EP_SIZE); ToPcRdy = 0; if(poll_mode!=0) { if( USBHandleBusy(USBGenericOutHandle) ) {//コマンドが来ない限り送り続ける. make_report(); } } } } }
/******************************************************************** * モニタコマンド受信と実行. ******************************************************************** */ void ProcessIO(void) { // 返答パケットが空であること、かつ、 // 処理対象の受信データがある. if((ToPcRdy == 0) && (!mHIDRxIsBusy())) { //受信データがあれば、受信データを受け取る. HIDRxReport64((char *)&PacketFromPC); PacketToPC.raw[0]=Cmd0; // CMD ECHOBACK //コマンドに対応する処理を呼び出す. if(Cmd0 >= HIDASP_PAGE_TX) {cmd_avrspx();} // AVRライターコマンド. else if(Cmd0 >= PICSPX_SETADRS24){cmd_picspx();} // PICライターコマンド. else if(Cmd0==HIDASP_PEEK) {cmd_peek();} // メモリー読み出し. else if(Cmd0==HIDASP_POKE) {cmd_poke();} // メモリー書き込み. else if(Cmd0==HIDASP_JMP) {cmd_exec();} // 実行. else if(Cmd0==HIDASP_SET_MODE) {cmd_set_mode();} else if(Cmd0==HIDASP_GET_STRING){cmd_get_string();} else if(Cmd0==HIDASP_USER_CMD) {cmd_user_cmd();} else if(Cmd0==HIDASP_TEST) {cmd_echo();} // 接続テスト. } // 必要なら、返答パケットをインタラプト転送(EP1)でホストPCに返却する. if( ToPcRdy ) { if(!mHIDTxIsBusy()) { HIDTxReport64((char *)&PacketToPC); ToPcRdy = 0; if(poll_mode!=0) { if(mHIDRxIsBusy()) { //コマンドが来ない限り送り続ける. make_report(); } } } } }
int execCommand(char *cmd) { if (*cmd == '#') return 0; // remove comments int currentlyInString = 0; char *commentScan = cmd; while (*commentScan != 0) { if ((*commentScan) == '"') currentlyInString = !currentlyInString; else if (((*commentScan) == '#') && (!currentlyInString)) { *commentScan = 0; break; }; commentScan++; }; if (*cmd == 0) return 0; char processedCommand[1024]; char *put = processedCommand; char *scan = cmd; while (*scan != 0) { if (*scan == '\\') { scan++; if (*scan == 0) break; *put++ = *scan++; continue; } else if (*scan == '$') { char envname[256]; char *envnameput = envname; scan++; while (isalnum(*scan)) { *envnameput++ = *scan++; }; *envnameput = 0; char *value = getenv(envname); if (value != NULL) { strcpy(put, value); put += strlen(value); }; } else { *put++ = *scan++; }; }; *put = 0; int argc = 0; char **argv = NULL; char *nextToStrtok = processedCommand; while (1) { //char *token = strtok(nextToStrtok, nextSplitString); char *token = nextToStrtok; #if 0 nextToStrtok = NULL; if (token != NULL) { if (strlen(token) == 0) continue; }; #endif if (token != NULL) { while (isspace(*token)) token++; if (*token == 0) { token = NULL; } else { const char *termString = " \t"; if (*token == '"') { termString = "\""; token++; }; char *endpos = strpbrk(token, termString); if (endpos == NULL) { nextToStrtok = NULL; } else { *endpos = 0; nextToStrtok = endpos+1; }; }; }; int shouldAdd = 0; if (token == NULL) { shouldAdd = 1; } else { if (strlen(token) > 0) { shouldAdd = 1; }; }; if (shouldAdd) { argv = realloc(argv, sizeof(char*)*(argc+1)); argv[argc++] = token; }; if (token == NULL) break; }; if (argc == 1) return 0; if (strcmp(argv[0], "cd") == 0) { int status = cmd_cd(argc-1, argv); free(argv); return status; } else if (strcmp(argv[0], "exit") == 0) { int status = cmd_exit(argc-1, argv); free(argv); return status; } else if (strcmp(argv[0], "echo") == 0) { int status = cmd_echo(argc-1, argv); free(argv); return status; } else if (strcmp(argv[0], "diag") == 0) { _glidix_diag(); free(argv); return 0; }; char execpath[256]; if (findCommand(execpath, argv[0]) == -1) { free(argv); fprintf(stderr, "%s: command not found\n", argv[0]); return 1; }; pid_t pid = fork(); if (pid == 0) { if (execv(execpath, argv) != 0) { perror(argv[0]); return 1; }; // the compiler won't stop moaning otherwise. // even though execv() obviously doesn't return. return 0; } else { free(argv); shellChildPid = pid; int status; while (1) { int ret = waitpid(pid, &status, 0); // EINTR is the only possible error here, so if it occurs, try again. if (ret != -1) { break; }; }; shellChildPid = 0; if (WIFSIGNALLED(status)) { int termsig = WTERMSIG(status); switch (termsig) { case SIGSEGV: fprintf(stderr, "Invalid memory access\n"); break; case SIGSYS: fprintf(stderr, "Invalid system call\n"); break; }; }; return status; }; };
void doCommand( void ) { int rv = 0; switch( ( *gbuffer & ~0x20 ) ) { // AT<CR> case 0x00: // OK break; // Autobaud detection case 'A': rv = cmd_autobaud(); break; // Set Baudrate case 'B': rv = cmd_baudrate(); break; case 'C': // { char buf[20]; int rr; *buf = 0; rr = getNumericValue( ( gbuffer + 1 ) ); itoa( rr, buf, 10 ); uart0BlockingPutch( ' ' ); uart0BlockingPuts( buf ); } break; case 'D': // Dial - Go online rv = cmd_online(); break; case 'E': // Turn on/off echo rv = cmd_echo(); break; case 'F': // Set Filter/Mask rv = cmd_filter(); break; case 'G': // Send Burst n - number of messages. sz - delay between frames rv = cmd_sendBurst(); break; case 'H': // Hook - Go online rv = cmd_online(); break; case 'I': // Information rv = cmd_info(); break; case 'J': rv = -1; // Not implemented break; case 'K': { canmsg_t msg; msg.id = 0x334; msg.length = 2; msg.data[ 0 ] = 1; msg.data[ 1 ] = 2; msg.flags |= MSG_EXT; //if ( !sja1000_sendMsg( &msg ) ) { //doResponse( FALSE, 0 ); //} if ( !sja1000_writeMsgToBuf( &msg ) ) { rv = -1; // Not implemented; } rv = 0; } break; case 'L': // Go online in Listen only mode rv = cmd_listen(); break; case 'M': rv = -1; // Not implemented break; case 'N': rv = -1; // Not implemented break; case 'O': rv = -1; // Not implemented break; case 'P': rv = -1; // Not implemented break; case 'Q': // Quite rv = cmd_quite(); break; case 'R': // Read message rv = cmd_readmsg(); break; case 'S': // Set/read registers rv = cmd_register(); break; case 'T': rv = -1; // Not implemented break; case 'U': rv = -1; // Not implemented break; case 'V': // Verbal rv = cmd_verbal(); break; case 'W': // Write message rv = cmd_writemsg(); break; case 'X': rv = -1; // Not implemented break; case 'Y': rv = -1; // Not implemented break; case 'Z': // Reset device rv = cmd_reset(); break; case '?': // Get statistics rv = -1; // Not implemented break; default: // Uknown command rv = -1; // Not implemented break; } // Print out response if ( 0 == rv ) { doResponse( TRUE, rv ); } else { doResponse( FALSE, rv ); } }
void pconsole(void) { int key, typed = 0; char kar; Conn *c, *c_next; if (AllConns == NULL) command_mode(); /* start in command mode */ else { printf("\n" "Press <Ctlr-A> for command mode\n" "> "); fflush(stdout); terminal_mode(TERMINAL_RAW); } while(read(fileno(stdin), &kar, 1) > 0) { key = kar & 0xff; if (key == 1) { /* Ctrl-A => command mode */ printf("<Ctrl-A>\n"); command_mode(); continue; } if (key == KEY_CTRL('S')) { /* Ctrl-S => toggle echo */ printf("<Ctrl-S> "); cmd_echo(NULL); printf("> "); fflush(stdout); typed = 0; continue; } if (key == '\r' || key == '\n') { /* return */ printf("\n> "); fflush(stdout); typed = 0; } else { if (flags & FLAGS_ECHO) { if (key == 0x7f || key == '\b') { /* backspace */ if (typed) { printf("\b \b"); fflush(stdout); typed--; } } else { if (key >= ' ' && key <= '~') { fputc(key, stdout); typed++; } else { switch(key) { case 0x1b: printf("<Esc>"); break; case '\t': printf("<Tab>"); break; default: printf("<Ctrl-%c>", key - 1 + 'A'); } printf("\n> "); typed = 0; } fflush(stdout); } } } /* put character in everyones input buffer */ for(c = AllConns; c != NULL; c = c_next) { c_next = c->next; if (c->fd > 0) { seteuid(0); /* regain root privs */ if (ioctl(c->fd, TIOCSTI, &kar) == -1) { /* simulate terminal input */ seteuid(getuid()); /* drop root privs again */ printf("\nioctl() : %s\n", strerror(errno)); if (c->hostname != NULL) printf("detaching from %s#%s\n", c->hostname, c->dev); else printf("detaching from %s\n", c->dev); remove_Conn(c); destroy_Conn(c); } else seteuid(getuid()); /* drop the root privs */ } } if (AllConns == NULL) command_mode(); } }