if (mask & CHK_EV_TCPCHK) {
const char *type;
- switch (check->tcpcheck_rules->flags & TCPCHK_RULES_PROTO_CHK) {
+ switch (check->tcpcheck->rs->flags & TCPCHK_RULES_PROTO_CHK) {
case TCPCHK_RULES_PGSQL_CHK: type = "PGSQL"; break;
case TCPCHK_RULES_REDIS_CHK: type = "REDIS"; break;
case TCPCHK_RULES_SMTP_CHK: type = "SMTP"; break;
buf = (b_is_null(&check->bo) ? NULL : &check->bo);
if (buf) {
- if ((check->tcpcheck_rules->flags & TCPCHK_RULES_PROTO_CHK) == TCPCHK_RULES_HTTP_CHK) {
+ if ((check->tcpcheck->rs->flags & TCPCHK_RULES_PROTO_CHK) == TCPCHK_RULES_HTTP_CHK) {
int full = (src->verbosity == CHK_VERB_COMPLETE);
chunk_memcat(&trace_buf, "\n\t", 2);
chk = get_trash_chunk();
if (check->type == PR_O2_TCPCHK_CHK &&
- (check->tcpcheck_rules->flags & TCPCHK_RULES_PROTO_CHK) == TCPCHK_RULES_TCP_CHK) {
+ (check->tcpcheck->rs->flags & TCPCHK_RULES_PROTO_CHK) == TCPCHK_RULES_TCP_CHK) {
step = tcpcheck_get_step_id(check, NULL);
if (!step) {
TRACE_DEVEL("initial connection failure", CHK_EV_HCHK_END|CHK_EV_HCHK_ERR, check);
* in this case.
*/
if (check->state & CHK_ST_AGENT) {
- free_tcpcheck_vars(&check->tcpcheck_rules->preset_vars);
- ha_free(&check->tcpcheck_rules);
+ free_tcpcheck_vars(&check->tcpcheck->preset_vars);
+ ha_free(&check->tcpcheck);
}
ha_free(&check->pool_conn_name);
for (px = proxies_list; px; px = px->next) {
for (s = px->srv; s; s = s->next) {
if ((px->options2 & PR_O2_USE_SBUF_CHECK) &&
- (s->check.tcpcheck_rules->flags & TCPCHK_RULES_MAY_USE_SBUF))
+ (s->check.tcpcheck->rs->flags & TCPCHK_RULES_MAY_USE_SBUF))
s->check.state |= CHK_ST_USE_SMALL_BUFF;
if (s->check.state & CHK_ST_CONFIGURED) {
if (!srv->do_check || !(srv->proxy->cap & PR_CAP_BE))
goto out;
- check_type = srv->check.tcpcheck_rules->flags & TCPCHK_RULES_PROTO_CHK;
+ check_type = srv->check.tcpcheck->rs->flags & TCPCHK_RULES_PROTO_CHK;
if (!(srv->flags & SRV_F_DYNAMIC)) {
/* If neither a port nor an addr was specified and no check
(!is_inet_addr(&srv->check.addr) && (is_addr(&srv->check.addr) || !is_inet_addr(&srv->addr))))
goto init;
- if (!srv->proxy->tcpcheck_rules.list || LIST_ISEMPTY(srv->proxy->tcpcheck_rules.list)) {
+ if (LIST_ISEMPTY(&srv->check.tcpcheck->rs->rules)) {
ha_alert("config: %s '%s': server '%s' has neither service port nor check port.\n",
proxy_type_str(srv->proxy), srv->proxy->id, srv->id);
ret |= ERR_ALERT | ERR_ABORT;
}
/* search the first action (connect / send / expect) in the list */
- r = get_first_tcpcheck_rule(&srv->proxy->tcpcheck_rules);
+ r = get_first_tcpcheck_rule(srv->check.tcpcheck->rs);
if (!r || (r->action != TCPCHK_ACT_CONNECT) || (!r->connect.port && !get_host_port(&r->connect.addr))) {
ha_alert("config: %s '%s': server '%s' has neither service port nor check port "
"nor tcp_check rule 'connect' with port information.\n",
}
/* scan the tcp-check ruleset to ensure a port has been configured */
- list_for_each_entry(r, srv->proxy->tcpcheck_rules.list, list) {
+ list_for_each_entry(r, &srv->check.tcpcheck->rs->rules, list) {
if ((r->action == TCPCHK_ACT_CONNECT) && (!r->connect.port && !get_host_port(&r->connect.addr))) {
ha_alert("config: %s '%s': server '%s' has neither service port nor check port, "
"and a tcp_check rule 'connect' with no port information.\n",
/* If there is no connect rule preceding all send / expect rules, an
* implicit one is inserted before all others.
*/
- chk = get_first_tcpcheck_rule(srv->agent.tcpcheck_rules);
+ chk = get_first_tcpcheck_rule(srv->agent.tcpcheck->rs);
if (!chk || chk->action != TCPCHK_ACT_CONNECT) {
chk = calloc(1, sizeof(*chk));
if (!chk) {
}
chk->action = TCPCHK_ACT_CONNECT;
chk->connect.options = (TCPCHK_OPT_DEFAULT_CONNECT|TCPCHK_OPT_IMPLICIT);
- LIST_INSERT(srv->agent.tcpcheck_rules->list, &chk->list);
+ LIST_INSERT(&srv->agent.tcpcheck->rs->rules, &chk->list);
}
/* <chk> is always defined here and it is a CONNECT action. If there is
* a preset variable, it means there is an agent string defined and data
* will be sent after the connect.
*/
- if (!LIST_ISEMPTY(&srv->agent.tcpcheck_rules->preset_vars))
+ if (!LIST_ISEMPTY(&srv->agent.tcpcheck->preset_vars))
chk->connect.options |= TCPCHK_OPT_HAS_DATA;
char **errmsg)
{
struct tcpcheck_ruleset *rs = NULL;
- struct tcpcheck_rules *rules = srv->agent.tcpcheck_rules;
+ struct tcpcheck *tc = srv->agent.tcpcheck;
struct tcpcheck_rule *chk;
int err_code = 0;
return ERR_WARN;
}
- if (!rules) {
- rules = calloc(1, sizeof(*rules));
- if (!rules) {
+ if (!tc) {
+ tc = calloc(1, sizeof(*tc));
+ if (!tc) {
memprintf(errmsg, "out of memory.");
goto error;
}
- LIST_INIT(&rules->preset_vars);
- srv->agent.tcpcheck_rules = rules;
+ LIST_INIT(&tc->preset_vars);
+ srv->agent.tcpcheck = tc;
}
- rules->list = NULL;
- rules->flags = 0;
rs = find_tcpcheck_ruleset("*agent-check");
if (rs)
LIST_APPEND(&rs->rules, &chk->list);
ruleset_found:
- rules->list = &rs->rules;
- rules->flags &= ~(TCPCHK_RULES_PROTO_CHK|TCPCHK_RULES_UNUSED_RS);
- rules->flags |= TCPCHK_RULES_AGENT_CHK;
+ tc->rs = rs;
+ tc->flags &= ~TCPCHK_FL_UNUSED_RS;
+ rs->flags |= TCPCHK_RULES_AGENT_CHK;
srv->do_agent = 1;
out:
int set_srv_agent_send(struct server *srv, const char *send)
{
- struct tcpcheck_rules *rules = srv->agent.tcpcheck_rules;
+ struct tcpcheck *tc = srv->agent.tcpcheck;
struct tcpcheck_var *var = NULL;
char *str;
if (str == NULL || var == NULL)
goto error;
- free_tcpcheck_vars(&rules->preset_vars);
+ free_tcpcheck_vars(&tc->preset_vars);
var->data.type = SMP_T_STR;
var->data.u.str.area = str;
var->data.u.str.data = strlen(str);
LIST_INIT(&var->list);
- LIST_APPEND(&rules->preset_vars, &var->list);
+ LIST_APPEND(&tc->preset_vars, &var->list);
return 1;
static int srv_parse_agent_send(char **args, int *cur_arg, struct proxy *curpx, struct server *srv,
char **errmsg)
{
- struct tcpcheck_rules *rules = srv->agent.tcpcheck_rules;
+ struct tcpcheck *tc = srv->agent.tcpcheck;
int err_code = 0;
if (!*(args[*cur_arg+1])) {
goto error;
}
- if (!rules) {
- rules = calloc(1, sizeof(*rules));
- if (!rules) {
+ if (!tc) {
+ tc = calloc(1, sizeof(*tc));
+ if (!tc) {
memprintf(errmsg, "out of memory.");
goto error;
}
- LIST_INIT(&rules->preset_vars);
- srv->agent.tcpcheck_rules = rules;
+ LIST_INIT(&tc->preset_vars);
+ srv->agent.tcpcheck = tc;
}
if (!set_srv_agent_send(srv, args[*cur_arg+1])) {
free(rs);
return NULL;
}
-
+ rs->flags = 0;
LIST_INIT(&rs->rules);
ebis_insert(&shared_tcpchecks, &rs->node);
return rs;
/* Returns the first non COMMENT/ACTION_KW tcp-check rule from list <list> or
* NULL if none was found.
*/
-struct tcpcheck_rule *get_first_tcpcheck_rule(const struct tcpcheck_rules *rules)
+struct tcpcheck_rule *get_first_tcpcheck_rule(const struct tcpcheck_ruleset *rs)
{
struct tcpcheck_rule *r;
- list_for_each_entry(r, rules->list, list) {
+ list_for_each_entry(r, &rs->rules, list) {
if (r->action != TCPCHK_ACT_COMMENT && r->action != TCPCHK_ACT_ACTION_KW)
return r;
}
/* Returns the last non COMMENT/ACTION_KW tcp-check rule from list <list> or
* NULL if none was found.
*/
-static struct tcpcheck_rule *get_last_tcpcheck_rule(struct tcpcheck_rules *rules)
+static struct tcpcheck_rule *get_last_tcpcheck_rule(struct tcpcheck_ruleset *rs)
{
struct tcpcheck_rule *r;
- list_for_each_entry_rev(r, rules->list, list) {
+ list_for_each_entry_rev(r, &rs->rules, list) {
if (r->action != TCPCHK_ACT_COMMENT && r->action != TCPCHK_ACT_ACTION_KW)
return r;
}
* <start> or NULL if non was found. If <start> is NULL, it relies on
* get_first_tcpcheck_rule().
*/
-static struct tcpcheck_rule *get_next_tcpcheck_rule(struct tcpcheck_rules *rules, struct tcpcheck_rule *start)
+static struct tcpcheck_rule *get_next_tcpcheck_rule(struct tcpcheck_ruleset *rs, struct tcpcheck_rule *start)
{
struct tcpcheck_rule *r;
if (!start)
- return get_first_tcpcheck_rule(rules);
+ return get_first_tcpcheck_rule(rs);
r = LIST_NEXT(&start->list, typeof(r), list);
- list_for_each_entry_from(r, rules->list, list) {
+ list_for_each_entry_from(r, &rs->rules, list) {
if (r->action != TCPCHK_ACT_COMMENT && r->action != TCPCHK_ACT_ACTION_KW)
return r;
}
}
if (check->type == PR_O2_TCPCHK_CHK &&
- (check->tcpcheck_rules->flags & TCPCHK_RULES_PROTO_CHK) != TCPCHK_RULES_TCP_CHK) {
+ (check->tcpcheck->rs->flags & TCPCHK_RULES_PROTO_CHK) != TCPCHK_RULES_TCP_CHK) {
goto comment;
}
msg->data += sess_build_logline(check->sess, NULL, b_tail(msg), b_room(msg),
&rule->expect.onsuccess_fmt);
else if (check->type == PR_O2_TCPCHK_CHK &&
- (check->tcpcheck_rules->flags & TCPCHK_RULES_PROTO_CHK) == TCPCHK_RULES_TCP_CHK)
+ (check->tcpcheck->rs->flags & TCPCHK_RULES_PROTO_CHK) == TCPCHK_RULES_TCP_CHK)
chunk_strcat(msg, "(tcp-check)");
/* Finally, the check status code is set if the expect rule defines a
goto error;
}
- if (get_next_tcpcheck_rule(check->tcpcheck_rules, rule) != NULL) {
+ if (get_next_tcpcheck_rule(check->tcpcheck->rs, rule) != NULL) {
/* Not the last rule, continue */
goto out;
}
TRACE_ENTER(CHK_EV_TCPCHK_CONN, check);
- check_type = check->tcpcheck_rules->flags & TCPCHK_RULES_PROTO_CHK;
+ check_type = check->tcpcheck->rs->flags & TCPCHK_RULES_PROTO_CHK;
- next = get_next_tcpcheck_rule(check->tcpcheck_rules, rule);
+ next = get_next_tcpcheck_rule(check->tcpcheck->rs, rule);
/* current connection already created, check if it is established or not */
if (conn) {
else if ((connect->options & TCPCHK_OPT_DEFAULT_CONNECT) && check->mux_proto)
mux_ops = check->mux_proto->mux;
else {
- int mode = tcpchk_rules_type_to_proto_mode(check->tcpcheck_rules->flags);
+ int mode = tcpchk_rules_type_to_proto_mode(check->tcpcheck->rs->flags);
mux_ops = conn_get_best_mux(conn, IST_NULL, PROTO_SIDE_BE, mode);
}
goto out_end_tcpcheck;
}
vars_init_head(&check->vars, SCOPE_CHECK);
- rule = LIST_NEXT(check->tcpcheck_rules->list, typeof(rule), list);
+ rule = LIST_NEXT(&check->tcpcheck->rs->rules, typeof(rule), list);
/* Preset tcp-check variables */
- list_for_each_entry(var, &check->tcpcheck_rules->preset_vars, list) {
+ list_for_each_entry(var, &check->tcpcheck->preset_vars, list) {
struct sample smp;
memset(&smp, 0, sizeof(smp));
/* Now evaluate the tcp-check rules */
- list_for_each_entry_from(rule, check->tcpcheck_rules->list, list) {
+ list_for_each_entry_from(rule, &check->tcpcheck->rs->rules, list) {
check->code = 0;
switch (rule->action) {
case TCPCHK_ACT_CONNECT:
must_read = 0;
}
- eval_ret = ((check->tcpcheck_rules->flags & TCPCHK_RULES_PROTO_CHK) == TCPCHK_RULES_HTTP_CHK
+ eval_ret = ((check->tcpcheck->rs->flags & TCPCHK_RULES_PROTO_CHK) == TCPCHK_RULES_HTTP_CHK
? tcpcheck_eval_expect_http(check, rule, last_read)
: tcpcheck_eval_expect(check, rule, last_read));
* returns 1 on success and 0 on error and <errmsg> is filled with the error
* message.
*/
-int tcpcheck_add_http_rule(struct tcpcheck_rule *chk, struct tcpcheck_rules *rules, char **errmsg)
+int tcpcheck_add_http_rule(struct tcpcheck_rule *chk, struct tcpcheck_ruleset *rs, char **errmsg)
{
struct tcpcheck_rule *r;
* both, overwriting the old send rule (the explicit one) with info of the
* new send rule (the implicit one).
*/
- r = get_first_tcpcheck_rule(rules);
+ r = get_first_tcpcheck_rule(rs);
if (r && r->action == TCPCHK_ACT_CONNECT)
- r = get_next_tcpcheck_rule(rules, r);
+ r = get_next_tcpcheck_rule(rs, r);
if (!r || r->action != TCPCHK_ACT_SEND)
- LIST_INSERT(rules->list, &chk->list);
+ LIST_INSERT(&rs->rules, &chk->list);
else if (r->send.http.flags & TCPCHK_SND_HTTP_FROM_OPT) {
LIST_DELETE(&r->list);
free_tcpcheck(r, 0);
- LIST_INSERT(rules->list, &chk->list);
+ LIST_INSERT(&rs->rules, &chk->list);
}
else {
tcpcheck_overwrite_send_http_rule(r, chk);
* the rule is appended to the list.
*/
- r = get_last_tcpcheck_rule(rules);
+ r = get_last_tcpcheck_rule(rs);
if (!r || (r->action == TCPCHK_ACT_SEND && (r->send.http.flags & TCPCHK_SND_HTTP_FROM_OPT)))
/* no error */;
else if (r->action != TCPCHK_ACT_CONNECT && chk->action == TCPCHK_ACT_SEND) {
}
if (chk->action == TCPCHK_ACT_SEND) {
- r = get_first_tcpcheck_rule(rules);
+ r = get_first_tcpcheck_rule(rs);
if (r && r->action == TCPCHK_ACT_SEND && (r->send.http.flags & TCPCHK_SND_HTTP_FROM_OPT)) {
tcpcheck_overwrite_send_http_rule(r, chk);
free_tcpcheck(chk, 0);
chk = r;
}
}
- LIST_APPEND(rules->list, &chk->list);
+ LIST_APPEND(&rs->rules, &chk->list);
}
return 1;
}
ha_free(&px->check_command);
ha_free(&px->check_path);
- if (!px->tcpcheck_rules.list) {
+ if (!px->tcpcheck.rs) {
ha_alert("proxy '%s' : tcp-check configured but no ruleset defined.\n", px->id);
ret |= ERR_ALERT | ERR_FATAL;
goto out;
}
/* HTTP ruleset only : */
- if ((px->tcpcheck_rules.flags & TCPCHK_RULES_PROTO_CHK) == TCPCHK_RULES_HTTP_CHK) {
+ if ((px->tcpcheck.rs->flags & TCPCHK_RULES_PROTO_CHK) == TCPCHK_RULES_HTTP_CHK) {
struct tcpcheck_rule *next;
/* move remaining implicit send rule from "option httpchk" line to the right place.
* If such rule exists, it must be the first one. In this case, the rule is moved
* after the first connect rule, if any. Otherwise, nothing is done.
*/
- chk = get_first_tcpcheck_rule(&px->tcpcheck_rules);
+ chk = get_first_tcpcheck_rule(px->tcpcheck.rs);
if (chk && chk->action == TCPCHK_ACT_SEND && (chk->send.http.flags & TCPCHK_SND_HTTP_FROM_OPT)) {
- next = get_next_tcpcheck_rule(&px->tcpcheck_rules, chk);
+ next = get_next_tcpcheck_rule(px->tcpcheck.rs, chk);
if (next && next->action == TCPCHK_ACT_CONNECT) {
LIST_DELETE(&chk->list);
LIST_INSERT(&next->list, &chk->list);
* versions where the http expect rule was optional. Now it is possible to chained
* send/expect rules but the last expect may still be implicit.
*/
- chk = get_last_tcpcheck_rule(&px->tcpcheck_rules);
+ chk = get_last_tcpcheck_rule(px->tcpcheck.rs);
if (chk && chk->action == TCPCHK_ACT_SEND) {
next = parse_tcpcheck_expect((char *[]){"http-check", "expect", "status", "200-399", ""},
- 1, px, px->tcpcheck_rules.list, TCPCHK_RULES_HTTP_CHK,
+ 1, px, &px->tcpcheck.rs->rules, TCPCHK_RULES_HTTP_CHK,
px->conf.file, px->conf.line, &errmsg);
if (!next) {
ha_alert("proxy '%s': unable to add implicit http-check expect rule "
ret |= ERR_ALERT | ERR_FATAL;
goto out;
}
- LIST_APPEND(px->tcpcheck_rules.list, &next->list);
+ LIST_APPEND(&px->tcpcheck.rs->rules, &next->list);
next->index = chk->index + 1;
}
}
/* If there is no connect rule preceding all send / expect rules, an
* implicit one is inserted before all others.
*/
- chk = get_first_tcpcheck_rule(&px->tcpcheck_rules);
+ chk = get_first_tcpcheck_rule(px->tcpcheck.rs);
if (!chk || chk->action != TCPCHK_ACT_CONNECT) {
chk = calloc(1, sizeof(*chk));
if (!chk) {
}
chk->action = TCPCHK_ACT_CONNECT;
chk->connect.options = (TCPCHK_OPT_DEFAULT_CONNECT|TCPCHK_OPT_IMPLICIT);
- LIST_INSERT(px->tcpcheck_rules.list, &chk->list);
+ LIST_INSERT(&px->tcpcheck.rs->rules, &chk->list);
}
/* Now, back again on HTTP ruleset. Try to resolve the sni log-format
* string if necessary, but onlu for implicit connect rules, by getting
* it from the following send rule.
*/
- if ((px->tcpcheck_rules.flags & TCPCHK_RULES_PROTO_CHK) == TCPCHK_RULES_HTTP_CHK) {
+ if ((px->tcpcheck.rs->flags & TCPCHK_RULES_PROTO_CHK) == TCPCHK_RULES_HTTP_CHK) {
struct tcpcheck_connect *connect = NULL;
- list_for_each_entry(chk, px->tcpcheck_rules.list, list) {
+ list_for_each_entry(chk, &px->tcpcheck.rs->rules, list) {
if (chk->action == TCPCHK_ACT_CONNECT && !chk->connect.sni &&
(chk->connect.options & TCPCHK_OPT_IMPLICIT)) {
/* Only eval connect rule with no explici SNI */
}
/* Allow small buffer use by default. All send rules must be compatible */
- px->tcpcheck_rules.flags |= (global.tune.bufsize_small ? TCPCHK_RULES_MAY_USE_SBUF : 0);
+ px->tcpcheck.rs->flags |= (global.tune.bufsize_small ? TCPCHK_RULES_MAY_USE_SBUF : 0);
/* Remove all comment rules. To do so, when a such rule is found, the
* comment is assigned to the following rule(s).
*/
- list_for_each_entry_safe(chk, back, px->tcpcheck_rules.list, list) {
+ list_for_each_entry_safe(chk, back, &px->tcpcheck.rs->rules, list) {
struct tcpcheck_rule *next;
if (chk->action != prev_action && prev_action != TCPCHK_ACT_COMMENT)
case TCPCHK_ACT_CONNECT:
if (!chk->comment && comment)
chk->comment = strdup(comment);
- next = get_next_tcpcheck_rule(&px->tcpcheck_rules, chk);
+ next = get_next_tcpcheck_rule(px->tcpcheck.rs, chk);
if (next && next->action == TCPCHK_ACT_SEND)
chk->connect.options |= TCPCHK_OPT_HAS_DATA;
__fallthrough;
case TCPCHK_SEND_STRING:
case TCPCHK_SEND_BINARY:
if (istlen(chk->send.data) >= global.tune.bufsize_small)
- px->tcpcheck_rules.flags &= ~TCPCHK_RULES_MAY_USE_SBUF;
+ px->tcpcheck.rs->flags &= ~TCPCHK_RULES_MAY_USE_SBUF;
break;
case TCPCHK_SEND_STRING_LF:
case TCPCHK_SEND_BINARY_LF:
- px->tcpcheck_rules.flags &= ~TCPCHK_RULES_MAY_USE_SBUF;
+ px->tcpcheck.rs->flags &= ~TCPCHK_RULES_MAY_USE_SBUF;
break;
case TCPCHK_SEND_HTTP:
if ((chk->send.http.flags & TCPCHK_SND_HTTP_FL_BODY_FMT) ||
(istlen(chk->send.http.body) >= global.tune.bufsize_small))
- px->tcpcheck_rules.flags &= ~TCPCHK_RULES_MAY_USE_SBUF;
+ px->tcpcheck.rs->flags &= ~TCPCHK_RULES_MAY_USE_SBUF;
default:
break;
}
void deinit_proxy_tcpcheck(struct proxy *px)
{
- free_tcpcheck_vars(&px->tcpcheck_rules.preset_vars);
- px->tcpcheck_rules.flags = 0;
- px->tcpcheck_rules.list = NULL;
+ free_tcpcheck_vars(&px->tcpcheck.preset_vars);
+ px->tcpcheck.flags = 0;
+ px->tcpcheck.rs = NULL;
}
static void deinit_tcpchecks()
}
}
-int add_tcpcheck_expect_str(struct tcpcheck_rules *rules, const char *str)
+int add_tcpcheck_expect_str(struct tcpcheck_ruleset *rs, const char *str)
{
struct tcpcheck_rule *tcpcheck, *prev_check;
struct tcpcheck_expect *expect;
* in a chain of one or more expect rule, potentially itself.
*/
tcpcheck->expect.head = tcpcheck;
- list_for_each_entry_rev(prev_check, rules->list, list) {
+ list_for_each_entry_rev(prev_check, &rs->rules, list) {
if (prev_check->action == TCPCHK_ACT_EXPECT) {
if (prev_check->expect.flags & TCPCHK_EXPT_FL_INV)
tcpcheck->expect.head = prev_check;
if (prev_check->action != TCPCHK_ACT_COMMENT && prev_check->action != TCPCHK_ACT_ACTION_KW)
break;
}
- LIST_APPEND(rules->list, &tcpcheck->list);
+ LIST_APPEND(&rs->rules, &tcpcheck->list);
return 1;
}
-int add_tcpcheck_send_strs(struct tcpcheck_rules *rules, const char * const *strs)
+int add_tcpcheck_send_strs(struct tcpcheck_ruleset *rs, const char * const *strs)
{
struct tcpcheck_rule *tcpcheck;
struct tcpcheck_send *send;
for (in = strs[i]; (*dst = *in++); dst++);
*dst = 0;
- LIST_APPEND(rules->list, &tcpcheck->list);
+ LIST_APPEND(&rs->rules, &tcpcheck->list);
return 1;
}
memprintf(errmsg, "out of memory.\n");
goto error;
}
+ rs->flags |= TCPCHK_RULES_TCP_CHK;
}
index = 0;
LIST_APPEND(&rs->rules, &chk->list);
if ((curpx->options2 & PR_O2_CHK_ANY) == PR_O2_TCPCHK_CHK &&
- (curpx->tcpcheck_rules.flags & TCPCHK_RULES_PROTO_CHK) == TCPCHK_RULES_TCP_CHK) {
+ (curpx->tcpcheck.rs->flags & TCPCHK_RULES_PROTO_CHK) == TCPCHK_RULES_TCP_CHK) {
/* Use this ruleset if the proxy already has tcp-check enabled */
- curpx->tcpcheck_rules.list = &rs->rules;
- curpx->tcpcheck_rules.flags &= ~TCPCHK_RULES_UNUSED_TCP_RS;
+ curpx->tcpcheck.rs = rs;
+ curpx->tcpcheck.flags &= ~TCPCHK_FL_UNUSED_TCP_RS;
}
else {
/* mark this ruleset as unused for now */
- curpx->tcpcheck_rules.flags |= TCPCHK_RULES_UNUSED_TCP_RS;
+ curpx->tcpcheck.flags |= TCPCHK_FL_UNUSED_TCP_RS;
}
return ret;
memprintf(errmsg, "out of memory.\n");
goto error;
}
+ rs->flags |= TCPCHK_RULES_HTTP_CHK;
}
index = 0;
chk->index = index;
if ((curpx->options2 & PR_O2_CHK_ANY) == PR_O2_TCPCHK_CHK &&
- (curpx->tcpcheck_rules.flags & TCPCHK_RULES_PROTO_CHK) == TCPCHK_RULES_HTTP_CHK) {
+ (curpx->tcpcheck.rs->flags & TCPCHK_RULES_PROTO_CHK) == TCPCHK_RULES_HTTP_CHK) {
/* Use this ruleset if the proxy already has http-check enabled */
- curpx->tcpcheck_rules.list = &rs->rules;
- curpx->tcpcheck_rules.flags &= ~TCPCHK_RULES_UNUSED_HTTP_RS;
- if (!tcpcheck_add_http_rule(chk, &curpx->tcpcheck_rules, errmsg)) {
+ curpx->tcpcheck.rs = rs;
+ curpx->tcpcheck.flags &= ~TCPCHK_FL_UNUSED_HTTP_RS;
+ if (!tcpcheck_add_http_rule(chk, curpx->tcpcheck.rs, errmsg)) {
memprintf(errmsg, "'%s %s' : %s.", args[0], args[1], *errmsg);
- curpx->tcpcheck_rules.list = NULL;
+ curpx->tcpcheck.rs = NULL;
goto error;
}
}
else {
/* mark this ruleset as unused for now */
- curpx->tcpcheck_rules.flags |= TCPCHK_RULES_UNUSED_HTTP_RS;
+ curpx->tcpcheck.flags |= TCPCHK_FL_UNUSED_HTTP_RS;
LIST_APPEND(&rs->rules, &chk->list);
}
static char *redis_res = "+PONG\r\n";
struct tcpcheck_ruleset *rs = NULL;
- struct tcpcheck_rules *rules = &curpx->tcpcheck_rules;
+ struct tcpcheck *tc = &curpx->tcpcheck;
struct tcpcheck_rule *chk;
char *errmsg = NULL;
int err_code = 0;
curpx->options2 &= ~PR_O2_CHK_ANY;
curpx->options2 |= PR_O2_TCPCHK_CHK;
- free_tcpcheck_vars(&rules->preset_vars);
- rules->list = NULL;
- rules->flags = 0;
+ free_tcpcheck_vars(&tc->preset_vars);
+ tc->rs = NULL;
rs = find_tcpcheck_ruleset("*redis-check");
if (rs)
ha_alert("parsing [%s:%d] : out of memory.\n", file, line);
goto error;
}
+ rs->flags |= TCPCHK_RULES_REDIS_CHK;
chk = parse_tcpcheck_send((char *[]){"tcp-check", "send", redis_req, ""},
1, curpx, &rs->rules, file, line, &errmsg);
LIST_APPEND(&rs->rules, &chk->list);
ruleset_found:
- rules->list = &rs->rules;
- rules->flags &= ~(TCPCHK_RULES_PROTO_CHK|TCPCHK_RULES_UNUSED_RS);
- rules->flags |= TCPCHK_RULES_REDIS_CHK;
+ tc->rs = rs;
out:
free(errmsg);
};
struct tcpcheck_ruleset *rs = NULL;
- struct tcpcheck_rules *rules = &curpx->tcpcheck_rules;
+ struct tcpcheck *tc = &curpx->tcpcheck;
struct tcpcheck_rule *chk;
char *errmsg = NULL;
int err_code = 0;
curpx->options2 &= ~PR_O2_CHK_ANY;
curpx->options2 |= PR_O2_TCPCHK_CHK;
- free_tcpcheck_vars(&rules->preset_vars);
- rules->list = NULL;
- rules->flags = 0;
+ free_tcpcheck_vars(&tc->preset_vars);
+ tc->rs = NULL;
rs = find_tcpcheck_ruleset("*ssl-hello-check");
if (rs)
ha_alert("parsing [%s:%d] : out of memory.\n", file, line);
goto error;
}
+ rs->flags |= TCPCHK_RULES_SSL3_CHK;
chk = parse_tcpcheck_send((char *[]){"tcp-check", "send-binary-lf", sslv3_client_hello, ""},
1, curpx, &rs->rules, file, line, &errmsg);
LIST_APPEND(&rs->rules, &chk->list);
ruleset_found:
- rules->list = &rs->rules;
- rules->flags &= ~(TCPCHK_RULES_PROTO_CHK|TCPCHK_RULES_UNUSED_RS);
- rules->flags |= TCPCHK_RULES_SSL3_CHK;
+ tc->rs = rs;
out:
free(errmsg);
static char *smtp_req = "%[var(check.smtp_cmd)]\r\n";
struct tcpcheck_ruleset *rs = NULL;
- struct tcpcheck_rules *rules = &curpx->tcpcheck_rules;
+ struct tcpcheck *tc = &curpx->tcpcheck;
struct tcpcheck_rule *chk;
struct tcpcheck_var *var = NULL;
char *cmd = NULL, *errmsg = NULL;
curpx->options2 &= ~PR_O2_CHK_ANY;
curpx->options2 |= PR_O2_TCPCHK_CHK;
- free_tcpcheck_vars(&rules->preset_vars);
- rules->list = NULL;
- rules->flags = 0;
+ free_tcpcheck_vars(&tc->preset_vars);
+ tc->rs = NULL;
cur_arg += 2;
if (*args[cur_arg] && *args[cur_arg+1] &&
var->data.u.str.area = cmd;
var->data.u.str.data = strlen(cmd);
LIST_INIT(&var->list);
- LIST_APPEND(&rules->preset_vars, &var->list);
+ LIST_APPEND(&tc->preset_vars, &var->list);
cmd = NULL;
var = NULL;
ha_alert("parsing [%s:%d] : out of memory.\n", file, line);
goto error;
}
+ rs->flags |= TCPCHK_RULES_SMTP_CHK;
chk = parse_tcpcheck_connect((char *[]){"tcp-check", "connect", "default", "linger", ""},
1, curpx, &rs->rules, file, line, &errmsg);
LIST_APPEND(&rs->rules, &chk->list);
ruleset_found:
- rules->list = &rs->rules;
- rules->flags &= ~(TCPCHK_RULES_PROTO_CHK|TCPCHK_RULES_UNUSED_RS);
- rules->flags |= TCPCHK_RULES_SMTP_CHK;
+ tc->rs = rs;
out:
free(errmsg);
error:
free(cmd);
free(var);
- free_tcpcheck_vars(&rules->preset_vars);
+ free_tcpcheck_vars(&tc->preset_vars);
free_tcpcheck_ruleset(rs);
err_code |= ERR_ALERT | ERR_FATAL;
goto out;
};
struct tcpcheck_ruleset *rs = NULL;
- struct tcpcheck_rules *rules = &curpx->tcpcheck_rules;
+ struct tcpcheck *tc = &curpx->tcpcheck;
struct tcpcheck_rule *chk;
struct tcpcheck_var *var = NULL;
char *user = NULL, *errmsg = NULL;
curpx->options2 &= ~PR_O2_CHK_ANY;
curpx->options2 |= PR_O2_TCPCHK_CHK;
- free_tcpcheck_vars(&rules->preset_vars);
- rules->list = NULL;
- rules->flags = 0;
+ free_tcpcheck_vars(&tc->preset_vars);
+ tc->rs = NULL;
cur_arg += 2;
if (!*args[cur_arg] || !*args[cur_arg+1]) {
var->data.u.str.area = user;
var->data.u.str.data = strlen(user);
LIST_INIT(&var->list);
- LIST_APPEND(&rules->preset_vars, &var->list);
+ LIST_APPEND(&tc->preset_vars, &var->list);
user = NULL;
var = NULL;
var->data.type = SMP_T_SINT;
var->data.u.sint = packetlen;
LIST_INIT(&var->list);
- LIST_APPEND(&rules->preset_vars, &var->list);
+ LIST_APPEND(&tc->preset_vars, &var->list);
var = NULL;
}
else {
ha_alert("parsing [%s:%d] : out of memory.\n", file, line);
goto error;
}
+ rs->flags |= TCPCHK_RULES_PGSQL_CHK;
chk = parse_tcpcheck_connect((char *[]){"tcp-check", "connect", "default", "linger", ""},
1, curpx, &rs->rules, file, line, &errmsg);
LIST_APPEND(&rs->rules, &chk->list);
ruleset_found:
- rules->list = &rs->rules;
- rules->flags &= ~(TCPCHK_RULES_PROTO_CHK|TCPCHK_RULES_UNUSED_RS);
- rules->flags |= TCPCHK_RULES_PGSQL_CHK;
+ tc->rs = rs;
out:
free(errmsg);
error:
free(user);
free(var);
- free_tcpcheck_vars(&rules->preset_vars);
+ free_tcpcheck_vars(&tc->preset_vars);
free_tcpcheck_ruleset(rs);
err_code |= ERR_ALERT | ERR_FATAL;
goto out;
};
struct tcpcheck_ruleset *rs = NULL;
- struct tcpcheck_rules *rules = &curpx->tcpcheck_rules;
+ struct tcpcheck *tc = &curpx->tcpcheck;
struct tcpcheck_rule *chk;
struct tcpcheck_var *var = NULL;
char *mysql_rsname = "*mysql-check";
curpx->options2 &= ~PR_O2_CHK_ANY;
curpx->options2 |= PR_O2_TCPCHK_CHK;
- free_tcpcheck_vars(&rules->preset_vars);
- rules->list = NULL;
- rules->flags = 0;
+ free_tcpcheck_vars(&tc->preset_vars);
+ tc->rs = NULL;
cur_arg += 2;
if (*args[cur_arg]) {
var->data.u.str.area = hdr;
var->data.u.str.data = 4;
LIST_INIT(&var->list);
- LIST_APPEND(&rules->preset_vars, &var->list);
+ LIST_APPEND(&tc->preset_vars, &var->list);
hdr = NULL;
var = NULL;
var->data.u.str.area = user;
var->data.u.str.data = strlen(user);
LIST_INIT(&var->list);
- LIST_APPEND(&rules->preset_vars, &var->list);
+ LIST_APPEND(&tc->preset_vars, &var->list);
user = NULL;
var = NULL;
}
ha_alert("parsing [%s:%d] : out of memory.\n", file, line);
goto error;
}
+ rs->flags |= TCPCHK_RULES_MYSQL_CHK;
chk = parse_tcpcheck_connect((char *[]){"tcp-check", "connect", "default", "linger", ""},
1, curpx, &rs->rules, file, line, &errmsg);
}
ruleset_found:
- rules->list = &rs->rules;
- rules->flags &= ~(TCPCHK_RULES_PROTO_CHK|TCPCHK_RULES_UNUSED_RS);
- rules->flags |= TCPCHK_RULES_MYSQL_CHK;
+ tc->rs = rs;
out:
free(errmsg);
free(hdr);
free(user);
free(var);
- free_tcpcheck_vars(&rules->preset_vars);
+ free_tcpcheck_vars(&tc->preset_vars);
free_tcpcheck_ruleset(rs);
err_code |= ERR_ALERT | ERR_FATAL;
goto out;
static char *ldap_req = "300C020101600702010304008000";
struct tcpcheck_ruleset *rs = NULL;
- struct tcpcheck_rules *rules = &curpx->tcpcheck_rules;
+ struct tcpcheck *tc = &curpx->tcpcheck;
struct tcpcheck_rule *chk;
char *errmsg = NULL;
int err_code = 0;
curpx->options2 &= ~PR_O2_CHK_ANY;
curpx->options2 |= PR_O2_TCPCHK_CHK;
- free_tcpcheck_vars(&rules->preset_vars);
- rules->list = NULL;
- rules->flags = 0;
+ free_tcpcheck_vars(&tc->preset_vars);
+ tc->rs = NULL;
rs = find_tcpcheck_ruleset("*ldap-check");
if (rs)
ha_alert("parsing [%s:%d] : out of memory.\n", file, line);
goto error;
}
+ rs->flags |= TCPCHK_RULES_LDAP_CHK;
chk = parse_tcpcheck_send((char *[]){"tcp-check", "send-binary", ldap_req, ""},
1, curpx, &rs->rules, file, line, &errmsg);
LIST_APPEND(&rs->rules, &chk->list);
ruleset_found:
- rules->list = &rs->rules;
- rules->flags &= ~(TCPCHK_RULES_PROTO_CHK|TCPCHK_RULES_UNUSED_RS);
- rules->flags |= TCPCHK_RULES_LDAP_CHK;
+ tc->rs = rs;
out:
free(errmsg);
"62696c697469657308000b6865616c7468636865636b11";
struct tcpcheck_ruleset *rs = NULL;
- struct tcpcheck_rules *rules = &curpx->tcpcheck_rules;
+ struct tcpcheck *tc = &curpx->tcpcheck;
struct tcpcheck_rule *chk;
char *errmsg = NULL;
int err_code = 0;
curpx->options2 &= ~PR_O2_CHK_ANY;
curpx->options2 |= PR_O2_TCPCHK_CHK;
- free_tcpcheck_vars(&rules->preset_vars);
- rules->list = NULL;
- rules->flags = 0;
+ free_tcpcheck_vars(&tc->preset_vars);
+ tc->rs = NULL;
rs = find_tcpcheck_ruleset("*spop-check");
if (rs)
ha_alert("parsing [%s:%d] : out of memory.\n", file, line);
goto error;
}
+ rs->flags |= TCPCHK_RULES_SPOP_CHK;
chk = parse_tcpcheck_connect((char *[]){"tcp-check", "connect", "default", "proto", "none", ""},
1, curpx, &rs->rules, file, line, &errmsg);
LIST_APPEND(&rs->rules, &chk->list);
ruleset_found:
- rules->list = &rs->rules;
- rules->flags &= ~(TCPCHK_RULES_PROTO_CHK|TCPCHK_RULES_UNUSED_RS);
- rules->flags |= TCPCHK_RULES_SPOP_CHK;
+ tc->rs = rs;
out:
return err_code;
const char *file, int line)
{
struct tcpcheck_ruleset *rs = NULL;
- struct tcpcheck_rules *rules = &curpx->tcpcheck_rules;
+ struct tcpcheck *tc = &curpx->tcpcheck;
struct tcpcheck_rule *chk;
char *errmsg = NULL;
int err_code = 0;
ha_free(&errmsg);
}
- no_request:
curpx->options2 &= ~PR_O2_CHK_ANY;
curpx->options2 |= PR_O2_TCPCHK_CHK;
- free_tcpcheck_vars(&rules->preset_vars);
- rules->list = NULL;
+ free_tcpcheck_vars(&tc->preset_vars);
+ tc->rs = NULL;
/* Deduce the ruleset name from the proxy info */
chunk_printf(&trash, "*http-check-%s_%s-%d",
ha_alert("parsing [%s:%d] : out of memory.\n", file, line);
goto error;
}
+ rs->flags |= TCPCHK_RULES_HTTP_CHK;
}
- rules->list = &rs->rules;
- rules->flags &= ~(TCPCHK_RULES_PROTO_CHK|TCPCHK_RULES_UNUSED_RS);
- rules->flags |= TCPCHK_RULES_HTTP_CHK;
- if (!tcpcheck_add_http_rule(chk, rules, &errmsg)) {
+ tc->rs = rs;
+ tc->flags &= ~TCPCHK_FL_UNUSED_HTTP_RS;
+ if (!tcpcheck_add_http_rule(chk, rs, &errmsg)) {
ha_alert("parsing [%s:%d] : '%s %s' : %s.\n", file, line, args[0], args[1], errmsg);
- rules->list = NULL;
+ tc->rs = NULL;
goto error;
}
const char *file, int line)
{
struct tcpcheck_ruleset *rs = NULL;
- struct tcpcheck_rules *rules = &curpx->tcpcheck_rules;
+ struct tcpcheck *tc = &curpx->tcpcheck;
int err_code = 0;
if (warnifnotcap(curpx, PR_CAP_BE, file, line, args[cur_arg+1], NULL))
curpx->options2 &= ~PR_O2_CHK_ANY;
curpx->options2 |= PR_O2_TCPCHK_CHK;
- if ((rules->flags & TCPCHK_RULES_PROTO_CHK) == TCPCHK_RULES_TCP_CHK) {
- /* If a tcp-check rulesset is already set, do nothing */
- if (rules->list)
- goto out;
-
- /* If a tcp-check ruleset is waiting to be used for the current proxy,
- * get it.
- */
- if (rules->flags & TCPCHK_RULES_UNUSED_TCP_RS)
- goto curpx_ruleset;
-
- /* Otherwise, try to get the tcp-check ruleset of the default proxy */
- chunk_printf(&trash, "*tcp-check-defaults_%s-%d", defpx->conf.file, defpx->conf.line);
- rs = find_tcpcheck_ruleset(b_orig(&trash));
- if (rs)
- goto ruleset_found;
- }
+ free_tcpcheck_vars(&tc->preset_vars);
+ tc->rs = NULL;
- curpx_ruleset:
/* Deduce the ruleset name from the proxy info */
chunk_printf(&trash, "*tcp-check-%s_%s-%d",
((curpx == defpx) ? "defaults" : curpx->id),
ha_alert("parsing [%s:%d] : out of memory.\n", file, line);
goto error;
}
+ rs->flags |= TCPCHK_RULES_TCP_CHK;
}
- ruleset_found:
- free_tcpcheck_vars(&rules->preset_vars);
- rules->list = &rs->rules;
- rules->flags &= ~(TCPCHK_RULES_PROTO_CHK|TCPCHK_RULES_UNUSED_RS);
- rules->flags |= TCPCHK_RULES_TCP_CHK;
+ tc->rs = rs;
+ tc->flags &= ~TCPCHK_FL_UNUSED_TCP_RS;
out:
return err_code;