mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-02-20 04:37:04 +00:00
Implement a way to test if some options are enabled at run-time. For now, following options may be detected: POLL, EPOLL, KQUEUE, EVPORTS, SPLICE, GETADDRINFO, REUSEPORT, FAST-FORWARD, SERVER-SSL-VERIFY-NONE These options are those that can be disabled on the command line. This way it is possible, from a reg-test for instance, to know if a feature is supported or not : feature cmd "$HAPROXY_PROGRAM -cc '!(globa.tune & GTUNE_NO_FAST_FWD)'"
106 lines
3.5 KiB
C
106 lines
3.5 KiB
C
/*
|
|
* include/haproxy/cfgcond-t.h
|
|
* Types for the configuration condition preprocessor
|
|
*
|
|
* Copyright (C) 2000-2021 Willy Tarreau - w@1wt.eu
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation, version 2.1
|
|
* exclusively.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#ifndef _HAPROXY_CFGCOND_T_H
|
|
#define _HAPROXY_CFGCOND_T_H
|
|
|
|
#include <haproxy/api-t.h>
|
|
|
|
/* nested if/elif/else/endif block states */
|
|
enum nested_cond_state {
|
|
NESTED_COND_IF_TAKE, // "if" with a true condition
|
|
NESTED_COND_IF_DROP, // "if" with a false condition
|
|
NESTED_COND_IF_SKIP, // "if" masked by an outer false condition
|
|
|
|
NESTED_COND_ELIF_TAKE, // "elif" with a true condition from a false one
|
|
NESTED_COND_ELIF_DROP, // "elif" with a false condition from a false one
|
|
NESTED_COND_ELIF_SKIP, // "elif" masked by an outer false condition or a previously taken if
|
|
|
|
NESTED_COND_ELSE_TAKE, // taken "else" after an if false condition
|
|
NESTED_COND_ELSE_DROP, // "else" masked by outer false condition or an if true condition
|
|
};
|
|
|
|
/* 100 levels of nested conditions should already be sufficient */
|
|
#define MAXNESTEDCONDS 100
|
|
|
|
/* supported conditional predicates for .if/.elif */
|
|
enum cond_predicate {
|
|
CFG_PRED_NONE, // none
|
|
CFG_PRED_DEFINED, // "defined"
|
|
CFG_PRED_FEATURE, // "feature"
|
|
CFG_PRED_STREQ, // "streq"
|
|
CFG_PRED_STRNEQ, // "strneq"
|
|
CFG_PRED_STRSTR, // "strstr"
|
|
CFG_PRED_VERSION_ATLEAST, // "version_atleast"
|
|
CFG_PRED_VERSION_BEFORE, // "version_before"
|
|
CFG_PRED_OSSL_VERSION_ATLEAST, // "openssl_version_atleast"
|
|
CFG_PRED_OSSL_VERSION_BEFORE, // "openssl_version_before"
|
|
CFG_PRED_SSLLIB_NAME_STARTSWITH, // "ssllib_name_startswith"
|
|
CFG_PRED_ENABLED, // "enabled"
|
|
};
|
|
|
|
/* types for condition terms */
|
|
enum cfg_cond_term_type {
|
|
CCTT_NONE = 0,
|
|
CCTT_FALSE,
|
|
CCTT_TRUE,
|
|
CCTT_PRED,
|
|
CCTT_PAREN, // '(' EXPR ')'
|
|
};
|
|
|
|
/* keyword for a condition predicate */
|
|
struct cond_pred_kw {
|
|
const char *word; // NULL marks the end of the list
|
|
enum cond_predicate prd; // one of the CFG_PRED_* above
|
|
uint64_t arg_mask; // mask of supported arguments (strings only)
|
|
};
|
|
|
|
/* condition term */
|
|
struct cfg_cond_term {
|
|
enum cfg_cond_term_type type; // CCTT_*
|
|
struct arg *args; // arguments for predicates
|
|
int neg; // 0: direct result; 1: negate
|
|
union {
|
|
const struct cond_pred_kw *pred; // predicate (function)
|
|
struct cfg_cond_expr *expr; // expression for CCTT_PAREN
|
|
};
|
|
};
|
|
|
|
/* condition sub-expression for an AND:
|
|
* expr_and = <term> '&&' <expr_and>
|
|
* | <term>
|
|
*/
|
|
struct cfg_cond_and {
|
|
struct cfg_cond_term *left;
|
|
struct cfg_cond_and *right; // may be NULL
|
|
};
|
|
|
|
/* condition expression:
|
|
* expr = <expr_and> '||' <expr>
|
|
* | <expr_and>
|
|
*/
|
|
struct cfg_cond_expr {
|
|
struct cfg_cond_and *left;
|
|
struct cfg_cond_expr *right; // may be NULL
|
|
};
|
|
|
|
#endif /* _HAPROXY_CFGCOND_T_H */
|