diff --git a/Makefile b/Makefile index 45e69afa..3a74205b 100644 --- a/Makefile +++ b/Makefile @@ -2,32 +2,41 @@ # (c) 1998 Martin Mares TOPDIR=$(shell pwd) +OBJDIR=obj + CPPFLAGS=-I$(TOPDIR)/sysdep/linux -I$(TOPDIR) OPT=-O2 DEBUG=-g#gdb CFLAGS=$(OPT) $(DEBUG) -Wall -W -Wstrict-prototypes -Wno-unused -Wno-parentheses PROTOCOLS= -DIRS=nest $(PROTOCOLS) lib sysdep/linux sysdep/unix -ARCHS=$(join $(addsuffix /,$(DIRS)),$(subst /,_,$(addsuffix .a,$(DIRS)))) +LIBDIRS=sysdep/linux sysdep/unix lib +STDDIRS=nest $(PROTOCOLS) +DIRS=$(STDDIRS) $(OBJDIR)/lib +PARTOBJS=$(join $(addsuffix /,$(STDDIRS)),$(subst /,_,$(addsuffix .o,$(STDDIRS)))) +LIBS=$(OBJDIR)/lib/birdlib.a export all: .dep all-dirs bird all-dirs: - set -e ; for a in $(DIRS) ; do $(MAKE) -C $$a ; done + set -e ; for a in $(DIRS) ; do $(MAKE) -C $$a all ; done -bird: $(ARCHS) +bird: $(PARTOBJS) $(LIBS) $(CC) $(LDFLAGS) -o $@ $^ .dep: $(MAKE) dep - touch .dep dep: + mkdir -p $(OBJDIR) + tools/mergedirs $(OBJDIR) $(LIBDIRS) +# for a in $(STDDIRS) ; do mkdir -p $(OBJDIR)/$$a ; done set -e ; for a in $(DIRS) ; do $(MAKE) -C $$a dep ; done + touch .dep clean: + rm -rf obj rm -f `find . -name "*~" -or -name "*.[oa]" -or -name "\#*\#" -or -name TAGS -or -name core -or -name .depend -or -name .#*` rm -f bird .dep diff --git a/Rules b/Rules index a0a1418a..2d9c0a8a 100644 --- a/Rules +++ b/Rules @@ -3,17 +3,32 @@ THISDIR=$(shell pwd) RELDIR=$(subst $(TOPDIR)/,,$(THISDIR)) -ANAME=$(subst /,_,$(RELDIR)).a +ONAME=$(subst /,_,$(RELDIR)).o + +ifndef SRCS SRCS=$(subst .o,.c,$(OBJS)) - -all: $(ANAME) - -$(ANAME): $(OBJS) - rm -f $(ANAME) - ar rcs $(ANAME) $(OBJS) +endif ifdef OBJS +ifdef LIB + +all: $(LIB) + +$(LIB): $(OBJS) + rm -f $(LIB) + ar rcs $(LIB) $(OBJS) + ranlib $(LIB) + +else + +all: $(ONAME) + +$(ONAME): $(OBJS) + $(LD) -r -o $(ONAME) $(OBJS) + +endif + dep: $(SRCS) rm -f .depend for a in $(SRCS) ; do gcc $(CPPFLAGS) -MM $$a >>.depend ; done diff --git a/lib/Makefile b/lib/Makefile deleted file mode 100644 index 6eb14e1e..00000000 --- a/lib/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -OBJS=lists.o bitops.o resource.o xmalloc.o mempool.o slab.o md5.o - -ifdef IPV6 -OBJS += ipv6.o -else -OBJS += ipv4.o -endif - -include $(TOPDIR)/Rules diff --git a/lib/Modules b/lib/Modules new file mode 100644 index 00000000..18447e1e --- /dev/null +++ b/lib/Modules @@ -0,0 +1,19 @@ +birdlib.h +bitops.c +bitops.h +ip.h +ipv4.c +ipv4.h +ipv6.c +ipv6.h +lists.c +lists.h +md5.c +md5.h +mempool.c +resource.c +resource.h +slab.c +socket.h +unaligned.h +xmalloc.c diff --git a/lib/birdlib.h b/lib/birdlib.h index 5e533b66..842fce86 100644 --- a/lib/birdlib.h +++ b/lib/birdlib.h @@ -21,8 +21,8 @@ /* Logging and dying */ -void log(char *msg, ...); -void die(char *msg, ...) NORET; +void log(char *msg, ...) __attribute__((format(printf,1,2))); +void die(char *msg, ...) __attribute__((format(printf,1,2))) NORET; #define L_DEBUG "\001" /* Debugging messages */ #define L_INFO "\002" /* Informational messages */ diff --git a/lib/ip.h b/lib/ip.h index c3683992..87cd3aa9 100644 --- a/lib/ip.h +++ b/lib/ip.h @@ -35,4 +35,10 @@ #define SCOPE_SITE 2 #define SCOPE_UNIVERSE 3 +/* + * Is it a valid network prefix? + */ + +#define ip_is_prefix(a,l) (!ipa_nonzero(ipa_and(a, ipa_not(ipa_mkmask(l))))) + #endif diff --git a/lib/ipv4.c b/lib/ipv4.c index 52f5b0b2..cc673733 100644 --- a/lib/ipv4.c +++ b/lib/ipv4.c @@ -6,6 +6,8 @@ * Can be freely distributed and used under the terms of the GNU GPL. */ +#ifndef IPV6 + #include "nest/bird.h" #include "lib/ip.h" @@ -27,3 +29,5 @@ ipv4_classify(u32 a) return IADDR_BROADCAST | SCOPE_LINK; return IADDR_INVALID; } + +#endif diff --git a/lib/ipv4.h b/lib/ipv4.h index fa8a27b5..de9f4e57 100644 --- a/lib/ipv4.h +++ b/lib/ipv4.h @@ -25,7 +25,7 @@ typedef struct ipv4_addr { } ip_addr; #define _I(x) (x).addr -#define _MI(x) ((struct ip_addr) { x }) +#define _MI(x) ((struct ipv4_addr) { x }) #else @@ -36,6 +36,8 @@ typedef u32 ip_addr; #endif +#define BITS_PER_IP_ADDRESS 32 + #define IPA_NONE (_MI(0)) #define ipa_equal(x,y) (_I(x) == _I(y)) @@ -50,8 +52,6 @@ typedef u32 ip_addr; #define ipa_ntoh(x) x = _MI(ntohl(_I(x))) #define ipa_classify(x) ipv4_classify(_I(x)) -unsigned ipv4_mklen(u32); -u32 ipv4_mkmask(unsigned); int ipv4_classify(u32); /* FIXME: Is this hash function uniformly distributed over standard routing tables? */ diff --git a/lib/ipv6.c b/lib/ipv6.c index e612af72..2d01e839 100644 --- a/lib/ipv6.c +++ b/lib/ipv6.c @@ -6,7 +6,11 @@ * Can be freely distributed and used under the terms of the GNU GPL. */ +#ifdef IPV6 + #include "nest/bird.h" #include "lib/ip.h" #error "Ought to implement these." + +#endif diff --git a/lib/ipv6.h b/lib/ipv6.h index 845955f4..08ed5f88 100644 --- a/lib/ipv6.h +++ b/lib/ipv6.h @@ -22,6 +22,8 @@ typedef struct ipv4_addr { #define _I2(a) ((a).addr[2]) #define _I3(a) ((a).addr[3]) +#define BITS_PER_IP_ADDRESS 128 + #define IPA_NONE _MI(0,0,0,0) #define ipa_equal(x,y) (!memcmp(&(x),&(y),sizeof(ip_addr))) diff --git a/sysdep/cf/linux-20.h b/sysdep/cf/linux-20.h index 6100add3..092ab71f 100644 --- a/sysdep/cf/linux-20.h +++ b/sysdep/cf/linux-20.h @@ -9,3 +9,7 @@ #undef CONFIG_TOS #undef CONFIG_MULTIPATH #undef CONFIG_NETLINK + +/* +Link: sysdep/linux + */ diff --git a/sysdep/cf/linux-21.h b/sysdep/cf/linux-21.h index a2afcbbd..c810ec1a 100644 --- a/sysdep/cf/linux-21.h +++ b/sysdep/cf/linux-21.h @@ -9,3 +9,7 @@ #define CONFIG_TOS #define CONFIG_MULTIPATH #define CONFIG_NETLINK + +/* +Link: sysdep/linux + */ diff --git a/sysdep/cf/linux-v6.h b/sysdep/cf/linux-v6.h index de397fc1..21939b86 100644 --- a/sysdep/cf/linux-v6.h +++ b/sysdep/cf/linux-v6.h @@ -11,3 +11,7 @@ #define CONFIG_TOS #define CONFIG_MULTIPATH #define CONFIG_NETLINK + +/* +Link: sysdep/linux + */ diff --git a/sysdep/linux/Makefile b/sysdep/linux/Makefile deleted file mode 100644 index a81db06d..00000000 --- a/sysdep/linux/Makefile +++ /dev/null @@ -1 +0,0 @@ -include $(TOPDIR)/Rules diff --git a/sysdep/linux/Modules b/sysdep/linux/Modules new file mode 100644 index 00000000..e69de29b diff --git a/sysdep/unix/Makefile b/sysdep/unix/Makefile deleted file mode 100644 index 60f80576..00000000 --- a/sysdep/unix/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -OBJS=log.o - -include $(TOPDIR)/Rules diff --git a/sysdep/unix/Modules b/sysdep/unix/Modules new file mode 100644 index 00000000..450f5795 --- /dev/null +++ b/sysdep/unix/Modules @@ -0,0 +1,3 @@ +log.c +main.c +timer.h diff --git a/sysdep/unix/main.c b/sysdep/unix/main.c new file mode 100644 index 00000000..f3b01d41 --- /dev/null +++ b/sysdep/unix/main.c @@ -0,0 +1,25 @@ +/* + * BIRD Internet Routing Daemon -- Unix Entry Point + * + * (c) 1998 Martin Mares + * + * Can be freely distributed and used under the terms of the GNU GPL. + */ + +#include + +#include "nest/bird.h" +#include "lib/lists.h" +#include "lib/resource.h" +#include "nest/route.h" + +int +main(void) +{ + log(L_INFO "Launching BIRD -1.-1-pre-omega..."); + + log_init_debug(NULL); + resource_init(); + + return 0; +} diff --git a/lib/timer.h b/sysdep/unix/timer.h similarity index 100% rename from lib/timer.h rename to sysdep/unix/timer.h diff --git a/tools/mergedirs b/tools/mergedirs new file mode 100755 index 00000000..581ea4cd --- /dev/null +++ b/tools/mergedirs @@ -0,0 +1,36 @@ +#!/bin/sh + +if [ -z "$2" ] ; then + echo "Usage: mergedirs " + exit 1 + fi +TOPDIR=`pwd` +OBJDIR=$1 +LIBDIR=$OBJDIR/lib +shift +echo "Merging system-dependent modules" +MODULES=`for a in $@ ; do + sed <$a/Modules "s@\\(.*\\)@\\1 $a/\\1@" + done | + sort +0 -1 -u | + cut -d ' ' -f 2` +rm -rf $LIBDIR +mkdir -p $LIBDIR +for a in $MODULES ; do + echo $a + b=`basename $a` + ln -s $TOPDIR/$a $LIBDIR/$b + OBJ=`echo $b | sed '/\.c$/!d;s/\.c$/\.o/'` + if [ -n "$OBJ" ] ; then + OBJS="$OBJS $OBJ" + SRCS="$SRCS \\ + \$(TOPDIR)/$a" + fi + done +cat >$LIBDIR/Makefile <