netdev: Change netdev_get_in4() to return an error code.
authorBen Pfaff <blp@nicira.com>
Tue, 28 Jul 2009 20:43:52 +0000 (13:43 -0700)
committerBen Pfaff <blp@nicira.com>
Thu, 30 Jul 2009 23:07:13 +0000 (16:07 -0700)
Until now, netdev_get_in4() and netdev_nodev_get_in4() have returned a
bool that represents success or failure.  This commit changes the return
value to an int that can indicate what kind of error occurred, which is
both more consistent with the rest of the netdev interfaces and more
meaningful, and updates all callers to the new interface.

(Currently netdev_get_in4() won't ever return an error, but other future
implementations might.)

extras/ezio/ovs-switchui.c
lib/netdev.c
lib/netdev.h

index 82019682c6d26141848d0c0b0b3e45efa1838b8f..ad006faec3902b6eddbce1fa798a4b73f9b17952 100644 (file)
@@ -2480,7 +2480,7 @@ choose_netdevs(struct svec *choices)
 
         retval = netdev_open(name, NETDEV_ETH_TYPE_NONE, &netdev);
         if (!retval) {
-            bool exclude = netdev_get_in4(netdev, NULL);
+            bool exclude = netdev_get_in4(netdev, NULL) == 0;
             netdev_close(netdev);
             if (exclude) {
                 continue;
index 191ed516a72b8a2b9e36c4a450d07b2bbe9cf568..b8e936d511955c3c842ed3b76d65de2b6b3adc43 100644 (file)
@@ -792,12 +792,14 @@ netdev_set_advertisements(struct netdev *netdev, uint32_t advertise)
 }
 
 /* If 'netdev' has an assigned IPv4 address, sets '*in4' to that address (if
- * 'in4' is non-null) and returns true.  Otherwise, returns false. */
-bool
+ * 'in4' is non-null) and returns 0.  Otherwise, returns a positive errno value
+ * and sets '*in4' to INADDR_ANY (0). */
+int
 netdev_nodev_get_in4(const char *netdev_name, struct in_addr *in4)
 {
     struct ifreq ifr;
     struct in_addr ip = { INADDR_ANY };
+    int error;
 
     init_netdev();
 
@@ -807,17 +809,19 @@ netdev_nodev_get_in4(const char *netdev_name, struct in_addr *in4)
     if (ioctl(af_inet_sock, SIOCGIFADDR, &ifr) == 0) {
         struct sockaddr_in *sin = (struct sockaddr_in *) &ifr.ifr_addr;
         ip = sin->sin_addr;
+        error = ip.s_addr != INADDR_ANY ? 0 : EADDRNOTAVAIL;
     } else {
         VLOG_DBG_RL(&rl, "%s: ioctl(SIOCGIFADDR) failed: %s",
                     netdev_name, strerror(errno));
+        error = errno;
     }
     if (in4) {
         *in4 = ip;
     }
-    return ip.s_addr != INADDR_ANY;
+    return error;
 }
 
-bool
+int
 netdev_get_in4(const struct netdev *netdev, struct in_addr *in4)
 {
     return netdev_nodev_get_in4(netdev->name, in4);
@@ -1322,7 +1326,7 @@ netdev_find_dev_by_in4(const struct in_addr *in4, char **netdev_name)
     struct svec dev_list;
 
     /* Check the hint first. */
-    if (*netdev_name && (netdev_nodev_get_in4(*netdev_name, &dev_in4)) 
+    if (*netdev_name && !netdev_nodev_get_in4(*netdev_name, &dev_in4)
             && (dev_in4.s_addr == in4->s_addr)) {
         return true;
     }
@@ -1332,7 +1336,7 @@ netdev_find_dev_by_in4(const struct in_addr *in4, char **netdev_name)
     netdev_enumerate(&dev_list);
 
     for (i=0; i<dev_list.n; i++) {
-        if ((netdev_nodev_get_in4(dev_list.names[i], &dev_in4)) 
+        if (!netdev_nodev_get_in4(dev_list.names[i], &dev_in4)
                 && (dev_in4.s_addr == in4->s_addr)) {
             *netdev_name = xstrdup(dev_list.names[i]);
             svec_destroy(&dev_list);
index 6ce28ef66dd815e52eeaa562a68010f882669200..0c7f1cc349a39231015ee9c0956f3ea2d66b727b 100644 (file)
@@ -91,7 +91,7 @@ int netdev_get_features(struct netdev *,
                         uint32_t *current, uint32_t *advertised,
                         uint32_t *supported, uint32_t *peer);
 int netdev_set_advertisements(struct netdev *, uint32_t advertise);
-bool netdev_get_in4(const struct netdev *, struct in_addr *);
+int netdev_get_in4(const struct netdev *, struct in_addr *);
 int netdev_set_in4(struct netdev *, struct in_addr addr, struct in_addr mask);
 int netdev_add_router(struct in_addr router);
 bool netdev_get_in6(const struct netdev *, struct in6_addr *);
@@ -108,7 +108,7 @@ int netdev_set_policing(struct netdev *, uint32_t kbits_rate,
 void netdev_enumerate(struct svec *);
 bool netdev_find_dev_by_in4(const struct in_addr *in4, char **netdev_name);
 int netdev_nodev_get_flags(const char *netdev_name, enum netdev_flags *);
-bool netdev_nodev_get_in4(const char *netdev_name, struct in_addr *);
+int netdev_nodev_get_in4(const char *netdev_name, struct in_addr *);
 int netdev_nodev_set_etheraddr(const char *name, const uint8_t mac[6]);
 int netdev_nodev_get_etheraddr(const char *netdev_name, uint8_t mac[6]);
 int netdev_nodev_set_policing(const char *netdev_name, uint32_t kbits_rate,