rtnetlink: Switch to stdplus::Fd

Simplifies the code a little bit and will allow us to remove the
Descriptor.

Change-Id: If78ea4478fed9f818bcf1d00ef1c952cb5c7df00
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/src/network_manager_main.cpp b/src/network_manager_main.cpp
index 802b7d6..b72e32d 100644
--- a/src/network_manager_main.cpp
+++ b/src/network_manager_main.cpp
@@ -265,19 +265,6 @@
 } // namespace network
 } // namespace phosphor
 
-void createNetLinkSocket(phosphor::Descriptor& smartSock)
-{
-    // RtnetLink socket
-    auto fd = socket(PF_NETLINK, SOCK_RAW | SOCK_NONBLOCK, NETLINK_ROUTE);
-    if (fd < 0)
-    {
-        log<level::ERR>("Unable to create the net link socket",
-                        entry("ERRNO=%d", errno));
-        elog<InternalFailure>();
-    }
-    smartSock.set(fd);
-}
-
 int main(int /*argc*/, char** /*argv*/)
 {
     phosphor::network::initializeTimers();
@@ -315,12 +302,8 @@
         phosphor::network::manager->reloadConfigs();
     }
 
-    // RtnetLink socket
-    phosphor::Descriptor smartSock;
-    createNetLinkSocket(smartSock);
-
     // RTNETLINK event handler
-    phosphor::network::rtnetlink::Server svr(eventPtr, smartSock);
+    phosphor::network::rtnetlink::Server svr(eventPtr);
 
 #ifdef SYNC_MAC_FROM_INVENTORY
     std::ifstream in(configFile);
diff --git a/src/rtnetlink_server.cpp b/src/rtnetlink_server.cpp
index b7b7cb3..3722a67 100644
--- a/src/rtnetlink_server.cpp
+++ b/src/rtnetlink_server.cpp
@@ -1,19 +1,15 @@
 #include "rtnetlink_server.hpp"
 
-#include "types.hpp"
-#include "util.hpp"
-
 #include <linux/netlink.h>
 #include <linux/rtnetlink.h>
-#include <net/if.h>
 #include <netinet/in.h>
-#include <sys/types.h>
-#include <systemd/sd-daemon.h>
-#include <unistd.h>
 
 #include <memory>
 #include <phosphor-logging/elog-errors.hpp>
 #include <phosphor-logging/log.hpp>
+#include <stdplus/fd/create.hpp>
+#include <stdplus/fd/ops.hpp>
+#include <stdplus/signal.hpp>
 #include <string_view>
 #include <xyz/openbmc_project/Common/error.hpp>
 
@@ -96,64 +92,49 @@
     return 0;
 }
 
-Server::Server(EventPtr& eventPtr, const phosphor::Descriptor& smartSock)
+static stdplus::ManagedFd makeSock()
+{
+    using namespace stdplus::fd;
+
+    auto sock = socket(SocketDomain::Netlink, SocketType::Raw,
+                       static_cast<stdplus::fd::SocketProto>(NETLINK_ROUTE));
+
+    sock.fcntlSetfl(sock.fcntlGetfl().set(FileFlag::NonBlock));
+
+    sockaddr_nl local{};
+    local.nl_family = AF_NETLINK;
+    local.nl_groups = RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR |
+                      RTMGRP_IPV4_ROUTE | RTMGRP_IPV6_ROUTE | RTMGRP_NEIGH;
+    bind(sock, local);
+
+    return sock;
+}
+
+Server::Server(EventPtr& eventPtr) : sock(makeSock())
 {
     using namespace phosphor::logging;
     using InternalFailure =
         sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
-    struct sockaddr_nl addr
-    {
-    };
     int r{};
 
-    sigset_t ss{};
-    // check that the given socket is valid or not.
-    if (smartSock() < 0)
-    {
-        r = -EBADF;
-        goto finish;
-    }
-
-    if (sigemptyset(&ss) < 0 || sigaddset(&ss, SIGTERM) < 0 ||
-        sigaddset(&ss, SIGINT) < 0)
-    {
-        r = -errno;
-        goto finish;
-    }
-    /* Block SIGTERM first, so that the event loop can handle it */
-    if (sigprocmask(SIG_BLOCK, &ss, NULL) < 0)
-    {
-        r = -errno;
-        goto finish;
-    }
-
     /* Let's make use of the default handler and "floating"
        reference features of sd_event_add_signal() */
 
+    stdplus::signal::block(SIGTERM);
     r = sd_event_add_signal(eventPtr.get(), NULL, SIGTERM, NULL, NULL);
     if (r < 0)
     {
         goto finish;
     }
 
+    stdplus::signal::block(SIGINT);
     r = sd_event_add_signal(eventPtr.get(), NULL, SIGINT, NULL, NULL);
     if (r < 0)
     {
         goto finish;
     }
 
-    std::memset(&addr, 0, sizeof(addr));
-    addr.nl_family = AF_NETLINK;
-    addr.nl_groups = RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR |
-                     RTMGRP_IPV4_ROUTE | RTMGRP_IPV6_ROUTE | RTMGRP_NEIGH;
-
-    if (bind(smartSock(), (struct sockaddr*)&addr, sizeof(addr)) < 0)
-    {
-        r = -errno;
-        goto finish;
-    }
-
-    r = sd_event_add_io(eventPtr.get(), nullptr, smartSock(), EPOLLIN,
+    r = sd_event_add_io(eventPtr.get(), nullptr, sock.get(), EPOLLIN,
                         eventHandler, nullptr);
     if (r < 0)
     {
diff --git a/src/rtnetlink_server.hpp b/src/rtnetlink_server.hpp
index e62f51c..aca3744 100644
--- a/src/rtnetlink_server.hpp
+++ b/src/rtnetlink_server.hpp
@@ -1,9 +1,8 @@
 #pragma once
 
 #include "types.hpp"
-#include "util.hpp"
 
-#include <systemd/sd-event.h>
+#include <stdplus/fd/managed.hpp>
 
 namespace phosphor
 {
@@ -31,14 +30,16 @@
      *  @param[in] eventPtr - Unique ptr reference to sd_event.
      *  @param[in] socket - netlink socket.
      */
-    Server(EventPtr& eventPtr, const phosphor::Descriptor& socket);
+    Server(EventPtr& eventPtr);
 
-    Server() = delete;
-    ~Server() = default;
-    Server(const Server&) = delete;
-    Server& operator=(const Server&) = delete;
-    Server(Server&&) = default;
-    Server& operator=(Server&&) = default;
+    /** @brief Gets the socket associated with this netlink server */
+    inline stdplus::Fd& getSock()
+    {
+        return sock;
+    }
+
+  private:
+    stdplus::ManagedFd sock;
 };
 
 } // namespace rtnetlink
diff --git a/test/test_rtnetlink.cpp b/test/test_rtnetlink.cpp
index 98d8db3..21aaca3 100644
--- a/test/test_rtnetlink.cpp
+++ b/test/test_rtnetlink.cpp
@@ -28,7 +28,7 @@
 {
 
   public:
-    phosphor::Descriptor smartSock;
+    std::optional<rtnetlink::Server> svr;
 
     TestRtNetlink()
     {
@@ -41,8 +41,9 @@
         initializeTimers();
         createNetLinkSocket();
         bus.attach_event(eventPtr.get(), SD_EVENT_PRIORITY_NORMAL);
-        rtnetlink::Server svr(eventPtr, smartSock);
+        svr.emplace(eventPtr);
     }
+
     void createNetLinkSocket()
     {
         // RtnetLink socket
@@ -72,7 +73,7 @@
 
     EXPECT_EQ(false, manager->hasInterface("igb5"));
     // Send the request
-    send(smartSock(), nlMsg, nlMsg->nlmsg_len, 0);
+    send(svr->getSock(), nlMsg, nlMsg->nlmsg_len, 0);
 
     int i = 3;
     while (i--)