QMGR_QUEUE *qmgr_queue_create(QMGR_TRANSPORT *transport, const char *name, const char *nexthop) { QMGR_QUEUE *queue; /* * If possible, choose an initial concurrency of > 1 so that one bad * message or one bad network won't slow us down unnecessarily. */ queue = (QMGR_QUEUE *) mymalloc(sizeof(QMGR_QUEUE)); qmgr_queue_count++; queue->name = mystrdup(name); queue->nexthop = mystrdup(nexthop); queue->reason = mystrdup(""); queue->todo_refcount = 0; queue->busy_refcount = 0; queue->transport = transport; queue->window = transport->init_dest_concurrency; QMGR_LIST_INIT(queue->todo); QMGR_LIST_INIT(queue->busy); queue->reason = 0; queue->clog_time_to_warn = 0; queue->blocker_tag = 0; QMGR_LIST_APPEND(transport->queue_list, queue, peers); htable_enter(transport->queue_byname, name, (char *) queue); return (queue); }
static QMGR_JOB *qmgr_job_create(QMGR_MESSAGE *message, QMGR_TRANSPORT *transport) { QMGR_JOB *job; job = (QMGR_JOB *) mymalloc(sizeof(QMGR_JOB)); job->message = message; QMGR_LIST_APPEND(message->job_list, job, message_peers); htable_enter(transport->job_byname, message->queue_id, (void *) job); job->transport = transport; QMGR_LIST_INIT(job->transport_peers); QMGR_LIST_INIT(job->time_peers); job->stack_parent = 0; QMGR_LIST_INIT(job->stack_children); QMGR_LIST_INIT(job->stack_siblings); job->stack_level = -1; job->blocker_tag = 0; job->peer_byname = htable_create(0); QMGR_LIST_INIT(job->peer_list); job->slots_used = 0; job->slots_available = 0; job->selected_entries = 0; job->read_entries = 0; job->rcpt_count = 0; job->rcpt_limit = 0; return (job); }
QMGR_TRANSPORT *qmgr_transport_create(const char *name) { QMGR_TRANSPORT *transport; if (htable_find(qmgr_transport_byname, name) != 0) msg_panic("qmgr_transport_create: transport exists: %s", name); transport = (QMGR_TRANSPORT *) mymalloc(sizeof(QMGR_TRANSPORT)); transport->flags = 0; transport->pending = 0; transport->name = mystrdup(name); /* * Use global configuration settings or transport-specific settings. */ transport->dest_concurrency_limit = get_mail_conf_int2(name, _DEST_CON_LIMIT, var_dest_con_limit, 0, 0); transport->recipient_limit = get_mail_conf_int2(name, _DEST_RCPT_LIMIT, var_dest_rcpt_limit, 0, 0); transport->init_dest_concurrency = get_mail_conf_int2(name, _INIT_DEST_CON, var_init_dest_concurrency, 1, 0); transport->xport_rate_delay = get_mail_conf_time2(name, _XPORT_RATE_DELAY, var_xport_rate_delay, 's', 0, 0); transport->rate_delay = get_mail_conf_time2(name, _DEST_RATE_DELAY, var_dest_rate_delay, 's', 0, 0); if (transport->rate_delay > 0) transport->dest_concurrency_limit = 1; if (transport->dest_concurrency_limit != 0 && transport->dest_concurrency_limit < transport->init_dest_concurrency) transport->init_dest_concurrency = transport->dest_concurrency_limit; transport->queue_byname = htable_create(0); QMGR_LIST_INIT(transport->queue_list); transport->dsn = 0; qmgr_feedback_init(&transport->pos_feedback, name, _CONC_POS_FDBACK, VAR_CONC_POS_FDBACK, var_conc_pos_feedback); qmgr_feedback_init(&transport->neg_feedback, name, _CONC_NEG_FDBACK, VAR_CONC_NEG_FDBACK, var_conc_neg_feedback); transport->fail_cohort_limit = get_mail_conf_int2(name, _CONC_COHORT_LIM, var_conc_cohort_limit, 0, 0); if (qmgr_transport_byname == 0) qmgr_transport_byname = htable_create(10); htable_enter(qmgr_transport_byname, name, (void *) transport); QMGR_LIST_APPEND(qmgr_transport_list, transport); if (msg_verbose) msg_info("qmgr_transport_create: %s concurrency %d recipients %d", transport->name, transport->dest_concurrency_limit, transport->recipient_limit); return (transport); }
static QMGR_MESSAGE *qmgr_message_create(const char *queue_name, const char *queue_id, int qflags) { QMGR_MESSAGE *message; message = (QMGR_MESSAGE *) mymalloc(sizeof(QMGR_MESSAGE)); qmgr_message_count++; message->flags = 0; message->qflags = qflags; message->tflags = 0; message->tflags_offset = 0; message->rflags = QMGR_READ_FLAG_DEFAULT; message->fp = 0; message->refcount = 0; message->single_rcpt = 0; message->arrival_time.tv_sec = message->arrival_time.tv_usec = 0; message->create_time = 0; GETTIMEOFDAY(&message->active_time); message->queued_time = sane_time(); message->refill_time = 0; message->data_offset = 0; message->queue_id = mystrdup(queue_id); message->queue_name = mystrdup(queue_name); message->encoding = 0; message->sender = 0; message->dsn_envid = 0; message->dsn_ret = 0; message->smtputf8 = 0; message->filter_xport = 0; message->inspect_xport = 0; message->redirect_addr = 0; message->data_size = 0; message->cont_length = 0; message->warn_offset = 0; message->warn_time = 0; message->rcpt_offset = 0; message->verp_delims = 0; message->client_name = 0; message->client_addr = 0; message->client_port = 0; message->client_proto = 0; message->client_helo = 0; message->sasl_method = 0; message->sasl_username = 0; message->sasl_sender = 0; message->log_ident = 0; message->rewrite_context = 0; recipient_list_init(&message->rcpt_list, RCPT_LIST_INIT_QUEUE); message->rcpt_count = 0; message->rcpt_limit = var_qmgr_msg_rcpt_limit; message->rcpt_unread = 0; QMGR_LIST_INIT(message->job_list); return (message); }
QMGR_PEER *qmgr_peer_create(QMGR_JOB *job, QMGR_QUEUE *queue) { QMGR_PEER *peer; peer = (QMGR_PEER *) mymalloc(sizeof(QMGR_PEER)); peer->queue = queue; peer->job = job; QMGR_LIST_APPEND(job->peer_list, peer, peers); htable_enter(job->peer_byname, queue->name, (char *) peer); peer->refcount = 0; QMGR_LIST_INIT(peer->entry_list); return (peer); }
QMGR_TRANSPORT *qmgr_transport_create(const char *name) { QMGR_TRANSPORT *transport; if (htable_find(qmgr_transport_byname, name) != 0) msg_panic("qmgr_transport_create: transport exists: %s", name); transport = (QMGR_TRANSPORT *) mymalloc(sizeof(QMGR_TRANSPORT)); transport->flags = 0; transport->pending = 0; transport->name = mystrdup(name); /* * Use global configuration settings or transport-specific settings. */ transport->dest_concurrency_limit = get_mail_conf_int2(name, _DEST_CON_LIMIT, var_dest_con_limit, 0, 0); transport->recipient_limit = get_mail_conf_int2(name, _DEST_RCPT_LIMIT, var_dest_rcpt_limit, 0, 0); transport->init_dest_concurrency = get_mail_conf_int2(name, _INIT_DEST_CON, var_init_dest_concurrency, 1, 0); transport->xport_rate_delay = get_mail_conf_time2(name, _XPORT_RATE_DELAY, var_xport_rate_delay, 's', 0, 0); transport->rate_delay = get_mail_conf_time2(name, _DEST_RATE_DELAY, var_dest_rate_delay, 's', 0, 0); if (transport->rate_delay > 0) transport->dest_concurrency_limit = 1; if (transport->dest_concurrency_limit != 0 && transport->dest_concurrency_limit < transport->init_dest_concurrency) transport->init_dest_concurrency = transport->dest_concurrency_limit; transport->slot_cost = get_mail_conf_int2(name, _DELIVERY_SLOT_COST, var_delivery_slot_cost, 0, 0); transport->slot_loan = get_mail_conf_int2(name, _DELIVERY_SLOT_LOAN, var_delivery_slot_loan, 0, 0); transport->slot_loan_factor = 100 - get_mail_conf_int2(name, _DELIVERY_SLOT_DISCOUNT, var_delivery_slot_discount, 0, 100); transport->min_slots = get_mail_conf_int2(name, _MIN_DELIVERY_SLOTS, var_min_delivery_slots, 0, 0); transport->rcpt_unused = get_mail_conf_int2(name, _XPORT_RCPT_LIMIT, var_xport_rcpt_limit, 0, 0); transport->rcpt_per_stack = get_mail_conf_int2(name, _STACK_RCPT_LIMIT, var_stack_rcpt_limit, 0, 0); transport->refill_limit = get_mail_conf_int2(name, _XPORT_REFILL_LIMIT, var_xport_refill_limit, 1, 0); transport->refill_delay = get_mail_conf_time2(name, _XPORT_REFILL_DELAY, var_xport_refill_delay, 's', 1, 0); transport->queue_byname = htable_create(0); QMGR_LIST_INIT(transport->queue_list); transport->job_byname = htable_create(0); QMGR_LIST_INIT(transport->job_list); QMGR_LIST_INIT(transport->job_bytime); transport->job_current = 0; transport->job_next_unread = 0; transport->candidate_cache = 0; transport->candidate_cache_current = 0; transport->candidate_cache_time = (time_t) 0; transport->blocker_tag = 1; transport->dsn = 0; qmgr_feedback_init(&transport->pos_feedback, name, _CONC_POS_FDBACK, VAR_CONC_POS_FDBACK, var_conc_pos_feedback); qmgr_feedback_init(&transport->neg_feedback, name, _CONC_NEG_FDBACK, VAR_CONC_NEG_FDBACK, var_conc_neg_feedback); transport->fail_cohort_limit = get_mail_conf_int2(name, _CONC_COHORT_LIM, var_conc_cohort_limit, 0, 0); if (qmgr_transport_byname == 0) qmgr_transport_byname = htable_create(10); htable_enter(qmgr_transport_byname, name, (void *) transport); QMGR_LIST_PREPEND(qmgr_transport_list, transport, peers); if (msg_verbose) msg_info("qmgr_transport_create: %s concurrency %d recipients %d", transport->name, transport->dest_concurrency_limit, transport->recipient_limit); return (transport); }