#include "sockunion.h"
#include "sockopt.h"
#include "privs.h"
+#include "lib_errors.h"
#include "libospf.h"
#include "ospf6_proto.h"
#endif /* DISABLE_IPV6_CHECKSUM */
}
+void ospf6_serv_close(void)
+{
+ if (ospf6_sock > 0) {
+ close(ospf6_sock);
+ ospf6_sock = -1;
+ return;
+ }
+}
+
/* Make ospf6d's server socket. */
int ospf6_serv_sock(void)
{
- if (ospf6d_privs.change(ZPRIVS_RAISE))
- zlog_err("ospf6_serv_sock: could not raise privs");
-
- ospf6_sock = socket(AF_INET6, SOCK_RAW, IPPROTO_OSPFIGP);
- if (ospf6_sock < 0) {
- zlog_warn("Network: can't create OSPF6 socket.");
- if (ospf6d_privs.change(ZPRIVS_LOWER))
- zlog_err("ospf_sock_init: could not lower privs");
- return -1;
+ frr_with_privs(&ospf6d_privs) {
+
+ ospf6_sock = socket(AF_INET6, SOCK_RAW, IPPROTO_OSPFIGP);
+ if (ospf6_sock < 0) {
+ zlog_warn("Network: can't create OSPF6 socket.");
+ return -1;
+ }
}
- if (ospf6d_privs.change(ZPRIVS_LOWER))
- zlog_err("ospf_sock_init: could not lower privs");
/* set socket options */
#if 1
ret = setsockopt(ospf6_sock, IPPROTO_IPV6, option, &mreq6,
sizeof(mreq6));
if (ret < 0) {
- zlog_err("Network: setsockopt (%d) on ifindex %d failed: %s",
- option, ifindex, safe_strerror(errno));
+ flog_err_sys(
+ EC_LIB_SOCKET,
+ "Network: setsockopt (%d) on ifindex %d failed: %s",
+ option, ifindex, safe_strerror(errno));
return ret;
}
assert(dst);
assert(*ifindex);
+ memset(&cmsgbuf, 0, sizeof(cmsgbuf));
scmsgp = (struct cmsghdr *)&cmsgbuf;
pktinfo = (struct in6_pktinfo *)(CMSG_DATA(scmsgp));
memset(&dst_sin6, 0, sizeof(struct sockaddr_in6));