mirror of
https://git.proxmox.com/git/mirror_iproute2
synced 2025-10-05 03:13:04 +00:00
ss: Make leading ":" always optional for sport and dport
The sport and dport conditions in expressions were inconsistent on whether there should be a ":" at the beginning of the port when only a port was provided depending on the family. The link and netlink families required a ":" to work. The vsock family required the ":" to be absent. The inet and inet6 families work with or without a leading ":". This makes the leading ":" optional in all cases, so if sport or dport are used, then it works with a leading ":" or without one, as inet and inet6 did. Signed-off-by: Thayne McCombs <astrothayne@gmail.com> Signed-off-by: David Ahern <dsahern@kernel.org>
This commit is contained in:
parent
33e2471e8f
commit
c7897ec2a6
46
misc/ss.c
46
misc/ss.c
@ -2111,6 +2111,18 @@ static void vsock_set_inet_prefix(inet_prefix *a, __u32 cid)
|
|||||||
memcpy(a->data, &cid, sizeof(cid));
|
memcpy(a->data, &cid, sizeof(cid));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char* find_port(char *addr, bool is_port)
|
||||||
|
{
|
||||||
|
char *port = NULL;
|
||||||
|
if (is_port)
|
||||||
|
port = addr;
|
||||||
|
else
|
||||||
|
port = strchr(addr, ':');
|
||||||
|
if (port && *port == ':')
|
||||||
|
*port++ = '\0';
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
void *parse_hostcond(char *addr, bool is_port)
|
void *parse_hostcond(char *addr, bool is_port)
|
||||||
{
|
{
|
||||||
char *port = NULL;
|
char *port = NULL;
|
||||||
@ -2152,17 +2164,16 @@ void *parse_hostcond(char *addr, bool is_port)
|
|||||||
if (fam == AF_PACKET) {
|
if (fam == AF_PACKET) {
|
||||||
a.addr.family = AF_PACKET;
|
a.addr.family = AF_PACKET;
|
||||||
a.addr.bitlen = 0;
|
a.addr.bitlen = 0;
|
||||||
port = strchr(addr, ':');
|
port = find_port(addr, is_port);
|
||||||
if (port) {
|
if (port) {
|
||||||
*port = 0;
|
if (*port && strcmp(port, "*")) {
|
||||||
if (port[1] && strcmp(port+1, "*")) {
|
if (get_integer(&a.port, port, 0)) {
|
||||||
if (get_integer(&a.port, port+1, 0)) {
|
if ((a.port = xll_name_to_index(port)) <= 0)
|
||||||
if ((a.port = xll_name_to_index(port+1)) <= 0)
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (addr[0] && strcmp(addr, "*")) {
|
if (!is_port && addr[0] && strcmp(addr, "*")) {
|
||||||
unsigned short tmp;
|
unsigned short tmp;
|
||||||
|
|
||||||
a.addr.bitlen = 32;
|
a.addr.bitlen = 32;
|
||||||
@ -2176,19 +2187,18 @@ void *parse_hostcond(char *addr, bool is_port)
|
|||||||
if (fam == AF_NETLINK) {
|
if (fam == AF_NETLINK) {
|
||||||
a.addr.family = AF_NETLINK;
|
a.addr.family = AF_NETLINK;
|
||||||
a.addr.bitlen = 0;
|
a.addr.bitlen = 0;
|
||||||
port = strchr(addr, ':');
|
port = find_port(addr, is_port);
|
||||||
if (port) {
|
if (port) {
|
||||||
*port = 0;
|
if (*port && strcmp(port, "*")) {
|
||||||
if (port[1] && strcmp(port+1, "*")) {
|
if (get_integer(&a.port, port, 0)) {
|
||||||
if (get_integer(&a.port, port+1, 0)) {
|
if (strcmp(port, "kernel") == 0)
|
||||||
if (strcmp(port+1, "kernel") == 0)
|
|
||||||
a.port = 0;
|
a.port = 0;
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (addr[0] && strcmp(addr, "*")) {
|
if (!is_port && addr[0] && strcmp(addr, "*")) {
|
||||||
a.addr.bitlen = 32;
|
a.addr.bitlen = 32;
|
||||||
if (nl_proto_a2n(&a.addr.data[0], addr) == -1)
|
if (nl_proto_a2n(&a.addr.data[0], addr) == -1)
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -2201,21 +2211,13 @@ void *parse_hostcond(char *addr, bool is_port)
|
|||||||
|
|
||||||
a.addr.family = AF_VSOCK;
|
a.addr.family = AF_VSOCK;
|
||||||
|
|
||||||
if (is_port)
|
port = find_port(addr, is_port);
|
||||||
port = addr;
|
|
||||||
else {
|
|
||||||
port = strchr(addr, ':');
|
|
||||||
if (port) {
|
|
||||||
*port = '\0';
|
|
||||||
port++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (port && strcmp(port, "*") &&
|
if (port && strcmp(port, "*") &&
|
||||||
get_u32((__u32 *)&a.port, port, 0))
|
get_u32((__u32 *)&a.port, port, 0))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (addr[0] && strcmp(addr, "*")) {
|
if (!is_port && addr[0] && strcmp(addr, "*")) {
|
||||||
a.addr.bitlen = 32;
|
a.addr.bitlen = 32;
|
||||||
if (get_u32(&cid, addr, 0))
|
if (get_u32(&cid, addr, 0))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user