Commit f960c92a authored by Vlad Dogaru's avatar Vlad Dogaru Committed by Stephen Hemminger

iproute2: support listing devices by group

User can specify device group to list by using the group keyword:

	ip link show group test

If no group is specified, 0 (default) is implied.
Signed-off-by: default avatarVlad Dogaru <ddvlad@rosedu.org>
parent dd4b25a0
# device group names
0 default
......@@ -13,6 +13,7 @@ int rtnl_rtscope_a2n(__u32 *id, char *arg);
int rtnl_rttable_a2n(__u32 *id, char *arg);
int rtnl_rtrealm_a2n(__u32 *id, char *arg);
int rtnl_dsfield_a2n(__u32 *id, char *arg);
int rtnl_group_a2n(int *id, char *arg);
const char *inet_proto_n2a(int proto, char *buf, int len);
int inet_proto_a2n(char *buf);
......
......@@ -49,6 +49,7 @@ static struct
char *flushb;
int flushp;
int flushe;
int group;
} filter;
static int do_link;
......@@ -246,6 +247,12 @@ int print_linkinfo(const struct sockaddr_nl *who,
fnmatch(filter.label, RTA_DATA(tb[IFLA_IFNAME]), 0))
return 0;
if (tb[IFLA_GROUP]) {
int group = *(int*)RTA_DATA(tb[IFLA_GROUP]);
if (group != filter.group)
return -1;
}
if (n->nlmsg_type == RTM_DELLINK)
fprintf(fp, "Deleted ");
......@@ -718,9 +725,12 @@ static int ipaddr_list_or_flush(int argc, char **argv, int flush)
if (filter.family == AF_UNSPEC)
filter.family = preferred_family;
filter.group = INIT_NETDEV_GROUP;
if (flush) {
if (argc <= 0) {
fprintf(stderr, "Flush requires arguments.\n");
return -1;
}
if (filter.family == AF_PACKET) {
......@@ -779,6 +789,10 @@ static int ipaddr_list_or_flush(int argc, char **argv, int flush)
} else if (strcmp(*argv, "label") == 0) {
NEXT_ARG();
filter.label = *argv;
} else if (strcmp(*argv, "group") == 0) {
NEXT_ARG();
if (rtnl_group_a2n(&filter.group, *argv))
invarg("Invalid \"group\" value\n", *argv);
} else {
if (strcmp(*argv, "dev") == 0) {
NEXT_ARG();
......
......@@ -71,7 +71,7 @@ void iplink_usage(void)
fprintf(stderr, " [ vf NUM [ mac LLADDR ]\n");
fprintf(stderr, " [ vlan VLANID [ qos VLAN-QOS ] ]\n");
fprintf(stderr, " [ rate TXRATE ] ] \n");
fprintf(stderr, " ip link show [ DEVICE ]\n");
fprintf(stderr, " ip link show [ DEVICE | group GROUP ]\n");
if (iplink_have_newlink()) {
fprintf(stderr, "\n");
......
......@@ -447,3 +447,53 @@ int rtnl_dsfield_a2n(__u32 *id, char *arg)
return 0;
}
static struct rtnl_hash_entry dflt_group_entry = { .id = 0, .name = "default" };
static struct rtnl_hash_entry * rtnl_group_hash[256] = {
[0] = &dflt_group_entry,
};
static int rtnl_group_init;
static void rtnl_group_initialize(void)
{
rtnl_group_init = 1;
rtnl_hash_initialize("/etc/iproute2/group",
rtnl_group_hash, 256);
}
int rtnl_group_a2n(int *id, char *arg)
{
static char *cache = NULL;
static unsigned long res;
struct rtnl_hash_entry *entry;
char *end;
int i;
if (cache && strcmp(cache, arg) == 0) {
*id = res;
return 0;
}
if (!rtnl_group_init)
rtnl_group_initialize();
for (i=0; i<256; i++) {
entry = rtnl_group_hash[i];
while (entry && strcmp(entry->name, arg))
entry = entry->next;
if (entry) {
cache = entry->name;
res = entry->id;
*id = res;
return 0;
}
}
i = strtol(arg, &end, 0);
if (!end || end == arg || *end || i < 0)
return -1;
*id = i;
return 0;
}
......@@ -99,7 +99,9 @@ ip \- show / manipulate routing, devices, policy routing and tunnels
.ti -8
.B ip link show
.RI "[ " DEVICE " ]"
.RI "[ " DEVICE " | "
.B group
.IR GROUP " ]"
.ti -8
.BR "ip addr" " { " add " | " del " } "
......@@ -1056,7 +1058,12 @@ call.
.BI dev " NAME " (default)
.I NAME
specifies the network device to show.
If this argument is omitted all devices are listed.
If this argument is omitted all devices in the default group are listed.
.TP
.BI group " GROUP "
.I GROUP
specifies what group of devices to show.
.TP
.B up
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment