/** * shell_runscript * * Parse and execute a script. */ int shell_runscript(char *buffer) { char *token, *save; char *delim = ";\n"; char *argv[MAXLINE]; int stat, line, argc; if (buffer == NULL) return -1; token = strtok_r(buffer, delim, &save); for (line = 1; token != NULL; line++) { if ((argc = shell_parseline(token, argv)) == -1) { printf("runscript: syntax error on line %d, aborting.\n", line); stat = -2; break; } if ((stat = shell_callcmd(argc, argv)) != 0) { printf("runscript: command error on line %d, aborting.\n", line); stat = -3; break; } shell_flushargs(argv); token = strtok_r(NULL, delim, &save); } return stat; }
int exec(FILE * f, char * line, const struct shell_cmd * cmd_tab) { char * argv[SHELL_ARG_MAX]; struct shell_cmd * cmd; value_t val; int argc; int n; /* if ((s = shell_stripline(line)) == NULL) { return 0; } */ if ((argc = shell_parseline(line, argv, SHELL_ARG_MAX)) == 0) { return 0; } #if 0 for (n = 0; n < argc; n++) { printf(" '%s'", argv[n]); } printf("\n"); #endif /* */ if (argc > 2) { if (strcmp(argv[1], "=") == 0) { argv[1] = argv[0]; argv[0] = "let"; } } if ((cmd = cmd_lookup(cmd_tab, argv[0])) == NULL) { DCC_LOG(LOG_TRACE, "cmd_lookup() == NULL"); if ((n = eval_uint32(&val, argc, argv)) < 0) { DCC_LOG(LOG_WARNING, "eval_uint32()"); return n; } if (n != argc) { DCC_LOG(LOG_WARNING, "parse error"); return -2; } show_uint32(f, val.uint32); return 0; } return cmd->callback(f, argc, argv); }
/** * shell_prompt * * An interactive shell for xBoot. */ void shell_prompt(const char *prompt) { int argc, guard; char *argv[MAXLINE]; char buffer[MAXLINE]; printf("\n\nEntering interactive shell. Run \'help\' for a list of commands.\n\n"); guard = (strlen(prompt)); while (1) { printf("%s", prompt); shell_getline(buffer, guard, MAXLINE); argc = shell_parseline(buffer, argv); shell_callcmd(argc, argv); shell_flushargs(argv); shell_flushbuffer(buffer); } return; }