diff options
author | Erwin Lansing <erwin@FreeBSD.org> | 2006-04-26 07:45:09 +0000 |
---|---|---|
committer | Erwin Lansing <erwin@FreeBSD.org> | 2006-04-26 07:45:09 +0000 |
commit | 76843608455d692f1b89ef776758b2c2194846d6 (patch) | |
tree | 6545e5460d28c2d7bf0cd71822fa8f7c0be18a25 /net-mgmt | |
parent | c77d360bd47b113bd6c48e363f02e4f9858325f8 (diff) | |
download | ports-76843608455d692f1b89ef776758b2c2194846d6.tar.gz ports-76843608455d692f1b89ef776758b2c2194846d6.zip |
Notes
Diffstat (limited to 'net-mgmt')
-rw-r--r-- | net-mgmt/bsnmpd/Makefile | 10 | ||||
-rw-r--r-- | net-mgmt/bsnmpd/distinfo | 6 | ||||
-rw-r--r-- | net-mgmt/bsnmpd/files/patch-configure.ac | 22 | ||||
-rw-r--r-- | net-mgmt/bsnmpd/files/patch-lib__support.h | 16 | ||||
-rw-r--r-- | net-mgmt/bsnmpd/files/patch-snmp_mibII__Makefile.in | 11 | ||||
-rw-r--r-- | net-mgmt/bsnmpd/files/patch-snmp_mibII__mibII.c | 62 | ||||
-rw-r--r-- | net-mgmt/bsnmpd/files/patch-snmp_mibII__mibII.h | 20 | ||||
-rw-r--r-- | net-mgmt/bsnmpd/files/patch-snmp_mibII__mibII_interfaces.c | 25 | ||||
-rw-r--r-- | net-mgmt/bsnmpd/files/patch-snmp_mibII__mibII_route.c | 15 | ||||
-rw-r--r-- | net-mgmt/bsnmpd/files/patch-snmp_mibII__tree.h | 682 |
10 files changed, 161 insertions, 708 deletions
diff --git a/net-mgmt/bsnmpd/Makefile b/net-mgmt/bsnmpd/Makefile index 5e74a9e7387a..7f729a0479e3 100644 --- a/net-mgmt/bsnmpd/Makefile +++ b/net-mgmt/bsnmpd/Makefile @@ -6,11 +6,10 @@ # PORTNAME= bsnmpd -PORTVERSION= 1.11 -PORTREVISION= 3 +PORTVERSION= 1.12 CATEGORIES= net-mgmt MASTER_SITES= http://people.freebsd.org/~harti/bsnmp/ -DISTNAME= bsnmp-${PORTVERSION}a +DISTNAME= bsnmp-${PORTVERSION} MAINTAINER= bu7cher@yandex.ru COMMENT= A mini-SNMP daemon @@ -21,9 +20,8 @@ LIB_DEPENDS= begemot.1:${PORTSDIR}/devel/libbegemot \ USE_GMAKE= yes GNU_CONFIGURE= yes CONFIGURE_ARGS= --with-libbegemot=${LOCALBASE} +USE_AUTOTOOLS= autoconf:259 -# Currently autotools is not needed -#USE_AUTOTOOLS= automake:19 autoconf:259 INSTALLS_SHLIB= yes USE_GCC= 3.2+ @@ -39,8 +37,6 @@ MAN3= asn1.3 bsnmplib.3 bsnmpclient.3 bsnmpagent.3 snmpmod.3 \ IGNORE= bsnmpd already in base system .endif -#run-autotools:: run-autotools-aclocal run-autotools-autoconf - post-install: @${MKDIR} ${PREFIX}/etc @${INSTALL_DATA} ${BUILD_WRKSRC}/snmpd/snmpd.config ${PREFIX}/etc/snmpd.config.example diff --git a/net-mgmt/bsnmpd/distinfo b/net-mgmt/bsnmpd/distinfo index 03ff86d93567..0d96ac92ae63 100644 --- a/net-mgmt/bsnmpd/distinfo +++ b/net-mgmt/bsnmpd/distinfo @@ -1,3 +1,3 @@ -MD5 (bsnmp-1.11a.tar.gz) = 98edaf75d7da5c12705328216129778e -SHA256 (bsnmp-1.11a.tar.gz) = 72d74b12742b153ac9c0bb4deb86bda6fc982eb41c775cc6fd7f343924b887f8 -SIZE (bsnmp-1.11a.tar.gz) = 408165 +MD5 (bsnmp-1.12.tar.gz) = 1700e76fb9611778fff62f75fdf2623f +SHA256 (bsnmp-1.12.tar.gz) = 986d02d71c55693ec0b90b24564cb43195ce03254e85a8cd70457b318eefbee0 +SIZE (bsnmp-1.12.tar.gz) = 418653 diff --git a/net-mgmt/bsnmpd/files/patch-configure.ac b/net-mgmt/bsnmpd/files/patch-configure.ac new file mode 100644 index 000000000000..d113f099df0e --- /dev/null +++ b/net-mgmt/bsnmpd/files/patch-configure.ac @@ -0,0 +1,22 @@ +--- configure.ac.orig Mon Feb 27 13:03:16 2006 ++++ configure.ac Mon Apr 24 23:18:56 2006 +@@ -78,10 +78,6 @@ + # check for getaddrinfo + AC_CHECK_FUNCS(getaddrinfo) + +-# check for a usable tree.h +-AC_CHECK_HEADER(sys/tree.h, +- AC_DEFINE(HAVE_SYS_TREE_H)) +- + # check whether we have posix stdint.h or at least inttypes.h + AC_CHECK_HEADER(stdint.h, + AC_DEFINE(HAVE_STDINT_H)) +@@ -126,6 +122,8 @@ + AC_DEFINE_UNQUOTED(QUADXFMT, ${ac_cv_quad_fmt}"x") + fi + ++AC_EGREP_HEADER(ifi_link_state, net/if.h, ++ AC_DEFINE(HAVE_MIB_LINKSTATE)) + + AC_CONFIG_FILES([ + Makefile:config/Makefile.pre:Makefile.in diff --git a/net-mgmt/bsnmpd/files/patch-lib__support.h b/net-mgmt/bsnmpd/files/patch-lib__support.h new file mode 100644 index 000000000000..1d9dd4c9791b --- /dev/null +++ b/net-mgmt/bsnmpd/files/patch-lib__support.h @@ -0,0 +1,16 @@ +--- lib/support.h Mon Feb 27 13:03:16 2006 ++++ lib/support.h Fri Apr 21 22:14:27 2006 +@@ -36,6 +36,13 @@ + + #include <sys/cdefs.h> + ++#ifndef HAVE_MIB_LINKSTATE ++#include <net/if_media.h> ++#define LINK_STATE_UNKNOWN 0 ++#define LINK_STATE_DOWN 1 ++#define LINK_STATE_UP 2 ++#endif ++ + #ifndef HAVE_ERR_H + void err(int, const char *, ...) __printflike(2, 3) __dead2; + void errx(int, const char *, ...) __printflike(2, 3) __dead2; diff --git a/net-mgmt/bsnmpd/files/patch-snmp_mibII__Makefile.in b/net-mgmt/bsnmpd/files/patch-snmp_mibII__Makefile.in new file mode 100644 index 000000000000..78fba52b2325 --- /dev/null +++ b/net-mgmt/bsnmpd/files/patch-snmp_mibII__Makefile.in @@ -0,0 +1,11 @@ +--- snmp_mibII/Makefile.in.orig Tue Apr 25 14:52:11 2006 ++++ snmp_mibII/Makefile.in Tue Apr 25 14:52:53 2006 +@@ -10,7 +10,7 @@ + SRCS= ${MOD}_tree.c mibII.c mibII_ifmib.c mibII_ip.c \ + mibII_interfaces.c mibII_ipaddr.c mibII_ifstack.c \ + mibII_rcvaddr.c mibII_nettomedia.c mibII_tcp.c mibII_udp.c \ +- mibII_route.c ++ mibII_route.c mibII_begemot.c + INCS= snmp_${MOD}.h + DEFS= mibII_tree.def + MAN3= snmp_mibII.3 diff --git a/net-mgmt/bsnmpd/files/patch-snmp_mibII__mibII.c b/net-mgmt/bsnmpd/files/patch-snmp_mibII__mibII.c index 138fa2c89e25..b8d43afc3128 100644 --- a/net-mgmt/bsnmpd/files/patch-snmp_mibII__mibII.c +++ b/net-mgmt/bsnmpd/files/patch-snmp_mibII__mibII.c @@ -1,15 +1,55 @@ ---- snmp_mibII/mibII.c.orig Thu Jun 9 16:36:52 2005 -+++ snmp_mibII/mibII.c Fri Oct 7 14:21:53 2005 -@@ -34,6 +34,12 @@ - #include "mibII_oid.h" - #include <net/if_types.h> +--- snmp_mibII/mibII.c Mon Feb 27 13:03:15 2006 ++++ snmp_mibII/mibII.c Fri Apr 21 20:44:26 2006 +@@ -420,6 +420,15 @@ + size_t len; + void *newmib; + struct ifmibdata oldmib = ifp->mib; ++#ifdef HAVE_MIB_LINKSTATE ++#define MIB_LINKSTATE ifp->mib.ifmd_data.ifi_link_state ++#define OLD_LINKSTATE oldmib.ifmd_data.ifi_link_state ++#else ++#define MIB_LINKSTATE MIBIF_PRIV(ifp)->pr_link_state ++#define OLD_LINKSTATE old_link_state ++ struct ifmediareq ifmr; ++ uint8_t old_link_state = MIB_LINKSTATE; ++#endif -+#ifndef SA_SIZE -+#define SA_SIZE(sa) \ -+ ( (!(sa) || ((struct sockaddr *)(sa))->sa_len == 0) ? \ -+ sizeof(long) : \ -+ 1 + ( (((struct sockaddr *)(sa))->sa_len - 1) | (sizeof(long) - 1) ) ) + if (fetch_generic_mib(ifp, &oldmib) == -1) + return (-1); +@@ -429,12 +438,18 @@ + * generated just after ifOperStatus leaves, or just before it + * enters, the down state, respectively;" + */ +- if (ifp->trap_enable && ifp->mib.ifmd_data.ifi_link_state != +- oldmib.ifmd_data.ifi_link_state && +- (ifp->mib.ifmd_data.ifi_link_state == LINK_STATE_DOWN || +- oldmib.ifmd_data.ifi_link_state == LINK_STATE_DOWN)) +- link_trap(ifp, ifp->mib.ifmd_data.ifi_link_state == +- LINK_STATE_UP ? 1 : 0); ++#ifndef HAVE_MIB_LINKSTATE ++ memset(&ifmr, 0, sizeof(ifmr)); ++ strncpy(ifmr.ifm_name, ifp->name, sizeof(ifmr.ifm_name)); ++ if (ioctl(mib_netsock, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) ++ MIB_LINKSTATE = LINK_STATE_UNKNOWN; ++ else MIB_LINKSTATE = (ifmr.ifm_status & IFM_ACTIVE) ? LINK_STATE_UP: ++ LINK_STATE_DOWN; +#endif ++ if (ifp->trap_enable && MIB_LINKSTATE != OLD_LINKSTATE && ++ (MIB_LINKSTATE == LINK_STATE_DOWN || ++ OLD_LINKSTATE == LINK_STATE_DOWN)) ++ link_trap(ifp, MIB_LINKSTATE == LINK_STATE_UP ? 1 : 0); - /*****************************/ + ifp->flags &= ~(MIBIF_HIGHSPEED | MIBIF_VERYHIGHSPEED); + if (ifp->mib.ifmd_data.ifi_baudrate > 20000000) { +@@ -774,7 +789,11 @@ + ifp->counter_disc = get_ticks(); + } + ifp->index = map->ifindex; ++#ifdef HAVE_MIB_LINKSTATE + ifp->mib.ifmd_data.ifi_link_state = LINK_STATE_UNKNOWN; ++#else ++ MIBIF_PRIV(ifp)->pr_link_state = LINK_STATE_UNKNOWN; ++#endif + INSERT_OBJECT_INT(ifp, &mibif_list); + mib_if_number++; diff --git a/net-mgmt/bsnmpd/files/patch-snmp_mibII__mibII.h b/net-mgmt/bsnmpd/files/patch-snmp_mibII__mibII.h new file mode 100644 index 000000000000..4d8b508ce07a --- /dev/null +++ b/net-mgmt/bsnmpd/files/patch-snmp_mibII__mibII.h @@ -0,0 +1,20 @@ +--- snmp_mibII/mibII.h.orig Mon Feb 27 13:03:15 2006 ++++ snmp_mibII/mibII.h Fri Apr 21 20:53:50 2006 +@@ -55,6 +55,7 @@ + #include "snmpmod.h" + #include "snmp_mibII.h" + #include "mibII_tree.h" ++#include "support.h" + + /* + * Interface list and flags. +@@ -76,6 +77,9 @@ + uint64_t hc_opackets; + uint64_t hc_imcasts; + uint64_t hc_ipackets; ++#ifndef HAVE_MIB_LINKSTATE ++ uint8_t pr_link_state; ++#endif + }; + #define MIBIF_PRIV(IFP) ((struct mibif_private *)((IFP)->private)) + diff --git a/net-mgmt/bsnmpd/files/patch-snmp_mibII__mibII_interfaces.c b/net-mgmt/bsnmpd/files/patch-snmp_mibII__mibII_interfaces.c new file mode 100644 index 000000000000..a1e4a1381634 --- /dev/null +++ b/net-mgmt/bsnmpd/files/patch-snmp_mibII__mibII_interfaces.c @@ -0,0 +1,25 @@ +--- snmp_mibII/mibII_interfaces.c.orig Fri Apr 21 22:31:19 2006 ++++ snmp_mibII/mibII_interfaces.c Fri Apr 21 22:37:11 2006 +@@ -289,8 +289,20 @@ + * cable) and hence return 'dormant'. + */ + if (ifp->mib.ifmd_flags & IFF_RUNNING) { +- if (ifp->mib.ifmd_data.ifi_link_state == +- LINK_STATE_DOWN) ++#ifndef HAVE_MIB_LINKSTATE ++#define MIB_LINKSTATE MIBIF_PRIV(ifp)->pr_link_state ++ struct ifmediareq ifmr; ++ memset(&ifmr, 0, sizeof(ifmr)); ++ strncpy(ifmr.ifm_name, ifp->name, sizeof(ifmr.ifm_name)); ++ if (ioctl(mib_netsock, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) ++ MIB_LINKSTATE = LINK_STATE_UNKNOWN; ++ else ++ MIB_LINKSTATE = (ifmr.ifm_status & IFM_ACTIVE) ? ++ LINK_STATE_UP: LINK_STATE_DOWN; ++#else ++#define MIB_LINKSTATE ifp->mib.ifmd_data.ifi_link_state ++#endif ++ if (MIB_LINKSTATE == LINK_STATE_DOWN) + value->v.integer = 5; /* state dormant */ + else + value->v.integer = 1; /* state up */ diff --git a/net-mgmt/bsnmpd/files/patch-snmp_mibII__mibII_route.c b/net-mgmt/bsnmpd/files/patch-snmp_mibII__mibII_route.c index da673fe9cad1..d6c2c53a3600 100644 --- a/net-mgmt/bsnmpd/files/patch-snmp_mibII__mibII_route.c +++ b/net-mgmt/bsnmpd/files/patch-snmp_mibII__mibII_route.c @@ -1,11 +1,16 @@ ---- snmp_mibII/mibII_route.c.orig Fri Oct 7 14:23:49 2005 -+++ snmp_mibII/mibII_route.c Fri Oct 7 14:24:05 2005 -@@ -30,7 +30,7 @@ - * +--- snmp_mibII/mibII_route.c.orig Mon Apr 24 23:53:40 2006 ++++ snmp_mibII/mibII_route.c Mon Apr 24 23:53:51 2006 +@@ -31,13 +31,7 @@ * Routing table */ + #include "support.h" +- +-#ifdef HAVE_SYS_TREE_H -#include <sys/tree.h> -+#include "tree.h" +-#else + #include "tree.h" +-#endif +- #include "mibII.h" #include "mibII_oid.h" diff --git a/net-mgmt/bsnmpd/files/patch-snmp_mibII__tree.h b/net-mgmt/bsnmpd/files/patch-snmp_mibII__tree.h deleted file mode 100644 index 5e41dc7aea77..000000000000 --- a/net-mgmt/bsnmpd/files/patch-snmp_mibII__tree.h +++ /dev/null @@ -1,682 +0,0 @@ ---- snmp_mibII/tree.h.orig Wed Oct 5 16:43:43 2005 -+++ snmp_mibII/tree.h Wed Oct 5 16:45:16 2005 -@@ -0,0 +1,679 @@ -+/*- -+ * Copyright 2002 Niels Provos <provos@citi.umich.edu> -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ */ -+ -+#ifndef _SYS_TREE_H_ -+#define _SYS_TREE_H_ -+ -+/* -+ * This file defines data structures for different types of trees: -+ * splay trees and red-black trees. -+ * -+ * A splay tree is a self-organizing data structure. Every operation -+ * on the tree causes a splay to happen. The splay moves the requested -+ * node to the root of the tree and partly rebalances it. -+ * -+ * This has the benefit that request locality causes faster lookups as -+ * the requested nodes move to the top of the tree. On the other hand, -+ * every lookup causes memory writes. -+ * -+ * The Balance Theorem bounds the total access time for m operations -+ * and n inserts on an initially empty tree as O((m + n)lg n). The -+ * amortized cost for a sequence of m accesses to a splay tree is O(lg n); -+ * -+ * A red-black tree is a binary search tree with the node color as an -+ * extra attribute. It fulfills a set of conditions: -+ * - every search path from the root to a leaf consists of the -+ * same number of black nodes, -+ * - each red node (except for the root) has a black parent, -+ * - each leaf node is black. -+ * -+ * Every operation on a red-black tree is bounded as O(lg n). -+ * The maximum height of a red-black tree is 2lg (n+1). -+ */ -+ -+#define SPLAY_HEAD(name, type) \ -+struct name { \ -+ struct type *sph_root; /* root of the tree */ \ -+} -+ -+#define SPLAY_INITIALIZER(root) \ -+ { NULL } -+ -+#define SPLAY_INIT(root) do { \ -+ (root)->sph_root = NULL; \ -+} while (/*CONSTCOND*/ 0) -+ -+#define SPLAY_ENTRY(type) \ -+struct { \ -+ struct type *spe_left; /* left element */ \ -+ struct type *spe_right; /* right element */ \ -+} -+ -+#define SPLAY_LEFT(elm, field) (elm)->field.spe_left -+#define SPLAY_RIGHT(elm, field) (elm)->field.spe_right -+#define SPLAY_ROOT(head) (head)->sph_root -+#define SPLAY_EMPTY(head) (SPLAY_ROOT(head) == NULL) -+ -+/* SPLAY_ROTATE_{LEFT,RIGHT} expect that tmp hold SPLAY_{RIGHT,LEFT} */ -+#define SPLAY_ROTATE_RIGHT(head, tmp, field) do { \ -+ SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(tmp, field); \ -+ SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ -+ (head)->sph_root = tmp; \ -+} while (/*CONSTCOND*/ 0) -+ -+#define SPLAY_ROTATE_LEFT(head, tmp, field) do { \ -+ SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(tmp, field); \ -+ SPLAY_LEFT(tmp, field) = (head)->sph_root; \ -+ (head)->sph_root = tmp; \ -+} while (/*CONSTCOND*/ 0) -+ -+#define SPLAY_LINKLEFT(head, tmp, field) do { \ -+ SPLAY_LEFT(tmp, field) = (head)->sph_root; \ -+ tmp = (head)->sph_root; \ -+ (head)->sph_root = SPLAY_LEFT((head)->sph_root, field); \ -+} while (/*CONSTCOND*/ 0) -+ -+#define SPLAY_LINKRIGHT(head, tmp, field) do { \ -+ SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ -+ tmp = (head)->sph_root; \ -+ (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field); \ -+} while (/*CONSTCOND*/ 0) -+ -+#define SPLAY_ASSEMBLE(head, node, left, right, field) do { \ -+ SPLAY_RIGHT(left, field) = SPLAY_LEFT((head)->sph_root, field); \ -+ SPLAY_LEFT(right, field) = SPLAY_RIGHT((head)->sph_root, field);\ -+ SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(node, field); \ -+ SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(node, field); \ -+} while (/*CONSTCOND*/ 0) -+ -+/* Generates prototypes and inline functions */ -+ -+#define SPLAY_PROTOTYPE(name, type, field, cmp) \ -+void name##_SPLAY(struct name *, struct type *); \ -+void name##_SPLAY_MINMAX(struct name *, int); \ -+struct type *name##_SPLAY_INSERT(struct name *, struct type *); \ -+struct type *name##_SPLAY_REMOVE(struct name *, struct type *); \ -+ \ -+/* Finds the node with the same key as elm */ \ -+static __inline struct type * \ -+name##_SPLAY_FIND(struct name *head, struct type *elm) \ -+{ \ -+ if (SPLAY_EMPTY(head)) \ -+ return(NULL); \ -+ name##_SPLAY(head, elm); \ -+ if ((cmp)(elm, (head)->sph_root) == 0) \ -+ return (head->sph_root); \ -+ return (NULL); \ -+} \ -+ \ -+static __inline struct type * \ -+name##_SPLAY_NEXT(struct name *head, struct type *elm) \ -+{ \ -+ name##_SPLAY(head, elm); \ -+ if (SPLAY_RIGHT(elm, field) != NULL) { \ -+ elm = SPLAY_RIGHT(elm, field); \ -+ while (SPLAY_LEFT(elm, field) != NULL) { \ -+ elm = SPLAY_LEFT(elm, field); \ -+ } \ -+ } else \ -+ elm = NULL; \ -+ return (elm); \ -+} \ -+ \ -+static __inline struct type * \ -+name##_SPLAY_MIN_MAX(struct name *head, int val) \ -+{ \ -+ name##_SPLAY_MINMAX(head, val); \ -+ return (SPLAY_ROOT(head)); \ -+} -+ -+/* Main splay operation. -+ * Moves node close to the key of elm to top -+ */ -+#define SPLAY_GENERATE(name, type, field, cmp) \ -+struct type * \ -+name##_SPLAY_INSERT(struct name *head, struct type *elm) \ -+{ \ -+ if (SPLAY_EMPTY(head)) { \ -+ SPLAY_LEFT(elm, field) = SPLAY_RIGHT(elm, field) = NULL; \ -+ } else { \ -+ int __comp; \ -+ name##_SPLAY(head, elm); \ -+ __comp = (cmp)(elm, (head)->sph_root); \ -+ if(__comp < 0) { \ -+ SPLAY_LEFT(elm, field) = SPLAY_LEFT((head)->sph_root, field);\ -+ SPLAY_RIGHT(elm, field) = (head)->sph_root; \ -+ SPLAY_LEFT((head)->sph_root, field) = NULL; \ -+ } else if (__comp > 0) { \ -+ SPLAY_RIGHT(elm, field) = SPLAY_RIGHT((head)->sph_root, field);\ -+ SPLAY_LEFT(elm, field) = (head)->sph_root; \ -+ SPLAY_RIGHT((head)->sph_root, field) = NULL; \ -+ } else \ -+ return ((head)->sph_root); \ -+ } \ -+ (head)->sph_root = (elm); \ -+ return (NULL); \ -+} \ -+ \ -+struct type * \ -+name##_SPLAY_REMOVE(struct name *head, struct type *elm) \ -+{ \ -+ struct type *__tmp; \ -+ if (SPLAY_EMPTY(head)) \ -+ return (NULL); \ -+ name##_SPLAY(head, elm); \ -+ if ((cmp)(elm, (head)->sph_root) == 0) { \ -+ if (SPLAY_LEFT((head)->sph_root, field) == NULL) { \ -+ (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field);\ -+ } else { \ -+ __tmp = SPLAY_RIGHT((head)->sph_root, field); \ -+ (head)->sph_root = SPLAY_LEFT((head)->sph_root, field);\ -+ name##_SPLAY(head, elm); \ -+ SPLAY_RIGHT((head)->sph_root, field) = __tmp; \ -+ } \ -+ return (elm); \ -+ } \ -+ return (NULL); \ -+} \ -+ \ -+void \ -+name##_SPLAY(struct name *head, struct type *elm) \ -+{ \ -+ struct type __node, *__left, *__right, *__tmp; \ -+ int __comp; \ -+\ -+ SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL;\ -+ __left = __right = &__node; \ -+\ -+ while ((__comp = (cmp)(elm, (head)->sph_root)) != 0) { \ -+ if (__comp < 0) { \ -+ __tmp = SPLAY_LEFT((head)->sph_root, field); \ -+ if (__tmp == NULL) \ -+ break; \ -+ if ((cmp)(elm, __tmp) < 0){ \ -+ SPLAY_ROTATE_RIGHT(head, __tmp, field); \ -+ if (SPLAY_LEFT((head)->sph_root, field) == NULL)\ -+ break; \ -+ } \ -+ SPLAY_LINKLEFT(head, __right, field); \ -+ } else if (__comp > 0) { \ -+ __tmp = SPLAY_RIGHT((head)->sph_root, field); \ -+ if (__tmp == NULL) \ -+ break; \ -+ if ((cmp)(elm, __tmp) > 0){ \ -+ SPLAY_ROTATE_LEFT(head, __tmp, field); \ -+ if (SPLAY_RIGHT((head)->sph_root, field) == NULL)\ -+ break; \ -+ } \ -+ SPLAY_LINKRIGHT(head, __left, field); \ -+ } \ -+ } \ -+ SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \ -+} \ -+ \ -+/* Splay with either the minimum or the maximum element \ -+ * Used to find minimum or maximum element in tree. \ -+ */ \ -+void name##_SPLAY_MINMAX(struct name *head, int __comp) \ -+{ \ -+ struct type __node, *__left, *__right, *__tmp; \ -+\ -+ SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL;\ -+ __left = __right = &__node; \ -+\ -+ while (1) { \ -+ if (__comp < 0) { \ -+ __tmp = SPLAY_LEFT((head)->sph_root, field); \ -+ if (__tmp == NULL) \ -+ break; \ -+ if (__comp < 0){ \ -+ SPLAY_ROTATE_RIGHT(head, __tmp, field); \ -+ if (SPLAY_LEFT((head)->sph_root, field) == NULL)\ -+ break; \ -+ } \ -+ SPLAY_LINKLEFT(head, __right, field); \ -+ } else if (__comp > 0) { \ -+ __tmp = SPLAY_RIGHT((head)->sph_root, field); \ -+ if (__tmp == NULL) \ -+ break; \ -+ if (__comp > 0) { \ -+ SPLAY_ROTATE_LEFT(head, __tmp, field); \ -+ if (SPLAY_RIGHT((head)->sph_root, field) == NULL)\ -+ break; \ -+ } \ -+ SPLAY_LINKRIGHT(head, __left, field); \ -+ } \ -+ } \ -+ SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \ -+} -+ -+#define SPLAY_NEGINF -1 -+#define SPLAY_INF 1 -+ -+#define SPLAY_INSERT(name, x, y) name##_SPLAY_INSERT(x, y) -+#define SPLAY_REMOVE(name, x, y) name##_SPLAY_REMOVE(x, y) -+#define SPLAY_FIND(name, x, y) name##_SPLAY_FIND(x, y) -+#define SPLAY_NEXT(name, x, y) name##_SPLAY_NEXT(x, y) -+#define SPLAY_MIN(name, x) (SPLAY_EMPTY(x) ? NULL \ -+ : name##_SPLAY_MIN_MAX(x, SPLAY_NEGINF)) -+#define SPLAY_MAX(name, x) (SPLAY_EMPTY(x) ? NULL \ -+ : name##_SPLAY_MIN_MAX(x, SPLAY_INF)) -+ -+#define SPLAY_FOREACH(x, name, head) \ -+ for ((x) = SPLAY_MIN(name, head); \ -+ (x) != NULL; \ -+ (x) = SPLAY_NEXT(name, head, x)) -+ -+/* Macros that define a red-black tree */ -+#define RB_HEAD(name, type) \ -+struct name { \ -+ struct type *rbh_root; /* root of the tree */ \ -+} -+ -+#define RB_INITIALIZER(root) \ -+ { NULL } -+ -+#define RB_INIT(root) do { \ -+ (root)->rbh_root = NULL; \ -+} while (/*CONSTCOND*/ 0) -+ -+#define RB_BLACK 0 -+#define RB_RED 1 -+#define RB_ENTRY(type) \ -+struct { \ -+ struct type *rbe_left; /* left element */ \ -+ struct type *rbe_right; /* right element */ \ -+ struct type *rbe_parent; /* parent element */ \ -+ int rbe_color; /* node color */ \ -+} -+ -+#define RB_LEFT(elm, field) (elm)->field.rbe_left -+#define RB_RIGHT(elm, field) (elm)->field.rbe_right -+#define RB_PARENT(elm, field) (elm)->field.rbe_parent -+#define RB_COLOR(elm, field) (elm)->field.rbe_color -+#define RB_ROOT(head) (head)->rbh_root -+#define RB_EMPTY(head) (RB_ROOT(head) == NULL) -+ -+#define RB_SET(elm, parent, field) do { \ -+ RB_PARENT(elm, field) = parent; \ -+ RB_LEFT(elm, field) = RB_RIGHT(elm, field) = NULL; \ -+ RB_COLOR(elm, field) = RB_RED; \ -+} while (/*CONSTCOND*/ 0) -+ -+#define RB_SET_BLACKRED(black, red, field) do { \ -+ RB_COLOR(black, field) = RB_BLACK; \ -+ RB_COLOR(red, field) = RB_RED; \ -+} while (/*CONSTCOND*/ 0) -+ -+#ifndef RB_AUGMENT -+#define RB_AUGMENT(x) do {} while (0) -+#endif -+ -+#define RB_ROTATE_LEFT(head, elm, tmp, field) do { \ -+ (tmp) = RB_RIGHT(elm, field); \ -+ if ((RB_RIGHT(elm, field) = RB_LEFT(tmp, field)) != NULL) { \ -+ RB_PARENT(RB_LEFT(tmp, field), field) = (elm); \ -+ } \ -+ RB_AUGMENT(elm); \ -+ if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \ -+ if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \ -+ RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \ -+ else \ -+ RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \ -+ } else \ -+ (head)->rbh_root = (tmp); \ -+ RB_LEFT(tmp, field) = (elm); \ -+ RB_PARENT(elm, field) = (tmp); \ -+ RB_AUGMENT(tmp); \ -+ if ((RB_PARENT(tmp, field))) \ -+ RB_AUGMENT(RB_PARENT(tmp, field)); \ -+} while (/*CONSTCOND*/ 0) -+ -+#define RB_ROTATE_RIGHT(head, elm, tmp, field) do { \ -+ (tmp) = RB_LEFT(elm, field); \ -+ if ((RB_LEFT(elm, field) = RB_RIGHT(tmp, field)) != NULL) { \ -+ RB_PARENT(RB_RIGHT(tmp, field), field) = (elm); \ -+ } \ -+ RB_AUGMENT(elm); \ -+ if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \ -+ if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \ -+ RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \ -+ else \ -+ RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \ -+ } else \ -+ (head)->rbh_root = (tmp); \ -+ RB_RIGHT(tmp, field) = (elm); \ -+ RB_PARENT(elm, field) = (tmp); \ -+ RB_AUGMENT(tmp); \ -+ if ((RB_PARENT(tmp, field))) \ -+ RB_AUGMENT(RB_PARENT(tmp, field)); \ -+} while (/*CONSTCOND*/ 0) -+ -+/* Generates prototypes and inline functions */ -+#define RB_PROTOTYPE(name, type, field, cmp) \ -+void name##_RB_INSERT_COLOR(struct name *, struct type *); \ -+void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *);\ -+struct type *name##_RB_REMOVE(struct name *, struct type *); \ -+struct type *name##_RB_INSERT(struct name *, struct type *); \ -+struct type *name##_RB_FIND(struct name *, struct type *); \ -+struct type *name##_RB_NEXT(struct type *); \ -+struct type *name##_RB_MINMAX(struct name *, int); \ -+ \ -+ -+/* Main rb operation. -+ * Moves node close to the key of elm to top -+ */ -+#define RB_GENERATE(name, type, field, cmp) \ -+void \ -+name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \ -+{ \ -+ struct type *parent, *gparent, *tmp; \ -+ while ((parent = RB_PARENT(elm, field)) != NULL && \ -+ RB_COLOR(parent, field) == RB_RED) { \ -+ gparent = RB_PARENT(parent, field); \ -+ if (parent == RB_LEFT(gparent, field)) { \ -+ tmp = RB_RIGHT(gparent, field); \ -+ if (tmp && RB_COLOR(tmp, field) == RB_RED) { \ -+ RB_COLOR(tmp, field) = RB_BLACK; \ -+ RB_SET_BLACKRED(parent, gparent, field);\ -+ elm = gparent; \ -+ continue; \ -+ } \ -+ if (RB_RIGHT(parent, field) == elm) { \ -+ RB_ROTATE_LEFT(head, parent, tmp, field);\ -+ tmp = parent; \ -+ parent = elm; \ -+ elm = tmp; \ -+ } \ -+ RB_SET_BLACKRED(parent, gparent, field); \ -+ RB_ROTATE_RIGHT(head, gparent, tmp, field); \ -+ } else { \ -+ tmp = RB_LEFT(gparent, field); \ -+ if (tmp && RB_COLOR(tmp, field) == RB_RED) { \ -+ RB_COLOR(tmp, field) = RB_BLACK; \ -+ RB_SET_BLACKRED(parent, gparent, field);\ -+ elm = gparent; \ -+ continue; \ -+ } \ -+ if (RB_LEFT(parent, field) == elm) { \ -+ RB_ROTATE_RIGHT(head, parent, tmp, field);\ -+ tmp = parent; \ -+ parent = elm; \ -+ elm = tmp; \ -+ } \ -+ RB_SET_BLACKRED(parent, gparent, field); \ -+ RB_ROTATE_LEFT(head, gparent, tmp, field); \ -+ } \ -+ } \ -+ RB_COLOR(head->rbh_root, field) = RB_BLACK; \ -+} \ -+ \ -+void \ -+name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm) \ -+{ \ -+ struct type *tmp; \ -+ while ((elm == NULL || RB_COLOR(elm, field) == RB_BLACK) && \ -+ elm != RB_ROOT(head)) { \ -+ if (RB_LEFT(parent, field) == elm) { \ -+ tmp = RB_RIGHT(parent, field); \ -+ if (RB_COLOR(tmp, field) == RB_RED) { \ -+ RB_SET_BLACKRED(tmp, parent, field); \ -+ RB_ROTATE_LEFT(head, parent, tmp, field);\ -+ tmp = RB_RIGHT(parent, field); \ -+ } \ -+ if ((RB_LEFT(tmp, field) == NULL || \ -+ RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) &&\ -+ (RB_RIGHT(tmp, field) == NULL || \ -+ RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) {\ -+ RB_COLOR(tmp, field) = RB_RED; \ -+ elm = parent; \ -+ parent = RB_PARENT(elm, field); \ -+ } else { \ -+ if (RB_RIGHT(tmp, field) == NULL || \ -+ RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK) {\ -+ struct type *oleft; \ -+ if ((oleft = RB_LEFT(tmp, field)) \ -+ != NULL) \ -+ RB_COLOR(oleft, field) = RB_BLACK;\ -+ RB_COLOR(tmp, field) = RB_RED; \ -+ RB_ROTATE_RIGHT(head, tmp, oleft, field);\ -+ tmp = RB_RIGHT(parent, field); \ -+ } \ -+ RB_COLOR(tmp, field) = RB_COLOR(parent, field);\ -+ RB_COLOR(parent, field) = RB_BLACK; \ -+ if (RB_RIGHT(tmp, field)) \ -+ RB_COLOR(RB_RIGHT(tmp, field), field) = RB_BLACK;\ -+ RB_ROTATE_LEFT(head, parent, tmp, field);\ -+ elm = RB_ROOT(head); \ -+ break; \ -+ } \ -+ } else { \ -+ tmp = RB_LEFT(parent, field); \ -+ if (RB_COLOR(tmp, field) == RB_RED) { \ -+ RB_SET_BLACKRED(tmp, parent, field); \ -+ RB_ROTATE_RIGHT(head, parent, tmp, field);\ -+ tmp = RB_LEFT(parent, field); \ -+ } \ -+ if ((RB_LEFT(tmp, field) == NULL || \ -+ RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) &&\ -+ (RB_RIGHT(tmp, field) == NULL || \ -+ RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) {\ -+ RB_COLOR(tmp, field) = RB_RED; \ -+ elm = parent; \ -+ parent = RB_PARENT(elm, field); \ -+ } else { \ -+ if (RB_LEFT(tmp, field) == NULL || \ -+ RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) {\ -+ struct type *oright; \ -+ if ((oright = RB_RIGHT(tmp, field)) \ -+ != NULL) \ -+ RB_COLOR(oright, field) = RB_BLACK;\ -+ RB_COLOR(tmp, field) = RB_RED; \ -+ RB_ROTATE_LEFT(head, tmp, oright, field);\ -+ tmp = RB_LEFT(parent, field); \ -+ } \ -+ RB_COLOR(tmp, field) = RB_COLOR(parent, field);\ -+ RB_COLOR(parent, field) = RB_BLACK; \ -+ if (RB_LEFT(tmp, field)) \ -+ RB_COLOR(RB_LEFT(tmp, field), field) = RB_BLACK;\ -+ RB_ROTATE_RIGHT(head, parent, tmp, field);\ -+ elm = RB_ROOT(head); \ -+ break; \ -+ } \ -+ } \ -+ } \ -+ if (elm) \ -+ RB_COLOR(elm, field) = RB_BLACK; \ -+} \ -+ \ -+struct type * \ -+name##_RB_REMOVE(struct name *head, struct type *elm) \ -+{ \ -+ struct type *child, *parent, *old = elm; \ -+ int color; \ -+ if (RB_LEFT(elm, field) == NULL) \ -+ child = RB_RIGHT(elm, field); \ -+ else if (RB_RIGHT(elm, field) == NULL) \ -+ child = RB_LEFT(elm, field); \ -+ else { \ -+ struct type *left; \ -+ elm = RB_RIGHT(elm, field); \ -+ while ((left = RB_LEFT(elm, field)) != NULL) \ -+ elm = left; \ -+ child = RB_RIGHT(elm, field); \ -+ parent = RB_PARENT(elm, field); \ -+ color = RB_COLOR(elm, field); \ -+ if (child) \ -+ RB_PARENT(child, field) = parent; \ -+ if (parent) { \ -+ if (RB_LEFT(parent, field) == elm) \ -+ RB_LEFT(parent, field) = child; \ -+ else \ -+ RB_RIGHT(parent, field) = child; \ -+ RB_AUGMENT(parent); \ -+ } else \ -+ RB_ROOT(head) = child; \ -+ if (RB_PARENT(elm, field) == old) \ -+ parent = elm; \ -+ (elm)->field = (old)->field; \ -+ if (RB_PARENT(old, field)) { \ -+ if (RB_LEFT(RB_PARENT(old, field), field) == old)\ -+ RB_LEFT(RB_PARENT(old, field), field) = elm;\ -+ else \ -+ RB_RIGHT(RB_PARENT(old, field), field) = elm;\ -+ RB_AUGMENT(RB_PARENT(old, field)); \ -+ } else \ -+ RB_ROOT(head) = elm; \ -+ RB_PARENT(RB_LEFT(old, field), field) = elm; \ -+ if (RB_RIGHT(old, field)) \ -+ RB_PARENT(RB_RIGHT(old, field), field) = elm; \ -+ if (parent) { \ -+ left = parent; \ -+ do { \ -+ RB_AUGMENT(left); \ -+ } while ((left = RB_PARENT(left, field)) != NULL); \ -+ } \ -+ goto color; \ -+ } \ -+ parent = RB_PARENT(elm, field); \ -+ color = RB_COLOR(elm, field); \ -+ if (child) \ -+ RB_PARENT(child, field) = parent; \ -+ if (parent) { \ -+ if (RB_LEFT(parent, field) == elm) \ -+ RB_LEFT(parent, field) = child; \ -+ else \ -+ RB_RIGHT(parent, field) = child; \ -+ RB_AUGMENT(parent); \ -+ } else \ -+ RB_ROOT(head) = child; \ -+color: \ -+ if (color == RB_BLACK) \ -+ name##_RB_REMOVE_COLOR(head, parent, child); \ -+ return (old); \ -+} \ -+ \ -+/* Inserts a node into the RB tree */ \ -+struct type * \ -+name##_RB_INSERT(struct name *head, struct type *elm) \ -+{ \ -+ struct type *tmp; \ -+ struct type *parent = NULL; \ -+ int comp = 0; \ -+ tmp = RB_ROOT(head); \ -+ while (tmp) { \ -+ parent = tmp; \ -+ comp = (cmp)(elm, parent); \ -+ if (comp < 0) \ -+ tmp = RB_LEFT(tmp, field); \ -+ else if (comp > 0) \ -+ tmp = RB_RIGHT(tmp, field); \ -+ else \ -+ return (tmp); \ -+ } \ -+ RB_SET(elm, parent, field); \ -+ if (parent != NULL) { \ -+ if (comp < 0) \ -+ RB_LEFT(parent, field) = elm; \ -+ else \ -+ RB_RIGHT(parent, field) = elm; \ -+ RB_AUGMENT(parent); \ -+ } else \ -+ RB_ROOT(head) = elm; \ -+ name##_RB_INSERT_COLOR(head, elm); \ -+ return (NULL); \ -+} \ -+ \ -+/* Finds the node with the same key as elm */ \ -+struct type * \ -+name##_RB_FIND(struct name *head, struct type *elm) \ -+{ \ -+ struct type *tmp = RB_ROOT(head); \ -+ int comp; \ -+ while (tmp) { \ -+ comp = cmp(elm, tmp); \ -+ if (comp < 0) \ -+ tmp = RB_LEFT(tmp, field); \ -+ else if (comp > 0) \ -+ tmp = RB_RIGHT(tmp, field); \ -+ else \ -+ return (tmp); \ -+ } \ -+ return (NULL); \ -+} \ -+ \ -+/* ARGSUSED */ \ -+struct type * \ -+name##_RB_NEXT(struct type *elm) \ -+{ \ -+ if (RB_RIGHT(elm, field)) { \ -+ elm = RB_RIGHT(elm, field); \ -+ while (RB_LEFT(elm, field)) \ -+ elm = RB_LEFT(elm, field); \ -+ } else { \ -+ if (RB_PARENT(elm, field) && \ -+ (elm == RB_LEFT(RB_PARENT(elm, field), field))) \ -+ elm = RB_PARENT(elm, field); \ -+ else { \ -+ while (RB_PARENT(elm, field) && \ -+ (elm == RB_RIGHT(RB_PARENT(elm, field), field)))\ -+ elm = RB_PARENT(elm, field); \ -+ elm = RB_PARENT(elm, field); \ -+ } \ -+ } \ -+ return (elm); \ -+} \ -+ \ -+struct type * \ -+name##_RB_MINMAX(struct name *head, int val) \ -+{ \ -+ struct type *tmp = RB_ROOT(head); \ -+ struct type *parent = NULL; \ -+ while (tmp) { \ -+ parent = tmp; \ -+ if (val < 0) \ -+ tmp = RB_LEFT(tmp, field); \ -+ else \ -+ tmp = RB_RIGHT(tmp, field); \ -+ } \ -+ return (parent); \ -+} -+ -+#define RB_NEGINF -1 -+#define RB_INF 1 -+ -+#define RB_INSERT(name, x, y) name##_RB_INSERT(x, y) -+#define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y) -+#define RB_FIND(name, x, y) name##_RB_FIND(x, y) -+#define RB_NEXT(name, x, y) name##_RB_NEXT(y) -+#define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF) -+#define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF) -+ -+#define RB_FOREACH(x, name, head) \ -+ for ((x) = RB_MIN(name, head); \ -+ (x) != NULL; \ -+ (x) = name##_RB_NEXT(x)) -+ -+#endif /* _SYS_TREE_H_ */ |