int main(int argc, char **argv) { char test1[] = " Hallo \n"; printf("Before: '%s'\n", test1); char *after = prepare(test1); printf("After: '%s'\n", after ? after : "<NULL>"); char test2[] = " \t\t \n"; printf("Before: '%s'\n", test2); after = prepare(test2); printf("After: '%s'\n", after ? after : "<NULL>"); struct cmd cmd = {0, 0}; char line[] = "echo \"test bla\" 'blub\\' diedup'"; split_cmd(line, &cmd); printf("Cmd: \n Argc: %d\n", cmd.argc); int i=0; for (; i < cmd.argc; ++i) { printf(" ->%s\n", cmd.argv[i]); } char *relined = build_cmd(&cmd); printf("Reassembled: '%s'\n", relined); free_argv(&cmd); free(relined); return 0; }
int main(void) { cfg_opt_t sub_opts[] = { CFG_BOOL("bool", cfg_false, CFGF_NONE), CFG_STR("string", NULL, CFGF_NONE), CFG_INT("int", 0, CFGF_NONE), CFG_FLOAT("float", 0.0, CFGF_NONE), CFG_END() }; cfg_opt_t opts[] = { CFG_BOOL_LIST("bool", cfg_false, CFGF_NONE), CFG_STR_LIST("string", NULL, CFGF_NONE), CFG_INT_LIST("int", 0, CFGF_NONE), CFG_FLOAT_LIST("float", "0.0", CFGF_NONE), CFG_SEC("sub", sub_opts, CFGF_MULTI | CFGF_TITLE | CFGF_NO_TITLE_DUPES), CFG_END() }; char *cmd = NULL; const char *reply; int res; int i; cfg = cfg_init(opts, CFGF_NONE); for (;;) { printf("cli> "); fflush(stdout); if (cmd) free(cmd); cmd = input_cmd(); if (!cmd) exit(0); res = split_cmd(cmd); if (res < 0) { printf("Parse error\n"); continue; } if (cmdc == 0) continue; for (i = 0; cmds[i].cmd; ++i) { if (strcmp(cmdv[0], cmds[i].cmd)) continue; reply = cmds[i].handler(cmdc, cmdv); if (!reply) exit(0); printf("%s", reply); break; } if (!cmds[i].cmd) printf("Unknown command\n"); } cfg_free(cfg); return 0; }
int prepare_cmds(char **cmd, char *ops, int ops_count) { /* * Funkcja ma za przekazać pierwszą komendę z **cmd do wykonania i zapisać jej wynik * do zmiennej result. * Jeśli wywoływana funkcja zawiera operatory logiczne, to wykonujemy kolejne komendy * w zależności od wartości result i kolejnego operatora logicznego. */ int args_count; int iter = 0; char ** args; int logical = ops_count > 0; args = split_cmd(cmd[iter++], &args_count); int result = check_cmd(args, args_count, logical, stdin, stdout); free(args); if (logical) { do { args = split_cmd(cmd[iter], &args_count); result = (*logic_tokens[token_idx(ops[iter - 1])].func)(result, args, args_count); iter++; free(args); } while(iter <= ops_count); } }
void exec_cmd(char *str) { char **cmd; str = ft_strdup(parse_vars(str)); if (!(cmd = split_cmd(str)) || !cmd[0]) { free_tab(cmd); return ; } if (!exec_file(cmd) && !exec_builtin(cmd)) exec_path(cmd); free(str); free_tab(cmd); }
void OnThreadRun() { while (true) { fprintf(stderr, "%s", PROMPT); // print to error will not buffer the printed message if (fgets(m_buf, MAX_LINE_LEN - 1, stdin) == NULL) { fprintf(stderr, "fgets failed: %d\n", errno); continue; } m_buf[strlen(m_buf) - 1] = '\0'; // remove newline character split_cmd(m_buf); exec_cmd(); } }
int main(){ int argc; char cmd[LEN_CMD]; char *argv[MAX_ARGC]; welcome(); for (;;){ argc = 0; memset(cmd, 0, sizeof(cmd)); memset(argv, 0, sizeof(argv)); if (get_cmd(cmd) < 0) break; if (split_cmd(argv, &argc, cmd) < 0){ printf("sh: split cmd fail, too many arguments\n"); }; if (argc == 0) continue; /* build-in command cd */ if (strcmp(argv[0], "cd") == 0){ if (argc < 2){ printf("cd: missing directory.\n"); } else { if (_chdir(argv[1]) < 0){ printf("cd: can not change directroy to %s\n", argv[1]); } } /* external command in /bin */ } else { parse_cmd(argc, argv); } } _exit(); }
/** * vrrp_ctrl_cmd() - Interprete control fifo cmd */ static inline vrrp_event_t vrrp_ctrl_cmd(struct vrrp *vrrp, struct vrrp_net *vnet) { int nword; nword = split_cmd(vrrp->ctrl.msg, vrrp->ctrl.cmd, CTRL_CMD_NTOKEN, WHITESPACE); if (nword == 0) return INVALID; /* * control cmd stop */ if (matches(vrrp->ctrl.cmd[0], "stop")) { log_notice("vrid %d :: control cmd stop, exiting", vrrp->vrid); set_bit(UVRRPD_RELOAD, ®); clear_bit(KEEP_GOING, ®); vrrp_ctrl_cmd_flush(&vrrp->ctrl); return CTRL_FIFO; } /* * control cmd reload */ if (matches(vrrp->ctrl.cmd[0], "reload")) { set_bit(UVRRPD_RELOAD, ®); vrrp_ctrl_cmd_flush(&vrrp->ctrl); return CTRL_FIFO; } /* * control cmd state || status */ if (matches(vrrp->ctrl.cmd[0], "state") || matches(vrrp->ctrl.cmd[0], "status")) { set_bit(UVRRPD_DUMP, ®); vrrp_ctrl_cmd_flush(&vrrp->ctrl); return CTRL_FIFO; } /* * control cmd prio */ if (matches(vrrp->ctrl.cmd[0], "prio")) { if (nword != 2) { log_error ("vrid %d :: invalid syntax, control cmd prio <priority>", vrrp->vrid); vrrp_ctrl_cmd_flush(&vrrp->ctrl); return INVALID; } /* fetch priority */ int err; unsigned long opt; err = mystrtoul(&opt, vrrp->ctrl.cmd[1], VRRP_PRIO_MAX); vrrp_ctrl_cmd_flush(&vrrp->ctrl); if (err == -ERANGE) { log_error ("vrid %d :: invalid control cmd prio, 0 < priority < 255", vrrp->vrid); return INVALID; } if (err == -EINVAL) { log_error ("vrid %d :: invalid control cmd prio, error parsing \"%s\" as a number", vrrp->vrid, vrrp->ctrl.cmd[1]); return INVALID; } /* change prio */ if (vrrp->priority != (uint8_t) opt) { vrrp->priority = (uint8_t) opt; vrrp_adv_set_priority(vnet, vrrp->priority); } /* reload bit */ set_bit(UVRRPD_RELOAD, ®); return CTRL_FIFO; } vrrp_ctrl_cmd_flush(&vrrp->ctrl); return INVALID; }