chiark / gitweb /
sd-rtnl: introduce sd_rtnl_new_from_netlink
authorTom Gundersen <teg@jklm.no>
Sun, 1 Feb 2015 21:12:33 +0000 (22:12 +0100)
committerTom Gundersen <teg@jklm.no>
Mon, 2 Feb 2015 10:57:52 +0000 (11:57 +0100)
src/libsystemd/sd-rtnl/sd-rtnl.c
src/systemd/sd-rtnl.h

index 7f1ec308a8e79a4d739d76684db3b5c8751f193c..767c583735211dcf35b8533348a7b504ab7b4503 100644 (file)
@@ -67,6 +67,31 @@ static int sd_rtnl_new(sd_rtnl **ret) {
         return 0;
 }
 
+int sd_rtnl_new_from_netlink(sd_rtnl **ret, int fd) {
+        _cleanup_rtnl_unref_ sd_rtnl *rtnl = NULL;
+        socklen_t addrlen;
+        int r;
+
+        assert_return(ret, -EINVAL);
+
+        r = sd_rtnl_new(ret);
+        if (r < 0)
+                return r;
+
+        addrlen = sizeof(rtnl->sockaddr);
+
+        r = getsockname(fd, &rtnl->sockaddr.sa, &addrlen);
+        if (r < 0)
+                return -errno;
+
+        rtnl->fd = fd;
+
+        *ret = rtnl;
+        rtnl = NULL;
+
+        return 0;
+}
+
 static bool rtnl_pid_changed(sd_rtnl *rtnl) {
         assert(rtnl);
 
@@ -126,7 +151,7 @@ static int rtnl_open_fd_ap(sd_rtnl **ret, int fd, unsigned n_groups, va_list ap)
 
         r = getsockname(fd, &rtnl->sockaddr.sa, &addrlen);
         if (r < 0)
-                return r;
+                return -errno;
 
         rtnl->fd = fd;
 
index 79191723c61803e7a7ad74bcc5125b76aed13d77..0eb55470e9554dfeec66d1ad86834c52f9b2bc40 100644 (file)
@@ -41,6 +41,7 @@ typedef struct sd_rtnl_message sd_rtnl_message;
 typedef int (*sd_rtnl_message_handler_t)(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata);
 
 /* bus */
+int sd_rtnl_new_from_netlink(sd_rtnl **nl, int fd);
 int sd_rtnl_open(sd_rtnl **nl, unsigned n_groups, ...);
 int sd_rtnl_open_fd(sd_rtnl **nl, int fd, unsigned n_groups, ...);
 int sd_rtnl_inc_rcvbuf(const sd_rtnl *const rtnl, const int size);