*/
#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
** 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 */