define(`chr10', ` ') dnl define(`confOS', `esyscmd(`uname | perl -p -e "chomp()"')') ifdef(`confOS',`',`define(`confOS', `esyscmd(`uname | perl -p -e "chomp()"')')') dnl define(`confPAROVOZ_VERSION', `esyscmd(`cat ../m4/VERSION')') dnl define(`confPAROVOZ_DATETIME', `esyscmd(`stat ../m4/VERSION | grep Modify | perl -p -e "s/^\S+: (\S+) (\d\d:\d\d:\d\d).+/\$'`1.\$'`2/"')') dnl define(`confNOW', `esyscmd(`date +"%Y-%m-%d.%H:%M:%S"')') define(`confPAROVOZ_VERSION', `esyscmd(`cat ../m4/VERSION ; echo -n "/" ; ../bin/stat_modify.sh ../m4/VERSION ; echo -n "/" ; date +"%Y-%m-%d %H:%M" | perl -p -e "chomp()"')') define(`DNSLOOKUP_DOMAINS', `! +local_domains')dnl define(`DNSLOOKUP_IGNORE_TARGET_HOSTS', `')dnl define(`DNSLOOKUP6_DOMAINS', `! +local_domains')dnl define(`DNSLOOKUP6_IGNORE_TARGET_HOSTS', `')dnl dnl truncate string $1 by character $2 dnl truncate_by_char(`data_string',`char') define(`truncate_by_char',`define(`_I1_',`index(`$1',`$2')')`'define(`_IS_SET_',`eval(_I1_ >= 0)')`'ifelse(_IS_SET_,`1',`substr(`$1',0,_I1_)',`$1')') dnl truncate_by_char_left(`data_string',`char') define(`truncate_by_char_left',`define(`_I2_',`index(`$1',`$2')')`'define(`_IS_SET_',`eval(_I2_ >= 0)')`'ifelse(_IS_SET_,`1',`substr(`$1',eval(_I2_+1))',`')') dnl truncate string $3 by character $2 from left side $1 times dnl truncate_by_char_N_left(`count', `char', `data_string') define(`truncate_by_char_N_left',`define(`_I3_', `eval($1-1)')`'define(`_IS_SET3_',`eval(_I3_>0)')`'ifelse(_IS_SET3_,`1',`truncate_by_char_N_left(_I3_,`$2',truncate_by_char_left(`$3',`$2'))',`$3')') dnl extract value of delimited parameter dnl EXTRACT_DELIMITED(`field_no', `delimiter', `data_string') define(`EXTRACT_DELIMITED',`truncate_by_char(truncate_by_char_N_left(`$1', `$2', `$3'),`$2')') dnl extract value of named parameter dnl EXTRACT_NAMED(`field_name', `data_string') define(`EXTRACT_NAMED',`define(`_I4_',`index(`$2',`$1=')')`'define(`_IS_SET2_',`eval(_I4_ >= 0)')`'ifelse(_IS_SET2_,`1',`truncate_by_char(substr(`$2',eval(_I4_+len(`$1')+1)),` ')',`')') dnl extract field by name or by number dnl EXTRACT(`field_name', `data_string') dnl EXTRACT(`field_no', `delimiter', `data_string') define(`EXTRACT',`ifelse(`$3',`',`EXTRACT_NAMED(`$1', `$2')',`EXTRACT_DELIMITED(`$1', `$2', `$3')')') dnl find substring `$2' in string `$1' define(`ifelse_strstr',`define(`_IS_SET_',`eval(index(`$1',`$2') >= 0)')`'ifelse(_IS_SET_,`1',`$3',`$4')') changequote(<<, >>) define(<>,<>,<>,<<$2>>) >= 0)>>)<<>>ifelse(_IS_SET_,<<1>>,<<$3>>,<<$4>>)>>) changequote dnl repeat `$2' string `$3' times and append it to `$1' string define(`repeat_str',`ifelse($3,`1',$1$2,`repeat_str($1$2,$2,eval($3-1))')') dnl change all occurrences of the first character (`$2') in the string `$1' to second character (`$3') define(`replace_char', `translit(`$1', `$2', `$3')') dnl replace first occurrence of the substring `$2' in the string `$1' to substring `$3' define(`replace_str', `define(`_IDX_',`index(`$1',`$2')')`'define(`_I_',`eval(_IDX_ >= 0)')`'ifelse(_I_,`1',`substr(`$1',0,_IDX_)`'$3`'substr(`$1',eval(_IDX_+len(`$2')))',`$1')') define(`replace_all_substr', `pushdef(`$2',`$3')$1`'popdef(`$2')') define(`semicolon2pipe', `translit(`$1', `:', `|')') define(`pipe2semicolon', `translit(`$1', `|', `:')') dnl convert string `$1 to lower' define(`lower', `translit(`$1', `ABCDEFGHIJKLMNOPQRSTUVWXYZ', `abcdefghijklmnopqrstuvwxyz')') dnl caseinsensitive compare of strings `$1' and `$2' define(`strcasecmp', `ifelse(lower($1), lower($2), `1', `0')') dnl define if not yet defined: if `$1' is not defined it will be `$2' define(`def_if_not',`ifdef(`$1',`',`define(`$1',`$2')')') dnl add a char $2 to a string $1 if it is not there define(`_ADDCHAR_',`define(`_I_',`eval(index(`$1',`$2') >= 0)')`'ifelse(_I_,`1',`$1',`$1$2')') dnl delete a char $2 from a string $1 if it is there define(`_DELCHAR_',`define(`_IDX_',`index(`$1',`$2')')`'define(`_I_',`eval(_IDX_ >= 0)')`'ifelse(_I_,`1',`substr(`$1',0,_IDX_)`'substr(`$1',eval(_IDX_+1))',`$1')') dnl delete a substring $2 from a string $1 if it is there define(`_DELSUBSTR_',`define(`_IDX_',`index(`$1',`$2')')`'define(`_I_',`eval(_IDX_ >= 0)')`'ifelse(_I_,`1',`substr(`$1',0,_IDX_)`'substr(`$1',eval(_IDX_+len(`$2')))',`$1')') dnl delete all spaces from a string $1 if they are there define(`del_spaces', `define(`_STR_INDEX_',`index(`$1',` ')')`'define(`_IS_SET_',`eval(_STR_INDEX_ >= 0)')`'ifelse(_IS_SET_,`1',`del_spaces(_DELCHAR_($1, ` '))',`$1')') define(`RENAME_HEADERS',`define(`_IDX_',`index($1,`:')')`'define(`_I_',`eval(_IDX_ >= 0)')`'ifelse(_I_,`1',`define(`_FIELD_NAME_', `substr(`$1',0,_IDX_)')',`define(`_FIELD_NAME_', `$1')')dnl add_header = ${substr{0}{32765}{${sg{${if eq{$h_`'_FIELD_NAME_`':}{}{}{_FIELD_NAME_`'-Old: ${sg{$h_`'_FIELD_NAME_`':}{\N\n(\S)\N}{\n`'_FIELD_NAME_`'-Old: \$`'1}}\n}}}{\N\n \n\N}{\n}}}} ifelse(_I_,`1',`define(`_NEW_ARG_',`substr(`$1',eval(_IDX_+1))')`'RENAME_HEADERS(_NEW_ARG_)')') define(`NORMALIZE_ACTION', `replace_str(replace_str(replace_str(replace_char(lower(`$1'), `:', `='), `deny', `reject'), `delay', `pause'), `greylisting', `greylist')')dnl define(`NORMALIZE_ACTION_PERSONAL_QUARANTINE', `replace_str(replace_str(replace_str(replace_str(replace_str(replace_char(lower(`$1'), `:', `='), `deny', `reject'), `delay', `pause'), `greylisting', `greylist'), `reject', `quarantine reject'), `quarantine reject=', `reject=')')dnl dnl define(`PUSHDIVERT', `pushdef(`__D__', divnum)divert($1)') dnl define(`POPDIVERT', `divert(__D__)popdef(`__D__')') define(`ACL', `define(`_ARG_', `$2')define(`_ARGS_', `shift($@)')include(confCONFDIR`'/acls/$1.m4)') define(`FEATURE', `define(`_ARG_', `$2')define(`_ARGS_', `shift($@)')include(confCONFDIR`'/features/$1.m4)') define(`DELIVERY', `define(`_ARG_', `$2')define(`_ARGS_', `shift($@)')include(confDELIVERIES_DIR`'/$1.m4)') dnl access to further arguments in FEATURE/ACL/etc define(`_ACC_ARG_1_',`$1') define(`_ACC_ARG_2_',`$2') define(`_ACC_ARG_3_',`$3') define(`_ACC_ARG_4_',`$4') define(`_ACC_ARG_5_',`$5') define(`_ACC_ARG_6_',`$6') define(`_ACC_ARG_7_',`$7') define(`_ACC_ARG_8_',`$8') define(`_ACC_ARG_9_',`$9') define(`_ARG1_',`_ACC_ARG_1_(_ARGS_)') define(`_ARG2_',`_ACC_ARG_2_(_ARGS_)') define(`_ARG3_',`_ACC_ARG_3_(_ARGS_)') define(`_ARG4_',`_ACC_ARG_4_(_ARGS_)') define(`_ARG5_',`_ACC_ARG_5_(_ARGS_)') define(`_ARG6_',`_ACC_ARG_6_(_ARGS_)') define(`_ARG7_',`_ACC_ARG_7_(_ARGS_)') define(`_ARG8_',`_ACC_ARG_8_(_ARGS_)') define(`_ARG9_',`_ACC_ARG_9_(_ARGS_)') define(`ENTERPRISE', `define(`_ARG_', `$3')define(`_ARGS_', `shift(shift($@))')include(confCONFDIR`'/enterprise/$1/$2.m4)') define(`ANTIVIR_DLFUNC',` ifdef(`_AVIR_N_', `define(`_TMP_', `eval(_AVIR_N_+1)')define(`_AVIR_N_', _TMP_)', `define(`_AVIR_N_', `0')') define(`confANTIVIRUS'_AVIR_N_`_DLFUNC_NAME',`$1') define(`confANTIVIRUS'_AVIR_N_`_DLFUNC_PARAM',`$2') define(`confANTIVIRUS'_AVIR_N_`_NAME',`$3') define(`confANTIVIRUS'_AVIR_N_`_ACT',`$4') define(`confANTIVIRUS'_AVIR_N_`_SCAN',`$5') define(`confANTIVIRUS'_AVIR_N_`_OPT',`$6') define(`confANTIVIRUS'_AVIR_N_`_NAME_CMD',`$7') define(`confANTIVIRUS'_AVIR_N_`_NAME_DEFAULT',`$8') define(`confANTIVIRUS'_AVIR_N_`_MAX_SIZE',`$9') ifelse_strstr($4,`QUARANTINE',`define(`_AV_QUARANTINE_',`YES')') ifelse_strstr($6,`defer_no_mbox_unspool',`define(`_AV_NO_MBOX_UNSPOOL_',`YES')') ') define(`ANTIVIRUS',` ifdef(`_AVIR_N_', `define(`_TMP_', `eval(_AVIR_N_+1)')define(`_AVIR_N_', _TMP_)', `define(`_AVIR_N_', `0')') define(`confANTIVIRUS'_AVIR_N_`_DLFUNC_NAME',`') define(`confANTIVIRUS'_AVIR_N_`_DLFUNC_PARAM',`') define(`confANTIVIRUS'_AVIR_N_`_NAME',`$1') define(`confANTIVIRUS'_AVIR_N_`_ACT',`$2') define(`confANTIVIRUS'_AVIR_N_`_SCAN',`$3') define(`confANTIVIRUS'_AVIR_N_`_OPT',`$4') define(`confANTIVIRUS'_AVIR_N_`_NAME_CMD',`$5') define(`confANTIVIRUS'_AVIR_N_`_NAME_DEFAULT',`$6') define(`confANTIVIRUS'_AVIR_N_`_MAX_SIZE',`$7') ifelse_strstr($2,`QUARANTINE',`define(`_AV_QUARANTINE_',`YES')') ifelse_strstr($4,`defer_no_mbox_unspool',`define(`_AV_NO_MBOX_UNSPOOL_',`YES')') ') define(`CONTENT_SCANNER',` ifdef(`_CONTENT_SCAN_N_', `define(`_TMP_', `eval(_CONTENT_SCAN_N_+1)')define(`_CONTENT_SCAN_N_', _TMP_)', `define(`_CONTENT_SCAN_N_', `0')') define(`confCONTENT_SCANNER'_CONTENT_SCAN_N_`_NAME',`$1') define(`confCONTENT_SCANNER'_CONTENT_SCAN_N_`_ACT',`$2') define(`confCONTENT_SCANNER'_CONTENT_SCAN_N_`_SCAN',`$3') define(`confCONTENT_SCANNER'_CONTENT_SCAN_N_`_OPT',`$4') define(`confCONTENT_SCANNER'_CONTENT_SCAN_N_`_NAME_CMD',`$5') define(`confCONTENT_SCANNER'_CONTENT_SCAN_N_`_NAME_DEFAULT',`$6') define(`confCONTENT_SCANNER'_CONTENT_SCAN_N_`_MAX_SIZE',`$7') ifelse_strstr($2,`QUARANTINE',`define(`_CSCAN_QUARANTINE_',`YES')') ') define(`DNS_BL',` ifdef(`_DNSBL_N_', `define(`_TMP_', `eval(_DNSBL_N_+1)')define(`_DNSBL_N_', _TMP_)', `define(`_DNSBL_N_', `0')') define(`confDNSBL'_DNSBL_N_`_NAME',`$1') define(`confDNSBL'_DNSBL_N_`_ACT',`$2') define(`confDNSBL'_DNSBL_N_`_DEFER',`$3') define(`confDNSBL'_DNSBL_N_`_MSG',`$4') ') define(`RFC_IGNORANT_LIST',` echo "ERROR: RFC_`'IGNORANT_LIST deprecated" echo "ERROR: remove it from your site/conf file" exit 1 ') dnl Macros for text handling dnl https://www.slac.stanford.edu/comp/unix/gnu-info/m4_10.html dnl Substituting text by regular expression dnl https://www.slac.stanford.edu/comp/unix/gnu-info/m4_toc.html#SEC56 define(`upcase', `translit(`$*', `a-z', `A-Z')')dnl define(`downcase', `translit(`$*', `A-Z', `a-z')')dnl define(`capitalize1', `regexp(`$1', `^\(\w\)\(\w*\)', `upcase(`\1')`'downcase(`\2')')')dnl define(`capitalize', `patsubst(`$1', `\w+', `capitalize1(`\&')')')dnl dnl capitalize(`GNUs not Unix') dnl =>Gnus Not Unix