From ec1a428343cad343969d569c56acbe6b02ab8f4f Mon Sep 17 00:00:00 2001 From: paul Date: Thu, 24 Nov 2005 15:15:17 +0000 Subject: [zebra] Fix mistake in previous commit and further compile warnings/errors. 2005-11-24 Paul Jakma * 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. --- zebra/ChangeLog | 15 +++++++++++++++ zebra/Makefile.am | 2 +- zebra/if_sysctl.c | 5 +++-- zebra/kernel_socket.c | 30 ++++++++++++++++++++---------- zebra/kernel_socket.h | 32 ++++++++++++++++++++++++++++++++ zebra/rib.h | 2 ++ zebra/rt.h | 3 +++ zebra/rtread_sysctl.c | 8 ++++---- zebra/zserv.h | 1 + 9 files changed, 81 insertions(+), 17 deletions(-) create mode 100644 zebra/kernel_socket.h (limited to 'zebra') diff --git a/zebra/ChangeLog b/zebra/ChangeLog index 734dd84b..4764012c 100644 --- a/zebra/ChangeLog +++ b/zebra/ChangeLog @@ -1,3 +1,18 @@ +2005-11-24 Paul Jakma + + * 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 * (general) fix some small compile errors, and mark several diff --git a/zebra/Makefile.am b/zebra/Makefile.am index 7dc495e9..751f606f 100644 --- a/zebra/Makefile.am +++ b/zebra/Makefile.am @@ -28,7 +28,7 @@ zebra_SOURCES = \ 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 7ad570f4..f1e3dcde 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 @@ interface_list () 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 903d6790..3b290e96 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 @@ extern struct zebra_t zebrad; 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 @@ extern struct zebra_t zebrad; 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 @@ ifan_read (struct if_announcemsghdr *ifan) 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 @@ ifan_read (struct if_announcemsghdr *ifan) * 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 @@ ifam_read_mesg (struct ifa_msghdr *ifm, } /* Interface's address information get. */ -static int +int ifam_read (struct ifa_msghdr *ifam) { struct interface *ifp = NULL; @@ -624,7 +634,7 @@ rtm_read_mesg (struct rt_msghdr *rtm, 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 00000000..a3923c5e --- /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 8d128464..a1a9e1db 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 e902b210..82747d3d 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 e39d8cb1..88527b37 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 @@ route_read (void) 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 @@ route_read (void) 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 @@ route_read (void) 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 @@ route_read (void) /* Free buffer. */ XFREE (MTYPE_TMP, ref); - return 0; + return; } diff --git a/zebra/zserv.h b/zebra/zserv.h index f7d3f8c0..9a570fb3 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. */ -- cgit v1.2.1