3
A brief file description
5
@section license License
7
Licensed to the Apache Software Foundation (ASF) under one
8
or more contributor license agreements. See the NOTICE file
9
distributed with this work for additional information
10
regarding copyright ownership. The ASF licenses this file
11
to you under the Apache License, Version 2.0 (the
12
"License"); you may not use this file except in compliance
13
with the License. You may obtain a copy of the License at
15
http://www.apache.org/licenses/LICENSE-2.0
17
Unless required by applicable law or agreed to in writing, software
18
distributed under the License is distributed on an "AS IS" BASIS,
19
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
See the License for the specific language governing permissions and
21
limitations under the License.
24
/***********************************************************************
27
* Implementation of CfgContext class and all the CfgEleObj subclasses
28
***********************************************************************/
31
#include "ink_platform.h"
33
#include "CfgContextImpl.h"
34
#include "CfgContextUtils.h"
35
#include "INKMgmtAPI.h"
37
//--------------------------------------------------------------------------
39
//--------------------------------------------------------------------------
41
#define TIGHT_RULE_CHECK true
43
//--------------------------------------------------------------------------
45
//--------------------------------------------------------------------------
46
CommentObj::CommentObj(char *comment)
48
m_ele = comment_ele_create(comment);
49
m_valid = (comment ? true : false);
52
CommentObj::~CommentObj()
54
comment_ele_destroy(m_ele);
58
CommentObj::formatEleToRule()
60
return xstrdup(m_ele->comment);
63
bool CommentObj::isValid()
69
CommentObj::getCfgEleCopy()
71
return (INKCfgEle *) copy_comment_ele(m_ele);
74
//--------------------------------------------------------------------------
76
//--------------------------------------------------------------------------
77
AdminAccessObj::AdminAccessObj(INKAdminAccessEle * ele)
84
AdminAccessObj::AdminAccessObj(TokenList * tokens)
89
m_ele = INKAdminAccessEleCreate();
90
m_ele->cfg_ele.error = INK_ERR_OKAY;
93
if (!tokens || tokens->length < 3) {
97
m_ele->cfg_ele.type = get_rule_type(tokens, INK_FNAME_ADMIN_ACCESS);
98
if (m_ele->cfg_ele.type == INK_TYPE_UNDEFINED) {
102
tok = tokens->first();
103
#ifdef TIGHT_RULE_CHECK
107
m_ele->user = xstrdup(tok->name);
110
tok = tokens->next(tok);
111
#ifdef TIGHT_RULE_CHECK
115
m_ele->password = xstrdup(tok->name);
117
// The third (last) token
118
tok = tokens->next(tok);
119
#ifdef TIGHT_RULE_CHECK
123
accessType = ink_atoi(tok->name);
124
switch (accessType) {
126
m_ele->access = INK_ACCESS_NONE;
129
m_ele->access = INK_ACCESS_MONITOR;
132
m_ele->access = INK_ACCESS_MONITOR_VIEW;
135
m_ele->access = INK_ACCESS_MONITOR_CHANGE;
138
m_ele->access = INK_ACCESS_UNDEFINED;
141
m_ele->cfg_ele.error = INK_ERR_OKAY;
145
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
149
AdminAccessObj::~AdminAccessObj()
151
INKAdminAccessEleDestroy(m_ele);
155
AdminAccessObj::formatEleToRule()
158
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
164
char buf[MAX_RULE_SIZE];
165
memset(buf, 0, MAX_RULE_SIZE);
167
switch (m_ele->access) {
168
case INK_ACCESS_NONE:
171
case INK_ACCESS_MONITOR:
174
case INK_ACCESS_MONITOR_VIEW:
177
case INK_ACCESS_MONITOR_CHANGE:
181
accessType = 0; // lv: just zero it
183
// INK_ACCESS_UNDEFINED
187
snprintf(buf, sizeof(buf), "%s:%s:%d:", m_ele->user, m_ele->password, accessType);
192
bool AdminAccessObj::isValid()
194
if (m_ele->cfg_ele.error != INK_ERR_OKAY) {
201
// Must have a password
202
if (!m_ele->password) {
205
// validate access type
206
switch (m_ele->access) {
207
case INK_ACCESS_NONE:
208
case INK_ACCESS_MONITOR:
209
case INK_ACCESS_MONITOR_VIEW:
210
case INK_ACCESS_MONITOR_CHANGE:
217
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
224
AdminAccessObj::getCfgEleCopy()
226
return (INKCfgEle *) copy_admin_access_ele(m_ele);
229
//--------------------------------------------------------------------------
231
//--------------------------------------------------------------------------
232
CacheObj::CacheObj(INKCacheEle * ele)
239
// assumes the specifiers are specified in specific order!!
240
CacheObj::CacheObj(TokenList * tokens)
243
m_ele = INKCacheEleCreate(INK_TYPE_UNDEFINED);
244
m_ele->cfg_ele.error = INK_ERR_OKAY;
251
m_ele->cfg_ele.type = get_rule_type(tokens, INK_FNAME_CACHE_OBJ);
253
// if any invalid values, set m_valid=false
254
// convert token name and value into ele field
255
tok = tokens->first();
256
tok = tokens_to_pdss_format(tokens, tok, &(m_ele->cache_info));
258
if (!tok) { // INVALID FORMAT
262
tok = tokens->next(tok);
263
if (m_ele->cfg_ele.type == INK_CACHE_REVALIDATE ||
264
m_ele->cfg_ele.type == INK_CACHE_PIN_IN_CACHE || m_ele->cfg_ele.type == INK_CACHE_TTL_IN_CACHE) {
265
// must have a time specified
266
if (strcmp(tok->name, "pin-in-cache") != 0 && strcmp(tok->name, "revalidate") != 0 &&
267
strcmp(tok->name, "ttl-in-cache") != 0) {
268
goto FORMAT_ERR; // wrong token!!
270
if (string_to_hms_time(tok->value, &(m_ele->time_period)) != INK_ERR_OKAY) {
278
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
282
CacheObj::~CacheObj()
284
INKCacheEleDestroy(m_ele);
288
CacheObj::formatEleToRule()
291
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
295
char *pd_str, *time_str;
296
char buf[MAX_RULE_SIZE];
297
memset(buf, 0, MAX_RULE_SIZE);
299
pd_str = pdest_sspec_to_string(m_ele->cache_info.pd_type, m_ele->cache_info.pd_val, &(m_ele->cache_info.sec_spec));
301
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
304
strncat(buf, pd_str, sizeof(buf) - strlen(buf) - 1);
307
switch (m_ele->cfg_ele.type) {
308
case INK_CACHE_NEVER:
309
strncat(buf, "action=never-cache ", sizeof(buf) - strlen(buf) - 1);
311
case INK_CACHE_IGNORE_NO_CACHE:
312
strncat(buf, "action=ignore-no-cache ", sizeof(buf) - strlen(buf) - 1);
314
case INK_CACHE_IGNORE_CLIENT_NO_CACHE:
315
strncat(buf, "action=ignore-client-no-cache ", sizeof(buf) - strlen(buf) - 1);
317
case INK_CACHE_IGNORE_SERVER_NO_CACHE:
318
strncat(buf, "action=ignore-server-no-cache ", sizeof(buf) - strlen(buf) - 1);
320
case INK_CACHE_AUTH_CONTENT:
321
strncat(buf, "action=cache-auth-content ", sizeof(buf) - strlen(buf) - 1);
323
case INK_CACHE_PIN_IN_CACHE:
324
strncat(buf, "pin-in-cache=", sizeof(buf) - strlen(buf) - 1);
325
time_str = hms_time_to_string(m_ele->time_period);
327
strncat(buf, time_str, sizeof(buf) - strlen(buf) - 1);
330
strncat(buf, " ", sizeof(buf) - strlen(buf) - 1);
332
case INK_CACHE_REVALIDATE:
333
strncat(buf, "revalidate=", sizeof(buf) - strlen(buf) - 1);
334
time_str = hms_time_to_string(m_ele->time_period);
336
strncat(buf, time_str, sizeof(buf) - strlen(buf) - 1);
339
strncat(buf, " ", sizeof(buf) - strlen(buf) - 1);
341
case INK_CACHE_TTL_IN_CACHE:
342
strncat(buf, "ttl-in-cache=", sizeof(buf) - strlen(buf) - 1);
343
time_str = hms_time_to_string(m_ele->time_period);
345
strncat(buf, time_str, sizeof(buf) - strlen(buf) - 1);
348
strncat(buf, " ", sizeof(buf) - strlen(buf) - 1);
359
bool CacheObj::isValid()
364
if (m_ele->cfg_ele.error != INK_ERR_OKAY) {
367
// all Cache Ele's should have a prim dest, sec specs are optional
368
if (!ccu_checkPdSspec(m_ele->cache_info)) {
371
// only pin-in-cache, ttl, and revalidate rules have time period
372
switch (m_ele->cfg_ele.type) {
373
case INK_CACHE_NEVER:
374
case INK_CACHE_IGNORE_NO_CACHE:
375
case INK_CACHE_IGNORE_CLIENT_NO_CACHE:
376
case INK_CACHE_IGNORE_SERVER_NO_CACHE:
377
case INK_CACHE_AUTH_CONTENT:
379
case INK_CACHE_PIN_IN_CACHE:
380
case INK_CACHE_REVALIDATE:
381
case INK_CACHE_TTL_IN_CACHE:
382
timeStr = hms_time_to_string(m_ele->time_period);
395
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
401
CacheObj::getCfgEleCopy()
403
return (INKCfgEle *) copy_cache_ele(m_ele);
407
//--------------------------------------------------------------------------
409
//--------------------------------------------------------------------------
410
CongestionObj::CongestionObj(INKCongestionEle * ele)
417
CongestionObj::CongestionObj(TokenList * tokens)
420
m_ele = INKCongestionEleCreate();
421
m_ele->cfg_ele.error = INK_ERR_OKAY;
428
m_ele->cfg_ele.type = get_rule_type(tokens, INK_FNAME_CONGESTION);
430
// if any invalid values, set m_valid=false
431
// convert token name and value into ele field
432
tok = tokens->first();
433
//tok = tokens_to_pdss_format(tokens, tok, &(m_ele->congestion_info));
435
if (!tok) { // INVALID FORMAT
439
if (strcmp(tok->name, "dest_domain") == 0) {
440
m_ele->pd_type = INK_PD_DOMAIN;
441
} else if (strcmp(tok->name, "dest_host") == 0) {
442
m_ele->pd_type = INK_PD_HOST;
443
} else if (strcmp(tok->name, "dest_ip") == 0) {
444
m_ele->pd_type = INK_PD_IP;
445
} else if (strcmp(tok->name, "host_regex") == 0) {
446
m_ele->pd_type = INK_PD_URL_REGEX;
448
m_ele->pd_val = xstrdup(tok->value);
450
// check for remaining tags
451
tok = tokens->next(tok);
453
if (!tok->name || !tok->value) {
456
if (strcmp(tok->name, "prefix") == 0) {
457
m_ele->prefix = xstrdup(tok->value);
458
} else if (strcmp(tok->name, "port") == 0) {
459
m_ele->port = ink_atoi(tok->value);
460
} else if (strcmp(tok->name, "congestion_scheme") == 0) {
461
if (strcmp(tok->value, "per_ip") == 0) {
462
m_ele->scheme = INK_HTTP_CONGEST_PER_IP;
463
} else if (strcmp(tok->value, "per_host") == 0) {
464
m_ele->scheme = INK_HTTP_CONGEST_PER_HOST;
468
} else if (strcmp(tok->name, "max_connection_failures") == 0) {
469
m_ele->max_connection_failures = ink_atoi(tok->value);
470
} else if (strcmp(tok->name, "fail_window") == 0) {
471
m_ele->fail_window = ink_atoi(tok->value);
472
} else if (strcmp(tok->name, "proxy_retry_interval") == 0) {
473
m_ele->proxy_retry_interval = ink_atoi(tok->value);
474
} else if (strcmp(tok->name, "client_wait_interval") == 0) {
475
m_ele->client_wait_interval = ink_atoi(tok->value);
476
} else if (strcmp(tok->name, "wait_interval_alpha") == 0) {
477
m_ele->wait_interval_alpha = ink_atoi(tok->value);
478
} else if (strcmp(tok->name, "live_os_conn_timeout") == 0) {
479
m_ele->live_os_conn_timeout = ink_atoi(tok->value);
480
} else if (strcmp(tok->name, "live_os_conn_retries") == 0) {
481
m_ele->live_os_conn_retries = ink_atoi(tok->value);
482
} else if (strcmp(tok->name, "dead_os_conn_timeout") == 0) {
483
m_ele->dead_os_conn_timeout = ink_atoi(tok->value);
484
} else if (strcmp(tok->name, "dead_os_conn_retries") == 0) {
485
m_ele->dead_os_conn_retries = ink_atoi(tok->value);
486
} else if (strcmp(tok->name, "max_connection") == 0) {
487
m_ele->max_connection = ink_atoi(tok->value);
488
} else if (strcmp(tok->name, "error_page_uri") == 0) {
489
m_ele->error_page_uri = xstrdup(tok->value);
493
tok = tokens->next(tok);
498
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
502
CongestionObj::~CongestionObj()
504
INKCongestionEleDestroy(m_ele);
508
// will always print defaults in the rule
511
CongestionObj::formatEleToRule()
514
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
518
char buf[MAX_BUF_SIZE];
521
memset(buf, 0, MAX_BUF_SIZE);
523
// push in primary destination
524
if (pos < sizeof(buf)) {
525
switch (m_ele->pd_type) {
527
psize = snprintf(buf + pos, sizeof(buf) - pos, "dest_domain=%s ", m_ele->pd_val);
530
psize = snprintf(buf + pos, sizeof(buf) - pos, "dest_host=%s ", m_ele->pd_val);
533
psize = snprintf(buf + pos, sizeof(buf) - pos, "dest_ip=%s ", m_ele->pd_val);
535
case INK_PD_URL_REGEX:
536
psize = snprintf(buf + pos, sizeof(buf) - pos, "host_regex=%s ", m_ele->pd_val);
547
// secondary specifiers
549
if (pos < sizeof(buf) && (psize = snprintf(buf + pos, sizeof(buf) - pos, "prefix=%s ", m_ele->prefix)) > 0)
552
if (m_ele->port > 0) {
553
if (pos < sizeof(buf) && (psize = snprintf(buf + pos, sizeof(buf) - pos, "port=%d ", m_ele->port)) > 0)
558
if (pos < sizeof(buf) &&
560
snprintf(buf + pos, sizeof(buf) - pos, "max_connection_failures=%d ", m_ele->max_connection_failures)) > 0)
562
if (pos < sizeof(buf) &&
563
(psize = snprintf(buf + pos, sizeof(buf) - pos, "fail_window=%d ", m_ele->fail_window)) > 0)
565
if (pos < sizeof(buf) &&
566
(psize = snprintf(buf + pos, sizeof(buf) - pos, "proxy_retry_interval=%d ", m_ele->proxy_retry_interval)) > 0)
568
if (pos < sizeof(buf) &&
569
(psize = snprintf(buf + pos, sizeof(buf) - pos, "client_wait_interval=%d ", m_ele->client_wait_interval)) > 0)
571
if (pos < sizeof(buf) &&
572
(psize = snprintf(buf + pos, sizeof(buf) - pos, "wait_interval_alpha=%d ", m_ele->wait_interval_alpha)) > 0)
574
if (pos < sizeof(buf) &&
575
(psize = snprintf(buf + pos, sizeof(buf) - pos, "live_os_conn_timeout=%d ", m_ele->live_os_conn_timeout)) > 0)
577
if (pos < sizeof(buf) &&
578
(psize = snprintf(buf + pos, sizeof(buf) - pos, "live_os_conn_retries=%d ", m_ele->live_os_conn_retries)) > 0)
580
if (pos < sizeof(buf) &&
581
(psize = snprintf(buf + pos, sizeof(buf) - pos, "dead_os_conn_timeout=%d ", m_ele->dead_os_conn_timeout)) > 0)
583
if (pos < sizeof(buf) &&
584
(psize = snprintf(buf + pos, sizeof(buf) - pos, "dead_os_conn_retries=%d ", m_ele->dead_os_conn_retries)) > 0)
586
if (pos < sizeof(buf) &&
587
(psize = snprintf(buf + pos, sizeof(buf) - pos, "max_connection=%d ", m_ele->max_connection)) > 0)
589
if (m_ele->error_page_uri) {
590
if (pos < sizeof(buf) &&
591
(psize = snprintf(buf + pos, sizeof(buf) - pos, "error_page=%s ", m_ele->error_page_uri)) > 0)
594
switch (m_ele->scheme) {
595
case INK_HTTP_CONGEST_PER_IP:
596
if (pos<sizeof(buf) && (psize = snprintf(buf + pos, sizeof(buf) - pos, "congestion_scheme=per_ip "))> 0)
599
case INK_HTTP_CONGEST_PER_HOST:
600
if (pos<sizeof(buf) && (psize = snprintf(buf + pos, sizeof(buf) - pos, "congestion_scheme=per_host "))> 0)
610
bool CongestionObj::isValid()
612
if (m_ele->cfg_ele.error != INK_ERR_OKAY) {
615
// all Congestion Ele's should have a prim dest, sec specs are optional
620
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
625
CongestionObj::getCfgEleCopy()
627
return (INKCfgEle *) copy_congestion_ele(m_ele);
631
//--------------------------------------------------------------------------
633
//--------------------------------------------------------------------------
634
HostingObj::HostingObj(INKHostingEle * ele)
641
HostingObj::HostingObj(TokenList * tokens)
645
m_ele = INKHostingEleCreate();
646
m_ele->cfg_ele.error = INK_ERR_OKAY;
649
if (!tokens || tokens->length != 2) {
653
m_ele->cfg_ele.type = get_rule_type(tokens, INK_FNAME_HOSTING);
654
if (m_ele->cfg_ele.type == INK_TYPE_UNDEFINED) {
658
token = tokens->first();
662
if (strcmp(token->name, "hostname") == 0) {
663
m_ele->pd_type = INK_PD_HOST;
664
} else if (strcmp(token->name, "domain") == 0) {
665
m_ele->pd_type = INK_PD_DOMAIN;
669
m_ele->pd_val = xstrdup(token->value);
672
token = tokens->next(token);
676
if (strcmp(token->name, "partition") != 0) {
679
m_ele->partitions = string_to_int_list(token->value, LIST_DELIMITER);
683
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
688
HostingObj::~HostingObj()
690
INKHostingEleDestroy(m_ele);
694
HostingObj::formatEleToRule()
697
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
702
char buf[MAX_RULE_SIZE];
703
memset(buf, 0, MAX_RULE_SIZE);
705
switch (m_ele->pd_type) {
707
strncat(buf, "hostname=", sizeof(buf) - strlen(buf) - 1);
710
strncat(buf, "domain=", sizeof(buf) - strlen(buf) - 1);
718
list_str = int_list_to_string(m_ele->partitions, ",");
719
strncat(buf, m_ele->pd_val, sizeof(buf) - strlen(buf) - 1);
720
strncat(buf, " partition=", sizeof(buf) - strlen(buf) - 1);
721
strncat(buf, list_str, sizeof(buf) - strlen(buf) - 1);
727
bool HostingObj::isValid()
735
if (m_ele->pd_type == INK_PD_UNDEFINED) {
740
if (!m_ele->pd_val) {
745
if (!m_ele->partitions || !INKIntListIsValid(m_ele->partitions, 0, 50000)) {
749
// check that each partition is between 1-255
750
len = INKIntListLen(m_ele->partitions);
751
for (i = 0; i < len; i++) {
752
part = INKIntListDequeue(m_ele->partitions);
753
if (*part<1 || *part> 255) {
754
INKIntListEnqueue(m_ele->partitions, part);
758
INKIntListEnqueue(m_ele->partitions, part);
763
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
769
HostingObj::getCfgEleCopy()
771
return (INKCfgEle *) copy_hosting_ele(m_ele);
774
//--------------------------------------------------------------------------
776
//--------------------------------------------------------------------------
777
IcpObj::IcpObj(INKIcpEle * ele)
784
IcpObj::IcpObj(TokenList * tokens)
789
m_ele = INKIcpEleCreate();
790
m_ele->cfg_ele.error = INK_ERR_OKAY;
793
if (!tokens || tokens->length < 8) {
797
m_ele->cfg_ele.type = get_rule_type(tokens, INK_FNAME_ICP_PEER);
798
if (m_ele->cfg_ele.type == INK_TYPE_UNDEFINED) {
802
token = tokens->first();
804
for (i = 0; i < 8; i++) {
805
if (!token->name || token->value) {
808
char *alias = token->name;
810
unsigned short cache_type;
816
if (strlen(alias) > 0)
817
m_ele->peer_hostname = xstrdup(alias);
820
if (strlen(alias) > 0) {
821
m_ele->peer_host_ip_addr = string_to_ip_addr(alias);
822
if (!m_ele->peer_host_ip_addr)
827
cache_type = ink_atoi(alias); // what if failed?
828
switch (cache_type) {
830
m_ele->peer_type = INK_ICP_PARENT;
833
m_ele->peer_type = INK_ICP_SIBLING;
836
m_ele->peer_type = INK_ICP_UNDEFINED;
840
m_ele->peer_proxy_port = ink_atoi(alias);
843
m_ele->peer_icp_port = ink_atoi(alias);
846
is_multicast = ink_atoi(alias);
847
switch (is_multicast) {
849
m_ele->is_multicast = false;
852
m_ele->is_multicast = true;
855
// ERROR:MC_on can only be either 0 or 1
860
m_ele->mc_ip_addr = string_to_ip_addr(alias);
861
if (!m_ele->mc_ip_addr)
865
mc_ttl = ink_atoi(alias);
868
m_ele->mc_ttl = INK_MC_TTL_SINGLE_SUBNET;
871
m_ele->mc_ttl = INK_MC_TTL_MULT_SUBNET;
874
m_ele->mc_ttl = INK_MC_TTL_UNDEFINED;
880
token = tokens->next(token);
886
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
892
INKIcpEleDestroy(m_ele);
896
IcpObj::formatEleToRule()
898
char *ip_str1, *ip_str2;
899
char buf[MAX_RULE_SIZE];
903
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
907
memset(buf, 0, MAX_RULE_SIZE);
909
switch (m_ele->peer_type) {
913
case INK_ICP_SIBLING:
923
if (m_ele->peer_host_ip_addr)
924
ip_str1 = ip_addr_to_string(m_ele->peer_host_ip_addr);
926
ip_str1 = xstrdup("");
929
if (m_ele->mc_ip_addr)
930
ip_str2 = ip_addr_to_string(m_ele->mc_ip_addr);
932
ip_str2 = xstrdup("0.0.0.0");
934
if (m_ele->peer_hostname) {
935
snprintf(buf, sizeof(buf), "%s:%s:%d:%d:%d:%d:%s:",
936
m_ele->peer_hostname,
937
ip_str1, peer_type, m_ele->peer_proxy_port, m_ele->peer_icp_port, (m_ele->is_multicast ? 1 : 0), ip_str2);
939
snprintf(buf, sizeof(buf), ":%s:%d:%d:%d:%d:%s:",
940
ip_str1, peer_type, m_ele->peer_proxy_port, m_ele->peer_icp_port, (m_ele->is_multicast ? 1 : 0), ip_str2);
943
switch (m_ele->mc_ttl) {
944
case INK_MC_TTL_SINGLE_SUBNET:
945
strncat(buf, "1:", sizeof(buf) - strlen(buf) - 1);
947
case INK_MC_TTL_MULT_SUBNET:
948
strncat(buf, "2:", sizeof(buf) - strlen(buf) - 1);
950
case INK_MC_TTL_UNDEFINED:
951
strncat(buf, "0:", sizeof(buf) - strlen(buf) - 1);
962
bool IcpObj::isValid()
964
if (m_ele->cfg_ele.error != INK_ERR_OKAY) {
967
// either hostname or IP must be specified
968
if (!m_ele->peer_hostname && !m_ele->peer_host_ip_addr) {
971
// check valid host IP
972
if (m_ele->peer_host_ip_addr && !ccu_checkIpAddr(m_ele->peer_host_ip_addr)) {
975
// check valid cache type
976
if (m_ele->peer_type == INK_ICP_UNDEFINED) {
980
if (!ccu_checkPortNum(m_ele->peer_proxy_port)) {
984
if (!ccu_checkPortNum(m_ele->peer_icp_port)) {
987
// check valid multicast values: mc_ttl, mc_ip, if enabled
988
if (m_ele->is_multicast) {
989
// a valid multicast address must be between 224.0.0.0-239.255.255.255
990
if (!ccu_checkIpAddr(m_ele->mc_ip_addr, "224.0.0.0", "239.255.255.255") || m_ele->mc_ttl == INK_MC_TTL_UNDEFINED)
992
} else { // multicast disabled; only valid mc ip is "0.0.0.0"
993
if (m_ele->mc_ip_addr && strcmp(m_ele->mc_ip_addr, "0.0.0.0") != 0)
998
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
1005
IcpObj::getCfgEleCopy()
1007
return (INKCfgEle *) copy_icp_ele(m_ele);
1010
//--------------------------------------------------------------------------
1012
//--------------------------------------------------------------------------
1013
IpAllowObj::IpAllowObj(INKIpAllowEle * ele)
1017
m_valid = isValid();
1020
IpAllowObj::IpAllowObj(TokenList * tokens)
1024
m_ele = INKIpAllowEleCreate();
1025
m_ele->cfg_ele.error = INK_ERR_OKAY;
1028
if (!tokens || (tokens->length != 2)) {
1032
m_ele->cfg_ele.type = get_rule_type(tokens, INK_FNAME_IP_ALLOW);
1033
if (m_ele->cfg_ele.type == INK_TYPE_UNDEFINED) {
1037
token = tokens->first();
1038
if (!token->name || strcmp(token->name, "src_ip")) {
1041
if (!token->value) {
1044
m_ele->src_ip_addr = string_to_ip_addr_ele(token->value);
1047
token = tokens->next(token);
1048
if (!token->name || strcmp(token->name, "action")) {
1051
if (!token->value) {
1054
if (!strcmp(token->value, "ip_allow")) {
1055
m_ele->action = INK_IP_ALLOW_ALLOW;
1056
} else if (strcmp(token->value, "ip_deny") == 0) {
1057
m_ele->action = INK_IP_ALLOW_DENY;
1059
m_ele->action = INK_IP_ALLOW_UNDEFINED;
1065
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
1069
IpAllowObj::~IpAllowObj()
1071
INKIpAllowEleDestroy(m_ele);
1075
IpAllowObj::formatEleToRule()
1078
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
1083
char buf[MAX_RULE_SIZE];
1084
memset(buf, 0, MAX_RULE_SIZE);
1086
ink_strncpy(buf, "src_ip=", sizeof(buf));
1087
if (m_ele->src_ip_addr) {
1088
char *ip_str = ip_addr_ele_to_string(m_ele->src_ip_addr);
1090
strncat(buf, ip_str, sizeof(buf) - strlen(buf) - 1);
1095
strncat(buf, " action=", sizeof(buf) - strlen(buf) - 1);
1096
switch (m_ele->action) {
1097
case INK_IP_ALLOW_ALLOW:
1098
strncat(buf, "ip_allow", sizeof(buf) - strlen(buf) - 1);
1100
case INK_IP_ALLOW_DENY:
1101
strncat(buf, "ip_deny", sizeof(buf) - strlen(buf) - 1);
1105
// INK_IP_ALLOW_UNDEFINED
1109
rule = xstrdup(buf);
1113
bool IpAllowObj::isValid()
1115
if (m_ele->cfg_ele.error != INK_ERR_OKAY) {
1119
if (!m_ele->src_ip_addr) {
1123
switch (m_ele->action) {
1124
case INK_IP_ALLOW_ALLOW:
1125
case INK_IP_ALLOW_DENY:
1132
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
1138
IpAllowObj::getCfgEleCopy()
1140
return (INKCfgEle *) copy_ip_allow_ele(m_ele);
1143
//--------------------------------------------------------------------------
1145
//--------------------------------------------------------------------------
1146
MgmtAllowObj::MgmtAllowObj(INKMgmtAllowEle * ele)
1150
m_valid = isValid();
1153
MgmtAllowObj::MgmtAllowObj(TokenList * tokens)
1157
m_ele = INKMgmtAllowEleCreate();
1158
m_ele->cfg_ele.error = INK_ERR_OKAY;
1161
if (!tokens || (tokens->length != 2)) {
1165
m_ele->cfg_ele.type = get_rule_type(tokens, INK_FNAME_IP_ALLOW);
1166
if (m_ele->cfg_ele.type == INK_TYPE_UNDEFINED) {
1170
token = tokens->first();
1171
if (!token->name || strcmp(token->name, "src_ip")) {
1174
if (!token->value) {
1177
m_ele->src_ip_addr = string_to_ip_addr_ele(token->value);
1180
token = tokens->next(token);
1181
if (!token->name || strcmp(token->name, "action")) {
1184
if (!token->value) {
1187
if (!strcmp(token->value, "ip_allow")) {
1188
m_ele->action = INK_MGMT_ALLOW_ALLOW;
1189
} else if (strcmp(token->value, "ip_deny") == 0) {
1190
m_ele->action = INK_MGMT_ALLOW_DENY;
1192
m_ele->action = INK_MGMT_ALLOW_UNDEFINED;
1198
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
1202
MgmtAllowObj::~MgmtAllowObj()
1204
INKMgmtAllowEleDestroy(m_ele);
1208
MgmtAllowObj::formatEleToRule()
1211
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
1216
char buf[MAX_RULE_SIZE];
1217
memset(buf, 0, MAX_RULE_SIZE);
1219
ink_strncpy(buf, "src_ip=", sizeof(buf));
1220
if (m_ele->src_ip_addr) {
1221
char *ip_str = ip_addr_ele_to_string(m_ele->src_ip_addr);
1223
strncat(buf, ip_str, sizeof(buf) - strlen(buf) - 1);
1230
strncat(buf, " action=", sizeof(buf) - strlen(buf) - 1);
1231
switch (m_ele->action) {
1232
case INK_MGMT_ALLOW_ALLOW:
1233
strncat(buf, "ip_allow", sizeof(buf) - strlen(buf) - 1);
1235
case INK_MGMT_ALLOW_DENY:
1236
strncat(buf, "ip_deny", sizeof(buf) - strlen(buf) - 1);
1240
// INK_MGMT_ALLOW_UNDEFINED
1244
rule = xstrdup(buf);
1249
bool MgmtAllowObj::isValid()
1251
if (m_ele->cfg_ele.error != INK_ERR_OKAY) {
1254
// must specify source IP addr
1255
if (!m_ele->src_ip_addr) {
1259
switch (m_ele->action) {
1260
case INK_MGMT_ALLOW_ALLOW:
1261
case INK_MGMT_ALLOW_DENY:
1268
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
1274
MgmtAllowObj::getCfgEleCopy()
1276
return (INKCfgEle *) copy_mgmt_allow_ele(m_ele);
1280
//--------------------------------------------------------------------------
1282
//--------------------------------------------------------------------------
1283
ParentProxyObj::ParentProxyObj(INKParentProxyEle * ele)
1287
m_valid = isValid();
1290
ParentProxyObj::ParentProxyObj(TokenList * tokens)
1293
m_ele = INKParentProxyEleCreate(INK_TYPE_UNDEFINED);
1294
m_ele->cfg_ele.error = INK_ERR_OKAY;
1297
if (!tokens || tokens->length < 1) {
1301
m_ele->cfg_ele.type = get_rule_type(tokens, INK_FNAME_PARENT_PROXY);
1302
if (m_ele->cfg_ele.type == INK_TYPE_UNDEFINED) {
1306
tok = tokens->first();
1307
tok = tokens_to_pdss_format(tokens, tok, &(m_ele->parent_info));
1311
// search parent and round_robin action tags
1312
for (tok = tokens->next(tok); tok; tok = tokens->next(tok)) {
1313
if (strcmp(tok->name, "round_robin") == 0) {
1318
if (strcmp(tok->value, "true") == 0) {
1319
m_ele->rr = INK_RR_TRUE;
1320
} else if (strcmp(tok->value, "strict") == 0) {
1321
m_ele->rr = INK_RR_STRICT;
1322
} else if (strcmp(tok->value, "false") == 0) {
1323
m_ele->rr = INK_RR_FALSE;
1325
m_ele->rr = INK_RR_NONE;
1329
} else if (strcmp(tok->name, "parent") == 0) {
1334
m_ele->proxy_list = string_to_domain_list(tok->value, ";");
1336
} else if (strcmp(tok->name, "go_direct") == 0) {
1341
if (!strcmp(tok->value, "true")) {
1342
m_ele->direct = true;
1343
} else if (!strcmp(tok->value, "false")) {
1344
m_ele->direct = false;
1353
// the rule type should tell us whether go_direct or not
1354
// the "go_direct" action tag recognization is done in get_rule_type
1355
switch (m_ele->cfg_ele.type) {
1356
case INK_PP_GO_DIRECT:
1357
m_ele->direct = true;
1360
m_ele->direct = false;
1374
ParentProxyObj::~ParentProxyObj()
1376
INKParentProxyEleDestroy(m_ele);
1380
ParentProxyObj::formatEleToRule()
1383
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
1387
char *pd_str, *list_str;
1388
char buf[MAX_RULE_SIZE];
1389
memset(buf, 0, MAX_RULE_SIZE);
1391
pd_str = pdest_sspec_to_string(m_ele->parent_info.pd_type, m_ele->parent_info.pd_val, &(m_ele->parent_info.sec_spec));
1394
strncat(buf, pd_str, sizeof(buf) - strlen(buf) - 1);
1398
if ((m_ele->rr != INK_RR_NONE) && (m_ele->rr != INK_RR_UNDEFINED)) {
1399
if (!isspace(buf[strlen(buf) - 1])) {
1400
strncat(buf, " ", sizeof(buf) - strlen(buf) - 1);
1402
strncat(buf, "round_robin=", sizeof(buf) - strlen(buf) - 1);
1403
switch (m_ele->rr) {
1405
strncat(buf, "true", sizeof(buf) - strlen(buf) - 1);
1408
strncat(buf, "strict", sizeof(buf) - strlen(buf) - 1);
1411
strncat(buf, "false", sizeof(buf) - strlen(buf) - 1);
1415
// INK_RR_NONE, INK_RR_UNDEFINED
1420
if (m_ele->proxy_list != NULL) {
1421
// include space delimiter if not already exist
1422
if (!isspace(buf[strlen(buf) - 1])) {
1423
strncat(buf, " ", sizeof(buf) - strlen(buf) - 1);
1425
list_str = domain_list_to_string(m_ele->proxy_list, ";");
1426
strncat(buf, "parent=\"", sizeof(buf) - strlen(buf) - 1);
1428
strncat(buf, list_str, sizeof(buf) - strlen(buf) - 1);
1431
strncat(buf, "\"", sizeof(buf) - strlen(buf) - 1);
1435
if (m_ele->direct) {
1436
// include space delimiter if not already exist
1437
if (!isspace(buf[strlen(buf) - 1])) {
1438
strncat(buf, " ", sizeof(buf) - strlen(buf) - 1);
1440
strncat(buf, "go_direct=true", sizeof(buf) - strlen(buf) - 1);
1442
if (!isspace(buf[strlen(buf) - 1])) {
1443
strncat(buf, " ", sizeof(buf) - strlen(buf) - 1);
1445
strncat(buf, "go_direct=false", sizeof(buf) - strlen(buf) - 1);
1448
return xstrdup(buf);
1451
bool ParentProxyObj::isValid()
1453
if (m_ele->cfg_ele.error != INK_ERR_OKAY) {
1457
if (!ccu_checkPdSspec(m_ele->parent_info)) {
1461
if (m_ele->proxy_list && !INKDomainListIsValid(m_ele->proxy_list)) {
1466
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
1472
ParentProxyObj::getCfgEleCopy()
1474
return (INKCfgEle *) copy_parent_proxy_ele(m_ele);
1477
//--------------------------------------------------------------------------
1479
//--------------------------------------------------------------------------
1480
PartitionObj::PartitionObj(INKPartitionEle * ele)
1484
m_valid = isValid();
1487
PartitionObj::PartitionObj(TokenList * tokens)
1491
m_ele = INKPartitionEleCreate();
1492
m_ele->cfg_ele.error = INK_ERR_OKAY;
1495
if (!tokens || tokens->length != 3) {
1499
m_ele->cfg_ele.type = get_rule_type(tokens, INK_FNAME_PARTITION);
1500
if (m_ele->cfg_ele.type == INK_TYPE_UNDEFINED) {
1504
token = tokens->first();
1505
if (strcmp(token->name, "partition") || !token->value) {
1508
m_ele->partition_num = ink_atoi(token->value);
1510
token = tokens->next(token);
1511
if (strcmp(token->name, "scheme") || !token->value) {
1514
if (!strcmp(token->value, "http")) {
1515
m_ele->scheme = INK_PARTITION_HTTP;
1517
m_ele->scheme = INK_PARTITION_UNDEFINED;
1520
token = tokens->next(token);
1521
if (strcmp(token->name, "size") || !token->value) {
1524
// CAUTION: we may need a tigher error check
1525
if (strstr(token->value, "%")) {
1526
m_ele->size_format = INK_SIZE_FMT_PERCENT;
1528
m_ele->size_format = INK_SIZE_FMT_ABSOLUTE;
1530
m_ele->partition_size = ink_atoi(token->value);
1535
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
1539
PartitionObj::~PartitionObj()
1541
INKPartitionEleDestroy(m_ele);
1545
PartitionObj::formatEleToRule()
1548
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
1552
char buf[MAX_RULE_SIZE];
1553
memset(buf, 0, MAX_RULE_SIZE);
1555
snprintf(buf, sizeof(buf), "partition=%d scheme=", m_ele->partition_num);
1557
switch (m_ele->scheme) {
1558
case INK_PARTITION_HTTP:
1559
strncat(buf, "http", sizeof(buf) - strlen(buf) - 1);
1563
// INK_PARTITION_UNDEFINED, INK_SIZE_FMT_ABSOLUTE, INK_SIZE_FMT_UNDEFINED
1567
size_t pos = strlen(buf);
1568
snprintf(buf + pos, sizeof(buf) - pos, " size=%d", m_ele->partition_size);
1569
switch (m_ele->size_format) {
1570
case INK_SIZE_FMT_PERCENT:
1571
strncat(buf, "%", sizeof(buf) - strlen(buf) - 1);
1575
// INK_SIZE_FMT_ABSOLUTE, INK_SIZE_FMT_UNDEFINED
1579
return xstrdup(buf);
1582
bool PartitionObj::isValid()
1584
if (m_ele->cfg_ele.error != INK_ERR_OKAY) {
1587
// partition nubmer must be between 1-255 inclusive
1588
if (m_ele->partition_num < 1 || m_ele->partition_num > 255) {
1592
switch (m_ele->scheme) {
1593
case INK_PARTITION_HTTP:
1599
// absolute size must be multiple of 128; percentage size <= 100
1600
if (m_ele->size_format == INK_SIZE_FMT_ABSOLUTE) {
1601
if ((m_ele->partition_size < 0) || (m_ele->partition_size % 128)) {
1604
} else if (m_ele->size_format == INK_SIZE_FMT_PERCENT) {
1605
if ((m_ele->partition_size < 0) || (m_ele->partition_size > 100)) {
1611
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
1617
PartitionObj::getCfgEleCopy()
1619
return (INKCfgEle *) copy_partition_ele(m_ele);
1622
//--------------------------------------------------------------------------
1624
//--------------------------------------------------------------------------
1625
PluginObj::PluginObj(INKPluginEle * ele)
1629
m_valid = isValid();
1632
PluginObj::PluginObj(TokenList * tokens)
1636
m_ele = INKPluginEleCreate();
1637
m_ele->cfg_ele.error = INK_ERR_OKAY;
1640
if (!tokens || tokens->length < 1) {
1644
m_ele->cfg_ele.type = get_rule_type(tokens, INK_FNAME_PLUGIN);
1645
if (m_ele->cfg_ele.type == INK_TYPE_UNDEFINED) {
1649
token = tokens->first();
1650
if (strcmp(token->name, "") == 0) {
1653
m_ele->name = xstrdup(token->name);
1656
token = tokens->next(token);
1658
if (m_ele->args == INK_INVALID_LIST)
1659
m_ele->args = INKStringListCreate();
1661
INKStringListEnqueue(m_ele->args, xstrdup(token->name));
1662
token = tokens->next(token);
1668
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
1672
PluginObj::~PluginObj()
1674
INKPluginEleDestroy(m_ele);
1678
PluginObj::formatEleToRule()
1681
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
1686
char buf[MAX_RULE_SIZE];
1687
memset(buf, 0, MAX_RULE_SIZE);
1689
list_str = string_list_to_string(m_ele->args, " ");
1691
snprintf(buf, sizeof(buf), "%s %s", m_ele->name, list_str);
1694
snprintf(buf, sizeof(buf), "%s", m_ele->name);
1697
return xstrdup(buf);
1700
bool PluginObj::isValid()
1702
if (m_ele->cfg_ele.error != INK_ERR_OKAY) {
1705
// check plugin name
1706
if (!m_ele->name || strcmp(m_ele->name, "") == 0) {
1714
PluginObj::getCfgEleCopy()
1716
return (INKCfgEle *) copy_plugin_ele(m_ele);
1720
//--------------------------------------------------------------------------
1722
//--------------------------------------------------------------------------
1723
RemapObj::RemapObj(INKRemapEle * ele)
1727
m_valid = isValid();
1730
RemapObj::RemapObj(TokenList * tokens)
1733
short current; // current token index
1734
Tokenizer fromTok(":/");
1735
Tokenizer toTok(":/");
1736
char buf[MAX_RULE_SIZE];
1738
m_ele = INKRemapEleCreate(INK_TYPE_UNDEFINED);
1739
m_ele->cfg_ele.error = INK_ERR_OKAY;
1742
if (!tokens || ((tokens->length != 2) && (tokens->length != 3))) {
1746
m_ele->cfg_ele.type = get_rule_type(tokens, INK_FNAME_REMAP);
1747
if (m_ele->cfg_ele.type == INK_TYPE_UNDEFINED) {
1750
// The first token must either be "map, "reverse_map", "redirect", and redirect_temporary
1751
token = tokens->first();
1754
token = tokens->next(token);
1756
if (!ccu_checkUrl(token->name)) {
1760
// TODO: Should we check the return value (count) here?
1761
fromTok.Initialize(token->name, ALLOW_EMPTY_TOKS); // allow empty token for parse sanity check
1763
if (strcmp(fromTok[0], "http") == 0) {
1764
m_ele->from_scheme = INK_SCHEME_HTTP;
1765
} else if (strcmp(fromTok[0], "https") == 0) {
1766
m_ele->from_scheme = INK_SCHEME_HTTPS;
1767
} else if (strcmp(fromTok[0], "rtsp") == 0) {
1768
m_ele->from_scheme = INK_SCHEME_RTSP;
1769
} else if (strcmp(fromTok[0], "mms") == 0) {
1770
m_ele->from_scheme = INK_SCHEME_MMS;
1772
m_ele->from_scheme = INK_SCHEME_UNDEFINED;
1777
m_ele->from_host = xstrdup(fromTok[3]);
1783
m_ele->from_port = ink_atoi(fromTok[4]);
1784
if (m_ele->from_port != 0) { // Does it have a port
1786
} else { // No ports
1787
m_ele->from_port = INK_INVALID_PORT;
1791
if (fromTok[current]) {
1793
memset(buf, 0, MAX_RULE_SIZE);
1795
for (int i = current; fromTok[i]; i++) {
1796
strncat(buf, fromTok[i], sizeof(buf) - strlen(buf) - 1);
1797
strncat(buf, "/", sizeof(buf) - strlen(buf) - 1);
1800
if ((token->name)[strlen(token->name) - 1] != '/') {
1801
buf[strlen(buf) - 1] = '\0'; // truncate the last '/'
1804
m_ele->from_path_prefix = xstrdup(buf);
1807
if ((token->name)[strlen(token->name) - 1] == '/') {
1808
memset(buf, 0, MAX_RULE_SIZE);
1809
ink_strncpy(buf, m_ele->from_host, sizeof(buf));
1810
xfree(m_ele->from_host);
1811
strncat(buf, "/", sizeof(buf) - strlen(buf) - 1);
1812
m_ele->from_host = xstrdup(buf);
1816
if (!ccu_checkUrl(token->value)) {
1820
// TODO: Should we check the return value (count) here?
1821
toTok.Initialize(token->value, ALLOW_EMPTY_TOKS); // allow empty token for parse sanity check
1823
if (strcmp(toTok[0], "http") == 0) {
1824
m_ele->to_scheme = INK_SCHEME_HTTP;
1825
} else if (strcmp(toTok[0], "https") == 0) {
1826
m_ele->to_scheme = INK_SCHEME_HTTPS;
1827
} else if (strcmp(toTok[0], "rtsp") == 0) {
1828
m_ele->to_scheme = INK_SCHEME_RTSP;
1829
} else if (strcmp(toTok[0], "mms") == 0) {
1830
m_ele->to_scheme = INK_SCHEME_MMS;
1832
m_ele->to_scheme = INK_SCHEME_UNDEFINED;
1837
m_ele->to_host = xstrdup(toTok[3]);
1843
m_ele->to_port = ink_atoi(toTok[4]);
1844
if (m_ele->to_port != 0) { // Does it have a port
1846
} else { // No ports
1847
m_ele->to_port = INK_INVALID_PORT;
1851
if (toTok[current]) {
1853
memset(buf, 0, MAX_RULE_SIZE);
1855
for (int i = current; toTok[i]; i++) {
1856
strncat(buf, toTok[i], sizeof(buf) - strlen(buf) - 1);
1857
strncat(buf, "/", sizeof(buf) - strlen(buf) - 1);
1860
if ((token->name)[strlen(token->name) - 1] != '/') {
1861
buf[strlen(buf) - 1] = '\0'; // truncate the last '/'
1864
m_ele->to_path_prefix = xstrdup(buf);
1867
if ((token->value)[strlen(token->value) - 1] == '/') {
1869
memset(buf, 0, MAX_RULE_SIZE);
1870
ink_strncpy(buf, m_ele->to_host, sizeof(buf));
1871
xfree(m_ele->to_host);
1872
strncat(buf, "/", sizeof(buf) - strlen(buf) - 1);
1873
m_ele->to_host = xstrdup(buf);
1881
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
1885
RemapObj::~RemapObj()
1887
INKRemapEleDestroy(m_ele);
1891
RemapObj::formatEleToRule()
1894
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
1898
char buf[MAX_RULE_SIZE];
1899
memset(buf, 0, MAX_RULE_SIZE);
1901
switch (m_ele->cfg_ele.type) {
1903
strncat(buf, "map", sizeof(buf) - strlen(buf) - 1);
1905
case INK_REMAP_REVERSE_MAP:
1906
strncat(buf, "reverse_map", sizeof(buf) - strlen(buf) - 1);
1908
case INK_REMAP_REDIRECT:
1909
strncat(buf, "redirect", sizeof(buf) - strlen(buf) - 1);
1911
case INK_REMAP_REDIRECT_TEMP:
1912
strncat(buf, "redirect_temporary", sizeof(buf) - strlen(buf) - 1);
1920
strncat(buf, " ", sizeof(buf) - strlen(buf) - 1);
1923
switch (m_ele->from_scheme) {
1924
case INK_SCHEME_HTTP:
1925
strncat(buf, "http", sizeof(buf) - strlen(buf) - 1);
1927
case INK_SCHEME_HTTPS:
1928
strncat(buf, "https", sizeof(buf) - strlen(buf) - 1);
1930
case INK_SCHEME_RTSP:
1931
strncat(buf, "rtsp", sizeof(buf) - strlen(buf) - 1);
1933
case INK_SCHEME_MMS:
1934
strncat(buf, "mms", sizeof(buf) - strlen(buf) - 1);
1938
// INK_SCHEME_NONE, INK_SCHEME_UNDEFINED
1941
strncat(buf, "://", sizeof(buf) - strlen(buf) - 1);
1944
if (m_ele->from_host) {
1945
strncat(buf, m_ele->from_host, sizeof(buf) - strlen(buf) - 1);
1948
if (m_ele->from_port != INK_INVALID_PORT) {
1949
snprintf(buf, sizeof(buf), "%s:%d", buf, m_ele->from_port);
1952
if (m_ele->from_path_prefix) {
1953
strncat(buf, "/", sizeof(buf) - strlen(buf) - 1);
1954
strncat(buf, m_ele->from_path_prefix, sizeof(buf) - strlen(buf) - 1);
1957
strncat(buf, " ", sizeof(buf) - strlen(buf) - 1);
1960
switch (m_ele->to_scheme) {
1961
case INK_SCHEME_HTTP:
1962
strncat(buf, "http", sizeof(buf) - strlen(buf) - 1);
1964
case INK_SCHEME_HTTPS:
1965
strncat(buf, "https", sizeof(buf) - strlen(buf) - 1);
1967
case INK_SCHEME_RTSP:
1968
strncat(buf, "rtsp", sizeof(buf) - strlen(buf) - 1);
1970
case INK_SCHEME_MMS:
1971
strncat(buf, "mms", sizeof(buf) - strlen(buf) - 1);
1975
// INK_SCHEME_NONE, INK_SCHEME_UNDEFINED
1978
strncat(buf, "://", sizeof(buf) - strlen(buf) - 1);
1981
if (m_ele->to_host) {
1982
strncat(buf, m_ele->to_host, sizeof(buf) - strlen(buf) - 1);
1985
if (m_ele->to_port != INK_INVALID_PORT) {
1986
snprintf(buf, sizeof(buf), "%s:%d", buf, m_ele->to_port);
1989
if (m_ele->to_path_prefix) {
1990
strncat(buf, "/", sizeof(buf) - strlen(buf) - 1);
1991
strncat(buf, m_ele->to_path_prefix, sizeof(buf) - strlen(buf) - 1);
1994
return xstrdup(buf);
1997
bool RemapObj::isValid()
1999
if (m_ele->cfg_ele.error != INK_ERR_OKAY) {
2003
switch (m_ele->cfg_ele.type) {
2005
case INK_REMAP_REVERSE_MAP:
2006
case INK_REMAP_REDIRECT:
2007
case INK_REMAP_REDIRECT_TEMP:
2014
switch (m_ele->from_scheme) {
2015
case INK_SCHEME_HTTP:
2016
case INK_SCHEME_HTTPS:
2017
case INK_SCHEME_RTSP:
2018
case INK_SCHEME_MMS:
2024
switch (m_ele->to_scheme) {
2025
case INK_SCHEME_HTTP:
2026
case INK_SCHEME_HTTPS:
2027
case INK_SCHEME_RTSP:
2028
case INK_SCHEME_MMS:
2035
if (!m_ele->from_host || strstr(m_ele->from_host, ":/")) {
2039
if (!m_ele->to_host || strstr(m_ele->to_host, ":/")) {
2043
if ((m_ele->from_path_prefix && strstr(m_ele->from_path_prefix, ":")) ||
2044
(m_ele->to_path_prefix && strstr(m_ele->to_path_prefix, ":"))) {
2049
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
2055
RemapObj::getCfgEleCopy()
2057
return (INKCfgEle *) copy_remap_ele(m_ele);
2060
//--------------------------------------------------------------------------
2062
//--------------------------------------------------------------------------
2063
SocksObj::SocksObj(INKSocksEle * ele)
2067
m_valid = isValid();
2070
SocksObj::SocksObj(TokenList * tokens)
2074
m_ele = INKSocksEleCreate(INK_TYPE_UNDEFINED);
2075
m_ele->cfg_ele.error = INK_ERR_OKAY;
2082
m_ele->cfg_ele.type = get_rule_type(tokens, INK_FNAME_SOCKS);
2083
if (m_ele->cfg_ele.type == INK_TYPE_UNDEFINED) {
2086
// Determine if it's a "no-socks" rule or a "parent socks servers" rule
2087
tok = tokens->first();
2088
if (strcmp(tok->name, "no_socks") == 0) { // no-socks rule; INK_SOCKS_BYPASS
2090
if (m_ele->ip_addrs != NULL) {
2093
m_ele->ip_addrs = string_to_ip_addr_list(tok->value, ",");
2094
} else if (strcmp(tok->name, "auth") == 0) { // INK_SOCKS_AUTH rule
2095
if (strcmp(tok->value, "u") == 0) {
2096
tok = tokens->next(tok);
2097
if (tok && tok->name) {
2098
m_ele->username = xstrdup(tok->name);
2102
if (tok && tok->name) {
2103
tok = tokens->next(tok);
2104
m_ele->password = xstrdup(tok->name);
2111
} else { // multiple socks servers rule; INK_SOCKS_MULTIPLE
2112
// should be dest_ip tag
2113
if (strcmp(tok->name, "dest_ip") == 0) {
2114
m_ele->dest_ip_addr = string_to_ip_addr_ele(tok->value);
2119
// search dest_ip, parent and round_robin action tags
2120
for (tok = tokens->next(tok); tok; tok = tokens->next(tok)) {
2121
if (strcmp(tok->name, "round_robin") == 0) {
2127
if (strcmp(tok->value, "true") == 0) {
2128
m_ele->rr = INK_RR_TRUE;
2129
} else if (strcmp(tok->value, "strict") == 0) {
2130
m_ele->rr = INK_RR_STRICT;
2131
} else if (strcmp(tok->value, "false") == 0) {
2132
m_ele->rr = INK_RR_FALSE;
2134
m_ele->rr = INK_RR_NONE;
2135
goto FORMAT_ERR; // missing value for round_robin tag
2138
} else if (strcmp(tok->name, "parent") == 0) {
2143
m_ele->socks_servers = string_to_domain_list(tok->value, ";");
2152
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
2156
SocksObj::~SocksObj()
2158
INKSocksEleDestroy(m_ele);
2162
SocksObj::formatEleToRule()
2165
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
2168
char buf[MAX_RULE_SIZE];
2169
memset(buf, 0, MAX_RULE_SIZE);
2171
if (m_ele->ip_addrs != NULL) { // INK_SOCKS_BYPASS rule
2172
char *str_list = ip_addr_list_to_string((LLQ *) m_ele->ip_addrs, ",");
2174
snprintf(buf, sizeof(buf), "no_socks %s", str_list);
2177
return NULL; // invalid ip_addr_list
2179
} else if (m_ele->username != NULL) { // INK_SOCKS_AUTH rule
2180
snprintf(buf, sizeof(buf), "auth u %s %s", m_ele->username, m_ele->password);
2181
} else { // INK_SOCKS_MULTIPLE rule
2183
char *ip_str = ip_addr_ele_to_string((INKIpAddrEle *) m_ele->dest_ip_addr);
2185
strncat(buf, "dest_ip=", sizeof(buf) - strlen(buf) - 1);
2186
strncat(buf, ip_str, sizeof(buf) - strlen(buf) - 1);
2189
return NULL; // invalid IP
2192
// parent server list
2193
if (m_ele->socks_servers != NULL) {
2194
// include space delimiter if not already exist
2195
if (!isspace(buf[strlen(buf) - 1])) {
2196
strncat(buf, " ", sizeof(buf) - strlen(buf) - 1);
2198
char *list_str = domain_list_to_string(m_ele->socks_servers, ";");
2200
strncat(buf, "parent=\"", sizeof(buf) - strlen(buf) - 1);
2201
strncat(buf, list_str, sizeof(buf) - strlen(buf) - 1);
2202
strncat(buf, "\"", sizeof(buf) - strlen(buf) - 1);
2205
return NULL; // invalid list
2208
// round-robin, if specified
2209
if ((m_ele->rr != INK_RR_NONE) && (m_ele->rr != INK_RR_UNDEFINED)) {
2210
if (!isspace(buf[strlen(buf) - 1])) {
2211
strncat(buf, " ", sizeof(buf) - strlen(buf) - 1);
2213
strncat(buf, "round_robin=", sizeof(buf) - strlen(buf) - 1);
2214
switch (m_ele->rr) {
2216
strncat(buf, "true", sizeof(buf) - strlen(buf) - 1);
2219
strncat(buf, "strict", sizeof(buf) - strlen(buf) - 1);
2222
strncat(buf, "false", sizeof(buf) - strlen(buf) - 1);
2226
// INK_RR_NONE, INK_RR_UNDEFINED
2232
return xstrdup(buf);
2235
// the rule must either have an ip addr list (exclusive) OR
2236
// the dest_ip_addr * socks_servers OR
2237
// the username and password
2238
bool SocksObj::isValid()
2240
if (m_ele->cfg_ele.error != INK_ERR_OKAY) {
2244
switch (m_ele->cfg_ele.type) {
2245
case INK_SOCKS_BYPASS:
2246
if (m_ele->dest_ip_addr || m_ele->username || m_ele->password || !INKIpAddrListIsValid(m_ele->ip_addrs)) {
2252
case INK_SOCKS_AUTH:
2253
if (m_ele->username == NULL || m_ele->password == NULL || m_ele->ip_addrs || m_ele->dest_ip_addr) {
2259
case INK_SOCKS_MULTIPLE:
2260
if (m_ele->ip_addrs || m_ele->username ||
2261
!(m_ele->dest_ip_addr && m_ele->socks_servers) ||
2262
!ccu_checkIpAddrEle(m_ele->dest_ip_addr) || !INKDomainListIsValid(m_ele->socks_servers)) {
2274
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
2280
SocksObj::getCfgEleCopy()
2282
return (INKCfgEle *) copy_socks_ele(m_ele);
2285
//--------------------------------------------------------------------------
2287
//--------------------------------------------------------------------------
2288
SplitDnsObj::SplitDnsObj(INKSplitDnsEle * ele)
2292
m_valid = isValid();
2295
SplitDnsObj::SplitDnsObj(TokenList * tokens)
2299
m_ele = INKSplitDnsEleCreate();
2300
m_ele->cfg_ele.error = INK_ERR_OKAY;
2303
if (!tokens || (tokens->length > 6)) {
2307
m_ele->cfg_ele.type = get_rule_type(tokens, INK_FNAME_SPLIT_DNS);
2308
if (m_ele->cfg_ele.type == INK_TYPE_UNDEFINED) {
2312
tok = tokens->first();
2314
if (!strcmp(tok->name, "dest_domain")) {
2315
if ((m_ele->pd_type != INK_PD_UNDEFINED) || (m_ele->pd_val != NULL) || (!tok->value)) {
2316
// fields are already defined!!
2319
m_ele->pd_type = INK_PD_DOMAIN;
2320
m_ele->pd_val = xstrdup(tok->value);
2321
} else if (strcmp(tok->name, "dest_host") == 0) {
2322
if ((m_ele->pd_type != INK_PD_UNDEFINED) || (m_ele->pd_val != NULL) || (!tok->value)) {
2323
// fields are already defined!!
2326
m_ele->pd_type = INK_PD_HOST;
2327
m_ele->pd_val = xstrdup(tok->value);
2328
} else if (strcmp(tok->name, "url_regex") == 0) {
2329
if ((m_ele->pd_type != INK_PD_UNDEFINED) || (m_ele->pd_val != NULL) || (!tok->value)) {
2330
// fields are already defined!!
2333
m_ele->pd_type = INK_PD_URL_REGEX;
2334
m_ele->pd_val = xstrdup(tok->value);
2335
} else if (strcmp(tok->name, "named") == 0) {
2336
if ((m_ele->dns_servers_addrs != NULL) || (!tok->value)) {
2337
// fields are already defined!!
2340
m_ele->dns_servers_addrs = (INKDomainList) string_to_domain_list(tok->value, "; ");
2341
} else if (strcmp(tok->name, "def_domain") == 0) {
2342
if ((m_ele->def_domain != NULL) || (!tok->value)) {
2343
// fields are already defined!!
2346
m_ele->def_domain = xstrdup(tok->value);
2347
} else if (strcmp(tok->name, "search_list") == 0) {
2348
if ((m_ele->search_list != NULL) || (!tok->value)) {
2349
// fields are already defined!!
2352
m_ele->search_list = (INKDomainList) string_to_domain_list(tok->value, "; ");
2354
// Not able to recongize token name
2358
tok = tokens->next(tok);
2363
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
2367
SplitDnsObj::~SplitDnsObj()
2369
INKSplitDnsEleDestroy(m_ele);
2373
SplitDnsObj::formatEleToRule()
2376
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
2380
char buf[MAX_RULE_SIZE];
2381
memset(buf, 0, MAX_RULE_SIZE);
2384
switch (m_ele->pd_type) {
2386
pd_name = xstrdup("dest_domain");
2389
pd_name = xstrdup("dest_host");
2391
case INK_PD_URL_REGEX:
2392
pd_name = xstrdup("url_regex");
2395
pd_name = xstrdup(""); // lv: just to make this junk workable
2397
// INK_PD_IP, INK_PD_UNDEFINED
2401
if (m_ele->pd_val) {
2402
strncat(buf, pd_name, sizeof(buf) - strlen(buf) - 1);
2403
strncat(buf, "=", sizeof(buf) - strlen(buf) - 1);
2404
if (strstr(m_ele->pd_val, " ")) {
2405
strncat(buf, "\"", sizeof(buf) - strlen(buf) - 1);
2407
strncat(buf, m_ele->pd_val, sizeof(buf) - strlen(buf) - 1);
2408
if (strstr(m_ele->pd_val, " ")) {
2409
strncat(buf, "\"", sizeof(buf) - strlen(buf) - 1);
2411
strncat(buf, " ", sizeof(buf) - strlen(buf) - 1);
2414
if (m_ele->dns_servers_addrs) {
2415
strncat(buf, "named=", sizeof(buf) - strlen(buf) - 1);
2416
char *temp = domain_list_to_string((LLQ *) m_ele->dns_servers_addrs, ";");
2418
if (strstr(temp, " ")) {
2419
strncat(buf, "\"", sizeof(buf) - strlen(buf) - 1);
2421
strncat(buf, temp, sizeof(buf) - strlen(buf) - 1);
2422
if (strstr(temp, " ")) {
2423
strncat(buf, "\"", sizeof(buf) - strlen(buf) - 1);
2427
strncat(buf, " ", sizeof(buf) - strlen(buf) - 1);
2430
if (m_ele->def_domain) {
2431
strncat(buf, "def_domain=", sizeof(buf) - strlen(buf) - 1);
2432
if (strstr(m_ele->def_domain, " ")) {
2433
strncat(buf, "\"", sizeof(buf) - strlen(buf) - 1);
2435
strncat(buf, m_ele->def_domain, sizeof(buf) - strlen(buf) - 1);
2436
if (strstr(m_ele->def_domain, " ")) {
2437
strncat(buf, "\"", sizeof(buf) - strlen(buf) - 1);
2439
strncat(buf, " ", sizeof(buf) - strlen(buf) - 1);
2442
if (m_ele->search_list) {
2443
strncat(buf, "search_list=", sizeof(buf) - strlen(buf) - 1);
2444
char *temp = domain_list_to_string(m_ele->search_list, ";");
2446
if (strstr(temp, " ")) {
2447
strncat(buf, "\"", sizeof(buf) - strlen(buf) - 1);
2449
strncat(buf, temp, sizeof(buf) - strlen(buf) - 1);
2450
if (strstr(temp, " ")) {
2451
strncat(buf, "\"", sizeof(buf) - strlen(buf) - 1);
2455
strncat(buf, " ", sizeof(buf) - strlen(buf) - 1);
2457
// chop the last space
2458
while (isspace(buf[strlen(buf) - 1])) {
2459
buf[strlen(buf) - 1] = '\0';
2465
return xstrdup(buf);
2468
bool SplitDnsObj::isValid()
2470
if (m_ele->cfg_ele.error != INK_ERR_OKAY) {
2474
switch (m_ele->pd_type) {
2477
case INK_PD_URL_REGEX:
2483
if (!m_ele->pd_val) {
2487
if (!INKDomainListIsValid(m_ele->dns_servers_addrs)) {
2490
// search_list is optional
2491
if (m_ele->search_list && !INKDomainListIsValid(m_ele->search_list)) {
2496
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
2502
SplitDnsObj::getCfgEleCopy()
2504
return (INKCfgEle *) copy_split_dns_ele(m_ele);
2507
//--------------------------------------------------------------------------
2509
//--------------------------------------------------------------------------
2510
StorageObj::StorageObj(INKStorageEle * ele)
2514
m_valid = isValid(); // now validate
2517
// must have at least 1 token (token-name = pathname, token-value = size (if any) )
2518
StorageObj::StorageObj(TokenList * tokens)
2522
m_ele = INKStorageEleCreate();
2523
m_ele->cfg_ele.error = INK_ERR_OKAY;
2526
if (!tokens || (tokens->length > 6)) {
2530
m_ele->cfg_ele.type = get_rule_type(tokens, INK_FNAME_STORAGE);
2531
if (m_ele->cfg_ele.type == INK_TYPE_UNDEFINED) {
2534
// check first token; must exist
2535
tok = tokens->first();
2537
goto FORMAT_ERR; // no pathname specified
2539
m_ele->pathname = xstrdup(tok->name);
2542
// check if size is specified
2543
if (tok->value) // size is specified in second token
2544
m_ele->size = ink_atoi(tok->value);
2549
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
2553
StorageObj::~StorageObj()
2555
INKStorageEleDestroy(m_ele);
2559
StorageObj::formatEleToRule()
2562
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
2566
char buf[MAX_RULE_SIZE];
2567
memset(buf, 0, MAX_RULE_SIZE);
2569
if (m_ele->size < 0) { // if size < 0, then raw partition
2570
snprintf(buf, sizeof(buf), "%s", m_ele->pathname);
2572
snprintf(buf, sizeof(buf), "%s %d", m_ele->pathname, m_ele->size);
2575
return xstrdup(buf);
2578
bool StorageObj::isValid()
2580
if (m_ele->cfg_ele.error != INK_ERR_OKAY) {
2584
if (!(m_ele->pathname))
2588
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
2594
StorageObj::getCfgEleCopy()
2596
return (INKCfgEle *) copy_storage_ele(m_ele);
2599
//--------------------------------------------------------------------------
2601
//--------------------------------------------------------------------------
2602
UpdateObj::UpdateObj(INKUpdateEle * ele)
2606
m_valid = isValid();
2609
UpdateObj::UpdateObj(TokenList * tokens)
2613
m_ele = INKUpdateEleCreate();
2614
m_ele->cfg_ele.error = INK_ERR_OKAY;
2617
if (!tokens || tokens->length < 5) {
2621
m_ele->cfg_ele.type = get_rule_type(tokens, INK_FNAME_UPDATE_URL);
2622
if (m_ele->cfg_ele.type == INK_TYPE_UNDEFINED) {
2626
token = tokens->first();
2627
if (strcmp(token->name, "") == 0) {
2630
m_ele->url = xstrdup(token->name);
2633
token = tokens->next(token);
2634
m_ele->headers = string_to_string_list(token->name, ";");
2637
token = tokens->next(token);
2638
if (strcmp(token->name, "") == 0) {
2641
m_ele->offset_hour = ink_atoi(token->name);
2644
token = tokens->next(token);
2645
if (strcmp(token->name, "") == 0) {
2648
m_ele->interval = ink_atoi(token->name);
2651
token = tokens->next(token);
2652
if (strcmp(token->name, "") == 0) {
2655
m_ele->recursion_depth = ink_atoi(token->name);
2659
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
2663
UpdateObj::~UpdateObj()
2665
INKUpdateEleDestroy(m_ele);
2669
UpdateObj::formatEleToRule()
2672
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
2677
char buf[MAX_RULE_SIZE];
2678
memset(buf, 0, MAX_RULE_SIZE);
2680
list_str = string_list_to_string(m_ele->headers, ";");
2682
snprintf(buf, sizeof(buf), "%s\\%s\\%d\\%d\\%d\\",
2683
m_ele->url, list_str, m_ele->offset_hour, m_ele->interval, m_ele->recursion_depth);
2686
snprintf(buf, sizeof(buf), "%s\\\\%d\\%d\\%d\\",
2687
m_ele->url, m_ele->offset_hour, m_ele->interval, m_ele->recursion_depth);
2690
return xstrdup(buf);
2693
bool UpdateObj::isValid()
2695
if (m_ele->cfg_ele.error != INK_ERR_OKAY) {
2699
if (!m_ele->url || strcmp(m_ele->url, "") == 0 ||
2700
strstr(m_ele->url, "\\") ||
2701
(!strstr(m_ele->url, "http") && !strstr(m_ele->url, "rtsp"))) {
2704
// bug 49322: check that there are no "\" in the url or headers
2706
list_str = string_list_to_string(m_ele->headers, ";");
2708
if (strstr(list_str, "\\"))
2712
// offset hour range is 00-23
2713
if (m_ele->offset_hour < 0 || m_ele->offset_hour > 23)
2716
if (m_ele->interval < 0)
2719
// optional - default is 0
2720
if (m_ele->recursion_depth < 0) {
2723
// recursion depth can only be specified for http
2724
if (m_ele->recursion_depth > 0) {
2725
if (!strstr(m_ele->url, "http"))
2730
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
2736
UpdateObj::getCfgEleCopy()
2738
return (INKCfgEle *) copy_update_ele(m_ele);
2741
//--------------------------------------------------------------------------
2743
//--------------------------------------------------------------------------
2744
VirtIpAddrObj::VirtIpAddrObj(INKVirtIpAddrEle * ele)
2748
m_valid = isValid();
2751
VirtIpAddrObj::VirtIpAddrObj(TokenList * tokens)
2755
m_ele = INKVirtIpAddrEleCreate();
2756
m_ele->cfg_ele.error = INK_ERR_OKAY;
2759
if (!tokens || (tokens->length != 3)) {
2763
m_ele->cfg_ele.type = get_rule_type(tokens, INK_FNAME_VADDRS);
2764
if (m_ele->cfg_ele.type == INK_TYPE_UNDEFINED) {
2768
tok = tokens->first();
2769
if (tok->value != NULL) {
2772
m_ele->ip_addr = string_to_ip_addr(tok->name);
2775
tok = tokens->next(tok);
2776
if (tok->value != NULL) {
2779
m_ele->intr = xstrdup(tok->name);
2782
tok = tokens->next(tok);
2783
if (tok->value != NULL) {
2786
m_ele->sub_intr = ink_atoi(tok->name); // ERROR: can't convert?
2791
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
2795
VirtIpAddrObj::~VirtIpAddrObj()
2797
INKVirtIpAddrEleDestroy(m_ele);
2801
VirtIpAddrObj::formatEleToRule()
2804
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
2809
char buf[MAX_RULE_SIZE];
2810
memset(buf, 0, MAX_RULE_SIZE);
2812
ip_str = ip_addr_to_string(m_ele->ip_addr);
2813
snprintf(buf, sizeof(buf), "%s %s %d", ip_str, m_ele->intr, m_ele->sub_intr);
2817
return xstrdup(buf);
2820
bool VirtIpAddrObj::isValid()
2822
if (m_ele->cfg_ele.error != INK_ERR_OKAY) {
2826
if (!ccu_checkIpAddr(m_ele->ip_addr)) {
2834
if ((m_ele->sub_intr < 1) || (m_ele->sub_intr > 255)) {
2839
m_ele->cfg_ele.error = INK_ERR_INVALID_CONFIG_RULE;
2845
VirtIpAddrObj::getCfgEleCopy()
2847
return (INKCfgEle *) copy_virt_ip_addr_ele(m_ele);
2851
/*****************************************************************
2853
*****************************************************************/
2854
CfgContext::CfgContext(INKFileNameT filename)
2860
CfgContext::~CfgContext()
2863
while ((ele = m_eles.dequeue())) {
2868
INKError CfgContext::addEle(CfgEleObj * ele)
2870
ink_assert(ele != NULL);
2871
m_eles.enqueue(ele); // enqueue CfgEleObj at end of Queue
2872
return INK_ERR_OKAY;
2875
INKError CfgContext::removeEle(CfgEleObj * ele)
2877
ink_assert(ele != NULL);
2882
return INK_ERR_OKAY;
2885
INKError CfgContext::insertEle(CfgEleObj * ele, CfgEleObj * after_ele)
2887
ink_assert(ele != NULL && after_ele != NULL);
2888
m_eles.insert(ele, after_ele);
2890
return INK_ERR_OKAY;
2893
// insert Ele at front of the Queue
2894
INKError CfgContext::pushEle(CfgEleObj * ele)
2896
ink_assert(ele != NULL);
2899
return INK_ERR_OKAY;