#include "rtnl-util.h"
#include "rtnl-internal.h"
-int rtnl_set_link_name(sd_rtnl *rtnl, int ifindex, const char *name) {
+int rtnl_set_link_name(sd_rtnl **rtnl, int ifindex, const char *name) {
_cleanup_rtnl_message_unref_ sd_rtnl_message *message = NULL;
int r;
assert(ifindex > 0);
assert(name);
- r = sd_rtnl_message_new_link(rtnl, &message, RTM_SETLINK, ifindex);
+ if (!*rtnl) {
+ r = sd_rtnl_open(rtnl, 0);
+ if (r < 0)
+ return r;
+ }
+
+ r = sd_rtnl_message_new_link(*rtnl, &message, RTM_SETLINK, ifindex);
if (r < 0)
return r;
if (r < 0)
return r;
- r = sd_rtnl_call(rtnl, message, 0, NULL);
+ r = sd_rtnl_call(*rtnl, message, 0, NULL);
if (r < 0)
return r;
bool rtnl_message_type_is_addr(uint16_t type);
bool rtnl_message_type_is_route(uint16_t type);
-int rtnl_set_link_name(sd_rtnl *rtnl, int ifindex, const char *name);
+int rtnl_set_link_name(sd_rtnl **rtnl, int ifindex, const char *name);
int rtnl_set_link_properties(sd_rtnl *rtnl, int ifindex, const char *alias, const struct ether_addr *mac, unsigned mtu);
int rtnl_log_parse_error(int r);
void udev_event_unref(struct udev_event *event) {
if (event == NULL)
return;
+ sd_rtnl_unref(event->rtnl);
udev_list_cleanup(&event->run_list);
udev_list_cleanup(&event->seclabel_list);
free(event->program_result);
static int rename_netif(struct udev_event *event) {
struct udev_device *dev = event->dev;
- _cleanup_rtnl_unref_ sd_rtnl *rtnl = NULL;
char name[IFNAMSIZ];
const char *oldname;
int r;
oldname = udev_device_get_sysname(dev);
- log_debug("changing net interface name from '%s' to '%s'",
- oldname, event->name);
-
strscpy(name, IFNAMSIZ, event->name);
- r = sd_rtnl_open(&rtnl, 0);
- if (r < 0)
+ r = rtnl_set_link_name(&event->rtnl, udev_device_get_ifindex(dev), name);
+ if (r < 0) {
+ log_error("error changing net interface name '%s' to '%s': %s",
+ oldname, name, strerror(-r));
return r;
+ }
- r = rtnl_set_link_name(rtnl, udev_device_get_ifindex(dev), name);
- if (r < 0)
- log_error("error changing net interface name %s to %s: %s",
- oldname, name, strerror(-r));
- else
- print_kmsg("renamed network interface %s to %s\n", oldname, name);
+ print_kmsg("renamed network interface '%s' to '%s'\n", oldname, name);
- return r;
+ return 0;
}
void udev_event_execute_rules(struct udev_event *event,
r = rename_netif(event);
if (r >= 0) {
- log_debug("renamed netif to '%s'", event->name);
-
/* remember old name */
udev_device_add_property(dev, "INTERFACE_OLD", udev_device_get_sysname(dev));
#include <signal.h>
#include "macro.h"
+#include "sd-rtnl.h"
#include "libudev.h"
#include "libudev-private.h"
#include "util.h"
int exec_delay;
usec_t birth_usec;
int fd_signal;
+ sd_rtnl *rtnl;
unsigned int builtin_run;
unsigned int builtin_ret;
bool sigterm;
#include "udev.h"
#include "udev-util.h"
+#include "rtnl-util.h"
#include "sd-daemon.h"
#include "cgroup-util.h"
#include "dev-setup.h"
case 0: {
struct udev_device *dev = NULL;
int fd_monitor;
+ _cleanup_rtnl_unref_ sd_rtnl *rtnl = NULL;
struct epoll_event ep_signal, ep_monitor;
sigset_t mask;
int rc = EXIT_SUCCESS;
}
}
+ /* needed for renaming netifs */
+ udev_event->rtnl = rtnl;
+
/* apply rules, create node, symlinks */
udev_event_execute_rules(udev_event, event_timeout_usec, rules, &sigmask_orig);
udev_event_execute_run(udev_event, event_timeout_usec, &sigmask_orig);
+ /* in case rtnl was initialized */
+ rtnl = sd_rtnl_ref(udev_event->rtnl);
+
/* apply/restore inotify watch */
if (udev_event->inotify_watch) {
udev_watch_begin(udev, dev);