57
#include "ESIParser.h"
63
#include "esi/Parser.h"
67
#include "adaptation/Config.h"
69
static void parse_adaptation_service_set_type();
70
static void parse_adaptation_service_chain_type();
71
static void parse_adaptation_access_type();
61
#include "ICAP/ICAPConfig.h"
63
static void parse_icap_service_type(ICAPConfig *);
64
static void dump_icap_service_type(StoreEntry *, const char *, const ICAPConfig &);
65
static void free_icap_service_type(ICAPConfig *);
66
static void parse_icap_class_type(ICAPConfig *);
67
static void dump_icap_class_type(StoreEntry *, const char *, const ICAPConfig &);
68
static void free_icap_class_type(ICAPConfig *);
69
static void parse_icap_access_type(ICAPConfig *);
70
static void dump_icap_access_type(StoreEntry *, const char *, const ICAPConfig &);
71
static void free_icap_access_type(ICAPConfig *);
76
#include "adaptation/icap/Config.h"
78
static void parse_icap_service_type(Adaptation::Icap::Config *);
79
static void dump_icap_service_type(StoreEntry *, const char *, const Adaptation::Icap::Config &);
80
static void free_icap_service_type(Adaptation::Icap::Config *);
81
static void parse_icap_class_type();
82
static void parse_icap_access_type();
87
#include "adaptation/ecap/Config.h"
88
static void parse_ecap_service_type(Adaptation::Ecap::Config *);
89
static void dump_ecap_service_type(StoreEntry *, const char *, const Adaptation::Ecap::Config &);
90
static void free_ecap_service_type(Adaptation::Ecap::Config *);
220
236
memset(&globbuf, 0, sizeof(globbuf));
221
237
for (path = strwordtok(files, &saveptr); path; path = strwordtok(NULL, &saveptr)) {
222
if (glob(path, globbuf.gl_pathc ? GLOB_APPEND : 0, NULL, &globbuf) != 0) {
223
fatalf("Unable to find configuration file: %s: %s",
238
if (glob(path, globbuf.gl_pathc ? GLOB_APPEND : 0, NULL, &globbuf) != 0) {
239
fatalf("Unable to find configuration file: %s: %s",
227
243
for (i = 0; i < (int)globbuf.gl_pathc; i++) {
228
error_count += parseOneConfigFile(globbuf.gl_pathv[i], depth);
244
error_count += parseOneConfigFile(globbuf.gl_pathv[i], depth);
230
246
globfree(&globbuf);
232
248
char* file = strwordtok(files, &saveptr);
233
249
while (file != NULL) {
234
error_count += parseOneConfigFile(file, depth);
235
file = strwordtok(NULL, &saveptr);
250
error_count += parseOneConfigFile(file, depth);
251
file = strwordtok(NULL, &saveptr);
237
253
#endif /* HAVE_GLOB */
238
254
return error_count;
716
for (s = Config.Sockaddr.http; s != NULL; s = (http_port_list *) s->next) {
717
if (!s->cert && !s->key)
720
debugs(3, 1, "Initializing http_port " << s->http.s << " SSL context");
722
s->sslContext = sslCreateServerContext(s->cert, s->key, s->version, s->cipher, s->options, s->sslflags, s->clientca, s->cafile, s->capath, s->crlfile, s->dhfile, s->sslcontext);
691
728
https_port_list *s;
693
730
for (s = Config.Sockaddr.https; s != NULL; s = (https_port_list *) s->http.next) {
694
debugs(3, 1, "Initializing https_port " <<
695
inet_ntoa(s->http.s.sin_addr) << ":" <<
696
ntohs(s->http.s.sin_port) << " SSL context");
731
debugs(3, 1, "Initializing https_port " << s->http.s << " SSL context");
698
733
s->sslContext = sslCreateServerContext(s->cert, s->key, s->version, s->cipher, s->options, s->sslflags, s->clientca, s->cafile, s->capath, s->crlfile, s->dhfile, s->sslcontext);
1732
1767
} else if (!strcasecmp(token, "htcp-oldsquid")) {
1733
1768
p->options.htcp = 1;
1734
1769
p->options.htcp_oldsquid = 1;
1770
} else if (!strcasecmp(token, "htcp-no-clr")) {
1771
if (p->options.htcp_only_clr)
1772
fatalf("parse_peer: can't set htcp-no-clr and htcp-only-clr simultaneously");
1773
p->options.htcp = 1;
1774
p->options.htcp_no_clr = 1;
1775
} else if (!strcasecmp(token, "htcp-no-purge-clr")) {
1776
p->options.htcp = 1;
1777
p->options.htcp_no_purge_clr = 1;
1778
} else if (!strcasecmp(token, "htcp-only-clr")) {
1779
if (p->options.htcp_no_clr)
1780
fatalf("parse_peer: can't set htcp-no-clr and htcp-only-clr simultaneously");
1781
p->options.htcp = 1;
1782
p->options.htcp_only_clr = 1;
1783
} else if (!strcasecmp(token, "htcp-forward-clr")) {
1784
p->options.htcp = 1;
1785
p->options.htcp_forward_clr = 1;
1737
1788
} else if (!strcasecmp(token, "no-netdb-exchange")) {
1738
1789
p->options.no_netdb_exchange = 1;
1741
1791
} else if (!strcasecmp(token, "carp")) {
1742
1792
if (p->type != PEER_PARENT)
2745
parse_sockaddr_in_list_token(sockaddr_in_list ** head, char *token)
2815
parse_IpAddress_list_token(IpAddress_list ** head, char *token)
2751
const struct hostent *hp;
2752
2822
unsigned short port;
2753
sockaddr_in_list *s;
2758
if ((t = strchr(token, ':'))) {
2829
if (*token == '[') {
2832
t = strchr(host, ']');
2762
2838
port = xatos(t + 1);
2766
} else if ((port = strtol(token, &tmp, 10)), !*tmp) {
2773
s = static_cast<sockaddr_in_list *>(xcalloc(1, sizeof(*s)));
2774
s->s.sin_port = htons(port);
2841
if ((t = strchr(token, ':'))) {
2845
port = xatos(t + 1);
2849
} else if ((port = strtol(token, &tmp, 10)), !*tmp) {
2776
2856
if (NULL == host)
2777
s->s.sin_addr = any_addr;
2778
else if (1 == safe_inet_addr(host, &s->s.sin_addr))
2858
else if ( ipa.GetHostByName(host) ) /* dont use ipcache. Accept either FQDN or IPA. */
2780
else if ((hp = gethostbyname(host))) /* dont use ipcache */
2781
s->s.sin_addr = inaddrFromHostent(hp);
2783
2861
self_destruct();
2863
/* port MUST be set after the IPA lookup/conversion is perofrmed. */
2786
2867
head = &(*head)->next;
2869
s = static_cast<IpAddress_list *>(xcalloc(1, sizeof(*s)));
2792
parse_sockaddr_in_list(sockaddr_in_list ** head)
2876
parse_IpAddress_list(IpAddress_list ** head)
2796
2880
while ((token = strtok(NULL, w_space))) {
2797
parse_sockaddr_in_list_token(head, token);
2881
parse_IpAddress_list_token(head, token);
2802
dump_sockaddr_in_list(StoreEntry * e, const char *n, const sockaddr_in_list * s)
2886
dump_IpAddress_list(StoreEntry * e, const char *n, const IpAddress_list * s)
2888
char ntoabuf[MAX_IPSTRLEN];
2805
storeAppendPrintf(e, "%s %s:%d\n",
2891
storeAppendPrintf(e, "%s %s\n",
2807
inet_ntoa(s->s.sin_addr),
2808
ntohs(s->s.sin_port));
2893
s->s.NtoA(ntoabuf,MAX_IPSTRLEN));
2814
free_sockaddr_in_list(sockaddr_in_list ** head)
2899
free_IpAddress_list(IpAddress_list ** head)
2816
sockaddr_in_list *s;
2818
while ((s = *head) != NULL) {
2901
if (*head) delete *head;
2824
2905
#if CURRENTLY_UNUSED
2834
2915
#endif /* CURRENTLY_UNUSED */
2835
2916
#endif /* USE_WCCPv2 */
2918
CBDATA_CLASS_INIT(http_port_list);
2838
2921
parse_http_port_specification(http_port_list * s, char *token)
2840
2923
char *host = NULL;
2842
const struct hostent *hp;
2843
2924
unsigned short port = 0;
2846
2928
s->disable_pmtu_discovery = DISABLE_PMTU_OFF;
2847
2929
s->name = xstrdup(token);
2930
s->connection_auth_disabled = false;
2849
if ((t = strchr(token, ':'))) {
2933
if (*token == '[') {
2936
t = strchr(host, ']');
2938
debugs(3, 0, "http(s)_port: missing ']' on IPv6 address: " << token);
2943
debugs(3, 0, "http(s)_port: missing Port in: " << token);
2853
2946
port = xatos(t + 1);
2856
port = xatos(token);
2949
if ((t = strchr(token, ':'))) {
2954
port = xatos(t + 1);
2956
} else if ((port = strtol(token, &junk, 10)), !*junk) {
2958
debugs(3, 3, "http(s)_port: found Listen on Port: " << port);
2960
debugs(3, 0, "http(s)_port: missing Port: " << token);
2965
debugs(3, 0, "http(s)_port: Port cannot be 0: " << token);
2862
s->s.sin_port = htons(port);
2865
s->s.sin_addr = any_addr;
2866
else if (1 == safe_inet_addr(host, &s->s.sin_addr))
2868
else if ((hp = gethostbyname(host))) {
2972
debugs(3, 3, "http(s)_port: found Listen on wildcard address: " << s->s);
2973
} else if ( s->s = host ) { /* check/parse numeric IPA */
2975
debugs(3, 3, "http(s)_port: Listen on Host/IP: " << host << " --> " << s->s);
2976
} else if ( s->s.GetHostByName(host) ) { /* check/parse for FQDN */
2869
2977
/* dont use ipcache */
2870
s->s.sin_addr = inaddrFromHostent(hp);
2871
2978
s->defaultsite = xstrdup(host);
2980
debugs(3, 3, "http(s)_port: found Listen as Host " << s->defaultsite << " on IP: " << s->s);
2982
debugs(3, 0, "http(s)_port: failed to resolve Host/IP: " << host);
2873
2983
self_destruct();
2898
3009
} else if (strcmp(token, "accel") == 0) {
3011
} else if (strcmp(token, "allow-direct") == 0) {
3012
s->allow_direct = 1;
3013
} else if (strcmp(token, "ignore-cc") == 0) {
3015
#if !HTTP_VIOLATIONS
3017
debugs(3, DBG_CRITICAL, "FATAL: ignore-cc is only valid in accelerator mode");
3021
} else if (strcmp(token, "no-connection-auth") == 0) {
3022
s->connection_auth_disabled = true;
3023
} else if (strcmp(token, "connection-auth=off") == 0) {
3024
s->connection_auth_disabled = true;
3025
} else if (strcmp(token, "connection-auth") == 0) {
3026
s->connection_auth_disabled = false;
3027
} else if (strcmp(token, "connection-auth=on") == 0) {
3028
s->connection_auth_disabled = false;
2900
3029
} else if (strncmp(token, "disable-pmtu-discovery=", 23) == 0) {
2901
3030
if (!strcasecmp(token + 23, "off"))
2902
3031
s->disable_pmtu_discovery = DISABLE_PMTU_OFF;
2908
3037
self_destruct();
2910
} else if (strcmp(token, "transparent") == 0) {
3039
} else if (strcmp(token, "transparent") == 0 || strcmp(token, "intercept") == 0) {
3041
IpInterceptor.StartInterception();
2912
3042
/* Log information regarding the port modes under interception. */
2913
debugs(3, 1, "Starting Authentication on port " << inet_ntoa(s->s.sin_addr) << ":" << s->s.sin_port);
2914
debugs(3, 1, "Disabling Authentication on port " << inet_ntoa(s->s.sin_addr) << ":" << s->s.sin_port << " (interception enabled)");
3043
debugs(3, DBG_IMPORTANT, "Starting Authentication on port " << s->s);
3044
debugs(3, DBG_IMPORTANT, "Disabling Authentication on port " << s->s << " (interception enabled)");
3047
/* INET6: until transparent REDIRECT works on IPv6 SOCKET, force wildcard to IPv4 */
3048
debugs(3, DBG_IMPORTANT, "Disabling IPv6 on port " << s->s << " (interception enabled)");
3049
if ( !s->s.SetIPv4() ) {
3050
debugs(3, DBG_CRITICAL, "http(s)_port: IPv6 addresses cannot be transparent (protocol does not provide NAT)" << s->s );
2917
3054
} else if (strcmp(token, "tproxy") == 0) {
2919
need_linux_tproxy = 1;
3055
if (s->intercepted || s->accel) {
3056
debugs(3,DBG_CRITICAL, "http(s)_port: TPROXY option requires its own interception port. It cannot be shared.");
3059
s->spoof_client_ip = 1;
3060
IpInterceptor.StartTransparency();
2920
3061
/* Log information regarding the port modes under transparency. */
2921
debugs(3, 1, "Starting IP Spoofing on port " << inet_ntoa(s->s.sin_addr) << ":" << s->s.sin_port);
2922
debugs(3, 1, "Disabling Authentication on port " << inet_ntoa(s->s.sin_addr) << ":" << s->s.sin_port << " (IP spoofing enabled)");
3062
debugs(3, DBG_IMPORTANT, "Starting IP Spoofing on port " << s->s);
3063
debugs(3, DBG_IMPORTANT, "Disabling Authentication on port " << s->s << " (IP spoofing enabled)");
3065
if (!IpInterceptor.ProbeForTproxy(s->s)) {
3066
debugs(3, DBG_CRITICAL, "FATAL: http(s)_port: TPROXY support in the system does not work.");
3070
} else if (strcmp(token, "ipv4") == 0) {
3072
if ( !s->s.SetIPv4() ) {
3073
debugs(3, 0, "http(s)_port: IPv6 addresses cannot be used a IPv4-Only." << s->s );
3077
} else if (strcmp(token, "tcpkeepalive") == 0) {
3078
s->tcp_keepalive.enabled = 1;
3079
} else if (strncmp(token, "tcpkeepalive=", 13) == 0) {
3080
char *t = token + 13;
3081
s->tcp_keepalive.enabled = 1;
3082
s->tcp_keepalive.idle = atoi(t);
3086
s->tcp_keepalive.interval = atoi(t);
3091
s->tcp_keepalive.timeout = atoi(t);
3095
} else if (strncmp(token, "cert=", 5) == 0) {
3097
s->cert = xstrdup(token + 5);
3098
} else if (strncmp(token, "key=", 4) == 0) {
3100
s->key = xstrdup(token + 4);
3101
} else if (strncmp(token, "version=", 8) == 0) {
3102
s->version = xatoi(token + 8);
3104
if (s->version < 1 || s->version > 4)
3106
} else if (strncmp(token, "options=", 8) == 0) {
3107
safe_free(s->options);
3108
s->options = xstrdup(token + 8);
3109
} else if (strncmp(token, "cipher=", 7) == 0) {
3110
safe_free(s->cipher);
3111
s->cipher = xstrdup(token + 7);
3112
} else if (strncmp(token, "clientca=", 9) == 0) {
3113
safe_free(s->clientca);
3114
s->clientca = xstrdup(token + 9);
3115
} else if (strncmp(token, "cafile=", 7) == 0) {
3116
safe_free(s->cafile);
3117
s->cafile = xstrdup(token + 7);
3118
} else if (strncmp(token, "capath=", 7) == 0) {
3119
safe_free(s->capath);
3120
s->capath = xstrdup(token + 7);
3121
} else if (strncmp(token, "crlfile=", 8) == 0) {
3122
safe_free(s->crlfile);
3123
s->crlfile = xstrdup(token + 8);
3124
} else if (strncmp(token, "dhparams=", 9) == 0) {
3125
safe_free(s->dhfile);
3126
s->dhfile = xstrdup(token + 9);
3127
} else if (strncmp(token, "sslflags=", 9) == 0) {
3128
safe_free(s->sslflags);
3129
s->sslflags = xstrdup(token + 9);
3130
} else if (strncmp(token, "sslcontext=", 11) == 0) {
3131
safe_free(s->sslcontext);
3132
s->sslcontext = xstrdup(token + 11);
3133
} else if (strcmp(token, "sslBump") == 0) {
3134
s->sslBump = 1; // accelerated when bumped, otherwise not
2926
3137
self_destruct();
2931
free_generic_http_port_data(http_port_list * s)
2934
safe_free(s->defaultsite);
2935
safe_free(s->protocol);
2939
cbdataFree_http_port(void *data)
2941
free_generic_http_port_data((http_port_list *)data);
3140
if ( s->spoof_client_ip && (s->intercepted || s->accel) ) {
3141
debugs(3,DBG_CRITICAL, "http(s)_port: TPROXY option requires its own interception port. It cannot be shared.");
2944
3146
static http_port_list *
2945
3147
create_http_port(char *portspec)
2947
CBDATA_TYPE(http_port_list);
2948
CBDATA_INIT_TYPE_FREECB(http_port_list, cbdataFree_http_port);
2950
http_port_list *s = cbdataAlloc(http_port_list);
2951
s->protocol = xstrdup("http");
3149
http_port_list *s = new http_port_list("http");
2952
3150
parse_http_port_specification(s, portspec);
3015
3219
storeAppendPrintf(e, " disable-pmtu-discovery=%s", pmtu);
3222
if (s->tcp_keepalive.enabled) {
3223
if (s->tcp_keepalive.idle || s->tcp_keepalive.interval || s->tcp_keepalive.timeout) {
3224
storeAppendPrintf(e, " tcpkeepalive=%d,%d,%d", s->tcp_keepalive.idle, s->tcp_keepalive.interval, s->tcp_keepalive.timeout);
3226
storeAppendPrintf(e, " tcpkeepalive");
3232
storeAppendPrintf(e, " cert=%s", s->cert);
3235
storeAppendPrintf(e, " key=%s", s->key);
3238
storeAppendPrintf(e, " version=%d", s->version);
3241
storeAppendPrintf(e, " options=%s", s->options);
3244
storeAppendPrintf(e, " cipher=%s", s->cipher);
3247
storeAppendPrintf(e, " cafile=%s", s->cafile);
3250
storeAppendPrintf(e, " capath=%s", s->capath);
3253
storeAppendPrintf(e, " crlfile=%s", s->crlfile);
3256
storeAppendPrintf(e, " dhparams=%s", s->dhfile);
3259
storeAppendPrintf(e, " sslflags=%s", s->sslflags);
3262
storeAppendPrintf(e, " sslcontext=%s", s->sslcontext);
3265
storeAppendPrintf(e, " sslBump");
3034
3284
while ((s = *head) != NULL) {
3035
3285
*head = s->next;
3042
cbdataFree_https_port(void *data)
3044
https_port_list *s = (https_port_list *)data;
3045
free_generic_http_port_data(&s->http);
3048
safe_free(s->options);
3049
safe_free(s->cipher);
3050
safe_free(s->cafile);
3051
safe_free(s->capath);
3052
safe_free(s->dhfile);
3053
safe_free(s->sslflags);
3292
// TODO: merge better with parse_http_port_list
3057
3294
parse_https_port_list(https_port_list ** head)
3059
CBDATA_TYPE(https_port_list);
3061
3297
https_port_list *s;
3062
CBDATA_INIT_TYPE_FREECB(https_port_list, cbdataFree_https_port);
3063
3299
token = strtok(NULL, w_space);
3066
3302
self_destruct();
3068
s = cbdataAlloc(https_port_list);
3070
s->http.protocol = xstrdup("https");
3304
s = new https_port_list;
3072
3305
parse_http_port_specification(&s->http, token);
3074
3307
/* parse options ... */
3075
3308
while ((token = strtok(NULL, w_space))) {
3076
if (strncmp(token, "cert=", 5) == 0) {
3078
s->cert = xstrdup(token + 5);
3079
} else if (strncmp(token, "key=", 4) == 0) {
3081
s->key = xstrdup(token + 4);
3082
} else if (strncmp(token, "version=", 8) == 0) {
3083
s->version = xatoi(token + 8);
3085
if (s->version < 1 || s->version > 4)
3087
} else if (strncmp(token, "options=", 8) == 0) {
3088
safe_free(s->options);
3089
s->options = xstrdup(token + 8);
3090
} else if (strncmp(token, "cipher=", 7) == 0) {
3091
safe_free(s->cipher);
3092
s->cipher = xstrdup(token + 7);
3093
} else if (strncmp(token, "clientca=", 9) == 0) {
3094
safe_free(s->clientca);
3095
s->clientca = xstrdup(token + 9);
3096
} else if (strncmp(token, "cafile=", 7) == 0) {
3097
safe_free(s->cafile);
3098
s->cafile = xstrdup(token + 7);
3099
} else if (strncmp(token, "capath=", 7) == 0) {
3100
safe_free(s->capath);
3101
s->capath = xstrdup(token + 7);
3102
} else if (strncmp(token, "crlfile=", 8) == 0) {
3103
safe_free(s->crlfile);
3104
s->crlfile = xstrdup(token + 8);
3105
} else if (strncmp(token, "dhparams=", 9) == 0) {
3106
safe_free(s->dhfile);
3107
s->dhfile = xstrdup(token + 9);
3108
} else if (strncmp(token, "sslflags=", 9) == 0) {
3109
safe_free(s->sslflags);
3110
s->sslflags = xstrdup(token + 9);
3111
} else if (strncmp(token, "sslcontext=", 11) == 0) {
3112
safe_free(s->sslcontext);
3113
s->sslcontext = xstrdup(token + 11);
3115
parse_http_port_option(&s->http, token);
3309
parse_http_port_option(s, token);
3119
3312
while (*head) {
3128
3321
dump_https_port_list(StoreEntry * e, const char *n, const https_port_list * s)
3131
dump_generic_http_port(e, n, &s->http);
3134
storeAppendPrintf(e, " cert=%s", s->cert);
3137
storeAppendPrintf(e, " key=%s", s->key);
3140
storeAppendPrintf(e, " version=%d", s->version);
3143
storeAppendPrintf(e, " options=%s", s->options);
3146
storeAppendPrintf(e, " cipher=%s", s->cipher);
3149
storeAppendPrintf(e, " cafile=%s", s->cafile);
3152
storeAppendPrintf(e, " capath=%s", s->capath);
3155
storeAppendPrintf(e, " crlfile=%s", s->crlfile);
3158
storeAppendPrintf(e, " dhparams=%s", s->dhfile);
3161
storeAppendPrintf(e, " sslflags=%s", s->sslflags);
3164
storeAppendPrintf(e, " sslcontext=%s", s->sslcontext);
3166
storeAppendPrintf(e, "\n");
3168
s = (https_port_list *) s->http.next;
3323
dump_http_port_list(e, n, s);
3173
3327
free_https_port_list(https_port_list ** head)
3177
while ((s = *head) != NULL) {
3178
*head = (https_port_list *) s->http.next;
3329
free_http_port_list((http_port_list**)head);
3570
parse_adaptation_service_set_type()
3572
Adaptation::Config::ParseServiceSet();
3576
parse_adaptation_service_chain_type()
3578
Adaptation::Config::ParseServiceChain();
3582
parse_adaptation_access_type()
3584
Adaptation::Config::ParseAccess(LegacyParser);
3587
#endif /* USE_ADAPTATION */
3412
3590
#if ICAP_CLIENT
3415
parse_icap_service_type(ICAPConfig * cfg)
3417
cfg->parseICAPService();
3421
free_icap_service_type(ICAPConfig * cfg)
3423
cfg->freeICAPService();
3427
dump_icap_service_type(StoreEntry * entry, const char *name, const ICAPConfig &cfg)
3429
cfg.dumpICAPService(entry, name);
3433
parse_icap_class_type(ICAPConfig * cfg)
3435
cfg->parseICAPClass();
3439
free_icap_class_type(ICAPConfig * cfg)
3441
cfg->freeICAPClass();
3445
dump_icap_class_type(StoreEntry * entry, const char *name, const ICAPConfig &cfg)
3447
cfg.dumpICAPClass(entry, name);
3451
parse_icap_access_type(ICAPConfig * cfg)
3453
cfg->parseICAPAccess(LegacyParser);
3457
free_icap_access_type(ICAPConfig * cfg)
3459
cfg->freeICAPAccess();
3463
dump_icap_access_type(StoreEntry * entry, const char *name, const ICAPConfig &cfg)
3465
cfg.dumpICAPAccess(entry, name);
3593
parse_icap_service_type(Adaptation::Icap::Config * cfg)
3595
cfg->parseService();
3599
free_icap_service_type(Adaptation::Icap::Config * cfg)
3605
dump_icap_service_type(StoreEntry * entry, const char *name, const Adaptation::Icap::Config &cfg)
3607
cfg.dumpService(entry, name);
3611
parse_icap_class_type()
3613
debugs(93, 0, "WARNING: 'icap_class' is depricated. " <<
3614
"Use 'adaptation_service_set' instead");
3615
Adaptation::Config::ParseServiceSet();
3619
parse_icap_access_type()
3621
debugs(93, 0, "WARNING: 'icap_access' is depricated. " <<
3622
"Use 'adaptation_access' instead");
3623
Adaptation::Config::ParseAccess(LegacyParser);
3632
parse_ecap_service_type(Adaptation::Ecap::Config * cfg)
3634
cfg->parseService();
3638
free_ecap_service_type(Adaptation::Ecap::Config * cfg)
3644
dump_ecap_service_type(StoreEntry * entry, const char *name, const Adaptation::Ecap::Config &cfg)
3646
cfg.dumpService(entry, name);
3649
#endif /* USE_ECAP */