#include <string.h>
#include <time.h>
#include <net/if.h>
-#include <sys/ioctl.h>
#include <sys/prctl.h>
#include <sys/poll.h>
#include <sys/epoll.h>
#include <sys/wait.h>
-#include <sys/socket.h>
#include <sys/signalfd.h>
-#include <linux/sockios.h>
#include "udev.h"
+#include "rtnl-util.h"
struct udev_event *udev_event_new(struct udev_device *dev)
{
event->dev = dev;
event->udev = udev;
udev_list_init(udev, &event->run_list, false);
+ udev_list_init(udev, &event->seclabel_list, false);
event->fd_signal = -1;
event->birth_usec = now(CLOCK_MONOTONIC);
event->timeout_usec = 30 * 1000 * 1000;
if (event == NULL)
return;
udev_list_cleanup(&event->run_list);
+ udev_list_cleanup(&event->seclabel_list);
free(event->program_result);
free(event->name);
free(event);
static int rename_netif(struct udev_event *event)
{
struct udev_device *dev = event->dev;
- int sk;
- struct ifreq ifr;
- int err;
+ _cleanup_sd_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'\n",
- udev_device_get_sysname(dev), event->name);
+ oldname, event->name);
- sk = socket(PF_INET, SOCK_DGRAM, 0);
- if (sk < 0) {
- err = -errno;
- log_error("error opening socket: %m\n");
- return err;
- }
+ strscpy(name, IFNAMSIZ, event->name);
- memset(&ifr, 0x00, sizeof(struct ifreq));
- strscpy(ifr.ifr_name, IFNAMSIZ, udev_device_get_sysname(dev));
- strscpy(ifr.ifr_newname, IFNAMSIZ, event->name);
- err = ioctl(sk, SIOCSIFNAME, &ifr);
- if (err >= 0) {
- print_kmsg("renamed network interface %s to %s\n", ifr.ifr_name, ifr.ifr_newname);
- } else {
- err = -errno;
- log_error("error changing net interface name %s to %s: %m\n", ifr.ifr_name, ifr.ifr_newname);
- }
- close(sk);
- return err;
+ r = sd_rtnl_open(0, &rtnl);
+ if (r < 0)
+ 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", oldname, name);
+
+ return r;
}
int udev_event_execute_rules(struct udev_event *event, struct udev_rules *rules, const sigset_t *sigmask)
}
if (major(udev_device_get_devnum(dev)) > 0) {
+ bool apply;
+
/* remove/update possible left-over symlinks from old database entry */
if (event->dev_db != NULL)
udev_node_update_old_links(dev, event->dev_db);
}
}
- udev_node_add(dev, event->owner_set || event->group_set || event->mode_set,
- event->mode, event->uid, event->gid);
+ apply = streq(udev_device_get_action(dev), "add") || event->owner_set || event->group_set || event->mode_set;
+ udev_node_add(dev, apply, event->mode, event->uid, event->gid, &event->seclabel_list);
}
/* preserve old, or get new initialization timestamp */