static bool get_console_input_systemd (const char *prompt, const bool echo, char *input, const int capacity) { int std_out; bool ret = false; struct argv argv; argv_init (&argv); argv_printf (&argv, SYSTEMD_ASK_PASSWORD_PATH); argv_printf_cat (&argv, "%s", prompt); if ((std_out = openvpn_popen (&argv, NULL)) < 0) { return false; } memset (input, 0, capacity); if (read (std_out, input, capacity-1) > 0) { chomp (input); ret = true; } close (std_out); argv_reset (&argv); return ret; }
struct argv argv_new (void) { struct argv ret; argv_init (&ret); return ret; }
void argv_reset (struct argv *a) { size_t i; for (i = 0; i < a->argc; ++i) free (a->argv[i]); free (a->argv); free (a->system_str); argv_init (a); }
static void process_buf(const char *buf) { int i; struct argv_buf a; argv_set_delim(&a, '\n'); argv_init(&a); argv_strdup(&a, buf); argv_parse(&a); for (i = 0; i < a.argc; i++) process_line(a.argv[i]); }
/* * ex_cinit -- * Create an EX command structure. * * PUBLIC: void ex_cinit __P((SCR *, EXCMD *, int, int, db_recno_t, db_recno_t, int)); */ void ex_cinit(SCR *sp, EXCMD *cmdp, int cmd_id, int naddr, db_recno_t lno1, db_recno_t lno2, int force) { memset(cmdp, 0, sizeof(EXCMD)); cmdp->cmd = &cmds[cmd_id]; cmdp->addrcnt = naddr; cmdp->addr1.lno = lno1; cmdp->addr2.lno = lno2; cmdp->addr1.cno = cmdp->addr2.cno = 1; if (force) cmdp->iflags |= E_C_FORCE; (void)argv_init(sp, cmdp); }
/* * Let's keep it simple. */ int main(int argc, char **argv) { int ret = 0; set_defaults(); inform_init(stderr); argv_init(argc, argv); ret = config_init(); assert(ret); work_in_progress(); ret = http_main(); return ret; }
struct argv argv_clone (const struct argv *a, const size_t headroom) { struct argv r; size_t i; argv_init (&r); for (i = 0; i < headroom; ++i) argv_append (&r, NULL); if (a) { for (i = 0; i < a->argc; ++i) argv_append (&r, string_alloc (a->argv[i], NULL)); r.system_str = string_alloc (a->system_str, NULL); } return r; }
static void setup(void) { args = argv_init();; }
/* * Main parser used for converting a string (str) to an argc/argv style * parameter list. This handles escape sequences and quoting. Possibly * correctly. :D * The argc/argv parameters passed are over-written. After they have been * built by this function, the caller should use argv_free() on them to * free() all associated memory. * If the parsing goes correctly, 0 is returned. Otherwise, 1 is returned * and the errmsg parameter is set to some appropriate error message and * both argc/argv are set to 0/NULL. */ int str2argv(char *str, int *argc, char ***argv, const char **errmsg) { bool in_token; bool in_container; bool escaped; char container_start; char c; int len; int i; const char *ERRORS[2] = { "Unmatched quotes", "Unused/Dangling escape sequence" }; *errmsg = NULL; container_start = 0; in_token = false; in_container = false; escaped = false; len = strlen(str); argv_init(argc, argv); for (i = 0; i < len; i++) { c = str[i]; switch (c) { /* handle whitespace */ case ' ': case '\t': case '\n': if (!in_token) continue; if (in_container) { argv_addch(*argc, *argv, c); continue; } if (escaped) { escaped = false; argv_addch(*argc, *argv, c); continue; } /* if reached here, we're at end of token */ in_token = false; argv_finish_token(argc, argv); break; /* handle quotes */ case '\'': case '\"': if (escaped) { argv_addch(*argc, *argv, c); escaped = false; continue; } if (!in_token) { in_token = true; in_container = true; container_start = c; continue; } if (in_token && !in_container) { in_container = true; container_start = c; continue; } if (in_container) { if (c == container_start) { in_container = false; in_token = false; argv_finish_token(argc, argv); continue; } else { argv_addch(*argc, *argv, c); continue; } } *errmsg = ERRORS[0]; argv_free(argc, argv); return 1; case '\\': if (in_container && str[i+1] != container_start) { argv_addch(*argc, *argv, c); continue; } if (escaped) { escaped = false; argv_addch(*argc, *argv, c); continue; } escaped = true; break; default: if (!in_token) in_token = true; if (escaped) escaped = false; argv_addch(*argc, *argv, c); } } argv_finish_token(argc, argv); if (in_container) { argv_free(argc, argv); *errmsg = ERRORS[0]; return 1; } if (escaped) { argv_free(argc, argv); *errmsg = ERRORS[1]; return 1; } (*argv)[*argc] = NULL;/*XXX*/ return 0; }