aboutsummaryrefslogtreecommitdiff
path: root/net-mgmt
diff options
context:
space:
mode:
authorErwin Lansing <erwin@FreeBSD.org>2006-04-26 07:45:09 +0000
committerErwin Lansing <erwin@FreeBSD.org>2006-04-26 07:45:09 +0000
commit76843608455d692f1b89ef776758b2c2194846d6 (patch)
tree6545e5460d28c2d7bf0cd71822fa8f7c0be18a25 /net-mgmt
parentc77d360bd47b113bd6c48e363f02e4f9858325f8 (diff)
downloadports-76843608455d692f1b89ef776758b2c2194846d6.tar.gz
ports-76843608455d692f1b89ef776758b2c2194846d6.zip
Notes
Diffstat (limited to 'net-mgmt')
-rw-r--r--net-mgmt/bsnmpd/Makefile10
-rw-r--r--net-mgmt/bsnmpd/distinfo6
-rw-r--r--net-mgmt/bsnmpd/files/patch-configure.ac22
-rw-r--r--net-mgmt/bsnmpd/files/patch-lib__support.h16
-rw-r--r--net-mgmt/bsnmpd/files/patch-snmp_mibII__Makefile.in11
-rw-r--r--net-mgmt/bsnmpd/files/patch-snmp_mibII__mibII.c62
-rw-r--r--net-mgmt/bsnmpd/files/patch-snmp_mibII__mibII.h20
-rw-r--r--net-mgmt/bsnmpd/files/patch-snmp_mibII__mibII_interfaces.c25
-rw-r--r--net-mgmt/bsnmpd/files/patch-snmp_mibII__mibII_route.c15
-rw-r--r--net-mgmt/bsnmpd/files/patch-snmp_mibII__tree.h682
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_ */