shill: Add a mockable layer for socket.h.

Mock the layer in device_info_unittest.cc. Some cleanup.

BUG=chromium-os:17394
TEST=unit tests

Change-Id: I2ddcb2fd0e01418a463596bf4e3a804b3e3023b2
Reviewed-on: http://gerrit.chromium.org/gerrit/3807
Reviewed-by: Darin Petkov <petkov@chromium.org>
Tested-by: Darin Petkov <petkov@chromium.org>
diff --git a/rtnl_handler.cc b/rtnl_handler.cc
index 51c2b88..8e2af7c 100644
--- a/rtnl_handler.cc
+++ b/rtnl_handler.cc
@@ -16,23 +16,21 @@
 #include <fcntl.h>
 #include <string>
 
-#include <base/callback_old.h>
 #include <base/logging.h>
-#include <base/memory/scoped_ptr.h>
-#include <base/memory/singleton.h>
 
 #include "shill/io_handler.h"
 #include "shill/ipconfig.h"
 #include "shill/rtnl_handler.h"
 #include "shill/rtnl_listener.h"
 #include "shill/shill_event.h"
+#include "shill/sockets.h"
 
 using std::string;
 
 namespace shill {
 
 RTNLHandler::RTNLHandler()
-    : running_(false),
+    : sockets_(NULL),
       in_request_(false),
       rtnl_socket_(-1),
       request_flags_(0),
@@ -50,13 +48,14 @@
   return Singleton<RTNLHandler>::get();
 }
 
-void RTNLHandler::Start(EventDispatcher *dispatcher) {
+void RTNLHandler::Start(EventDispatcher *dispatcher, Sockets *sockets) {
   struct sockaddr_nl addr;
 
-  if (running_)
+  if (sockets_) {
     return;
+  }
 
-  rtnl_socket_ = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);
+  rtnl_socket_ = sockets->Socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);
   if (rtnl_socket_ < 0) {
     LOG(ERROR) << "Failed to open rtnl socket";
     return;
@@ -66,9 +65,10 @@
   addr.nl_family = AF_NETLINK;
   addr.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV4_ROUTE;
 
-  if (bind(rtnl_socket_, reinterpret_cast<struct sockaddr *>(&addr),
-           sizeof(addr)) < 0) {
-    close(rtnl_socket_);
+  if (sockets->Bind(rtnl_socket_,
+                    reinterpret_cast<struct sockaddr *>(&addr),
+                    sizeof(addr)) < 0) {
+    sockets->Close(rtnl_socket_);
     rtnl_socket_ = -1;
     LOG(ERROR) << "RTNL socket bind failed";
     return;
@@ -76,22 +76,20 @@
 
   rtnl_handler_.reset(dispatcher->CreateInputHandler(rtnl_socket_,
                                                      rtnl_callback_.get()));
-  running_ = true;
+  sockets_ = sockets;
 
   NextRequest(request_sequence_);
-
-  VLOG(2) << "RTNLHandler started";
   VLOG(2) << "RTNLHandler started";
 }
 
 void RTNLHandler::Stop() {
-  if (!running_)
+  if (!sockets_)
     return;
 
   rtnl_handler_.reset(NULL);
-  close(rtnl_socket_);
-  running_ = false;
+  sockets_->Close(rtnl_socket_);
   in_request_ = false;
+  sockets_ = NULL;
   VLOG(2) << "RTNLHandler stopped";
 }
 
@@ -135,7 +133,7 @@
   req.msg.ifi_flags = flags;
   req.msg.ifi_change = change;
 
-  if (send(rtnl_socket_, &req, sizeof(req), 0) < 0) {
+  if (sockets_->Send(rtnl_socket_, &req, sizeof(req), 0) < 0) {
     LOG(ERROR) << "RTNL sendto failed: " << strerror(errno);
   }
 }
@@ -145,7 +143,7 @@
 
   VLOG(2) << "RTNLHandler got request to dump " << request_flags;
 
-  if (!in_request_ && running_)
+  if (!in_request_ && sockets_)
     NextRequest(request_sequence_);
 }
 
@@ -164,8 +162,8 @@
   struct sockaddr_nl addr;
   int flag = 0;
 
-  VLOG(2) << "RTNLHandler nextrequest " << seq << " " << request_sequence_ <<
-    " " << request_flags_;
+  VLOG(2) << "RTNLHandler nextrequest " << seq << " " << request_sequence_
+          << " " << request_flags_;
 
   if (seq != request_sequence_)
     return;
@@ -196,8 +194,12 @@
   memset(&addr, 0, sizeof(addr));
   addr.nl_family = AF_NETLINK;
 
-  if (sendto(rtnl_socket_, &req, sizeof(req), 0,
-             reinterpret_cast<struct sockaddr *>(&addr), sizeof(addr)) < 0) {
+  if (sockets_->SendTo(rtnl_socket_,
+                       &req,
+                       sizeof(req),
+                       0,
+                       reinterpret_cast<struct sockaddr *>(&addr),
+                       sizeof(addr)) < 0) {
     LOG(ERROR) << "RTNL sendto failed";
     return;
   }
@@ -314,7 +316,7 @@
 
   req.ifa.ifa_prefixlen = properties.subnet_cidr;
 
-  if (send(rtnl_socket_, &req, req.hdr.nlmsg_len, 0) < 0) {
+  if (sockets_->Send(rtnl_socket_, &req, req.hdr.nlmsg_len, 0) < 0) {
     LOG(ERROR) << "RTNL sendto failed: " << strerror(errno);
     return false;
   }