]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/if_ioctl_solaris.c
*: use frr_elevate_privs() (1/2: coccinelle)
[mirror_frr.git] / zebra / if_ioctl_solaris.c
index 3d53194593c640a432b9737cf58512f3de967b06..ee7f22e780cd2389b60c93ee25de574cae553e1d 100644 (file)
@@ -34,6 +34,7 @@
 #include "privs.h"
 #include "vrf.h"
 #include "vty.h"
+#include "lib_errors.h"
 
 #include "zebra/interface.h"
 #include "zebra/ioctl_solaris.h"
@@ -58,29 +59,24 @@ static int interface_list_ioctl(int af)
        size_t needed, lastneeded = 0;
        char *buf = NULL;
 
-       if (zserv_privs.change(ZPRIVS_RAISE))
-               zlog_err("Can't raise privileges");
-
-       sock = socket(af, SOCK_DGRAM, 0);
-       if (sock < 0) {
-               zlog_warn("Can't make %s socket stream: %s",
-                         (af == AF_INET ? "AF_INET" : "AF_INET6"),
-                         safe_strerror(errno));
+       frr_elevate_privs(&zserv_privs) {
 
-               if (zserv_privs.change(ZPRIVS_LOWER))
-                       zlog_err("Can't lower privileges");
+               sock = socket(af, SOCK_DGRAM, 0);
+               if (sock < 0) {
+                       zlog_warn("Can't make %s socket stream: %s",
+                                 (af == AF_INET ? "AF_INET" : "AF_INET6"),
+                                 safe_strerror(errno));
 
-               return -1;
-       }
+                       return -1;
+               }
 
 calculate_lifc_len: /* must hold privileges to enter here */
-       lifn.lifn_family = af;
-       lifn.lifn_flags = LIFC_NOXMIT; /* we want NOXMIT interfaces too */
-       ret = ioctl(sock, SIOCGLIFNUM, &lifn);
-       save_errno = errno;
+               lifn.lifn_family = af;
+               lifn.lifn_flags = LIFC_NOXMIT; /* we want NOXMIT interfaces too */
+               ret = ioctl(sock, SIOCGLIFNUM, &lifn);
+               save_errno = errno;
 
-       if (zserv_privs.change(ZPRIVS_LOWER))
-               zlog_err("Can't lower privileges");
+       }
 
        if (ret < 0) {
                zlog_warn("interface_list_ioctl: SIOCGLIFNUM failed %s",
@@ -100,11 +96,7 @@ calculate_lifc_len: /* must hold privileges to enter here */
        if (needed > lastneeded || needed < lastneeded / 2) {
                if (buf != NULL)
                        XFREE(MTYPE_TMP, buf);
-               if ((buf = XMALLOC(MTYPE_TMP, needed)) == NULL) {
-                       zlog_warn("interface_list_ioctl: malloc failed");
-                       close(sock);
-                       return -1;
-               }
+               buf = XMALLOC(MTYPE_TMP, needed);
        }
        lastneeded = needed;
 
@@ -114,7 +106,7 @@ calculate_lifc_len: /* must hold privileges to enter here */
        lifconf.lifc_buf = buf;
 
        if (zserv_privs.change(ZPRIVS_RAISE))
-               zlog_err("Can't raise privileges");
+               flog_err(LIB_ERR_PRIVILEGES, "Can't raise privileges");
 
        ret = ioctl(sock, SIOCGLIFCONF, &lifconf);
 
@@ -126,13 +118,13 @@ calculate_lifc_len: /* must hold privileges to enter here */
                zlog_warn("SIOCGLIFCONF: %s", safe_strerror(errno));
 
                if (zserv_privs.change(ZPRIVS_LOWER))
-                       zlog_err("Can't lower privileges");
+                       flog_err(LIB_ERR_PRIVILEGES, "Can't lower privileges");
 
                goto end;
        }
 
        if (zserv_privs.change(ZPRIVS_LOWER))
-               zlog_err("Can't lower privileges");
+               flog_err(LIB_ERR_PRIVILEGES, "Can't lower privileges");
 
        /* Allocate interface. */
        lifreq = lifconf.lifc_req;
@@ -170,8 +162,7 @@ calculate_lifc_len: /* must hold privileges to enter here */
                       && (*(lifreq->lifr_name + normallen) != ':'))
                        normallen++;
 
-               ifp = if_get_by_name_len(lifreq->lifr_name, normallen,
-                                        VRF_DEFAULT, 0);
+               ifp = if_get_by_name(lifreq->lifr_name, VRF_DEFAULT, 0);
 
                if (lifreq->lifr_addr.ss_family == AF_INET)
                        ifp->flags |= IFF_IPV4;
@@ -228,9 +219,9 @@ static int if_get_index(struct interface *ifp)
 
 /* OK we got interface index. */
 #ifdef ifr_ifindex
-       ifp->ifindex = lifreq.lifr_ifindex;
+       if_set_index(ifp, lifreq.lifr_ifindex);
 #else
-       ifp->ifindex = lifreq.lifr_index;
+       if_set_index(ifp, lifreq.lifr_index);
 #endif
        return ifp->ifindex;
 }
@@ -253,7 +244,7 @@ static int if_get_addr(struct interface *ifp, struct sockaddr *addr,
        struct lifreq lifreq;
        struct sockaddr_storage mask, dest;
        char *dest_pnt = NULL;
-       u_char prefixlen = 0;
+       uint8_t prefixlen = 0;
        afi_t af;
        int flags = 0;
 
@@ -316,9 +307,8 @@ static int if_get_addr(struct interface *ifp, struct sockaddr *addr,
                connected_add_ipv4(ifp, flags, &SIN(addr)->sin_addr, prefixlen,
                                   (struct in_addr *)dest_pnt, label);
        else if (af == AF_INET6)
-               connected_add_ipv6(ifp, flags, &SIN6(addr)->sin6_addr,
-                                  prefixlen, (struct in6_addr *)dest_pnt,
-                                  label);
+               connected_add_ipv6(ifp, flags, &SIN6(addr)->sin6_addr, NULL,
+                                  prefixlen, label);
 
        return 0;
 }