postconf_service.c [plain text]
#include <sys_defs.h>
#include <string.h>
#include <msg.h>
#include <mymalloc.h>
#include <htable.h>
#include <vstring.h>
#include <stringops.h>
#include <argv.h>
#include <mail_params.h>
#include <postconf.h>
#ifndef MAIL_PROGRAM_LOCAL
#define MAIL_PROGRAM_LOCAL "local"
#define MAIL_PROGRAM_ERROR "error"
#define MAIL_PROGRAM_VIRTUAL "virtual"
#define MAIL_PROGRAM_SMTP "smtp"
#define MAIL_PROGRAM_LMTP "lmtp"
#define MAIL_PROGRAM_PIPE "pipe"
#define MAIL_PROGRAM_SPAWN "spawn"
#endif
typedef struct {
const char *name;
const char *value;
} PC_STRING_NV;
#define STR(x) vstring_str(x)
static const char *convert_service_parameter(char *ptr)
{
return (STR(vstring_sprintf(param_string_buf, "$%s", ptr)));
}
static void register_service_parameter(const char *service, const char *suffix,
const char *defparam)
{
char *name = concatenate(service, suffix, (char *) 0);
PC_PARAM_NODE *node;
if ((node = PC_PARAM_TABLE_FIND(param_table, name)) != 0) {
PC_PARAM_CLASS_OVERRIDE(node, PC_PARAM_FLAG_SERVICE);
} else {
PC_PARAM_TABLE_ENTER(param_table, name, PC_PARAM_FLAG_SERVICE,
(char *) defparam, convert_service_parameter);
}
myfree(name);
}
void register_service_parameters(void)
{
const char *myname = "register_service_parameters";
static const PC_STRING_NV pipe_params[] = {
_MAXTIME, VAR_COMMAND_MAXTIME,
#define service_params (pipe_params + 1)
_XPORT_RCPT_LIMIT, VAR_XPORT_RCPT_LIMIT,
_STACK_RCPT_LIMIT, VAR_STACK_RCPT_LIMIT,
_XPORT_REFILL_LIMIT, VAR_XPORT_REFILL_LIMIT,
_XPORT_REFILL_DELAY, VAR_XPORT_REFILL_DELAY,
_DELIVERY_SLOT_COST, VAR_DELIVERY_SLOT_COST,
_DELIVERY_SLOT_LOAN, VAR_DELIVERY_SLOT_LOAN,
_DELIVERY_SLOT_DISCOUNT, VAR_DELIVERY_SLOT_DISCOUNT,
_MIN_DELIVERY_SLOTS, VAR_MIN_DELIVERY_SLOTS,
_INIT_DEST_CON, VAR_INIT_DEST_CON,
_DEST_CON_LIMIT, VAR_DEST_CON_LIMIT,
_DEST_RCPT_LIMIT, VAR_DEST_RCPT_LIMIT,
_CONC_POS_FDBACK, VAR_CONC_POS_FDBACK,
_CONC_NEG_FDBACK, VAR_CONC_NEG_FDBACK,
_CONC_COHORT_LIM, VAR_CONC_COHORT_LIM,
_DEST_RATE_DELAY, VAR_DEST_RATE_DELAY,
0,
};
static const PC_STRING_NV spawn_params[] = {
_MAXTIME, VAR_COMMAND_MAXTIME,
0,
};
typedef struct {
const char *progname;
const PC_STRING_NV *params;
} PC_SERVICE_DEF;
static const PC_SERVICE_DEF service_defs[] = {
MAIL_PROGRAM_LOCAL, service_params,
MAIL_PROGRAM_ERROR, service_params,
MAIL_PROGRAM_VIRTUAL, service_params,
MAIL_PROGRAM_SMTP, service_params,
MAIL_PROGRAM_LMTP, service_params,
MAIL_PROGRAM_PIPE, pipe_params,
MAIL_PROGRAM_SPAWN, spawn_params,
0,
};
const PC_STRING_NV *sp;
const char *progname;
const char *service;
PC_MASTER_ENT *masterp;
ARGV *argv;
const PC_SERVICE_DEF *sd;
if (param_table == 0)
msg_panic("%s: global parameter table is not initialized", myname);
if (master_table == 0)
msg_panic("%s: master table is not initialized", myname);
for (masterp = master_table; (argv = masterp->argv) != 0; masterp++) {
progname = argv->argv[7];
for (sd = service_defs; sd->progname; sd++) {
if (strcmp(sd->progname, progname) == 0) {
service = argv->argv[0];
for (sp = sd->params; sp->name; sp++)
register_service_parameter(service, sp->name, sp->value);
break;
}
}
}
}