[zebra] Fix mistake in previous commit and further compile warnings/errors.
2005-11-24 Paul Jakma <paul.jakma@sun.com>
* kernel_socket.h: New header for functions exported to sysctl
methods.
* kernel_socket.c: include previous.
Remove static qualifier from couple of functions which are
used by sysctl methods, incorrectly added in previous commit.
Add a workaround for a bogus gcc warning to the RTA_ macros.
* Makefile.am: Add kernel_socket.h to noinst_HEADERS
* if_sysctl.c: include rt.h and kernel_socket.h and remove
redundant prototypes.
* rtread_sysctl.c: ditto.
(route_read) fix mismatch of return values.
* {rt,zserv,rib}.h: Include lib headers depended on.
diff --git a/zebra/ChangeLog b/zebra/ChangeLog
index 734dd84..4764012 100644
--- a/zebra/ChangeLog
+++ b/zebra/ChangeLog
@@ -1,3 +1,18 @@
+2005-11-24 Paul Jakma <paul.jakma@sun.com>
+
+ * kernel_socket.h: New header for functions exported to sysctl
+ methods.
+ * kernel_socket.c: include previous.
+ Remove static qualifier from couple of functions which are
+ used by sysctl methods.
+ Add a workaround for a bogus gcc warning to the RTA_ macros.
+ * Makefile.am: Add kernel_socket.h to noinst_HEADERS
+ * if_sysctl.c: include rt.h and kernel_socket.h and remove
+ redundant prototypes.
+ * rtread_sysctl.c: ditto.
+ (route_read) fix mismatch of return values.
+ * {rt,zserv,rib}.h: Include lib headers depended on.
+
2005-11-23 Paul Jakma <paul.jakma@sun.com>
* (general) fix some small compile errors, and mark several
diff --git a/zebra/Makefile.am b/zebra/Makefile.am
index 7dc495e..751f606 100644
--- a/zebra/Makefile.am
+++ b/zebra/Makefile.am
@@ -28,7 +28,7 @@
noinst_HEADERS = \
connected.h ioctl.h rib.h rt.h zserv.h redistribute.h debug.h rtadv.h \
- interface.h ipforward.h irdp.h router-id.h
+ interface.h ipforward.h irdp.h router-id.h kernel_socket.h
zebra_LDADD = $(otherobj) $(LIBCAP) $(LIB_IPV6) ../lib/libzebra.la
diff --git a/zebra/if_sysctl.c b/zebra/if_sysctl.c
index 7ad570f..f1e3dcd 100644
--- a/zebra/if_sysctl.c
+++ b/zebra/if_sysctl.c
@@ -30,6 +30,9 @@
#include "ioctl.h"
#include "log.h"
+#include "zebra/rt.h"
+#include "zebra/kernel_socket.h"
+
int
ifstat_update_sysctl ()
{
@@ -91,8 +94,6 @@
caddr_t ref, buf, end;
size_t bufsiz;
struct if_msghdr *ifm;
- int ifm_read (struct if_msghdr *);
- int ifam_read (struct ifa_msghdr *);
#define MIBSIZ 6
int mib[MIBSIZ] =
diff --git a/zebra/kernel_socket.c b/zebra/kernel_socket.c
index 903d679..3b290e9 100644
--- a/zebra/kernel_socket.c
+++ b/zebra/kernel_socket.c
@@ -36,6 +36,7 @@
#include "zebra/interface.h"
#include "zebra/zserv.h"
#include "zebra/debug.h"
+#include "zebra/kernel_socket.h"
extern struct zebra_privs_t zserv_privs;
extern struct zebra_t zebrad;
@@ -77,27 +78,35 @@
ROUNDUP(sizeof(struct sockaddr_dl)) : sizeof(struct sockaddr)))
#endif /* HAVE_SA_LEN */
+/* We use an additional pointer in following, pdest, rather than (DEST)
+ * directly, because gcc will warn if the macro is expanded and DEST is NULL,
+ * complaining that memcpy is being passed a NULL value, despite the fact
+ * the if (NULL) makes it impossible.
+ */
#define RTA_ADDR_GET(DEST, RTA, RTMADDRS, PNT) \
if ((RTMADDRS) & (RTA)) \
{ \
+ void *pdest = (DEST); \
int len = SAROUNDUP ((PNT)); \
if ( ((DEST) != NULL) && \
af_check (((struct sockaddr *)(PNT))->sa_family)) \
- memcpy ((DEST), (PNT), len); \
+ memcpy (pdest, (PNT), len); \
(PNT) += len; \
}
#define RTA_ATTR_GET(DEST, RTA, RTMADDRS, PNT) \
if ((RTMADDRS) & (RTA)) \
{ \
+ void *pdest = (DEST); \
int len = SAROUNDUP ((PNT)); \
- if ( ((DEST) != NULL) ) \
- memcpy ((DEST), (PNT), len); \
+ if ((DEST) != NULL) \
+ memcpy (pdest, (PNT), len); \
(PNT) += len; \
}
#define RTA_NAME_GET(DEST, RTA, RTMADDRS, PNT, LEN) \
if ((RTMADDRS) & (RTA)) \
{ \
+ u_char *pdest = (u_char *) (DEST); \
int len = SAROUNDUP ((PNT)); \
struct sockaddr_dl *sdl = (struct sockaddr_dl *)(PNT); \
if (IS_ZEBRA_DEBUG_KERNEL) \
@@ -106,8 +115,8 @@
if ( ((DEST) != NULL) && (sdl->sdl_family == AF_LINK) \
&& (sdl->sdl_nlen < IFNAMSIZ) && (sdl->sdl_nlen <= len) ) \
{ \
- memcpy ((DEST), sdl->sdl_data, sdl->sdl_nlen); \
- (DEST)[sdl->sdl_nlen] = '\0'; \
+ memcpy (pdest, sdl->sdl_data, sdl->sdl_nlen); \
+ pdest[sdl->sdl_nlen] = '\0'; \
(LEN) = sdl->sdl_nlen; \
} \
(PNT) += len; \
@@ -251,8 +260,9 @@
assert ( (ifp->ifindex == ifan->ifan_index)
|| (ifp->ifindex == IFINDEX_INTERNAL) );
- if ( (ifp == NULL) || (ifp->ifindex == IFINDEX_INTERNAL)
- && (ifan->ifan_what == IFAN_ARRIVAL) )
+ if ( (ifp == NULL)
+ || ((ifp->ifindex == IFINDEX_INTERNAL)
+ && (ifan->ifan_what == IFAN_ARRIVAL)) )
{
if (IS_ZEBRA_DEBUG_KERNEL)
zlog_debug ("%s: creating interface for ifindex %d, name %s",
@@ -286,7 +296,7 @@
* sysctl (from interface_list). There may or may not be sockaddrs
* present after the header.
*/
-static int
+int
ifm_read (struct if_msghdr *ifm)
{
struct interface *ifp = NULL;
@@ -510,7 +520,7 @@
}
/* Interface's address information get. */
-static int
+int
ifam_read (struct ifa_msghdr *ifam)
{
struct interface *ifp = NULL;
@@ -624,7 +634,7 @@
return rtm->rtm_flags;
}
-static void
+void
rtm_read (struct rt_msghdr *rtm)
{
int flags;
diff --git a/zebra/kernel_socket.h b/zebra/kernel_socket.h
new file mode 100644
index 0000000..a3923c5
--- /dev/null
+++ b/zebra/kernel_socket.h
@@ -0,0 +1,32 @@
+/*
+ * Exported kernel_socket functions, exported only for convenience of
+ * sysctl methods.
+ *
+ * This file is part of Quagga.
+ *
+ * Quagga is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * Quagga is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Quagga; see the file COPYING. If not, write to the Free
+ * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#ifndef __ZEBRA_KERNEL_SOCKET_H
+#define __ZEBRA_KERNEL_SOCKET_H
+
+extern void rtm_read (struct rt_msghdr *);
+extern int ifam_read (struct ifa_msghdr *);
+extern int ifm_read (struct if_msghdr *);
+extern int rtm_write (int, union sockunion *, union sockunion *,
+ union sockunion *, unsigned int, int, int);
+
+#endif /* __ZEBRA_KERNEL_SOCKET_H */
diff --git a/zebra/rib.h b/zebra/rib.h
index 8d12846..a1a9e1d 100644
--- a/zebra/rib.h
+++ b/zebra/rib.h
@@ -23,6 +23,8 @@
#ifndef _ZEBRA_RIB_H
#define _ZEBRA_RIB_H
+#include "prefix.h"
+
#define DISTANCE_INFINITY 255
/* Routing information base. */
diff --git a/zebra/rt.h b/zebra/rt.h
index e902b21..82747d3 100644
--- a/zebra/rt.h
+++ b/zebra/rt.h
@@ -23,6 +23,9 @@
#ifndef _ZEBRA_RT_H
#define _ZEBRA_RT_H
+#include "prefix.h"
+#include "if.h"
+
extern int kernel_add_ipv4 (struct prefix *, struct rib *);
extern int kernel_delete_ipv4 (struct prefix *, struct rib *);
extern int kernel_add_route (struct prefix_ipv4 *, struct in_addr *, int, int);
diff --git a/zebra/rtread_sysctl.c b/zebra/rtread_sysctl.c
index e39d8cb..88527b3 100644
--- a/zebra/rtread_sysctl.c
+++ b/zebra/rtread_sysctl.c
@@ -27,6 +27,7 @@
#include "zebra/zserv.h"
#include "zebra/rt.h"
+#include "zebra/kernel_socket.h"
/* Kernel routing table read up by sysctl function. */
void
@@ -35,7 +36,6 @@
caddr_t buf, end, ref;
size_t bufsiz;
struct rt_msghdr *rtm;
- void rtm_read (struct rt_msghdr *);
#define MIBSIZ 6
int mib[MIBSIZ] =
@@ -52,7 +52,7 @@
if (sysctl (mib, MIBSIZ, NULL, &bufsiz, NULL, 0) < 0)
{
zlog_warn ("sysctl fail: %s", safe_strerror (errno));
- return -1;
+ return;
}
/* Allocate buffer. */
@@ -62,7 +62,7 @@
if (sysctl (mib, MIBSIZ, buf, &bufsiz, NULL, 0) < 0)
{
zlog_warn ("sysctl() fail by %s", safe_strerror (errno));
- return -1;
+ return;
}
for (end = buf + bufsiz; buf < end; buf += rtm->rtm_msglen)
@@ -74,5 +74,5 @@
/* Free buffer. */
XFREE (MTYPE_TMP, ref);
- return 0;
+ return;
}
diff --git a/zebra/zserv.h b/zebra/zserv.h
index f7d3f8c..9a570fb 100644
--- a/zebra/zserv.h
+++ b/zebra/zserv.h
@@ -23,6 +23,7 @@
#define _ZEBRA_ZSERV_H
#include "rib.h"
+#include "if.h"
#include "workqueue.h"
/* Default port information. */