mirror of
https://git.proxmox.com/git/mirror_iproute2
synced 2025-08-13 22:20:26 +00:00
lib: Exec func on each netns
Added possibility to run some func on each netns. Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
This commit is contained in:
parent
4c7d75de95
commit
e998e118dd
@ -44,5 +44,11 @@ static inline int setns(int fd, int nstype)
|
||||
|
||||
extern int netns_switch(char *netns);
|
||||
extern int netns_get_fd(const char *netns);
|
||||
extern int netns_foreach(int (*func)(char *nsname, void *arg), void *arg);
|
||||
|
||||
struct netns_func {
|
||||
int (*func)(char *nsname, void *arg);
|
||||
void *arg;
|
||||
};
|
||||
|
||||
#endif /* __NAMESPACE_H__ */
|
||||
|
@ -5,6 +5,7 @@
|
||||
#include <asm/types.h>
|
||||
#include <resolv.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "libnetlink.h"
|
||||
#include "ll_map.h"
|
||||
@ -162,4 +163,7 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req,
|
||||
char **name, char **type, char **link, char **dev,
|
||||
int *group, int *index);
|
||||
|
||||
extern int do_each_netns(int (*func)(char *nsname, void *arg), void *arg,
|
||||
bool show_label);
|
||||
|
||||
#endif /* __UTILS_H__ */
|
||||
|
@ -99,3 +99,25 @@ int netns_get_fd(const char *name)
|
||||
}
|
||||
return open(path, O_RDONLY);
|
||||
}
|
||||
|
||||
int netns_foreach(int (*func)(char *nsname, void *arg), void *arg)
|
||||
{
|
||||
DIR *dir;
|
||||
struct dirent *entry;
|
||||
|
||||
dir = opendir(NETNS_RUN_DIR);
|
||||
if (!dir)
|
||||
return -1;
|
||||
|
||||
while ((entry = readdir(dir)) != NULL) {
|
||||
if (strcmp(entry->d_name, ".") == 0)
|
||||
continue;
|
||||
if (strcmp(entry->d_name, "..") == 0)
|
||||
continue;
|
||||
if (func(entry->d_name, arg))
|
||||
break;
|
||||
}
|
||||
|
||||
closedir(dir);
|
||||
return 0;
|
||||
}
|
||||
|
28
lib/utils.c
28
lib/utils.c
@ -31,6 +31,7 @@
|
||||
|
||||
|
||||
#include "utils.h"
|
||||
#include "namespace.h"
|
||||
|
||||
int timestamp_short = 0;
|
||||
|
||||
@ -878,3 +879,30 @@ void print_nlmsg_timestamp(FILE *fp, const struct nlmsghdr *n)
|
||||
tstr[strlen(tstr)-1] = 0;
|
||||
fprintf(fp, "Timestamp: %s %lu us\n", tstr, usecs);
|
||||
}
|
||||
|
||||
static int on_netns(char *nsname, void *arg)
|
||||
{
|
||||
struct netns_func *f = arg;
|
||||
|
||||
if (netns_switch(nsname))
|
||||
return -1;
|
||||
|
||||
return f->func(nsname, f->arg);
|
||||
}
|
||||
|
||||
static int on_netns_label(char *nsname, void *arg)
|
||||
{
|
||||
printf("\nnetns: %s\n", nsname);
|
||||
return on_netns(nsname, arg);
|
||||
}
|
||||
|
||||
int do_each_netns(int (*func)(char *nsname, void *arg), void *arg,
|
||||
bool show_label)
|
||||
{
|
||||
struct netns_func nsf = { .func = func, .arg = arg };
|
||||
|
||||
if (show_label)
|
||||
return netns_foreach(on_netns_label, &nsf);
|
||||
|
||||
return netns_foreach(on_netns, &nsf);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user