From 23a7f0f721ff4e3b3fd4ed87f7d8e01ebad20093 Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Fri, 6 Dec 2013 15:20:36 +0100 Subject: [PATCH] rtnl: match - only match on one type at a time --- src/libsystemd-rtnl/rtnl-internal.h | 2 +- src/libsystemd-rtnl/sd-rtnl.c | 12 ++++++------ src/libsystemd-rtnl/test-rtnl.c | 12 +++++------- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/libsystemd-rtnl/rtnl-internal.h b/src/libsystemd-rtnl/rtnl-internal.h index 1e40427e5..2e0b7b8f3 100644 --- a/src/libsystemd-rtnl/rtnl-internal.h +++ b/src/libsystemd-rtnl/rtnl-internal.h @@ -39,7 +39,7 @@ struct reply_callback { struct match_callback { sd_rtnl_message_handler_t callback; - uint16_t types; + uint16_t type; void *userdata; LIST_FIELDS(struct match_callback, match_callbacks); diff --git a/src/libsystemd-rtnl/sd-rtnl.c b/src/libsystemd-rtnl/sd-rtnl.c index c933ac5fb..08b82ab2a 100644 --- a/src/libsystemd-rtnl/sd-rtnl.c +++ b/src/libsystemd-rtnl/sd-rtnl.c @@ -304,7 +304,7 @@ static int process_match(sd_rtnl *rtnl, sd_rtnl_message *m) { return r; LIST_FOREACH(match_callbacks, c, rtnl->match_callbacks) { - if (type & c->types) { + if (type == c->type) { r = c->callback(rtnl, m, c->userdata); if (r != 0) return r; @@ -825,22 +825,22 @@ int sd_rtnl_detach_event(sd_rtnl *rtnl) { } int sd_rtnl_add_match(sd_rtnl *rtnl, - uint16_t types, + uint16_t type, sd_rtnl_message_handler_t callback, void *userdata) { struct match_callback *c; assert_return(rtnl, -EINVAL); assert_return(callback, -EINVAL); - assert_return(types, -EINVAL); assert_return(!rtnl_pid_changed(rtnl), -ECHILD); + assert_return(message_type_is_link(type) || message_type_is_addr(type) || message_type_is_route(type), -ENOTSUP); c = new0(struct match_callback, 1); if (!c) return -ENOMEM; c->callback = callback; - c->types = types; + c->type = type; c->userdata = userdata; LIST_PREPEND(match_callbacks, rtnl->match_callbacks, c); @@ -849,7 +849,7 @@ int sd_rtnl_add_match(sd_rtnl *rtnl, } int sd_rtnl_remove_match(sd_rtnl *rtnl, - uint16_t types, + uint16_t type, sd_rtnl_message_handler_t callback, void *userdata) { struct match_callback *c; @@ -859,7 +859,7 @@ int sd_rtnl_remove_match(sd_rtnl *rtnl, assert_return(!rtnl_pid_changed(rtnl), -ECHILD); LIST_FOREACH(match_callbacks, c, rtnl->match_callbacks) - if (c->callback == callback && c->types == types && c->userdata == userdata) { + if (c->callback == callback && c->type == type && c->userdata == userdata) { LIST_REMOVE(match_callbacks, rtnl->match_callbacks, c); free(c); diff --git a/src/libsystemd-rtnl/test-rtnl.c b/src/libsystemd-rtnl/test-rtnl.c index a512a7b2f..6c34a8537 100644 --- a/src/libsystemd-rtnl/test-rtnl.c +++ b/src/libsystemd-rtnl/test-rtnl.c @@ -235,14 +235,12 @@ static void test_match(void) { assert(sd_rtnl_open(0, &rtnl) >= 0); - assert(sd_rtnl_add_match(rtnl, 0, &link_handler, NULL) == -EINVAL); + assert(sd_rtnl_add_match(rtnl, RTM_NEWLINK, &link_handler, NULL) >= 0); + assert(sd_rtnl_add_match(rtnl, RTM_NEWLINK, &link_handler, NULL) >= 0); - assert(sd_rtnl_add_match(rtnl, RTMGRP_LINK, &link_handler, NULL) >= 0); - assert(sd_rtnl_add_match(rtnl, RTMGRP_LINK, &link_handler, NULL) >= 0); - - assert(sd_rtnl_remove_match(rtnl, RTMGRP_LINK, &link_handler, NULL) == 1); - assert(sd_rtnl_remove_match(rtnl, RTMGRP_LINK, &link_handler, NULL) == 1); - assert(sd_rtnl_remove_match(rtnl, RTMGRP_LINK, &link_handler, NULL) == 0); + assert(sd_rtnl_remove_match(rtnl, RTM_NEWLINK, &link_handler, NULL) == 1); + assert(sd_rtnl_remove_match(rtnl, RTM_NEWLINK, &link_handler, NULL) == 1); + assert(sd_rtnl_remove_match(rtnl, RTM_NEWLINK, &link_handler, NULL) == 0); } int main(void) { -- 2.30.2