MAJOR: arg: converts uint and sint in sint
This patch removes the 32 bits unsigned integer and the 32 bit signed
integer. It replaces these types by a unique type 64 bit signed.
diff --git a/include/types/arg.h b/include/types/arg.h
index c38d9d6..28cdfb3 100644
--- a/include/types/arg.h
+++ b/include/types/arg.h
@@ -44,8 +44,7 @@
enum {
ARGT_STOP = 0, /* end of the arg list */
- ARGT_UINT, /* unsigned integer, which is a positive integer without any sign */
- ARGT_SINT, /* signed integer, the sign (+/-) was explicit. Falls back to UINT if no sign. */
+ ARGT_SINT, /* signed 64 bit integer. */
ARGT_STR, /* string */
ARGT_IPV4, /* an IPv4 address */
ARGT_MSK4, /* an IPv4 address mask (integer or dotted), stored as ARGT_IPV4 */
@@ -88,8 +87,7 @@
struct my_regex;
union arg_data {
- unsigned int uint; /* used for uint, time, size */
- int sint;
+ long long int sint;
struct chunk str;
struct in_addr ipv4;
struct in6_addr ipv6;
diff --git a/src/arg.c b/src/arg.c
index e212f6b..93389e1 100644
--- a/src/arg.c
+++ b/src/arg.c
@@ -19,8 +19,7 @@
const char *arg_type_names[ARGT_NBTYPES] = {
[ARGT_STOP] = "end of arguments",
- [ARGT_UINT] = "unsigned integer",
- [ARGT_SINT] = "signed integer",
+ [ARGT_SINT] = "integer",
[ARGT_STR] = "string",
[ARGT_IPV4] = "IPv4 address",
[ARGT_MSK4] = "IPv4 mask",
@@ -125,6 +124,8 @@
/* Note: empty arguments after a comma always exist. */
while (pos < nbarg) {
+ unsigned int uint;
+
beg = in;
while (len && *in != ',') {
in++;
@@ -145,28 +146,10 @@
case ARGT_SINT:
if (in == beg) // empty number
goto empty_err;
- else if (*beg < '0' || *beg > '9') {
- beg++;
- arg->data.sint = read_uint(&beg, in);
- if (beg < in)
- goto parse_err;
- if (*word == '-')
- arg->data.sint = -arg->data.sint;
- else if (*word != '+') // invalid first character
- goto parse_err;
- break;
- }
-
- arg->type = ARGT_UINT;
- /* fall through ARGT_UINT if no sign is present */
-
- case ARGT_UINT:
- if (in == beg) // empty number
- goto empty_err;
-
- arg->data.uint = read_uint(&beg, in);
+ arg->data.sint = read_int64(&beg, in);
if (beg < in)
goto parse_err;
+ arg->type = ARGT_SINT;
break;
case ARGT_FE:
@@ -226,22 +209,23 @@
if (in == beg) // empty time
goto empty_err;
- ptr_err = parse_time_err(word, &arg->data.uint, TIME_UNIT_MS);
+ ptr_err = parse_time_err(word, &uint, TIME_UNIT_MS);
if (ptr_err)
goto parse_err;
-
- arg->type = ARGT_UINT;
+ arg->data.sint = uint;
+ arg->type = ARGT_SINT;
break;
case ARGT_SIZE:
if (in == beg) // empty size
goto empty_err;
- ptr_err = parse_size_err(word, &arg->data.uint);
+ ptr_err = parse_size_err(word, &uint);
if (ptr_err)
goto parse_err;
- arg->type = ARGT_UINT;
+ arg->data.sint = uint;
+ arg->type = ARGT_SINT;
break;
/* FIXME: other types need to be implemented here */
diff --git a/src/hlua.c b/src/hlua.c
index 34e14e8..6fe3797 100644
--- a/src/hlua.c
+++ b/src/hlua.c
@@ -317,10 +317,6 @@
{
switch (arg->type) {
case ARGT_SINT:
- lua_pushinteger(L, arg->data.sint);
- break;
-
- case ARGT_UINT:
case ARGT_TIME:
case ARGT_SIZE:
lua_pushinteger(L, arg->data.sint);
@@ -374,7 +370,7 @@
case LUA_TTHREAD:
case LUA_TLIGHTUSERDATA:
arg->type = ARGT_SINT;
- arg->data.uint = 0;
+ arg->data.sint = 0;
break;
}
return 1;
@@ -608,12 +604,6 @@
argp[idx].type = ARGT_SINT;
break;
- case ARGT_UINT:
- if (argp[idx].type != ARGT_SINT)
- WILL_LJMP(luaL_argerror(L, first + idx, "integer expected"));
- argp[idx].type = ARGT_SINT;
- break;
-
case ARGT_TIME:
if (argp[idx].type != ARGT_SINT)
WILL_LJMP(luaL_argerror(L, first + idx, "integer expected"));
diff --git a/src/map.c b/src/map.c
index be33c2c..fedd9d2 100644
--- a/src/map.c
+++ b/src/map.c
@@ -188,7 +188,7 @@
case SMP_T_SINT:
smp->type = SMP_T_SINT;
- smp->data.sint = arg_p[1].data.uint;
+ smp->data.sint = arg_p[1].data.sint;
break;
case SMP_T_IPV4:
@@ -233,15 +233,15 @@
{ "map_int", sample_conv_map, ARG2(1,STR,STR), sample_load_map, SMP_T_SINT, SMP_T_STR, (void *)PAT_MATCH_INT },
{ "map_ip", sample_conv_map, ARG2(1,STR,STR), sample_load_map, SMP_T_ADDR, SMP_T_STR, (void *)PAT_MATCH_IP },
- { "map_str_int", sample_conv_map, ARG2(1,STR,UINT), sample_load_map, SMP_T_STR, SMP_T_SINT, (void *)PAT_MATCH_STR },
- { "map_beg_int", sample_conv_map, ARG2(1,STR,UINT), sample_load_map, SMP_T_STR, SMP_T_SINT, (void *)PAT_MATCH_BEG },
- { "map_sub_int", sample_conv_map, ARG2(1,STR,UINT), sample_load_map, SMP_T_STR, SMP_T_SINT, (void *)PAT_MATCH_SUB },
- { "map_dir_int", sample_conv_map, ARG2(1,STR,UINT), sample_load_map, SMP_T_STR, SMP_T_SINT, (void *)PAT_MATCH_DIR },
- { "map_dom_int", sample_conv_map, ARG2(1,STR,UINT), sample_load_map, SMP_T_STR, SMP_T_SINT, (void *)PAT_MATCH_DOM },
- { "map_end_int", sample_conv_map, ARG2(1,STR,UINT), sample_load_map, SMP_T_STR, SMP_T_SINT, (void *)PAT_MATCH_END },
- { "map_reg_int", sample_conv_map, ARG2(1,STR,UINT), sample_load_map, SMP_T_STR, SMP_T_SINT, (void *)PAT_MATCH_REG },
- { "map_int_int", sample_conv_map, ARG2(1,STR,UINT), sample_load_map, SMP_T_SINT, SMP_T_SINT, (void *)PAT_MATCH_INT },
- { "map_ip_int", sample_conv_map, ARG2(1,STR,UINT), sample_load_map, SMP_T_ADDR, SMP_T_SINT, (void *)PAT_MATCH_IP },
+ { "map_str_int", sample_conv_map, ARG2(1,STR,SINT), sample_load_map, SMP_T_STR, SMP_T_SINT, (void *)PAT_MATCH_STR },
+ { "map_beg_int", sample_conv_map, ARG2(1,STR,SINT), sample_load_map, SMP_T_STR, SMP_T_SINT, (void *)PAT_MATCH_BEG },
+ { "map_sub_int", sample_conv_map, ARG2(1,STR,SINT), sample_load_map, SMP_T_STR, SMP_T_SINT, (void *)PAT_MATCH_SUB },
+ { "map_dir_int", sample_conv_map, ARG2(1,STR,SINT), sample_load_map, SMP_T_STR, SMP_T_SINT, (void *)PAT_MATCH_DIR },
+ { "map_dom_int", sample_conv_map, ARG2(1,STR,SINT), sample_load_map, SMP_T_STR, SMP_T_SINT, (void *)PAT_MATCH_DOM },
+ { "map_end_int", sample_conv_map, ARG2(1,STR,SINT), sample_load_map, SMP_T_STR, SMP_T_SINT, (void *)PAT_MATCH_END },
+ { "map_reg_int", sample_conv_map, ARG2(1,STR,SINT), sample_load_map, SMP_T_STR, SMP_T_SINT, (void *)PAT_MATCH_REG },
+ { "map_int_int", sample_conv_map, ARG2(1,STR,SINT), sample_load_map, SMP_T_SINT, SMP_T_SINT, (void *)PAT_MATCH_INT },
+ { "map_ip_int", sample_conv_map, ARG2(1,STR,SINT), sample_load_map, SMP_T_ADDR, SMP_T_SINT, (void *)PAT_MATCH_IP },
{ "map_str_ip", sample_conv_map, ARG2(1,STR,IPV4), sample_load_map, SMP_T_STR, SMP_T_IPV4, (void *)PAT_MATCH_STR },
{ "map_beg_ip", sample_conv_map, ARG2(1,STR,IPV4), sample_load_map, SMP_T_STR, SMP_T_IPV4, (void *)PAT_MATCH_BEG },
diff --git a/src/payload.c b/src/payload.c
index c81c0b4..32c530c 100644
--- a/src/payload.c
+++ b/src/payload.c
@@ -637,8 +637,8 @@
static int
smp_fetch_payload_lv(const struct arg *arg_p, struct sample *smp, const char *kw, void *private)
{
- unsigned int len_offset = arg_p[0].data.uint;
- unsigned int len_size = arg_p[1].data.uint;
+ unsigned int len_offset = arg_p[0].data.sint;
+ unsigned int len_size = arg_p[1].data.sint;
unsigned int buf_offset;
unsigned int buf_size = 0;
struct channel *chn;
@@ -659,12 +659,16 @@
buf_size = (buf_size << 8) + ((unsigned char *)chn->buf->p)[i + len_offset];
}
- /* buf offset may be implicit, absolute or relative */
+ /* buf offset may be implicit, absolute or relative. If the LSB
+ * is set, then the offset is relative otherwise it is absolute.
+ */
buf_offset = len_offset + len_size;
- if (arg_p[2].type == ARGT_UINT)
- buf_offset = arg_p[2].data.uint;
- else if (arg_p[2].type == ARGT_SINT)
- buf_offset += arg_p[2].data.sint;
+ if (arg_p[2].type == ARGT_SINT) {
+ if (arg_p[2].data.sint & 1)
+ buf_offset += arg_p[2].data.sint >> 1;
+ else
+ buf_offset = arg_p[2].data.sint >> 1;
+ }
if (!buf_size || buf_size > chn->buf->size || buf_offset + buf_size > chn->buf->size) {
/* will never match */
@@ -690,8 +694,8 @@
static int
smp_fetch_payload(const struct arg *arg_p, struct sample *smp, const char *kw, void *private)
{
- unsigned int buf_offset = arg_p[0].data.uint;
- unsigned int buf_size = arg_p[1].data.uint;
+ unsigned int buf_offset = arg_p[0].data.sint;
+ unsigned int buf_size = arg_p[1].data.sint;
struct channel *chn;
chn = ((smp->opt & SMP_OPT_DIR) == SMP_OPT_DIR_RES) ? &smp->strm->res : &smp->strm->req;
@@ -729,19 +733,43 @@
* not NULL, it will be filled with a pointer to an error message in case of
* error, that the caller is responsible for freeing. The initial location must
* either be freeable or NULL.
+ *
+ * Note that offset2 is stored with SINT type, but its not directly usable as is.
+ * The value is contained in the 63 MSB and the LSB is used as a flag for marking
+ * the "relative" property of the value.
*/
int val_payload_lv(struct arg *arg, char **err_msg)
{
- if (!arg[1].data.uint) {
- memprintf(err_msg, "payload length must be > 0");
+ int relative = 0;
+ const char *str;
+
+ if (arg[0].data.sint < 0) {
+ memprintf(err_msg, "payload offset1 must be positive");
return 0;
}
- if (arg[2].type == ARGT_SINT &&
- (int)(arg[0].data.uint + arg[1].data.uint + arg[2].data.sint) < 0) {
- memprintf(err_msg, "payload offset too negative");
+ if (!arg[1].data.sint) {
+ memprintf(err_msg, "payload length must be > 0");
return 0;
}
+
+ if (arg[2].type == ARGT_STR && arg[2].data.str.len > 0) {
+ if (arg[2].data.str.str[0] == '+' || arg[2].data.str.str[0] == '-')
+ relative = 1;
+ str = arg[2].data.str.str;
+ arg[2].type = ARGT_SINT;
+ arg[2].data.sint = read_int64(&str, str + arg[2].data.str.len);
+ if (*str != '\0') {
+ memprintf(err_msg, "payload offset2 is not a number");
+ return 0;
+ }
+ if (arg[0].data.sint + arg[1].data.sint + arg[2].data.sint < 0) {
+ memprintf(err_msg, "payload offset2 too negative");
+ return 0;
+ }
+ if (relative)
+ arg[2].data.sint = ( arg[2].data.sint << 1 ) + 1;
+ }
return 1;
}
@@ -755,8 +783,8 @@
* instance IPv4/IPv6 must be declared IPv4.
*/
static struct sample_fetch_kw_list smp_kws = {ILH, {
- { "payload", smp_fetch_payload, ARG2(2,UINT,UINT), NULL, SMP_T_BIN, SMP_USE_L6REQ|SMP_USE_L6RES },
- { "payload_lv", smp_fetch_payload_lv, ARG3(2,UINT,UINT,UINT), val_payload_lv, SMP_T_BIN, SMP_USE_L6REQ|SMP_USE_L6RES },
+ { "payload", smp_fetch_payload, ARG2(2,SINT,SINT), NULL, SMP_T_BIN, SMP_USE_L6REQ|SMP_USE_L6RES },
+ { "payload_lv", smp_fetch_payload_lv, ARG3(2,SINT,SINT,STR), val_payload_lv, SMP_T_BIN, SMP_USE_L6REQ|SMP_USE_L6RES },
{ "rdp_cookie", smp_fetch_rdp_cookie, ARG1(0,STR), NULL, SMP_T_STR, SMP_USE_L6REQ },
{ "rdp_cookie_cnt", smp_fetch_rdp_cookie_cnt, ARG1(0,STR), NULL, SMP_T_SINT, SMP_USE_L6REQ },
{ "rep_ssl_hello_type", smp_fetch_ssl_hello_type, 0, NULL, SMP_T_SINT, SMP_USE_L6RES },
@@ -766,8 +794,8 @@
{ "req_ssl_ver", smp_fetch_req_ssl_ver, 0, NULL, SMP_T_SINT, SMP_USE_L6REQ },
{ "req.len", smp_fetch_len, 0, NULL, SMP_T_SINT, SMP_USE_L6REQ },
- { "req.payload", smp_fetch_payload, ARG2(2,UINT,UINT), NULL, SMP_T_BIN, SMP_USE_L6REQ },
- { "req.payload_lv", smp_fetch_payload_lv, ARG3(2,UINT,UINT,UINT), val_payload_lv, SMP_T_BIN, SMP_USE_L6REQ },
+ { "req.payload", smp_fetch_payload, ARG2(2,SINT,SINT), NULL, SMP_T_BIN, SMP_USE_L6REQ },
+ { "req.payload_lv", smp_fetch_payload_lv, ARG3(2,SINT,SINT,STR), val_payload_lv, SMP_T_BIN, SMP_USE_L6REQ },
{ "req.rdp_cookie", smp_fetch_rdp_cookie, ARG1(0,STR), NULL, SMP_T_STR, SMP_USE_L6REQ },
{ "req.rdp_cookie_cnt", smp_fetch_rdp_cookie_cnt, ARG1(0,STR), NULL, SMP_T_SINT, SMP_USE_L6REQ },
{ "req.ssl_ec_ext", smp_fetch_req_ssl_ec_ext, 0, NULL, SMP_T_BOOL, SMP_USE_L6REQ },
@@ -775,8 +803,8 @@
{ "req.ssl_sni", smp_fetch_ssl_hello_sni, 0, NULL, SMP_T_STR, SMP_USE_L6REQ },
{ "req.ssl_ver", smp_fetch_req_ssl_ver, 0, NULL, SMP_T_SINT, SMP_USE_L6REQ },
{ "res.len", smp_fetch_len, 0, NULL, SMP_T_SINT, SMP_USE_L6RES },
- { "res.payload", smp_fetch_payload, ARG2(2,UINT,UINT), NULL, SMP_T_BIN, SMP_USE_L6RES },
- { "res.payload_lv", smp_fetch_payload_lv, ARG3(2,UINT,UINT,SINT), val_payload_lv, SMP_T_BIN, SMP_USE_L6RES },
+ { "res.payload", smp_fetch_payload, ARG2(2,SINT,SINT), NULL, SMP_T_BIN, SMP_USE_L6RES },
+ { "res.payload_lv", smp_fetch_payload_lv, ARG3(2,SINT,SINT,STR), val_payload_lv, SMP_T_BIN, SMP_USE_L6RES },
{ "res.ssl_hello_type", smp_fetch_ssl_hello_type, 0, NULL, SMP_T_SINT, SMP_USE_L6RES },
{ "wait_end", smp_fetch_wait_end, 0, NULL, SMP_T_BOOL, SMP_USE_INTRN },
{ /* END */ },
diff --git a/src/proto_http.c b/src/proto_http.c
index c35e6a1..18a9455 100644
--- a/src/proto_http.c
+++ b/src/proto_http.c
@@ -10603,8 +10603,8 @@
name_str = args[0].data.str.str;
name_len = args[0].data.str.len;
- if (args[1].type == ARGT_UINT || args[1].type == ARGT_SINT)
- occ = args[1].data.uint;
+ if (args[1].type == ARGT_SINT)
+ occ = args[1].data.sint;
}
CHECK_HTTP_MESSAGE_FIRST();
@@ -10731,8 +10731,8 @@
name_str = args[0].data.str.str;
name_len = args[0].data.str.len;
- if (args[1].type == ARGT_UINT || args[1].type == ARGT_SINT)
- occ = args[1].data.uint;
+ if (args[1].type == ARGT_SINT)
+ occ = args[1].data.sint;
}
CHECK_HTTP_MESSAGE_FIRST();
@@ -11216,10 +11216,10 @@
struct proxy *fe = strm_fe(smp->strm);
int idx;
- if (!args || args->type != ARGT_UINT)
+ if (!args || args->type != ARGT_SINT)
return 0;
- idx = args->data.uint;
+ idx = args->data.sint;
if (idx > (fe->nb_req_cap - 1) || smp->strm->req_cap == NULL || smp->strm->req_cap[idx] == NULL)
return 0;
@@ -11241,10 +11241,10 @@
struct proxy *fe = strm_fe(smp->strm);
int idx;
- if (!args || args->type != ARGT_UINT)
+ if (!args || args->type != ARGT_SINT)
return 0;
- idx = args->data.uint;
+ idx = args->data.sint;
if (idx > (fe->nb_rsp_cap - 1) || smp->strm->res_cap == NULL || smp->strm->res_cap[idx] == NULL)
return 0;
@@ -12081,10 +12081,11 @@
const char mon[12][4] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
struct chunk *temp;
struct tm *tm;
- time_t curr_date = smp->data.sint;
+ /* With high numbers, the date returned can be negative, the 55 bits mask prevent this. */
+ time_t curr_date = smp->data.sint & 0x007fffffffffffffLL;
/* add offset */
- if (args && (args[0].type == ARGT_SINT || args[0].type == ARGT_UINT))
+ if (args && (args[0].type == ARGT_SINT))
curr_date += args[0].data.sint;
tm = gmtime(&curr_date);
@@ -12302,10 +12303,10 @@
struct cap_hdr *hdr;
int len;
- if (!args || args->type != ARGT_UINT)
+ if (!args || args->type != ARGT_SINT)
return 0;
- idx = args->data.uint;
+ idx = args->data.sint;
/* Check the availibity of the capture id. */
if (idx > fe->nb_req_cap - 1)
@@ -12343,10 +12344,10 @@
struct cap_hdr *hdr;
int len;
- if (!args || args->type != ARGT_UINT)
+ if (!args || args->type != ARGT_SINT)
return 0;
- idx = args->data.uint;
+ idx = args->data.sint;
/* Check the availibity of the capture id. */
if (idx > fe->nb_rsp_cap - 1)
@@ -13013,15 +13014,15 @@
{ "base32+src", smp_fetch_base32_src, 0, NULL, SMP_T_BIN, SMP_USE_HRQHV },
/* capture are allocated and are permanent in the stream */
- { "capture.req.hdr", smp_fetch_capture_header_req, ARG1(1, UINT), NULL, SMP_T_STR, SMP_USE_HRQHP },
+ { "capture.req.hdr", smp_fetch_capture_header_req, ARG1(1,SINT), NULL, SMP_T_STR, SMP_USE_HRQHP },
/* retrieve these captures from the HTTP logs */
- { "capture.req.method", smp_fetch_capture_req_method, 0, NULL, SMP_T_STR, SMP_USE_HRQHP },
- { "capture.req.uri", smp_fetch_capture_req_uri, 0, NULL, SMP_T_STR, SMP_USE_HRQHP },
- { "capture.req.ver", smp_fetch_capture_req_ver, 0, NULL, SMP_T_STR, SMP_USE_HRQHP },
+ { "capture.req.method", smp_fetch_capture_req_method, 0, NULL, SMP_T_STR, SMP_USE_HRQHP },
+ { "capture.req.uri", smp_fetch_capture_req_uri, 0, NULL, SMP_T_STR, SMP_USE_HRQHP },
+ { "capture.req.ver", smp_fetch_capture_req_ver, 0, NULL, SMP_T_STR, SMP_USE_HRQHP },
- { "capture.res.hdr", smp_fetch_capture_header_res, ARG1(1, UINT), NULL, SMP_T_STR, SMP_USE_HRSHP },
- { "capture.res.ver", smp_fetch_capture_res_ver, 0, NULL, SMP_T_STR, SMP_USE_HRQHP },
+ { "capture.res.hdr", smp_fetch_capture_header_res, ARG1(1,SINT), NULL, SMP_T_STR, SMP_USE_HRSHP },
+ { "capture.res.ver", smp_fetch_capture_res_ver, 0, NULL, SMP_T_STR, SMP_USE_HRQHP },
/* cookie is valid in both directions (eg: for "stick ...") but cook*
* are only here to match the ACL's name, are request-only and are used
@@ -13123,8 +13124,8 @@
static struct sample_conv_kw_list sample_conv_kws = {ILH, {
{ "http_date", sample_conv_http_date, ARG1(0,SINT), NULL, SMP_T_SINT, SMP_T_STR},
{ "language", sample_conv_q_prefered, ARG2(1,STR,STR), NULL, SMP_T_STR, SMP_T_STR},
- { "capture-req", smp_conv_req_capture, ARG1(1,UINT), NULL, SMP_T_STR, SMP_T_STR},
- { "capture-res", smp_conv_res_capture, ARG1(1,UINT), NULL, SMP_T_STR, SMP_T_STR},
+ { "capture-req", smp_conv_req_capture, ARG1(1,SINT), NULL, SMP_T_STR, SMP_T_STR},
+ { "capture-res", smp_conv_res_capture, ARG1(1,SINT), NULL, SMP_T_STR, SMP_T_STR},
{ "url_dec", sample_conv_url_dec, 0, NULL, SMP_T_STR, SMP_T_STR},
{ NULL, NULL, 0, 0, 0 },
}};
diff --git a/src/sample.c b/src/sample.c
index 17e331a..15c004f 100644
--- a/src/sample.c
+++ b/src/sample.c
@@ -1433,7 +1433,7 @@
static int sample_conv_djb2(const struct arg *arg_p, struct sample *smp, void *private)
{
smp->data.sint = hash_djb2(smp->data.str.str, smp->data.str.len);
- if (arg_p && arg_p->data.uint)
+ if (arg_p && arg_p->data.sint)
smp->data.sint = full_hash(smp->data.sint);
smp->type = SMP_T_SINT;
return 1;
@@ -1488,11 +1488,12 @@
static int sample_conv_ltime(const struct arg *args, struct sample *smp, void *private)
{
struct chunk *temp;
- time_t curr_date = smp->data.sint;
+ /* With high numbers, the date returned can be negative, the 55 bits mask prevent this. */
+ time_t curr_date = smp->data.sint & 0x007fffffffffffffLL;
struct tm *tm;
/* add offset */
- if (args[1].type == ARGT_SINT || args[1].type == ARGT_UINT)
+ if (args[1].type == ARGT_SINT)
curr_date += args[1].data.sint;
tm = localtime(&curr_date);
@@ -1509,7 +1510,7 @@
static int sample_conv_sdbm(const struct arg *arg_p, struct sample *smp, void *private)
{
smp->data.sint = hash_sdbm(smp->data.str.str, smp->data.str.len);
- if (arg_p && arg_p->data.uint)
+ if (arg_p && arg_p->data.sint)
smp->data.sint = full_hash(smp->data.sint);
smp->type = SMP_T_SINT;
return 1;
@@ -1522,11 +1523,12 @@
static int sample_conv_utime(const struct arg *args, struct sample *smp, void *private)
{
struct chunk *temp;
- time_t curr_date = smp->data.sint;
+ /* With high numbers, the date returned can be negative, the 55 bits mask prevent this. */
+ time_t curr_date = smp->data.sint & 0x007fffffffffffffLL;
struct tm *tm;
/* add offset */
- if (args[1].type == ARGT_SINT || args[1].type == ARGT_UINT)
+ if (args[1].type == ARGT_SINT)
curr_date += args[1].data.sint;
tm = gmtime(&curr_date);
@@ -1543,7 +1545,7 @@
static int sample_conv_wt6(const struct arg *arg_p, struct sample *smp, void *private)
{
smp->data.sint = hash_wt6(smp->data.str.str, smp->data.str.len);
- if (arg_p && arg_p->data.uint)
+ if (arg_p && arg_p->data.sint)
smp->data.sint = full_hash(smp->data.sint);
smp->type = SMP_T_SINT;
return 1;
@@ -1553,7 +1555,7 @@
static int sample_conv_crc32(const struct arg *arg_p, struct sample *smp, void *private)
{
smp->data.sint = hash_crc32(smp->data.str.str, smp->data.str.len);
- if (arg_p && arg_p->data.uint)
+ if (arg_p && arg_p->data.sint)
smp->data.sint = full_hash(smp->data.sint);
smp->type = SMP_T_SINT;
return 1;
@@ -1590,38 +1592,38 @@
}
if (strcmp(arg->data.str.str, "") == 0) {
- arg->type = ARGT_UINT;
- arg->data.uint = IT_ASCII;
+ arg->type = ARGT_SINT;
+ arg->data.sint = IT_ASCII;
return 1;
}
else if (strcmp(arg->data.str.str, "ascii") == 0) {
- arg->type = ARGT_UINT;
- arg->data.uint = IT_ASCII;
+ arg->type = ARGT_SINT;
+ arg->data.sint = IT_ASCII;
return 1;
}
else if (strcmp(arg->data.str.str, "utf8") == 0) {
- arg->type = ARGT_UINT;
- arg->data.uint = IT_UTF8;
+ arg->type = ARGT_SINT;
+ arg->data.sint = IT_UTF8;
return 1;
}
else if (strcmp(arg->data.str.str, "utf8s") == 0) {
- arg->type = ARGT_UINT;
- arg->data.uint = IT_UTF8S;
+ arg->type = ARGT_SINT;
+ arg->data.sint = IT_UTF8S;
return 1;
}
else if (strcmp(arg->data.str.str, "utf8p") == 0) {
- arg->type = ARGT_UINT;
- arg->data.uint = IT_UTF8P;
+ arg->type = ARGT_SINT;
+ arg->data.sint = IT_UTF8P;
return 1;
}
else if (strcmp(arg->data.str.str, "utf8ps") == 0) {
- arg->type = ARGT_UINT;
- arg->data.uint = IT_UTF8PS;
+ arg->type = ARGT_SINT;
+ arg->data.sint = IT_UTF8PS;
return 1;
}
@@ -1642,7 +1644,7 @@
char *p;
if (arg_p)
- input_type = arg_p->data.uint;
+ input_type = arg_p->data.sint;
temp = get_trash_chunk();
temp->len = 0;
@@ -1746,18 +1748,18 @@
* Optional second arg is the length to truncate */
static int sample_conv_bytes(const struct arg *arg_p, struct sample *smp, void *private)
{
- if (smp->data.str.len <= arg_p[0].data.uint) {
+ if (smp->data.str.len <= arg_p[0].data.sint) {
smp->data.str.len = 0;
return 1;
}
if (smp->data.str.size)
- smp->data.str.size -= arg_p[0].data.uint;
- smp->data.str.len -= arg_p[0].data.uint;
- smp->data.str.str += arg_p[0].data.uint;
+ smp->data.str.size -= arg_p[0].data.sint;
+ smp->data.str.len -= arg_p[0].data.sint;
+ smp->data.str.str += arg_p[0].data.sint;
- if ((arg_p[1].type == ARGT_UINT) && (arg_p[1].data.uint < smp->data.str.len))
- smp->data.str.len = arg_p[1].data.uint;
+ if ((arg_p[1].type == ARGT_SINT) && (arg_p[1].data.sint < smp->data.str.len))
+ smp->data.str.len = arg_p[1].data.sint;
return 1;
}
@@ -1772,12 +1774,12 @@
return 0;
}
- if (arg->type != ARGT_UINT) {
+ if (arg->type != ARGT_SINT) {
memprintf(err, "Unexpected arg type");
return 0;
}
- if (!arg->data.uint) {
+ if (!arg->data.sint) {
memprintf(err, "Unexpected value 0 for index");
return 0;
}
@@ -1807,7 +1809,7 @@
char *start, *end;
int i;
- if (!arg_p[0].data.uint)
+ if (!arg_p[0].data.sint)
return 0;
field = 1;
@@ -1816,7 +1818,7 @@
for (i = 0 ; i < arg_p[1].data.str.len ; i++) {
if (*end == arg_p[1].data.str.str[i]) {
- if (field == arg_p[0].data.uint)
+ if (field == arg_p[0].data.sint)
goto found;
start = end+1;
field++;
@@ -1827,7 +1829,7 @@
}
/* Field not found */
- if (field != arg_p[0].data.uint) {
+ if (field != arg_p[0].data.sint) {
smp->data.str.len = 0;
return 1;
}
@@ -1858,7 +1860,7 @@
char *start, *end;
int i, issep, inword;
- if (!arg_p[0].data.uint)
+ if (!arg_p[0].data.sint)
return 0;
word = 0;
@@ -1880,7 +1882,7 @@
}
}
else if (issep) {
- if (word == arg_p[0].data.uint)
+ if (word == arg_p[0].data.sint)
goto found;
inword = 0;
}
@@ -1888,7 +1890,7 @@
}
/* Field not found */
- if (word != arg_p[0].data.uint) {
+ if (word != arg_p[0].data.sint) {
smp->data.str.len = 0;
return 1;
}
@@ -2029,7 +2031,7 @@
*/
static int sample_conv_binary_and(const struct arg *arg_p, struct sample *smp, void *private)
{
- smp->data.sint &= arg_p->data.uint;
+ smp->data.sint &= arg_p->data.sint;
return 1;
}
@@ -2038,7 +2040,7 @@
*/
static int sample_conv_binary_or(const struct arg *arg_p, struct sample *smp, void *private)
{
- smp->data.sint |= arg_p->data.uint;
+ smp->data.sint |= arg_p->data.sint;
return 1;
}
@@ -2047,7 +2049,7 @@
*/
static int sample_conv_binary_xor(const struct arg *arg_p, struct sample *smp, void *private)
{
- smp->data.sint ^= arg_p->data.uint;
+ smp->data.sint ^= arg_p->data.sint;
return 1;
}
@@ -2056,7 +2058,7 @@
*/
static int sample_conv_arith_add(const struct arg *arg_p, struct sample *smp, void *private)
{
- smp->data.sint += arg_p->data.uint;
+ smp->data.sint += arg_p->data.sint;
return 1;
}
@@ -2066,7 +2068,7 @@
static int sample_conv_arith_sub(const struct arg *arg_p,
struct sample *smp, void *private)
{
- smp->data.sint -= arg_p->data.uint;
+ smp->data.sint -= arg_p->data.sint;
return 1;
}
@@ -2076,7 +2078,7 @@
static int sample_conv_arith_mul(const struct arg *arg_p,
struct sample *smp, void *private)
{
- smp->data.sint *= arg_p->data.uint;
+ smp->data.sint *= arg_p->data.sint;
return 1;
}
@@ -2087,8 +2089,8 @@
static int sample_conv_arith_div(const struct arg *arg_p,
struct sample *smp, void *private)
{
- if (arg_p->data.uint)
- smp->data.sint /= arg_p->data.uint;
+ if (arg_p->data.sint)
+ smp->data.sint /= arg_p->data.sint;
else
smp->data.sint = ~0;
return 1;
@@ -2101,8 +2103,8 @@
static int sample_conv_arith_mod(const struct arg *arg_p,
struct sample *smp, void *private)
{
- if (arg_p->data.uint)
- smp->data.sint %= arg_p->data.uint;
+ if (arg_p->data.sint)
+ smp->data.sint %= arg_p->data.sint;
else
smp->data.sint = 0;
return 1;
@@ -2213,7 +2215,7 @@
smp->data.sint = date.tv_sec;
/* add offset */
- if (args && (args[0].type == ARGT_SINT || args[0].type == ARGT_UINT))
+ if (args && args[0].type == ARGT_SINT)
smp->data.sint += args[0].data.sint;
smp->type = SMP_T_SINT;
@@ -2248,8 +2250,8 @@
smp->data.sint = random();
/* reduce if needed. Don't do a modulo, use all bits! */
- if (args && args[0].type == ARGT_UINT)
- smp->data.sint = (smp->data.sint * args[0].data.uint) / ((u64)RAND_MAX+1);
+ if (args && args[0].type == ARGT_SINT)
+ smp->data.sint = (smp->data.sint * args[0].data.sint) / ((u64)RAND_MAX+1);
smp->type = SMP_T_SINT;
smp->flags |= SMP_F_VOL_TEST | SMP_F_MAY_CHANGE;
@@ -2278,14 +2280,14 @@
{
if (strcasecmp(args[0].data.str.str, "true") == 0 ||
strcasecmp(args[0].data.str.str, "1") == 0) {
- args[0].type = ARGT_UINT;
- args[0].data.uint = 1;
+ args[0].type = ARGT_SINT;
+ args[0].data.sint = 1;
return 1;
}
if (strcasecmp(args[0].data.str.str, "false") == 0 ||
strcasecmp(args[0].data.str.str, "0") == 0) {
- args[0].type = ARGT_UINT;
- args[0].data.uint = 0;
+ args[0].type = ARGT_SINT;
+ args[0].data.sint = 0;
return 1;
}
memprintf(err, "Expects 'true', 'false', '0' or '1'");
@@ -2295,7 +2297,7 @@
static int smp_fetch_const_bool(const struct arg *args, struct sample *smp, const char *kw, void *private)
{
smp->type = SMP_T_BOOL;
- smp->data.sint = args[0].data.uint;
+ smp->data.sint = args[0].data.sint;
return 1;
}
@@ -2349,8 +2351,8 @@
meth = find_http_meth(args[0].data.str.str, args[0].data.str.len);
if (meth != HTTP_METH_OTHER) {
- args[0].type = ARGT_UINT;
- args[0].data.uint = meth;
+ args[0].type = ARGT_SINT;
+ args[0].data.sint = meth;
} else {
/* Check method avalaibility. A methos is a token defined as :
* tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." /
@@ -2370,9 +2372,9 @@
static int smp_fetch_const_meth(const struct arg *args, struct sample *smp, const char *kw, void *private)
{
smp->type = SMP_T_METH;
- if (args[0].type == ARGT_UINT) {
+ if (args[0].type == ARGT_SINT) {
smp->flags &= ~SMP_F_CONST;
- smp->data.meth.meth = args[0].data.uint;
+ smp->data.meth.meth = args[0].data.sint;
smp->data.meth.str.str = "";
smp->data.meth.str.len = 0;
} else {
@@ -2396,7 +2398,7 @@
{ "date", smp_fetch_date, ARG1(0,SINT), NULL, SMP_T_SINT, SMP_USE_INTRN },
{ "nbproc", smp_fetch_nbproc,0, NULL, SMP_T_SINT, SMP_USE_INTRN },
{ "proc", smp_fetch_proc, 0, NULL, SMP_T_SINT, SMP_USE_INTRN },
- { "rand", smp_fetch_rand, ARG1(0,UINT), NULL, SMP_T_SINT, SMP_USE_INTRN },
+ { "rand", smp_fetch_rand, ARG1(0,SINT), NULL, SMP_T_SINT, SMP_USE_INTRN },
{ "stopping", smp_fetch_stopping, 0, NULL, SMP_T_BOOL, SMP_USE_INTRN },
{ "str", smp_fetch_const_str, ARG1(1,STR), NULL , SMP_T_STR, SMP_USE_INTRN },
@@ -2423,29 +2425,29 @@
{ "ipmask", sample_conv_ipmask, ARG1(1,MSK4), NULL, SMP_T_IPV4, SMP_T_IPV4 },
{ "ltime", sample_conv_ltime, ARG2(1,STR,SINT), NULL, SMP_T_SINT, SMP_T_STR },
{ "utime", sample_conv_utime, ARG2(1,STR,SINT), NULL, SMP_T_SINT, SMP_T_STR },
- { "crc32", sample_conv_crc32, ARG1(0,UINT), NULL, SMP_T_BIN, SMP_T_SINT },
- { "djb2", sample_conv_djb2, ARG1(0,UINT), NULL, SMP_T_BIN, SMP_T_SINT },
- { "sdbm", sample_conv_sdbm, ARG1(0,UINT), NULL, SMP_T_BIN, SMP_T_SINT },
- { "wt6", sample_conv_wt6, ARG1(0,UINT), NULL, SMP_T_BIN, SMP_T_SINT },
+ { "crc32", sample_conv_crc32, ARG1(0,SINT), NULL, SMP_T_BIN, SMP_T_SINT },
+ { "djb2", sample_conv_djb2, ARG1(0,SINT), NULL, SMP_T_BIN, SMP_T_SINT },
+ { "sdbm", sample_conv_sdbm, ARG1(0,SINT), NULL, SMP_T_BIN, SMP_T_SINT },
+ { "wt6", sample_conv_wt6, ARG1(0,SINT), NULL, SMP_T_BIN, SMP_T_SINT },
{ "json", sample_conv_json, ARG1(1,STR), sample_conv_json_check, SMP_T_STR, SMP_T_STR },
- { "bytes", sample_conv_bytes, ARG2(1,UINT,UINT), NULL, SMP_T_BIN, SMP_T_BIN },
- { "field", sample_conv_field, ARG2(2,UINT,STR), sample_conv_field_check, SMP_T_STR, SMP_T_STR },
- { "word", sample_conv_word, ARG2(2,UINT,STR), sample_conv_field_check, SMP_T_STR, SMP_T_STR },
+ { "bytes", sample_conv_bytes, ARG2(1,SINT,SINT), NULL, SMP_T_BIN, SMP_T_BIN },
+ { "field", sample_conv_field, ARG2(2,SINT,STR), sample_conv_field_check, SMP_T_STR, SMP_T_STR },
+ { "word", sample_conv_word, ARG2(2,SINT,STR), sample_conv_field_check, SMP_T_STR, SMP_T_STR },
{ "regsub", sample_conv_regsub, ARG3(2,REG,STR,STR), sample_conv_regsub_check, SMP_T_STR, SMP_T_STR },
- { "and", sample_conv_binary_and, ARG1(1,UINT), NULL, SMP_T_SINT, SMP_T_SINT },
- { "or", sample_conv_binary_or, ARG1(1,UINT), NULL, SMP_T_SINT, SMP_T_SINT },
- { "xor", sample_conv_binary_xor, ARG1(1,UINT), NULL, SMP_T_SINT, SMP_T_SINT },
+ { "and", sample_conv_binary_and, ARG1(1,SINT), NULL, SMP_T_SINT, SMP_T_SINT },
+ { "or", sample_conv_binary_or, ARG1(1,SINT), NULL, SMP_T_SINT, SMP_T_SINT },
+ { "xor", sample_conv_binary_xor, ARG1(1,SINT), NULL, SMP_T_SINT, SMP_T_SINT },
{ "cpl", sample_conv_binary_cpl, 0, NULL, SMP_T_SINT, SMP_T_SINT },
{ "bool", sample_conv_arith_bool, 0, NULL, SMP_T_SINT, SMP_T_BOOL },
{ "not", sample_conv_arith_not, 0, NULL, SMP_T_SINT, SMP_T_BOOL },
{ "odd", sample_conv_arith_odd, 0, NULL, SMP_T_SINT, SMP_T_BOOL },
{ "even", sample_conv_arith_even, 0, NULL, SMP_T_SINT, SMP_T_BOOL },
- { "add", sample_conv_arith_add, ARG1(1,UINT), NULL, SMP_T_SINT, SMP_T_SINT },
- { "sub", sample_conv_arith_sub, ARG1(1,UINT), NULL, SMP_T_SINT, SMP_T_SINT },
- { "mul", sample_conv_arith_mul, ARG1(1,UINT), NULL, SMP_T_SINT, SMP_T_SINT },
- { "div", sample_conv_arith_div, ARG1(1,UINT), NULL, SMP_T_SINT, SMP_T_SINT },
- { "mod", sample_conv_arith_mod, ARG1(1,UINT), NULL, SMP_T_SINT, SMP_T_SINT },
+ { "add", sample_conv_arith_add, ARG1(1,SINT), NULL, SMP_T_SINT, SMP_T_SINT },
+ { "sub", sample_conv_arith_sub, ARG1(1,SINT), NULL, SMP_T_SINT, SMP_T_SINT },
+ { "mul", sample_conv_arith_mul, ARG1(1,SINT), NULL, SMP_T_SINT, SMP_T_SINT },
+ { "div", sample_conv_arith_div, ARG1(1,SINT), NULL, SMP_T_SINT, SMP_T_SINT },
+ { "mod", sample_conv_arith_mod, ARG1(1,SINT), NULL, SMP_T_SINT, SMP_T_SINT },
{ "neg", sample_conv_arith_neg, 0, NULL, SMP_T_SINT, SMP_T_SINT },
{ NULL, NULL, 0, 0, 0 },
diff --git a/src/ssl_sock.c b/src/ssl_sock.c
index 520c866..7f1a070 100644
--- a/src/ssl_sock.c
+++ b/src/ssl_sock.c
@@ -3613,8 +3613,6 @@
if (args[1].type == ARGT_SINT)
pos = args[1].data.sint;
- else if (args[1].type == ARGT_UINT)
- pos =(int)args[1].data.uint;
if (ssl_sock_get_dn_entry(name, &args[0].data.str, pos, smp_trash) <= 0)
goto out;
@@ -3715,8 +3713,6 @@
if (args[1].type == ARGT_SINT)
pos = args[1].data.sint;
- else if (args[1].type == ARGT_UINT)
- pos =(int)args[1].data.uint;
if (ssl_sock_get_dn_entry(name, &args[0].data.str, pos, smp_trash) <= 0)
goto out;
diff --git a/src/stream.c b/src/stream.c
index baab845..ff6b32b 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -2582,7 +2582,7 @@
if (num == '_' - '0') {
/* sc_* variant, args[0] = ctr# (mandatory) */
- num = args[arg++].data.uint;
+ num = args[arg++].data.sint;
if (num >= MAX_SESS_STKCTR)
return NULL;
}
@@ -3168,25 +3168,25 @@
* Please take care of keeping this list alphabetically sorted.
*/
static struct sample_fetch_kw_list smp_fetch_keywords = {ILH, {
- { "sc_bytes_in_rate", smp_fetch_sc_bytes_in_rate, ARG2(1,UINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
- { "sc_bytes_out_rate", smp_fetch_sc_bytes_out_rate, ARG2(1,UINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
- { "sc_clr_gpc0", smp_fetch_sc_clr_gpc0, ARG2(1,UINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
- { "sc_conn_cnt", smp_fetch_sc_conn_cnt, ARG2(1,UINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
- { "sc_conn_cur", smp_fetch_sc_conn_cur, ARG2(1,UINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
- { "sc_conn_rate", smp_fetch_sc_conn_rate, ARG2(1,UINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
- { "sc_get_gpc0", smp_fetch_sc_get_gpc0, ARG2(1,UINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
- { "sc_gpc0_rate", smp_fetch_sc_gpc0_rate, ARG2(1,UINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
- { "sc_http_err_cnt", smp_fetch_sc_http_err_cnt, ARG2(1,UINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
- { "sc_http_err_rate", smp_fetch_sc_http_err_rate, ARG2(1,UINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
- { "sc_http_req_cnt", smp_fetch_sc_http_req_cnt, ARG2(1,UINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
- { "sc_http_req_rate", smp_fetch_sc_http_req_rate, ARG2(1,UINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
- { "sc_inc_gpc0", smp_fetch_sc_inc_gpc0, ARG2(1,UINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
- { "sc_kbytes_in", smp_fetch_sc_kbytes_in, ARG2(1,UINT,TAB), NULL, SMP_T_SINT, SMP_USE_L4CLI, },
- { "sc_kbytes_out", smp_fetch_sc_kbytes_out, ARG2(1,UINT,TAB), NULL, SMP_T_SINT, SMP_USE_L4CLI, },
- { "sc_sess_cnt", smp_fetch_sc_sess_cnt, ARG2(1,UINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
- { "sc_sess_rate", smp_fetch_sc_sess_rate, ARG2(1,UINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
- { "sc_tracked", smp_fetch_sc_tracked, ARG2(1,UINT,TAB), NULL, SMP_T_BOOL, SMP_USE_INTRN, },
- { "sc_trackers", smp_fetch_sc_trackers, ARG2(1,UINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
+ { "sc_bytes_in_rate", smp_fetch_sc_bytes_in_rate, ARG2(1,SINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
+ { "sc_bytes_out_rate", smp_fetch_sc_bytes_out_rate, ARG2(1,SINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
+ { "sc_clr_gpc0", smp_fetch_sc_clr_gpc0, ARG2(1,SINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
+ { "sc_conn_cnt", smp_fetch_sc_conn_cnt, ARG2(1,SINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
+ { "sc_conn_cur", smp_fetch_sc_conn_cur, ARG2(1,SINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
+ { "sc_conn_rate", smp_fetch_sc_conn_rate, ARG2(1,SINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
+ { "sc_get_gpc0", smp_fetch_sc_get_gpc0, ARG2(1,SINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
+ { "sc_gpc0_rate", smp_fetch_sc_gpc0_rate, ARG2(1,SINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
+ { "sc_http_err_cnt", smp_fetch_sc_http_err_cnt, ARG2(1,SINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
+ { "sc_http_err_rate", smp_fetch_sc_http_err_rate, ARG2(1,SINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
+ { "sc_http_req_cnt", smp_fetch_sc_http_req_cnt, ARG2(1,SINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
+ { "sc_http_req_rate", smp_fetch_sc_http_req_rate, ARG2(1,SINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
+ { "sc_inc_gpc0", smp_fetch_sc_inc_gpc0, ARG2(1,SINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
+ { "sc_kbytes_in", smp_fetch_sc_kbytes_in, ARG2(1,SINT,TAB), NULL, SMP_T_SINT, SMP_USE_L4CLI, },
+ { "sc_kbytes_out", smp_fetch_sc_kbytes_out, ARG2(1,SINT,TAB), NULL, SMP_T_SINT, SMP_USE_L4CLI, },
+ { "sc_sess_cnt", smp_fetch_sc_sess_cnt, ARG2(1,SINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
+ { "sc_sess_rate", smp_fetch_sc_sess_rate, ARG2(1,SINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
+ { "sc_tracked", smp_fetch_sc_tracked, ARG2(1,SINT,TAB), NULL, SMP_T_BOOL, SMP_USE_INTRN, },
+ { "sc_trackers", smp_fetch_sc_trackers, ARG2(1,SINT,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
{ "sc0_bytes_in_rate", smp_fetch_sc_bytes_in_rate, ARG1(0,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
{ "sc0_bytes_out_rate", smp_fetch_sc_bytes_out_rate, ARG1(0,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },
{ "sc0_clr_gpc0", smp_fetch_sc_clr_gpc0, ARG1(0,TAB), NULL, SMP_T_SINT, SMP_USE_INTRN, },