There is no functional change with this commit. It only prepares the next one.
Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
}
static int accept_msg(const struct sockaddr_nl *who,
+ struct rtnl_ctrl_data *ctrl,
struct nlmsghdr *n, void *arg)
{
FILE *fp = arg;
/*
* The controller sends one nlmsg per family
*/
-static int print_ctrl(const struct sockaddr_nl *who, struct nlmsghdr *n,
- void *arg)
+static int print_ctrl(const struct sockaddr_nl *who,
+ struct rtnl_ctrl_data *ctrl,
+ struct nlmsghdr *n, void *arg)
{
struct rtattr *tb[CTRL_ATTR_MAX + 1];
struct genlmsghdr *ghdr = NLMSG_DATA(n);
return 0;
}
+static int print_ctrl2(const struct sockaddr_nl *who,
+ struct nlmsghdr *n, void *arg)
+{
+ return print_ctrl(who, NULL, n, arg);
+}
+
static int ctrl_list(int cmd, int argc, char **argv)
{
struct rtnl_handle rth;
goto ctrl_done;
}
- if (print_ctrl(NULL, nlh, (void *) stdout) < 0) {
+ if (print_ctrl2(NULL, nlh, (void *) stdout) < 0) {
fprintf(stderr, "Dump terminated\n");
goto ctrl_done;
}
goto ctrl_done;
}
- rtnl_dump_filter(&rth, print_ctrl, stdout);
+ rtnl_dump_filter(&rth, print_ctrl2, stdout);
}
struct genl_util ctrl_genl_util = {
.name = "ctrl",
.parse_genlopt = parse_ctrl,
- .print_genlopt = print_ctrl,
+ .print_genlopt = print_ctrl2,
};
int len)
__attribute__((warn_unused_result));
+struct rtnl_ctrl_data {
+};
+
typedef int (*rtnl_filter_t)(const struct sockaddr_nl *,
struct nlmsghdr *n, void *);
+typedef int (*rtnl_listen_filter_t)(const struct sockaddr_nl *,
+ struct rtnl_ctrl_data *,
+ struct nlmsghdr *n, void *);
+
struct rtnl_dump_filter_arg
{
rtnl_filter_t filter;
return (const char *)RTA_DATA(rta);
}
-extern int rtnl_listen(struct rtnl_handle *, rtnl_filter_t handler,
+extern int rtnl_listen(struct rtnl_handle *, rtnl_listen_filter_t handler,
void *jarg);
-extern int rtnl_from_file(FILE *, rtnl_filter_t handler,
+extern int rtnl_from_file(FILE *, rtnl_listen_filter_t handler,
void *jarg);
#define NLMSG_TAIL(nmsg) \
extern int print_rule(const struct sockaddr_nl *who,
struct nlmsghdr *n, void *arg);
extern int print_netconf(const struct sockaddr_nl *who,
+ struct rtnl_ctrl_data *ctrl,
struct nlmsghdr *n, void *arg);
extern void netns_map_init(void);
extern int print_nsid(const struct sockaddr_nl *who,
return ret == n->nlmsg_len ? 0 : ret;
}
-static int show_handler(const struct sockaddr_nl *nl, struct nlmsghdr *n, void *arg)
+static int show_handler(const struct sockaddr_nl *nl,
+ struct rtnl_ctrl_data *ctrl,
+ struct nlmsghdr *n, void *arg)
{
struct ifaddrmsg *ifa = NLMSG_DATA(n);
exit(rtnl_from_file(stdin, &show_handler, NULL));
}
-static int restore_handler(const struct sockaddr_nl *nl, struct nlmsghdr *n, void *arg)
+static int restore_handler(const struct sockaddr_nl *nl,
+ struct rtnl_ctrl_data *ctrl,
+ struct nlmsghdr *n, void *arg)
{
int ret;
static int have_rtnl_newlink = -1;
static int accept_msg(const struct sockaddr_nl *who,
+ struct rtnl_ctrl_data *ctrl,
struct nlmsghdr *n, void *arg)
{
struct nlmsgerr *err = (struct nlmsgerr *)NLMSG_DATA(n);
}
static int accept_msg(const struct sockaddr_nl *who,
+ struct rtnl_ctrl_data *ctrl,
struct nlmsghdr *n, void *arg)
{
FILE *fp = (FILE*)arg;
if (n->nlmsg_type == RTM_NEWNETCONF) {
if (prefix_banner)
fprintf(fp, "[NETCONF]");
- print_netconf(who, n, arg);
+ print_netconf(who, ctrl, n, arg);
return 0;
}
if (n->nlmsg_type == NLMSG_TSTAMP) {
#define NETCONF_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct netconfmsg))))
-int print_netconf(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
+int print_netconf(const struct sockaddr_nl *who, struct rtnl_ctrl_data *ctrl,
+ struct nlmsghdr *n, void *arg)
{
FILE *fp = (FILE*)arg;
struct netconfmsg *ncm = NLMSG_DATA(n);
return 0;
}
+static int print_netconf2(const struct sockaddr_nl *who,
+ struct nlmsghdr *n, void *arg)
+{
+ return print_netconf(who, NULL, n, arg);
+}
+
void ipnetconf_reset_filter(int ifindex)
{
memset(&filter, 0, sizeof(filter));
perror("Cannot send dump request");
exit(1);
}
- if (rtnl_dump_filter(&rth, print_netconf, stdout) < 0) {
+ if (rtnl_dump_filter(&rth, print_netconf2, stdout) < 0) {
fprintf(stderr, "Dump terminated\n");
exit(1);
}
static int have_rtnl_getnsid = -1;
static int ipnetns_accept_msg(const struct sockaddr_nl *who,
+ struct rtnl_ctrl_data *ctrl,
struct nlmsghdr *n, void *arg)
{
struct nlmsgerr *err = (struct nlmsgerr *)NLMSG_DATA(n);
exit(0);
}
-static int restore_handler(const struct sockaddr_nl *nl, struct nlmsghdr *n,
- void *arg)
+static int restore_handler(const struct sockaddr_nl *nl,
+ struct rtnl_ctrl_data *ctrl,
+ struct nlmsghdr *n, void *arg)
{
int ret;
exit(rtnl_from_file(stdin, &restore_handler, NULL));
}
-static int show_handler(const struct sockaddr_nl *nl, struct nlmsghdr *n, void *arg)
+static int show_handler(const struct sockaddr_nl *nl,
+ struct rtnl_ctrl_data *ctrl,
+ struct nlmsghdr *n, void *arg)
{
print_route(nl, n, stdout);
return 0;
fwrite((void*)n1, 1, NLMSG_ALIGN(n1->nlmsg_len), fp);
}
-static int dump_msg(const struct sockaddr_nl *who, struct nlmsghdr *n,
- void *arg)
+static int dump_msg(const struct sockaddr_nl *who, struct rtnl_ctrl_data *ctrl,
+ struct nlmsghdr *n, void *arg)
{
FILE *fp = (FILE*)arg;
if (!init_phase)
return 0;
}
+static int dump_msg2(const struct sockaddr_nl *who,
+ struct nlmsghdr *n, void *arg)
+{
+ return dump_msg(who, NULL, n, arg);
+}
+
static void usage(void)
{
fprintf(stderr, "Usage: rtmon file FILE [ all | LISTofOBJECTS]\n");
write_stamp(fp);
- if (rtnl_dump_filter(&rth, dump_msg, fp) < 0) {
+ if (rtnl_dump_filter(&rth, dump_msg2, fp) < 0) {
fprintf(stderr, "Dump terminated\n");
return 1;
}
}
static int xfrm_accept_msg(const struct sockaddr_nl *who,
+ struct rtnl_ctrl_data *ctrl,
struct nlmsghdr *n, void *arg)
{
FILE *fp = (FILE*)arg;
}
int rtnl_listen(struct rtnl_handle *rtnl,
- rtnl_filter_t handler,
+ rtnl_listen_filter_t handler,
void *jarg)
{
int status;
exit(1);
}
- err = handler(&nladdr, h, jarg);
+ err = handler(&nladdr, NULL, h, jarg);
if (err < 0)
return err;
}
}
-int rtnl_from_file(FILE *rtnl, rtnl_filter_t handler,
+int rtnl_from_file(FILE *rtnl, rtnl_listen_filter_t handler,
void *jarg)
{
int status;
return -1;
}
- err = handler(&nladdr, h, jarg);
+ err = handler(&nladdr, NULL, h, jarg);
if (err < 0)
return err;
}
void *jarg)
.sp
int rtnl_listen(struct rtnl_handle *rtnl,
- int (*handler)(struct sockaddr_nl *,struct nlmsghdr *n, void *),
+ int (*handler)(struct sockaddr_nl *, struct rtnl_ctrl_data *,
+ struct nlmsghdr *n, void *),
void *jarg)
.sp
int rtnl_from_file(FILE *rtnl,
Receive netlink data after a request and pass it to
.I handler.
.B handler
-is a callback that gets the message source address, the message itself,
-and the
+is a callback that gets the message source address, anscillary data, the message
+itself, and the
.B jarg
cookie as arguments. It will get called for all received messages.
Only one message bundle is received. If there is a message
static int accept_tcmsg(const struct sockaddr_nl *who,
+ struct rtnl_ctrl_data *ctrl,
struct nlmsghdr *n, void *arg)
{
FILE *fp = (FILE*)arg;