]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/ipforward_solaris.c
Merge pull request #5793 from ton31337/fix/formatting_show_bgp_summary_failed
[mirror_frr.git] / zebra / ipforward_solaris.c
index 09f145e818bdb6ba636e9e90dbf6f88eaae0b6f4..1a45328248be9ac8f393504eaca233a0a1d73cd8 100644 (file)
  */
 
 #include <zebra.h>
+
+#ifdef SUNOS_5
+
 #include "log.h"
 #include "prefix.h"
+#include "lib_errors.h"
 
 #include "privs.h"
 #include "zebra/ipforward.h"
+#include "zebra/zebra_errors.h"
 
 /*
 ** Solaris should define IP_DEV_NAME in <inet/ip.h>, but we'll save
@@ -46,117 +51,107 @@ extern struct zebra_privs_t zserv_privs;
 ** name of the parameter being referenced.
 */
 
-static int
-solaris_nd(const int cmd, const char* parameter, const int value)
+static int solaris_nd(const int cmd, const char *parameter, const int value)
 {
 #define ND_BUFFER_SIZE 1024
-  int fd;
-  char nd_buf[ND_BUFFER_SIZE];
-  struct strioctl strioctl;
-  const char* device = IP_DEV_NAME;
-  int retval;
-  memset(nd_buf, '\0', ND_BUFFER_SIZE);
-  /*
-  ** ND_SET takes a NULL delimited list of strings further terminated
-  ** buy a NULL.  ND_GET returns a list in a similar layout, although
-  ** here we only use the first result.
-  */
-  if (cmd == ND_SET)
-    snprintf(nd_buf, ND_BUFFER_SIZE, "%s%c%d%c", parameter, '\0', value,'\0');
-  else if (cmd == ND_GET)
-    snprintf(nd_buf, ND_BUFFER_SIZE, "%s", parameter);
-  else {
-    zlog_err("internal error - inappropriate command given to "
-             "solaris_nd()%s:%d", __FILE__, __LINE__);
-    return -1;
-  }
-
-  strioctl.ic_cmd = cmd;
-  strioctl.ic_timout = 0;
-  strioctl.ic_len = ND_BUFFER_SIZE;
-  strioctl.ic_dp = nd_buf;
-  
-  if ( zserv_privs.change (ZPRIVS_RAISE) )
-       zlog_err ("solaris_nd: Can't raise privileges");
-  if ((fd = open (device, O_RDWR)) < 0) 
-    {
-      zlog_warn("failed to open device %s - %s", device, safe_strerror(errno));
-      if ( zserv_privs.change (ZPRIVS_LOWER) )
-        zlog_err ("solaris_nd: Can't lower privileges");
-      return -1;
-    }
-  if (ioctl (fd, I_STR, &strioctl) < 0) 
-    {
-      int save_errno = errno;
-      if ( zserv_privs.change (ZPRIVS_LOWER) )
-        zlog_err ("solaris_nd: Can't lower privileges");
-      close (fd);
-      zlog_warn("ioctl I_STR failed on device %s - %s",
-               device, safe_strerror(save_errno));
-      return -1;
-    }
-  close(fd);
-  if ( zserv_privs.change (ZPRIVS_LOWER) )
-         zlog_err ("solaris_nd: Can't lower privileges");
-  
-  if (cmd == ND_GET) 
-    {
-      errno = 0;
-      retval = atoi(nd_buf);
-      if (errno) 
-        {
-          zlog_warn("failed to convert returned value to integer - %s",
-                    safe_strerror(errno));
-          retval = -1;
-        }
-    } 
-  else 
-    {
-      retval = 0;
-    }
-  return retval;
+       int fd;
+       char nd_buf[ND_BUFFER_SIZE];
+       struct strioctl strioctl;
+       const char *device = IP_DEV_NAME;
+       int retval;
+       memset(nd_buf, '\0', ND_BUFFER_SIZE);
+       /*
+       ** ND_SET takes a NULL delimited list of strings further terminated
+       ** buy a NULL.  ND_GET returns a list in a similar layout, although
+       ** here we only use the first result.
+       */
+       if (cmd == ND_SET)
+               snprintf(nd_buf, ND_BUFFER_SIZE, "%s%c%d%c", parameter, '\0',
+                        value, '\0');
+       else if (cmd == ND_GET)
+               snprintf(nd_buf, ND_BUFFER_SIZE, "%s", parameter);
+       else {
+               flog_err_sys(EC_LIB_SYSTEM_CALL,
+                            "internal error - inappropriate command given to "
+                            "solaris_nd()%s:%d",
+                            __FILE__, __LINE__);
+               return -1;
+       }
+
+       strioctl.ic_cmd = cmd;
+       strioctl.ic_timout = 0;
+       strioctl.ic_len = ND_BUFFER_SIZE;
+       strioctl.ic_dp = nd_buf;
+
+       frr_with_privs(&zserv_privs) {
+               if ((fd = open(device, O_RDWR)) < 0) {
+                       flog_err_sys(EC_LIB_SYSTEM_CALL,
+                                    "failed to open device %s - %s", device,
+                                    safe_strerror(errno));
+                       return -1;
+               }
+               if (ioctl(fd, I_STR, &strioctl) < 0) {
+                       close(fd);
+                       flog_err_sys(EC_LIB_SYSTEM_CALL,
+                                    "ioctl I_STR failed on device %s - %s",
+                                    device, safe_strerror(errno));
+                       return -1;
+               }
+               close(fd);
+       }
+
+       if (cmd == ND_GET) {
+               errno = 0;
+               retval = atoi(nd_buf);
+               if (errno) {
+                       zlog_debug(
+                               "failed to convert returned value to integer - %s",
+                               safe_strerror(errno));
+                       retval = -1;
+               }
+       } else {
+               retval = 0;
+       }
+       return retval;
 }
 
-static int
-solaris_nd_set(const char* parameter, const int value) {
-  return solaris_nd(ND_SET, parameter, value);
+static int solaris_nd_set(const char *parameter, const int value)
+{
+       return solaris_nd(ND_SET, parameter, value);
 }
-static int
-solaris_nd_get(const char* parameter) {
-  return solaris_nd(ND_GET, parameter, 0);
+static int solaris_nd_get(const char *parameter)
+{
+       return solaris_nd(ND_GET, parameter, 0);
 }
-int
-ipforward(void)
+int ipforward(void)
 {
-  return solaris_nd_get("ip_forwarding");
+       return solaris_nd_get("ip_forwarding");
 }
 
-int
-ipforward_on (void)
+int ipforward_on(void)
 {
-  (void) solaris_nd_set("ip_forwarding", 1);
-  return ipforward();
+       (void)solaris_nd_set("ip_forwarding", 1);
+       return ipforward();
 }
 
-int
-ipforward_off (void)
+int ipforward_off(void)
 {
-  (void) solaris_nd_set("ip_forwarding", 0);
-  return ipforward();
+       (void)solaris_nd_set("ip_forwarding", 0);
+       return ipforward();
 }
 int ipforward_ipv6(void)
 {
-  return solaris_nd_get("ip6_forwarding");
+       return solaris_nd_get("ip6_forwarding");
 }
-int
-ipforward_ipv6_on (void)
+int ipforward_ipv6_on(void)
 {
-  (void) solaris_nd_set("ip6_forwarding", 1);
-  return ipforward_ipv6();
+       (void)solaris_nd_set("ip6_forwarding", 1);
+       return ipforward_ipv6();
 }
-int
-ipforward_ipv6_off (void)
+int ipforward_ipv6_off(void)
 {
-  (void) solaris_nd_set("ip6_forwarding", 0);
-  return ipforward_ipv6();
+       (void)solaris_nd_set("ip6_forwarding", 0);
+       return ipforward_ipv6();
 }
+
+#endif /* SUNOS_5 */