void register_dbms_parameters(const char *param_value, const char *(flag_parameter) (const char *, int, PC_MASTER_ENT *), PC_MASTER_ENT *local_scope) { const PC_DBMS_INFO *dp; char *bufp; char *db_type; char *prefix; static VSTRING *buffer = 0; static VSTRING *candidate = 0; const char **cpp; /* * XXX This does not examine both sides of conditional macro expansion, * and may expand the "wrong" conditional macros. This is the best we can * do for legacy database configuration support. */ if (buffer == 0) buffer = vstring_alloc(100); bufp = expand_parameter_value(buffer, SHOW_EVAL, param_value, local_scope); /* * Naive parsing. We don't really know if the parameter specifies free * text or a list of databases. */ while ((db_type = mystrtok(&bufp, " ,\t\r\n")) != 0) { /* * Skip over "proxy:" maptypes, to emulate the proxymap(8) server's * behavior when opening a local database configuration file. */ while ((prefix = split_at(db_type, ':')) != 0 && strcmp(db_type, DICT_TYPE_PROXY) == 0) db_type = prefix; /* * Look for database:prefix where the prefix is not a pathname and * the database is a known type. Synthesize candidate parameter names * from the user-defined prefix and from the database-defined suffix * list, and see if those parameters have a "name=value" entry in the * local or global namespace. */ if (prefix != 0 && *prefix != '/' && *prefix != '.') { for (dp = dbms_info; dp->db_type != 0; dp++) { if (strcmp(db_type, dp->db_type) == 0) { for (cpp = dp->db_suffixes; *cpp; cpp++) { vstring_sprintf(candidate ? candidate : (candidate = vstring_alloc(30)), "%s_%s", prefix, *cpp); flag_parameter(STR(candidate), PC_PARAM_FLAG_DBMS | PC_PARAM_FLAG_USER, local_scope); } break; } } } } }
static void print_master_line(VSTREAM *fp, int mode, PC_MASTER_ENT *masterp) { char **argv = masterp->argv->argv; const char *arg; const char *aval; int arg_len; int line_len; int field; int in_daemon_options; static int column_goal[] = { 0, /* service */ 11, /* type */ 17, /* private */ 25, /* unpriv */ 33, /* chroot */ 41, /* wakeup */ 49, /* maxproc */ 57, /* command */ }; #define ADD_TEXT(text, len) do { \ vstream_fputs(text, fp); line_len += len; } \ while (0) #define ADD_SPACE ADD_TEXT(" ", 1) /* * Show the standard fields at their preferred column position. Use at * least one-space column separation. */ for (line_len = 0, field = 0; field < PC_MASTER_MIN_FIELDS; field++) { arg = argv[field]; if (line_len > 0) { do { ADD_SPACE; } while (line_len < column_goal[field]); } ADD_TEXT(arg, strlen(arg)); } /* * Format the daemon command-line options and non-option arguments. Here, * we have no data-dependent preference for column positions, but we do * have argument grouping preferences. */ in_daemon_options = 1; for ( /* void */ ; (arg = argv[field]) != 0; field++) { arg_len = strlen(arg); aval = 0; if (in_daemon_options) { /* * Try to show the generic options (-v -D) on the first line, and * non-options on a later line. */ if (arg[0] != '-' || strcmp(arg, "--") == 0) { in_daemon_options = 0; if ((mode & FOLD_LINE) && line_len > column_goal[PC_MASTER_MIN_FIELDS - 1]) { /* Force line wrap. */ line_len = LINE_LIMIT; } } /* * Special processing for options that require a value. */ else if (strchr(daemon_options_expecting_value, arg[1]) != 0 && (aval = argv[field + 1]) != 0) { /* * Optionally, expand $name in parameter value. */ if (strcmp(arg, "-o") == 0 && (mode & SHOW_EVAL) != 0) aval = expand_parameter_value((VSTRING *) 0, mode, aval, masterp); /* * Keep option and value on the same line. */ arg_len += strlen(aval) + 1; } } /* * Insert a line break when the next item won't fit. */ if (line_len > INDENT_LEN) { if ((mode & FOLD_LINE) == 0 || line_len + 1 + arg_len < LINE_LIMIT) { ADD_SPACE; } else { vstream_fputs("\n" INDENT_TEXT, fp); line_len = INDENT_LEN; } } ADD_TEXT(arg, strlen(arg)); if (aval) { ADD_SPACE; ADD_TEXT(aval, strlen(aval)); field += 1; } } vstream_fputs("\n", fp); }