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; } } } }
void pcf_edit_master_field(PCF_MASTER_ENT *masterp, int field, const char *new_value) { /* * Replace multi-column attribute. */ if (field == PCF_MASTER_FLD_CMD) { argv_truncate(masterp->argv, PCF_MASTER_FLD_CMD); argv_splitq_append(masterp->argv, new_value, PCF_MASTER_BLANKS, CHARS_BRACE); pcf_normalize_daemon_args(masterp->argv); } /* * Replace single-column attribute. */ else { argv_replace_one(masterp->argv, field, new_value); } /* * Do per-field sanity checks. */ pcf_check_master_entry(masterp->argv, new_value); }
static void pcf_extract_field(ARGV *argv, int field, const char *parens) { char *arg = argv->argv[field]; char *err; if ((err = extpar(&arg, parens, EXTPAR_FLAG_STRIP)) != 0) { msg_warn("%s: %s", MASTER_CONF_FILE, err); myfree(err); } argv_replace_one(argv, field, arg); }
static void pcf_normalize_nameval(ARGV *argv, int field) { char *arg = argv->argv[field]; char *name; char *value; const char *err; char *normalized; if ((err = split_nameval(arg, &name, &value)) != 0) { msg_warn("%s: %s: \"%s\"", MASTER_CONF_FILE, err, arg); } else { normalized = concatenate(name, "=", value, (char *) 0); argv_replace_one(argv, field, normalized); myfree(normalized); } }
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; } }