[MINOR] Allow showing and clearing by key of integer stick tables

This commit is contained in:
Simon Horman 2011-06-15 15:18:51 +09:00 committed by Willy Tarreau
parent c5b89f6495
commit cec9a22780
2 changed files with 26 additions and 7 deletions

View File

@ -9336,7 +9336,7 @@ clear table <table> [ data.<type> <operator> <value> ] | [ key <key> ]
- gt : match entries whose data is greater than this value - gt : match entries whose data is greater than this value
When the key form is used the entry <key> is removed. The key must be of the When the key form is used the entry <key> is removed. The key must be of the
same type as the table, which currently is limited to IPv4 and IPv6. same type as the table, which currently is limited to IPv4, IPv6 and integer.
Example : Example :
$ echo "show table http_proxy" | socat stdio /tmp/sock1 $ echo "show table http_proxy" | socat stdio /tmp/sock1
@ -9562,7 +9562,7 @@ show table <name> [ data.<type> <operator> <value> ] | [ key <key> ]
When the key form is used the entry <key> is shown. The key must be of the When the key form is used the entry <key> is shown. The key must be of the
same type as the table, which currently is limited to IPv4 and IPv6. same type as the table, which currently is limited to IPv4, IPv6 and integer.
Example : Example :
$ echo "show table http_proxy" | socat stdio /tmp/sock1 $ echo "show table http_proxy" | socat stdio /tmp/sock1

View File

@ -15,6 +15,7 @@
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -510,7 +511,7 @@ static void stats_sock_table_key_request(struct stream_interface *si, char **arg
struct session *s = si->applet.private; struct session *s = si->applet.private;
struct proxy *px = si->applet.ctx.table.target; struct proxy *px = si->applet.ctx.table.target;
struct stksess *ts; struct stksess *ts;
unsigned int ip_key; uint32_t uint32_key;
unsigned char ip6_key[sizeof(struct in6_addr)]; unsigned char ip6_key[sizeof(struct in6_addr)];
si->applet.st0 = STAT_CLI_OUTPUT; si->applet.st0 = STAT_CLI_OUTPUT;
@ -523,18 +524,36 @@ static void stats_sock_table_key_request(struct stream_interface *si, char **arg
switch (px->table.type) { switch (px->table.type) {
case STKTABLE_TYPE_IP: case STKTABLE_TYPE_IP:
ip_key = htonl(inetaddr_host(args[4])); uint32_key = htonl(inetaddr_host(args[4]));
static_table_key.key = (void *)&ip_key; static_table_key.key = &uint32_key;
break; break;
case STKTABLE_TYPE_IPV6: case STKTABLE_TYPE_IPV6:
inet_pton(AF_INET6, args[4], ip6_key); inet_pton(AF_INET6, args[4], ip6_key);
static_table_key.key = &ip6_key; static_table_key.key = &ip6_key;
break; break;
case STKTABLE_TYPE_INTEGER:
{
char *endptr;
unsigned long val;
errno = 0;
val = strtoul(args[4], &endptr, 10);
if ((errno == ERANGE && val == ULONG_MAX) ||
(errno != 0 && val == 0) || endptr == args[4] ||
val > 0xffffffff) {
si->applet.ctx.cli.msg = "Invalid key\n";
si->applet.st0 = STAT_CLI_PRINT;
return;
}
uint32_key = (uint32_t) val;
static_table_key.key = &uint32_key;
break;
}
break;
default: default:
if (show) if (show)
si->applet.ctx.cli.msg = "Showing keys from tables of type other than ip and ipv6 is not supported\n"; si->applet.ctx.cli.msg = "Showing keys from tables of type other than ip, ipv6 and integer is not supported\n";
else else
si->applet.ctx.cli.msg = "Removing keys from ip tables of type other than ip and ipv6 is not supported\n"; si->applet.ctx.cli.msg = "Removing keys from ip tables of type other than ip, ipv6 and integer is not supported\n";
si->applet.st0 = STAT_CLI_PRINT; si->applet.st0 = STAT_CLI_PRINT;
return; return;
} }