|
|
8d419f |
From 3852f94de9582dc1acb44844579873cd0e2f3162 Mon Sep 17 00:00:00 2001
|
|
|
8d419f |
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
|
|
8d419f |
Date: Tue, 11 Jan 2022 15:12:42 +0100
|
|
|
8d419f |
Subject: [PATCH] networkctl: open the bus just once
|
|
|
8d419f |
|
|
|
8d419f |
We'd connect to the bus twice: the first time to check networkd namespace,
|
|
|
8d419f |
and then the second time to do the deed we were asked to do. It's nicer
|
|
|
8d419f |
to open the bus just once, for efficience and also to avoid the open call
|
|
|
8d419f |
in all functions.
|
|
|
8d419f |
|
|
|
8d419f |
An ASSERT_PTR helper is added:
|
|
|
8d419f |
- sd_bus *bus = userdata;
|
|
|
8d419f |
...
|
|
|
8d419f |
- assert(bus);
|
|
|
8d419f |
+ sd_bus *bus = ASSERT_PTR(userdata);
|
|
|
8d419f |
...
|
|
|
8d419f |
|
|
|
8d419f |
It can be used in other place too, but I'm leaving that for a later
|
|
|
8d419f |
refactoring.
|
|
|
8d419f |
|
|
|
8d419f |
(cherry picked from commit d821e40ca96d2b14216f7a18e4512364bfb83628)
|
|
|
8d419f |
Related: #2087652
|
|
|
8d419f |
---
|
|
|
8d419f |
src/fundamental/macro-fundamental.h | 8 ++++
|
|
|
8d419f |
src/network/networkctl.c | 74 ++++++++++-------------------
|
|
|
8d419f |
2 files changed, 33 insertions(+), 49 deletions(-)
|
|
|
8d419f |
|
|
|
8d419f |
diff --git a/src/fundamental/macro-fundamental.h b/src/fundamental/macro-fundamental.h
|
|
|
8d419f |
index f87839d47b..d597c743bb 100644
|
|
|
8d419f |
--- a/src/fundamental/macro-fundamental.h
|
|
|
8d419f |
+++ b/src/fundamental/macro-fundamental.h
|
|
|
8d419f |
@@ -66,6 +66,14 @@
|
|
|
8d419f |
#define free(a) FreePool(a)
|
|
|
8d419f |
#endif
|
|
|
8d419f |
|
|
|
8d419f |
+/* This passes the argument through after (if asserts are enabled) checking that it is not null. */
|
|
|
8d419f |
+#define ASSERT_PTR(expr) \
|
|
|
8d419f |
+ ({ \
|
|
|
8d419f |
+ typeof(expr) _expr_ = (expr); \
|
|
|
8d419f |
+ assert(_expr_); \
|
|
|
8d419f |
+ _expr_; \
|
|
|
8d419f |
+ })
|
|
|
8d419f |
+
|
|
|
8d419f |
#if defined(static_assert)
|
|
|
8d419f |
#define assert_cc(expr) \
|
|
|
8d419f |
static_assert(expr, #expr)
|
|
|
8d419f |
diff --git a/src/network/networkctl.c b/src/network/networkctl.c
|
|
|
8d419f |
index 68dd4b185c..c35f851bdb 100644
|
|
|
8d419f |
--- a/src/network/networkctl.c
|
|
|
8d419f |
+++ b/src/network/networkctl.c
|
|
|
8d419f |
@@ -79,17 +79,12 @@ static bool arg_full = false;
|
|
|
8d419f |
static unsigned arg_lines = 10;
|
|
|
8d419f |
static JsonFormatFlags arg_json_format_flags = JSON_FORMAT_OFF;
|
|
|
8d419f |
|
|
|
8d419f |
-static int get_description(JsonVariant **ret) {
|
|
|
8d419f |
+static int get_description(sd_bus *bus, JsonVariant **ret) {
|
|
|
8d419f |
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
|
|
8d419f |
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
|
|
|
8d419f |
- _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
|
|
|
8d419f |
const char *text = NULL;
|
|
|
8d419f |
int r;
|
|
|
8d419f |
|
|
|
8d419f |
- r = sd_bus_open_system(&bus;;
|
|
|
8d419f |
- if (r < 0)
|
|
|
8d419f |
- return log_error_errno(r, "Failed to connect system bus: %m");
|
|
|
8d419f |
-
|
|
|
8d419f |
r = bus_call_method(bus, bus_network_mgr, "Describe", &error, &reply, NULL);
|
|
|
8d419f |
if (r < 0)
|
|
|
8d419f |
return log_error_errno(r, "Failed to get description: %s", bus_error_message(&error, r));
|
|
|
8d419f |
@@ -105,11 +100,11 @@ static int get_description(JsonVariant **ret) {
|
|
|
8d419f |
return 0;
|
|
|
8d419f |
}
|
|
|
8d419f |
|
|
|
8d419f |
-static int dump_manager_description(void) {
|
|
|
8d419f |
+static int dump_manager_description(sd_bus *bus) {
|
|
|
8d419f |
_cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
|
|
|
8d419f |
int r;
|
|
|
8d419f |
|
|
|
8d419f |
- r = get_description(&v);
|
|
|
8d419f |
+ r = get_description(bus, &v);
|
|
|
8d419f |
if (r < 0)
|
|
|
8d419f |
return r;
|
|
|
8d419f |
|
|
|
8d419f |
@@ -117,14 +112,14 @@ static int dump_manager_description(void) {
|
|
|
8d419f |
return 0;
|
|
|
8d419f |
}
|
|
|
8d419f |
|
|
|
8d419f |
-static int dump_link_description(char **patterns) {
|
|
|
8d419f |
+static int dump_link_description(sd_bus *bus, char **patterns) {
|
|
|
8d419f |
_cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
|
|
|
8d419f |
_cleanup_free_ bool *matched_patterns = NULL;
|
|
|
8d419f |
JsonVariant *i;
|
|
|
8d419f |
size_t c = 0;
|
|
|
8d419f |
int r;
|
|
|
8d419f |
|
|
|
8d419f |
- r = get_description(&v);
|
|
|
8d419f |
+ r = get_description(bus, &v);
|
|
|
8d419f |
if (r < 0)
|
|
|
8d419f |
return r;
|
|
|
8d419f |
|
|
|
8d419f |
@@ -790,6 +785,7 @@ static int acquire_link_info(sd_bus *bus, sd_netlink *rtnl, char **patterns, Lin
|
|
|
8d419f |
}
|
|
|
8d419f |
|
|
|
8d419f |
static int list_links(int argc, char *argv[], void *userdata) {
|
|
|
8d419f |
+ sd_bus *bus = ASSERT_PTR(userdata);
|
|
|
8d419f |
_cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
|
|
|
8d419f |
_cleanup_(link_info_array_freep) LinkInfo *links = NULL;
|
|
|
8d419f |
_cleanup_(table_unrefp) Table *table = NULL;
|
|
|
8d419f |
@@ -798,9 +794,9 @@ static int list_links(int argc, char *argv[], void *userdata) {
|
|
|
8d419f |
|
|
|
8d419f |
if (arg_json_format_flags != JSON_FORMAT_OFF) {
|
|
|
8d419f |
if (arg_all || argc <= 1)
|
|
|
8d419f |
- return dump_manager_description();
|
|
|
8d419f |
+ return dump_manager_description(bus);
|
|
|
8d419f |
else
|
|
|
8d419f |
- return dump_link_description(strv_skip(argv, 1));
|
|
|
8d419f |
+ return dump_link_description(bus, strv_skip(argv, 1));
|
|
|
8d419f |
}
|
|
|
8d419f |
|
|
|
8d419f |
r = sd_netlink_open(&rtnl);
|
|
|
8d419f |
@@ -2383,7 +2379,7 @@ static int system_status(sd_netlink *rtnl, sd_hwdb *hwdb) {
|
|
|
8d419f |
}
|
|
|
8d419f |
|
|
|
8d419f |
static int link_status(int argc, char *argv[], void *userdata) {
|
|
|
8d419f |
- _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
|
|
|
8d419f |
+ sd_bus *bus = ASSERT_PTR(userdata);
|
|
|
8d419f |
_cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
|
|
|
8d419f |
_cleanup_(sd_hwdb_unrefp) sd_hwdb *hwdb = NULL;
|
|
|
8d419f |
_cleanup_(link_info_array_freep) LinkInfo *links = NULL;
|
|
|
8d419f |
@@ -2391,17 +2387,13 @@ static int link_status(int argc, char *argv[], void *userdata) {
|
|
|
8d419f |
|
|
|
8d419f |
if (arg_json_format_flags != JSON_FORMAT_OFF) {
|
|
|
8d419f |
if (arg_all || argc <= 1)
|
|
|
8d419f |
- return dump_manager_description();
|
|
|
8d419f |
+ return dump_manager_description(bus);
|
|
|
8d419f |
else
|
|
|
8d419f |
- return dump_link_description(strv_skip(argv, 1));
|
|
|
8d419f |
+ return dump_link_description(bus, strv_skip(argv, 1));
|
|
|
8d419f |
}
|
|
|
8d419f |
|
|
|
8d419f |
pager_open(arg_pager_flags);
|
|
|
8d419f |
|
|
|
8d419f |
- r = sd_bus_open_system(&bus;;
|
|
|
8d419f |
- if (r < 0)
|
|
|
8d419f |
- return log_error_errno(r, "Failed to connect system bus: %m");
|
|
|
8d419f |
-
|
|
|
8d419f |
r = sd_netlink_open(&rtnl);
|
|
|
8d419f |
if (r < 0)
|
|
|
8d419f |
return log_error_errno(r, "Failed to connect to netlink: %m");
|
|
|
8d419f |
@@ -2738,14 +2730,10 @@ static int link_renew_one(sd_bus *bus, int index, const char *name) {
|
|
|
8d419f |
}
|
|
|
8d419f |
|
|
|
8d419f |
static int link_renew(int argc, char *argv[], void *userdata) {
|
|
|
8d419f |
- _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
|
|
|
8d419f |
+ sd_bus *bus = ASSERT_PTR(userdata);
|
|
|
8d419f |
_cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
|
|
|
8d419f |
int index, k = 0, r;
|
|
|
8d419f |
|
|
|
8d419f |
- r = sd_bus_open_system(&bus;;
|
|
|
8d419f |
- if (r < 0)
|
|
|
8d419f |
- return log_error_errno(r, "Failed to connect system bus: %m");
|
|
|
8d419f |
-
|
|
|
8d419f |
for (int i = 1; i < argc; i++) {
|
|
|
8d419f |
index = rtnl_resolve_interface_or_warn(&rtnl, argv[i]);
|
|
|
8d419f |
if (index < 0)
|
|
|
8d419f |
@@ -2772,14 +2760,10 @@ static int link_force_renew_one(sd_bus *bus, int index, const char *name) {
|
|
|
8d419f |
}
|
|
|
8d419f |
|
|
|
8d419f |
static int link_force_renew(int argc, char *argv[], void *userdata) {
|
|
|
8d419f |
- _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
|
|
|
8d419f |
+ sd_bus *bus = ASSERT_PTR(userdata);
|
|
|
8d419f |
_cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
|
|
|
8d419f |
int k = 0, r;
|
|
|
8d419f |
|
|
|
8d419f |
- r = sd_bus_open_system(&bus;;
|
|
|
8d419f |
- if (r < 0)
|
|
|
8d419f |
- return log_error_errno(r, "Failed to connect system bus: %m");
|
|
|
8d419f |
-
|
|
|
8d419f |
for (int i = 1; i < argc; i++) {
|
|
|
8d419f |
int index = rtnl_resolve_interface_or_warn(&rtnl, argv[i]);
|
|
|
8d419f |
if (index < 0)
|
|
|
8d419f |
@@ -2794,14 +2778,10 @@ static int link_force_renew(int argc, char *argv[], void *userdata) {
|
|
|
8d419f |
}
|
|
|
8d419f |
|
|
|
8d419f |
static int verb_reload(int argc, char *argv[], void *userdata) {
|
|
|
8d419f |
+ sd_bus *bus = ASSERT_PTR(userdata);
|
|
|
8d419f |
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
|
|
8d419f |
- _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
|
|
|
8d419f |
int r;
|
|
|
8d419f |
|
|
|
8d419f |
- r = sd_bus_open_system(&bus;;
|
|
|
8d419f |
- if (r < 0)
|
|
|
8d419f |
- return log_error_errno(r, "Failed to connect system bus: %m");
|
|
|
8d419f |
-
|
|
|
8d419f |
r = bus_call_method(bus, bus_network_mgr, "Reload", &error, NULL, NULL);
|
|
|
8d419f |
if (r < 0)
|
|
|
8d419f |
return log_error_errno(r, "Failed to reload network settings: %m");
|
|
|
8d419f |
@@ -2810,17 +2790,13 @@ static int verb_reload(int argc, char *argv[], void *userdata) {
|
|
|
8d419f |
}
|
|
|
8d419f |
|
|
|
8d419f |
static int verb_reconfigure(int argc, char *argv[], void *userdata) {
|
|
|
8d419f |
+ sd_bus *bus = ASSERT_PTR(userdata);
|
|
|
8d419f |
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
|
|
8d419f |
- _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
|
|
|
8d419f |
_cleanup_(sd_netlink_unrefp) sd_netlink *rtnl = NULL;
|
|
|
8d419f |
_cleanup_set_free_ Set *indexes = NULL;
|
|
|
8d419f |
int index, r;
|
|
|
8d419f |
void *p;
|
|
|
8d419f |
|
|
|
8d419f |
- r = sd_bus_open_system(&bus;;
|
|
|
8d419f |
- if (r < 0)
|
|
|
8d419f |
- return log_error_errno(r, "Failed to connect system bus: %m");
|
|
|
8d419f |
-
|
|
|
8d419f |
indexes = set_new(NULL);
|
|
|
8d419f |
if (!indexes)
|
|
|
8d419f |
return log_oom();
|
|
|
8d419f |
@@ -2968,7 +2944,7 @@ static int parse_argv(int argc, char *argv[]) {
|
|
|
8d419f |
return 1;
|
|
|
8d419f |
}
|
|
|
8d419f |
|
|
|
8d419f |
-static int networkctl_main(int argc, char *argv[]) {
|
|
|
8d419f |
+static int networkctl_main(sd_bus *bus, int argc, char *argv[]) {
|
|
|
8d419f |
static const Verb verbs[] = {
|
|
|
8d419f |
{ "list", VERB_ANY, VERB_ANY, VERB_DEFAULT, list_links },
|
|
|
8d419f |
{ "status", VERB_ANY, VERB_ANY, 0, link_status },
|
|
|
8d419f |
@@ -2984,20 +2960,15 @@ static int networkctl_main(int argc, char *argv[]) {
|
|
|
8d419f |
{}
|
|
|
8d419f |
};
|
|
|
8d419f |
|
|
|
8d419f |
- return dispatch_verb(argc, argv, verbs, NULL);
|
|
|
8d419f |
+ return dispatch_verb(argc, argv, verbs, bus);
|
|
|
8d419f |
}
|
|
|
8d419f |
|
|
|
8d419f |
-static int check_netns_match(void) {
|
|
|
8d419f |
+static int check_netns_match(sd_bus *bus) {
|
|
|
8d419f |
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
|
|
8d419f |
- _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
|
|
|
8d419f |
struct stat st;
|
|
|
8d419f |
uint64_t id;
|
|
|
8d419f |
int r;
|
|
|
8d419f |
|
|
|
8d419f |
- r = sd_bus_open_system(&bus;;
|
|
|
8d419f |
- if (r < 0)
|
|
|
8d419f |
- return log_error_errno(r, "Failed to connect system bus: %m");
|
|
|
8d419f |
-
|
|
|
8d419f |
r = sd_bus_get_property_trivial(
|
|
|
8d419f |
bus,
|
|
|
8d419f |
"org.freedesktop.network1",
|
|
|
8d419f |
@@ -3035,6 +3006,7 @@ static void warn_networkd_missing(void) {
|
|
|
8d419f |
}
|
|
|
8d419f |
|
|
|
8d419f |
static int run(int argc, char* argv[]) {
|
|
|
8d419f |
+ _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
|
|
|
8d419f |
int r;
|
|
|
8d419f |
|
|
|
8d419f |
log_setup();
|
|
|
8d419f |
@@ -3043,13 +3015,17 @@ static int run(int argc, char* argv[]) {
|
|
|
8d419f |
if (r <= 0)
|
|
|
8d419f |
return r;
|
|
|
8d419f |
|
|
|
8d419f |
- r = check_netns_match();
|
|
|
8d419f |
+ r = sd_bus_open_system(&bus;;
|
|
|
8d419f |
+ if (r < 0)
|
|
|
8d419f |
+ return log_error_errno(r, "Failed to connect system bus: %m");
|
|
|
8d419f |
+
|
|
|
8d419f |
+ r = check_netns_match(bus);
|
|
|
8d419f |
if (r < 0)
|
|
|
8d419f |
return r;
|
|
|
8d419f |
|
|
|
8d419f |
warn_networkd_missing();
|
|
|
8d419f |
|
|
|
8d419f |
- return networkctl_main(argc, argv);
|
|
|
8d419f |
+ return networkctl_main(bus, argc, argv);
|
|
|
8d419f |
}
|
|
|
8d419f |
|
|
|
8d419f |
DEFINE_MAIN_FUNCTION(run);
|