static void pcf_normalize_daemon_args(ARGV *argv) { int field; char *arg; char *cp; char *junk; int extract_field; /* * Normalize options to simplify later processing. */ for (field = PCF_MASTER_MIN_FIELDS; argv->argv[field] != 0; field++) { arg = argv->argv[field]; if (arg[0] != '-' || strcmp(arg, "--") == 0) break; for (cp = arg + 1; *cp; cp++) { if (strchr(pcf_daemon_options_expecting_value, *cp) != 0 && cp > arg + 1) { /* Split "-stuffozz" into "-stuff" and "-ozz". */ junk = concatenate("-", cp, (char *) 0); argv_insert_one(argv, field + 1, junk); myfree(junk); *cp = 0; /* XXX argv_replace_one() */ break; } } if (strchr(pcf_daemon_options_expecting_value, arg[1]) == 0) /* Option requires no value. */ continue; if (arg[2] != 0) { /* Split "-oname=value" into "-o" "name=value". */ argv_insert_one(argv, field + 1, arg + 2); arg[2] = 0; /* XXX argv_replace_one() */ field += 1; extract_field = (argv->argv[field][0] == CHARS_BRACE[0]); } else if (argv->argv[field + 1] != 0) { /* Already in "-o" "name=value" form. */ field += 1; extract_field = (argv->argv[field][0] == CHARS_BRACE[0]); } else extract_field = 0; /* Extract text inside {}, optionally convert to name=value. */ if (extract_field) { pcf_extract_field(argv, field, CHARS_BRACE); if (argv->argv[field - 1][1] == 'o') pcf_normalize_nameval(argv, field); } } /* Normalize non-option arguments. */ for ( /* void */ ; argv->argv[field] != 0; field++) /* Extract text inside {}. */ if (argv->argv[field][0] == CHARS_BRACE[0]) pcf_extract_field(argv, field, CHARS_BRACE); }
static void normalize_options(ARGV *argv) { int field; char *arg; /* * Normalize options to simplify later processing. */ for (field = PC_MASTER_MIN_FIELDS; argv->argv[field] != 0; field++) { arg = argv->argv[field]; if (arg[0] != '-' || strcmp(arg, "--") == 0) break; if (strncmp(arg, "-o", 2) == 0) { if (arg[2] != 0) { /* Split "-oname=value" into "-o" "name=value". */ argv_insert_one(argv, field + 1, arg + 2); argv_replace_one(argv, field, "-o"); /* arg is now a dangling pointer. */ field += 1; } else if (argv->argv[field + 1] != 0) { /* Already in "-o" "name=value" form. */ field += 1; } } } }
static void normalize_options(ARGV *argv) { int field; char *arg; char *cp; char *junk; /* * Normalize options to simplify later processing. */ for (field = PC_MASTER_MIN_FIELDS; argv->argv[field] != 0; field++) { arg = argv->argv[field]; if (arg[0] != '-' || strcmp(arg, "--") == 0) break; for (cp = arg + 1; *cp; cp++) { if (strchr(daemon_options_expecting_value, *cp) != 0 && cp > arg + 1) { /* Split "-stuffo" into "-stuff" and "-o". */ junk = concatenate("-", cp, (char *) 0); argv_insert_one(argv, field + 1, junk); myfree(junk); *cp = 0; /* XXX argv_replace_one() */ break; } } if (strchr(daemon_options_expecting_value, arg[1]) == 0) /* Option requires no value. */ continue; if (arg[2] != 0) { /* Split "-oname=value" into "-o" "name=value". */ argv_insert_one(argv, field + 1, arg + 2); arg[2] = 0; /* XXX argv_replace_one() */ field += 1; } else if (argv->argv[field + 1] != 0) { /* Already in "-o" "name=value" form. */ field += 1; } } }
void pcf_edit_master_param(PCF_MASTER_ENT *masterp, int mode, const char *param_name, const char *param_value) { const char *myname = "pcf_edit_master_param"; ARGV *argv = masterp->argv; const char *arg; const char *aval; int param_match = 0; int name_len = strlen(param_name); int field; for (field = PCF_MASTER_MIN_FIELDS; argv->argv[field] != 0; field++) { arg = argv->argv[field]; /* * Stop at the first non-option argument or end-of-list. */ if (arg[0] != '-' || strcmp(arg, "--") == 0) { break; } /* * Zoom in on command-line options with a value. */ else if (strchr(pcf_daemon_options_expecting_value, arg[1]) != 0 && (aval = argv->argv[field + 1]) != 0) { /* * Zoom in on "-o parameter=value". */ if (strcmp(arg, "-o") == 0) { if (strncmp(aval, param_name, name_len) == 0 && aval[name_len] == '=') { param_match = 1; switch (mode & (PCF_EDIT_CONF | PCF_EDIT_EXCL)) { /* * Update parameter=value. */ case PCF_EDIT_CONF: aval = concatenate(param_name, "=", param_value, (char *) 0); argv_replace_one(argv, field + 1, aval); myfree((void *) aval); if (masterp->all_params) dict_put(masterp->all_params, param_name, param_value); /* XXX Update parameter "used/defined" status. */ break; /* * Delete parameter=value. */ case PCF_EDIT_EXCL: argv_delete(argv, field, 2); if (masterp->all_params) dict_del(masterp->all_params, param_name); /* XXX Update parameter "used/defined" status. */ field -= 2; break; default: msg_panic("%s: unexpected mode: %d", myname, mode); } } } /* * Skip over the command-line option value. */ field += 1; } } /* * Add unmatched parameter. */ if ((mode & PCF_EDIT_CONF) && param_match == 0) { /* XXX Generalize: argv_insert(argv, where, list...) */ argv_insert_one(argv, field, "-o"); aval = concatenate(param_name, "=", param_value, (char *) 0); argv_insert_one(argv, field + 1, aval); if (masterp->all_params) dict_put(masterp->all_params, param_name, param_value); /* XXX May affect parameter "used/defined" status. */ myfree((void *) aval); param_match = 1; } }