summaryrefslogtreecommitdiffstats
path: root/contrib/bind9/lib/isc
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bind9/lib/isc')
-rw-r--r--contrib/bind9/lib/isc/Makefile.in21
-rw-r--r--contrib/bind9/lib/isc/alpha/include/isc/atomic.h170
-rw-r--r--contrib/bind9/lib/isc/api6
-rw-r--r--contrib/bind9/lib/isc/assertions.c13
-rw-r--r--contrib/bind9/lib/isc/base64.c20
-rw-r--r--contrib/bind9/lib/isc/bitstring.c6
-rw-r--r--contrib/bind9/lib/isc/buffer.c6
-rw-r--r--contrib/bind9/lib/isc/bufferlist.c6
-rw-r--r--contrib/bind9/lib/isc/commandline.c24
-rw-r--r--contrib/bind9/lib/isc/entropy.c119
-rw-r--r--contrib/bind9/lib/isc/error.c9
-rw-r--r--contrib/bind9/lib/isc/event.c9
-rw-r--r--contrib/bind9/lib/isc/fsaccess.c9
-rw-r--r--contrib/bind9/lib/isc/hash.c42
-rw-r--r--contrib/bind9/lib/isc/heap.c2
-rw-r--r--contrib/bind9/lib/isc/hex.c14
-rw-r--r--contrib/bind9/lib/isc/hmacmd5.c24
-rw-r--r--contrib/bind9/lib/isc/hmacsha.c438
-rw-r--r--contrib/bind9/lib/isc/ia64/include/isc/atomic.h88
-rw-r--r--contrib/bind9/lib/isc/include/Makefile.in2
-rw-r--r--contrib/bind9/lib/isc/include/isc/Makefile.in10
-rw-r--r--contrib/bind9/lib/isc/include/isc/app.h98
-rw-r--r--contrib/bind9/lib/isc/include/isc/assertions.h7
-rw-r--r--contrib/bind9/lib/isc/include/isc/base64.h50
-rw-r--r--contrib/bind9/lib/isc/include/isc/bitstring.h45
-rw-r--r--contrib/bind9/lib/isc/include/isc/boolean.h6
-rw-r--r--contrib/bind9/lib/isc/include/isc/buffer.h299
-rw-r--r--contrib/bind9/lib/isc/include/isc/bufferlist.h32
-rw-r--r--contrib/bind9/lib/isc/include/isc/commandline.h19
-rw-r--r--contrib/bind9/lib/isc/include/isc/entropy.h145
-rw-r--r--contrib/bind9/lib/isc/include/isc/error.h11
-rw-r--r--contrib/bind9/lib/isc/include/isc/event.h26
-rw-r--r--contrib/bind9/lib/isc/include/isc/eventclass.h18
-rw-r--r--contrib/bind9/lib/isc/include/isc/file.h126
-rw-r--r--contrib/bind9/lib/isc/include/isc/formatcheck.h18
-rw-r--r--contrib/bind9/lib/isc/include/isc/fsaccess.h78
-rw-r--r--contrib/bind9/lib/isc/include/isc/hash.h58
-rw-r--r--contrib/bind9/lib/isc/include/isc/heap.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/hex.h44
-rw-r--r--contrib/bind9/lib/isc/include/isc/hmacmd5.h13
-rw-r--r--contrib/bind9/lib/isc/include/isc/hmacsha.h156
-rw-r--r--contrib/bind9/lib/isc/include/isc/interfaceiter.h71
-rw-r--r--contrib/bind9/lib/isc/include/isc/ipv6.h34
-rw-r--r--contrib/bind9/lib/isc/include/isc/lang.h6
-rw-r--r--contrib/bind9/lib/isc/include/isc/lex.h241
-rw-r--r--contrib/bind9/lib/isc/include/isc/lfsr.h59
-rw-r--r--contrib/bind9/lib/isc/include/isc/lib.h10
-rw-r--r--contrib/bind9/lib/isc/include/isc/list.h2
-rw-r--r--contrib/bind9/lib/isc/include/isc/log.h508
-rw-r--r--contrib/bind9/lib/isc/include/isc/magic.h9
-rw-r--r--contrib/bind9/lib/isc/include/isc/md5.h11
-rw-r--r--contrib/bind9/lib/isc/include/isc/mem.h219
-rw-r--r--contrib/bind9/lib/isc/include/isc/msgcat.h51
-rw-r--r--contrib/bind9/lib/isc/include/isc/msgs.h262
-rw-r--r--contrib/bind9/lib/isc/include/isc/mutexblock.h24
-rw-r--r--contrib/bind9/lib/isc/include/isc/netaddr.h72
-rw-r--r--contrib/bind9/lib/isc/include/isc/netscope.h13
-rw-r--r--contrib/bind9/lib/isc/include/isc/ondestroy.h22
-rw-r--r--contrib/bind9/lib/isc/include/isc/os.h8
-rw-r--r--contrib/bind9/lib/isc/include/isc/parseint.h23
-rw-r--r--contrib/bind9/lib/isc/include/isc/platform.h.in122
-rw-r--r--contrib/bind9/lib/isc/include/isc/print.h6
-rw-r--r--contrib/bind9/lib/isc/include/isc/quota.h35
-rw-r--r--contrib/bind9/lib/isc/include/isc/random.h18
-rw-r--r--contrib/bind9/lib/isc/include/isc/ratelimiter.h46
-rw-r--r--contrib/bind9/lib/isc/include/isc/refcount.h109
-rw-r--r--contrib/bind9/lib/isc/include/isc/region.h22
-rw-r--r--contrib/bind9/lib/isc/include/isc/resource.h38
-rw-r--r--contrib/bind9/lib/isc/include/isc/result.h130
-rw-r--r--contrib/bind9/lib/isc/include/isc/resultclass.h20
-rw-r--r--contrib/bind9/lib/isc/include/isc/rwlock.h48
-rw-r--r--contrib/bind9/lib/isc/include/isc/serial.h21
-rw-r--r--contrib/bind9/lib/isc/include/isc/sha1.h17
-rw-r--r--contrib/bind9/lib/isc/include/isc/sha2.h132
-rw-r--r--contrib/bind9/lib/isc/include/isc/sockaddr.h94
-rw-r--r--contrib/bind9/lib/isc/include/isc/socket.h408
-rw-r--r--contrib/bind9/lib/isc/include/isc/stdio.h30
-rw-r--r--contrib/bind9/lib/isc/include/isc/stdlib.h6
-rw-r--r--contrib/bind9/lib/isc/include/isc/string.h156
-rw-r--r--contrib/bind9/lib/isc/include/isc/symtab.h45
-rw-r--r--contrib/bind9/lib/isc/include/isc/task.h327
-rw-r--r--contrib/bind9/lib/isc/include/isc/taskpool.h32
-rw-r--r--contrib/bind9/lib/isc/include/isc/timer.h145
-rw-r--r--contrib/bind9/lib/isc/include/isc/types.h100
-rw-r--r--contrib/bind9/lib/isc/include/isc/util.h28
-rw-r--r--contrib/bind9/lib/isc/include/isc/version.h6
-rw-r--r--contrib/bind9/lib/isc/inet_aton.c7
-rw-r--r--contrib/bind9/lib/isc/inet_ntop.c25
-rw-r--r--contrib/bind9/lib/isc/inet_pton.c36
-rw-r--r--contrib/bind9/lib/isc/lex.c46
-rw-r--r--contrib/bind9/lib/isc/lfsr.c6
-rw-r--r--contrib/bind9/lib/isc/lib.c8
-rw-r--r--contrib/bind9/lib/isc/log.c43
-rw-r--r--contrib/bind9/lib/isc/md5.c20
-rw-r--r--contrib/bind9/lib/isc/mem.c601
-rw-r--r--contrib/bind9/lib/isc/mips/include/isc/atomic.h98
-rw-r--r--contrib/bind9/lib/isc/mutexblock.c6
-rw-r--r--contrib/bind9/lib/isc/netaddr.c83
-rw-r--r--contrib/bind9/lib/isc/netscope.c6
-rw-r--r--contrib/bind9/lib/isc/nls/Makefile.in2
-rw-r--r--contrib/bind9/lib/isc/nls/msgcat.c7
-rw-r--r--contrib/bind9/lib/isc/noatomic/include/isc/atomic.h24
-rw-r--r--contrib/bind9/lib/isc/nothreads/Makefile.in2
-rw-r--r--contrib/bind9/lib/isc/nothreads/condition.c2
-rw-r--r--contrib/bind9/lib/isc/nothreads/include/Makefile.in2
-rw-r--r--contrib/bind9/lib/isc/nothreads/include/isc/Makefile.in2
-rw-r--r--contrib/bind9/lib/isc/nothreads/include/isc/condition.h2
-rw-r--r--contrib/bind9/lib/isc/nothreads/include/isc/mutex.h2
-rw-r--r--contrib/bind9/lib/isc/nothreads/include/isc/once.h2
-rw-r--r--contrib/bind9/lib/isc/nothreads/include/isc/thread.h2
-rw-r--r--contrib/bind9/lib/isc/nothreads/mutex.c2
-rw-r--r--contrib/bind9/lib/isc/nothreads/thread.c2
-rw-r--r--contrib/bind9/lib/isc/ondestroy.c6
-rw-r--r--contrib/bind9/lib/isc/parseint.c6
-rw-r--r--contrib/bind9/lib/isc/powerpc/include/isc/atomic.h160
-rw-r--r--contrib/bind9/lib/isc/print.c2
-rw-r--r--contrib/bind9/lib/isc/pthreads/Makefile.in2
-rw-r--r--contrib/bind9/lib/isc/pthreads/condition.c8
-rw-r--r--contrib/bind9/lib/isc/pthreads/include/Makefile.in2
-rw-r--r--contrib/bind9/lib/isc/pthreads/include/isc/Makefile.in2
-rw-r--r--contrib/bind9/lib/isc/pthreads/include/isc/condition.h6
-rw-r--r--contrib/bind9/lib/isc/pthreads/include/isc/mutex.h22
-rw-r--r--contrib/bind9/lib/isc/pthreads/include/isc/once.h10
-rw-r--r--contrib/bind9/lib/isc/pthreads/include/isc/thread.h12
-rw-r--r--contrib/bind9/lib/isc/pthreads/mutex.c59
-rw-r--r--contrib/bind9/lib/isc/pthreads/thread.c6
-rw-r--r--contrib/bind9/lib/isc/quota.c4
-rw-r--r--contrib/bind9/lib/isc/random.c6
-rw-r--r--contrib/bind9/lib/isc/ratelimiter.c6
-rw-r--r--contrib/bind9/lib/isc/refcount.c37
-rw-r--r--contrib/bind9/lib/isc/region.c6
-rw-r--r--contrib/bind9/lib/isc/result.c124
-rw-r--r--contrib/bind9/lib/isc/rwlock.c433
-rw-r--r--contrib/bind9/lib/isc/serial.c7
-rw-r--r--contrib/bind9/lib/isc/sha1.c28
-rw-r--r--contrib/bind9/lib/isc/sha2.c1234
-rw-r--r--contrib/bind9/lib/isc/sockaddr.c120
-rw-r--r--contrib/bind9/lib/isc/sparc64/include/isc/atomic.h127
-rw-r--r--contrib/bind9/lib/isc/string.c109
-rw-r--r--contrib/bind9/lib/isc/strtoul.c7
-rw-r--r--contrib/bind9/lib/isc/symtab.c6
-rw-r--r--contrib/bind9/lib/isc/task.c30
-rw-r--r--contrib/bind9/lib/isc/task_p.h6
-rw-r--r--contrib/bind9/lib/isc/taskpool.c6
-rw-r--r--contrib/bind9/lib/isc/timer.c38
-rw-r--r--contrib/bind9/lib/isc/timer_p.h6
-rw-r--r--contrib/bind9/lib/isc/unix/Makefile.in2
-rw-r--r--contrib/bind9/lib/isc/unix/app.c22
-rw-r--r--contrib/bind9/lib/isc/unix/dir.c52
-rw-r--r--contrib/bind9/lib/isc/unix/entropy.c14
-rw-r--r--contrib/bind9/lib/isc/unix/errno2result.c8
-rw-r--r--contrib/bind9/lib/isc/unix/errno2result.h6
-rw-r--r--contrib/bind9/lib/isc/unix/file.c8
-rw-r--r--contrib/bind9/lib/isc/unix/fsaccess.c7
-rw-r--r--contrib/bind9/lib/isc/unix/ifiter_getifaddrs.c25
-rw-r--r--contrib/bind9/lib/isc/unix/ifiter_ioctl.c7
-rw-r--r--contrib/bind9/lib/isc/unix/ifiter_sysctl.c5
-rw-r--r--contrib/bind9/lib/isc/unix/include/Makefile.in2
-rw-r--r--contrib/bind9/lib/isc/unix/include/isc/Makefile.in2
-rw-r--r--contrib/bind9/lib/isc/unix/include/isc/dir.h14
-rw-r--r--contrib/bind9/lib/isc/unix/include/isc/int.h8
-rw-r--r--contrib/bind9/lib/isc/unix/include/isc/keyboard.h6
-rw-r--r--contrib/bind9/lib/isc/unix/include/isc/net.h121
-rw-r--r--contrib/bind9/lib/isc/unix/include/isc/netdb.h17
-rw-r--r--contrib/bind9/lib/isc/unix/include/isc/offset.h9
-rw-r--r--contrib/bind9/lib/isc/unix/include/isc/stat.h3
-rw-r--r--contrib/bind9/lib/isc/unix/include/isc/stdtime.h25
-rw-r--r--contrib/bind9/lib/isc/unix/include/isc/strerror.h9
-rw-r--r--contrib/bind9/lib/isc/unix/include/isc/syslog.h16
-rw-r--r--contrib/bind9/lib/isc/unix/include/isc/time.h127
-rw-r--r--contrib/bind9/lib/isc/unix/interfaceiter.c10
-rw-r--r--contrib/bind9/lib/isc/unix/ipv6.c6
-rw-r--r--contrib/bind9/lib/isc/unix/keyboard.c2
-rw-r--r--contrib/bind9/lib/isc/unix/net.c12
-rw-r--r--contrib/bind9/lib/isc/unix/os.c2
-rw-r--r--contrib/bind9/lib/isc/unix/resource.c2
-rw-r--r--contrib/bind9/lib/isc/unix/socket.c330
-rw-r--r--contrib/bind9/lib/isc/unix/socket_p.h6
-rw-r--r--contrib/bind9/lib/isc/unix/stdio.c2
-rw-r--r--contrib/bind9/lib/isc/unix/stdtime.c4
-rw-r--r--contrib/bind9/lib/isc/unix/strerror.c8
-rw-r--r--contrib/bind9/lib/isc/unix/syslog.c6
-rw-r--r--contrib/bind9/lib/isc/unix/time.c14
-rw-r--r--contrib/bind9/lib/isc/version.c6
-rw-r--r--contrib/bind9/lib/isc/x86_32/include/isc/atomic.h158
-rw-r--r--contrib/bind9/lib/isc/x86_64/include/isc/atomic.h103
186 files changed, 7939 insertions, 3003 deletions
diff --git a/contrib/bind9/lib/isc/Makefile.in b/contrib/bind9/lib/isc/Makefile.in
index 7e53510..c03a3df 100644
--- a/contrib/bind9/lib/isc/Makefile.in
+++ b/contrib/bind9/lib/isc/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004-2006 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 1998-2003 Internet Software Consortium.
#
# Permission to use, copy, modify, and distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.71.2.2.2.8 2004/07/20 07:01:58 marka Exp $
+# $Id: Makefile.in,v 1.81.18.6 2006/01/27 23:57:45 marka Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -25,6 +25,7 @@ top_srcdir = @top_srcdir@
CINCLUDES = -I${srcdir}/unix/include \
-I${srcdir}/@ISC_THREAD_DIR@/include \
+ -I${srcdir}/@ISC_ARCH_DIR@/include \
-I./include \
-I${srcdir}/include
CDEFINES =
@@ -52,25 +53,25 @@ WIN32OBJS = win32/condition.@O@ win32/dir.@O@ win32/file.@O@ \
OBJS = @ISC_EXTRA_OBJS@ \
assertions.@O@ base64.@O@ bitstring.@O@ buffer.@O@ \
bufferlist.@O@ commandline.@O@ error.@O@ event.@O@ \
- hash.@O@ heap.@O@ hex.@O@ hmacmd5.@O@ \
+ hash.@O@ heap.@O@ hex.@O@ hmacmd5.@O@ hmacsha.@O@\
lex.@O@ lfsr.@O@ lib.@O@ log.@O@ md5.@O@ \
mem.@O@ mutexblock.@O@ netaddr.@O@ netscope.@O@ ondestroy.@O@ \
parseint.@O@ quota.@O@ random.@O@ \
- ratelimiter.@O@ region.@O@ result.@O@ rwlock.@O@ \
- serial.@O@ sha1.@O@ sockaddr.@O@ string.@O@ strtoul.@O@ \
- symtab.@O@ task.@O@ taskpool.@O@ timer.@O@ version.@O@ \
- ${UNIXOBJS} ${NLSOBJS} ${THREADOBJS}
+ ratelimiter.@O@ refcount.@O@ region.@O@ result.@O@ rwlock.@O@ \
+ serial.@O@ sha1.@O@ sha2.@O@ sockaddr.@O@ string.@O@ \
+ strtoul.@O@ symtab.@O@ task.@O@ taskpool.@O@ timer.@O@ \
+ version.@O@ ${UNIXOBJS} ${NLSOBJS} ${THREADOBJS}
# Alphabetically
SRCS = @ISC_EXTRA_SRCS@ \
assertions.c base64.c bitstring.c buffer.c \
bufferlist.c commandline.c error.c event.c \
- heap.c hex.c hmacmd5.c \
+ heap.c hex.c hmacmd5.c hmacsha.c \
lex.c lfsr.c lib.c log.c \
md5.c mem.c mutexblock.c netaddr.c netscope.c ondestroy.c \
parseint.c quota.c random.c \
- ratelimiter.c result.c rwlock.c \
- serial.c sha1.c sockaddr.c string.c strtoul.c symtab.c \
+ ratelimiter.c refcount.c region.c result.c rwlock.c \
+ serial.c sha1.c sha2.c sockaddr.c string.c strtoul.c symtab.c \
task.c taskpool.c timer.c version.c
LIBS = @LIBS@
diff --git a/contrib/bind9/lib/isc/alpha/include/isc/atomic.h b/contrib/bind9/lib/isc/alpha/include/isc/atomic.h
new file mode 100644
index 0000000..a4b9b15
--- /dev/null
+++ b/contrib/bind9/lib/isc/alpha/include/isc/atomic.h
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2005 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* $Id: atomic.h,v 1.2.2.2 2005/06/16 22:01:01 jinmei Exp $ */
+
+/*
+ * This code was written based on FreeBSD's kernel source whose copyright
+ * follows:
+ */
+
+/*-
+ * Copyright (c) 1998 Doug Rabson
+ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef ISC_ATOMIC_H
+#define ISC_ATOMIC_H 1
+
+#include <isc/platform.h>
+#include <isc/types.h>
+
+#ifdef ISC_PLATFORM_USEOSFASM
+#include <c_asm.h>
+
+#pragma intrinsic(asm)
+
+/*
+ * This routine atomically increments the value stored in 'p' by 'val', and
+ * returns the previous value.
+ */
+static inline isc_int32_t
+isc_atomic_xadd(isc_int32_t *p, isc_int32_t val) {
+ return (asm("1:"
+ "ldl_l %t0, 0(%a0);" /* load old value */
+ "mov %t0, %v0;" /* copy the old value */
+ "addl %t0, %a1, %t0;" /* calculate new value */
+ "stl_c %t0, 0(%a0);" /* attempt to store */
+ "beq %t0, 1b;", /* spin if failed */
+ p, val));
+}
+
+/*
+ * This routine atomically stores the value 'val' in 'p'.
+ */
+static inline void
+isc_atomic_store(isc_int32_t *p, isc_int32_t val) {
+ (void)asm("1:"
+ "ldl_l %t0, 0(%a0);" /* load old value */
+ "mov %a1, %t0;" /* value to store */
+ "stl_c %t0, 0(%a0);" /* attempt to store */
+ "beq %t0, 1b;", /* spin if failed */
+ p, val);
+}
+
+/*
+ * This routine atomically replaces the value in 'p' with 'val', if the
+ * original value is equal to 'cmpval'. The original value is returned in any
+ * case.
+ */
+static inline isc_int32_t
+isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val) {
+
+ return(asm("1:"
+ "ldl_l %t0, 0(%a0);" /* load old value */
+ "mov %t0, %v0;" /* copy the old value */
+ "cmpeq %t0, %a1, %t0;" /* compare */
+ "beq %t0, 2f;" /* exit if not equal */
+ "mov %a2, %t0;" /* value to store */
+ "stl_c %t0, 0(%a0);" /* attempt to store */
+ "beq %t0, 1b;" /* if it failed, spin */
+ "2:",
+ p, cmpval, val));
+}
+#elif defined (ISC_PLATFORM_USEGCCASM)
+static inline isc_int32_t
+isc_atomic_xadd(isc_int32_t *p, isc_int32_t val) {
+ isc_int32_t temp, prev;
+
+ __asm__ volatile(
+ "1:"
+ "ldl_l %0, %1;" /* load old value */
+ "mov %0, %2;" /* copy the old value */
+ "addl %0, %3, %0;" /* calculate new value */
+ "stl_c %0, %1;" /* attempt to store */
+ "beq %0, 1b;" /* spin if failed */
+ : "=&r"(temp), "+m"(*p), "=r"(prev)
+ : "r"(val)
+ : "memory");
+
+ return (prev);
+}
+
+static inline void
+isc_atomic_store(isc_int32_t *p, isc_int32_t val) {
+ isc_int32_t temp;
+
+ __asm__ volatile(
+ "1:"
+ "ldl_l %0, %1;" /* load old value */
+ "mov %2, %0;" /* value to store */
+ "stl_c %0, %1;" /* attempt to store */
+ "beq %0, 1b;" /* if it failed, spin */
+ : "=&r"(temp), "+m"(*p)
+ : "r"(val)
+ : "memory");
+}
+
+static inline isc_int32_t
+isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val) {
+ isc_int32_t temp, prev;
+
+ __asm__ volatile(
+ "1:"
+ "ldl_l %0, %1;" /* load old value */
+ "mov %0, %2;" /* copy the old value */
+ "cmpeq %0, %3, %0;" /* compare */
+ "beq %0, 2f;" /* exit if not equal */
+ "mov %4, %0;" /* value to store */
+ "stl_c %0, %1;" /* attempt to store */
+ "beq %0, 1b;" /* if it failed, spin */
+ "2:"
+ : "=&r"(temp), "+m"(*p), "=r"(prev)
+ : "r"(cmpval), "r"(val)
+ : "memory");
+
+ return (prev);
+}
+#else
+
+#error "unsupported compiler. disable atomic ops by --disable-atomic"
+
+#endif
+
+#endif /* ISC_ATOMIC_H */
diff --git a/contrib/bind9/lib/isc/api b/contrib/bind9/lib/isc/api
index b4d0173..759a051 100644
--- a/contrib/bind9/lib/isc/api
+++ b/contrib/bind9/lib/isc/api
@@ -1,3 +1,3 @@
-LIBINTERFACE = 12
-LIBREVISION = 1
-LIBAGE = 1
+LIBINTERFACE = 32
+LIBREVISION = 3
+LIBAGE = 0
diff --git a/contrib/bind9/lib/isc/assertions.c b/contrib/bind9/lib/isc/assertions.c
index 94c6732..b3fcf4a 100644
--- a/contrib/bind9/lib/isc/assertions.c
+++ b/contrib/bind9/lib/isc/assertions.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1997-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: assertions.c,v 1.16.206.1 2004/03/06 08:14:27 marka Exp $ */
+/* $Id: assertions.c,v 1.17.18.2 2005/04/29 00:16:44 marka Exp $ */
+
+/*! \file */
#include <config.h>
@@ -25,20 +27,20 @@
#include <isc/assertions.h>
#include <isc/msgs.h>
-/*
+/*%
* Forward.
*/
-
static void
default_callback(const char *, int, isc_assertiontype_t, const char *);
-/*
+/*%
* Public.
*/
LIBISC_EXTERNAL_DATA isc_assertioncallback_t isc_assertion_failed =
default_callback;
+/*% Set callback. */
void
isc_assertion_setcallback(isc_assertioncallback_t cb) {
if (cb == NULL)
@@ -47,6 +49,7 @@ isc_assertion_setcallback(isc_assertioncallback_t cb) {
isc_assertion_failed = cb;
}
+/*% Type to Text */
const char *
isc_assertion_typetotext(isc_assertiontype_t type) {
const char *result;
diff --git a/contrib/bind9/lib/isc/base64.c b/contrib/bind9/lib/isc/base64.c
index 445f8f5..faeae92 100644
--- a/contrib/bind9/lib/isc/base64.c
+++ b/contrib/bind9/lib/isc/base64.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: base64.c,v 1.23.2.2.2.3 2004/03/06 08:14:27 marka Exp $ */
+/* $Id: base64.c,v 1.28.18.2 2005/04/29 00:16:44 marka Exp $ */
+
+/*! \file */
#include <config.h>
@@ -32,7 +34,8 @@
} while (0)
-/*
+/*@{*/
+/*!
* These static functions are also present in lib/dns/rdata.c. I'm not
* sure where they should go. -- bwelling
*/
@@ -44,6 +47,7 @@ mem_tobuffer(isc_buffer_t *target, void *base, unsigned int length);
static const char base64[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+/*@}*/
isc_result_t
isc_base64_totext(isc_region_t *source, int wordlength,
@@ -90,14 +94,14 @@ isc_base64_totext(isc_region_t *source, int wordlength,
return (ISC_R_SUCCESS);
}
-/*
+/*%
* State of a base64 decoding process in progress.
*/
typedef struct {
- int length; /* Desired length of binary data or -1 */
- isc_buffer_t *target; /* Buffer for resulting binary data */
- int digits; /* Number of buffered base64 digits */
- isc_boolean_t seen_end; /* True if "=" end marker seen */
+ int length; /*%< Desired length of binary data or -1 */
+ isc_buffer_t *target; /*%< Buffer for resulting binary data */
+ int digits; /*%< Number of buffered base64 digits */
+ isc_boolean_t seen_end; /*%< True if "=" end marker seen */
int val[4];
} base64_decode_ctx_t;
diff --git a/contrib/bind9/lib/isc/bitstring.c b/contrib/bind9/lib/isc/bitstring.c
index e77ed39..105b5aa 100644
--- a/contrib/bind9/lib/isc/bitstring.c
+++ b/contrib/bind9/lib/isc/bitstring.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: bitstring.c,v 1.12.206.1 2004/03/06 08:14:27 marka Exp $ */
+/* $Id: bitstring.c,v 1.13.18.2 2005/04/29 00:16:44 marka Exp $ */
+
+/*! \file */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/buffer.c b/contrib/bind9/lib/isc/buffer.c
index 30ce529..fc07c00 100644
--- a/contrib/bind9/lib/isc/buffer.c
+++ b/contrib/bind9/lib/isc/buffer.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: buffer.c,v 1.36.12.2 2004/03/08 09:04:48 marka Exp $ */
+/* $Id: buffer.c,v 1.40.18.2 2005/04/29 00:16:44 marka Exp $ */
+
+/*! \file */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/bufferlist.c b/contrib/bind9/lib/isc/bufferlist.c
index 6d64a3f..773d075 100644
--- a/contrib/bind9/lib/isc/bufferlist.c
+++ b/contrib/bind9/lib/isc/bufferlist.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: bufferlist.c,v 1.12.206.1 2004/03/06 08:14:28 marka Exp $ */
+/* $Id: bufferlist.c,v 1.13.18.2 2005/04/29 00:16:45 marka Exp $ */
+
+/*! \file */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/commandline.c b/contrib/bind9/lib/isc/commandline.c
index 4c8af7f..679ed6d 100644
--- a/contrib/bind9/lib/isc/commandline.c
+++ b/contrib/bind9/lib/isc/commandline.c
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -48,9 +48,9 @@
* SUCH DAMAGE.
*/
-/* $Id: commandline.c,v 1.15.206.1 2004/03/06 08:14:28 marka Exp $ */
+/* $Id: commandline.c,v 1.16.18.2 2005/04/29 00:16:45 marka Exp $ */
-/*
+/*! \file
* This file was adapted from the NetBSD project's source tree, RCS ID:
* NetBSD: getopt.c,v 1.15 1999/09/20 04:39:37 lukem Exp
*
@@ -59,8 +59,8 @@
*/
/*
- * Principal Authors: Computer Systems Research Group at UC Berkeley
- * Principal ISC caretaker: DCL
+ * \author Principal Authors: Computer Systems Research Group at UC Berkeley
+ * \author Principal ISC caretaker: DCL
*/
#include <config.h>
@@ -72,17 +72,17 @@
#include <isc/string.h>
#include <isc/util.h>
-/* Index into parent argv vector. */
+/*% Index into parent argv vector. */
LIBISC_EXTERNAL_DATA int isc_commandline_index = 1;
-/* Character checked for validity. */
+/*% Character checked for validity. */
LIBISC_EXTERNAL_DATA int isc_commandline_option;
-/* Argument associated with option. */
+/*% Argument associated with option. */
LIBISC_EXTERNAL_DATA char *isc_commandline_argument;
-/* For printing error messages. */
+/*% For printing error messages. */
LIBISC_EXTERNAL_DATA char *isc_commandline_progname;
-/* Print error messages. */
+/*% Print error messages. */
LIBISC_EXTERNAL_DATA isc_boolean_t isc_commandline_errprint = ISC_TRUE;
-/* Reset processing. */
+/*% Reset processing. */
LIBISC_EXTERNAL_DATA isc_boolean_t isc_commandline_reset = ISC_TRUE;
static char endopt = '\0';
@@ -91,7 +91,7 @@ static char endopt = '\0';
#define BADARG ':'
#define ENDOPT &endopt
-/*
+/*!
* getopt --
* Parse argc/argv argument vector.
*/
diff --git a/contrib/bind9/lib/isc/entropy.c b/contrib/bind9/lib/isc/entropy.c
index 8834eef..3e87d87 100644
--- a/contrib/bind9/lib/isc/entropy.c
+++ b/contrib/bind9/lib/isc/entropy.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,12 +15,16 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: entropy.c,v 1.3.2.2.2.7 2004/03/08 09:04:48 marka Exp $ */
+/* $Id: entropy.c,v 1.11.18.3 2005/07/12 01:22:28 marka Exp $ */
-/*
+/*! \file
+ * \brief
* This is the system independent part of the entropy module. It is
* compiled via inclusion from the relevant OS source file, ie,
- * unix/entropy.c or win32/entropy.c.
+ * \link unix/entropy.c unix/entropy.c \endlink or win32/entropy.c.
+ *
+ * \author Much of this code is modeled after the NetBSD /dev/random implementation,
+ * written by Michael Graff <explorer@netbsd.org>.
*/
#include <errno.h>
@@ -42,10 +46,6 @@
#include <isc/time.h>
#include <isc/util.h>
-/*
- * Much of this code is modeled after the NetBSD /dev/random implementation,
- * written by Michael Graff <explorer@netbsd.org>.
- */
#define ENTROPY_MAGIC ISC_MAGIC('E', 'n', 't', 'e')
#define SOURCE_MAGIC ISC_MAGIC('E', 'n', 't', 's')
@@ -58,26 +58,28 @@
*** you are doing.
***/
-/*
- * size of entropy pool in 32-bit words. This _MUST_ be a power of 2.
+/*%
+ * Size of entropy pool in 32-bit words. This _MUST_ be a power of 2.
*/
#define RND_POOLWORDS 128
+/*% Pool in bytes. */
#define RND_POOLBYTES (RND_POOLWORDS * 4)
+/*% Pool in bits. */
#define RND_POOLBITS (RND_POOLWORDS * 32)
-/*
+/*%
* Number of bytes returned per hash. This must be true:
* threshold * 2 <= digest_size_in_bytes
*/
#define RND_ENTROPY_THRESHOLD 10
#define THRESHOLD_BITS (RND_ENTROPY_THRESHOLD * 8)
-/*
+/*%
* Size of the input event queue in samples.
*/
#define RND_EVENTQSIZE 32
-/*
+/*%
* The number of times we'll "reseed" for pseudorandom seeds. This is an
* extremely weak pseudorandom seed. If the caller is using lots of
* pseudorandom data and they cannot provide a stronger random source,
@@ -86,12 +88,13 @@
*/
#define RND_INITIALIZE 128
+/*% Entropy Pool */
typedef struct {
- isc_uint32_t cursor; /* current add point in the pool */
- isc_uint32_t entropy; /* current entropy estimate in bits */
- isc_uint32_t pseudo; /* bits extracted in pseudorandom */
- isc_uint32_t rotate; /* how many bits to rotate by */
- isc_uint32_t pool[RND_POOLWORDS]; /* random pool data */
+ isc_uint32_t cursor; /*%< current add point in the pool */
+ isc_uint32_t entropy; /*%< current entropy estimate in bits */
+ isc_uint32_t pseudo; /*%< bits extracted in pseudorandom */
+ isc_uint32_t rotate; /*%< how many bits to rotate by */
+ isc_uint32_t pool[RND_POOLWORDS]; /*%< random pool data */
} isc_entropypool_t;
struct isc_entropy {
@@ -107,13 +110,14 @@ struct isc_entropy {
ISC_LIST(isc_entropysource_t) sources;
};
+/*% Sample Queue */
typedef struct {
- isc_uint32_t last_time; /* last time recorded */
- isc_uint32_t last_delta; /* last delta value */
- isc_uint32_t last_delta2; /* last delta2 value */
- isc_uint32_t nsamples; /* number of samples filled in */
- isc_uint32_t *samples; /* the samples */
- isc_uint32_t *extra; /* extra samples added in */
+ isc_uint32_t last_time; /*%< last time recorded */
+ isc_uint32_t last_delta; /*%< last delta value */
+ isc_uint32_t last_delta2; /*%< last delta2 value */
+ isc_uint32_t nsamples; /*%< number of samples filled in */
+ isc_uint32_t *samples; /*%< the samples */
+ isc_uint32_t *extra; /*%< extra samples added in */
} sample_queue_t;
typedef struct {
@@ -137,7 +141,7 @@ struct isc_entropysource {
unsigned int magic;
unsigned int type;
isc_entropy_t *ent;
- isc_uint32_t total; /* entropy from this source */
+ isc_uint32_t total; /*%< entropy from this source */
ISC_LINK(isc_entropysource_t) link;
char name[32];
isc_boolean_t bad;
@@ -151,12 +155,13 @@ struct isc_entropysource {
} sources;
};
-#define ENTROPY_SOURCETYPE_SAMPLE 1 /* Type is a sample source */
-#define ENTROPY_SOURCETYPE_FILE 2 /* Type is a file source */
-#define ENTROPY_SOURCETYPE_CALLBACK 3 /* Type is a callback source */
-#define ENTROPY_SOURCETYPE_USOCKET 4 /* Type is a Unix socket source */
+#define ENTROPY_SOURCETYPE_SAMPLE 1 /*%< Type is a sample source */
+#define ENTROPY_SOURCETYPE_FILE 2 /*%< Type is a file source */
+#define ENTROPY_SOURCETYPE_CALLBACK 3 /*%< Type is a callback source */
+#define ENTROPY_SOURCETYPE_USOCKET 4 /*%< Type is a Unix socket source */
-/*
+/*@{*/
+/*%
* The random pool "taps"
*/
#define TAP1 99
@@ -164,8 +169,10 @@ struct isc_entropysource {
#define TAP3 31
#define TAP4 9
#define TAP5 7
+/*@}*/
-/*
+/*@{*/
+/*%
* Declarations for function provided by the system dependent sources that
* include this file.
*/
@@ -181,6 +188,7 @@ destroyfilesource(isc_entropyfilesource_t *source);
static void
destroyusocketsource(isc_entropyusocketsource_t *source);
+/*@}*/
static void
samplequeue_release(isc_entropy_t *ent, sample_queue_t *sq) {
@@ -211,7 +219,7 @@ samplesource_allocate(isc_entropy_t *ent, sample_queue_t *sq) {
return (ISC_R_SUCCESS);
}
-/*
+/*%
* Add in entropy, even when the value we're adding in could be
* very large.
*/
@@ -225,7 +233,7 @@ add_entropy(isc_entropy_t *ent, isc_uint32_t entropy) {
ent->pool.entropy = ISC_MIN(entropy, RND_POOLBITS);
}
-/*
+/*%
* Decrement the amount of entropy the pool has.
*/
static inline void
@@ -234,7 +242,7 @@ subtract_entropy(isc_entropy_t *ent, isc_uint32_t entropy) {
ent->pool.entropy -= entropy;
}
-/*
+/*!
* Add in entropy, even when the value we're adding in could be
* very large.
*/
@@ -248,7 +256,7 @@ add_pseudo(isc_entropy_t *ent, isc_uint32_t pseudo) {
ent->pool.pseudo = ISC_MIN(pseudo, RND_POOLBITS * 8);
}
-/*
+/*!
* Decrement the amount of pseudo the pool has.
*/
static inline void
@@ -257,7 +265,7 @@ subtract_pseudo(isc_entropy_t *ent, isc_uint32_t pseudo) {
ent->pool.pseudo -= pseudo;
}
-/*
+/*!
* Add one word to the pool, rotating the input as needed.
*/
static inline void
@@ -292,7 +300,7 @@ entropypool_add_word(isc_entropypool_t *rp, isc_uint32_t val) {
}
}
-/*
+/*!
* Add a buffer's worth of data to the pool.
*
* Requires that the lock is held on the entropy pool.
@@ -362,7 +370,7 @@ reseed(isc_entropy_t *ent) {
entropypool_adddata(ent, &pid, sizeof(pid), 0);
}
- /*
+ /*!
* After we've reseeded 100 times, only add new timing info every
* 50 requests. This will keep us from using lots and lots of
* CPU just to return bad pseudorandom data anyway.
@@ -382,7 +390,7 @@ estimate_entropy(sample_queue_t *sq, isc_uint32_t t) {
isc_int32_t delta2;
isc_int32_t delta3;
- /*
+ /*!
* If the time counter has overflowed, calculate the real difference.
* If it has not, it is simpler.
*/
@@ -661,7 +669,7 @@ isc_entropypool_invalidate(isc_entropypool_t *pool) {
isc_result_t
isc_entropy_create(isc_mem_t *mctx, isc_entropy_t **entp) {
- isc_result_t ret;
+ isc_result_t result;
isc_entropy_t *ent;
REQUIRE(mctx != NULL);
@@ -674,10 +682,9 @@ isc_entropy_create(isc_mem_t *mctx, isc_entropy_t **entp) {
/*
* We need a lock.
*/
- if (isc_mutex_init(&ent->lock) != ISC_R_SUCCESS) {
- ret = ISC_R_UNEXPECTED;
+ result = isc_mutex_init(&ent->lock);
+ if (result != ISC_R_SUCCESS)
goto errout;
- }
/*
* From here down, no failures will/can occur.
@@ -700,10 +707,10 @@ isc_entropy_create(isc_mem_t *mctx, isc_entropy_t **entp) {
errout:
isc_mem_put(mctx, ent, sizeof(isc_entropy_t));
- return (ret);
+ return (result);
}
-/*
+/*!
* Requires "ent" be locked.
*/
static void
@@ -851,7 +858,7 @@ isc_entropy_createcallbacksource(isc_entropy_t *ent,
void *arg,
isc_entropysource_t **sourcep)
{
- isc_result_t ret;
+ isc_result_t result;
isc_entropysource_t *source;
isc_cbsource_t *cbs;
@@ -863,15 +870,15 @@ isc_entropy_createcallbacksource(isc_entropy_t *ent,
source = isc_mem_get(ent->mctx, sizeof(isc_entropysource_t));
if (source == NULL) {
- ret = ISC_R_NOMEMORY;
+ result = ISC_R_NOMEMORY;
goto errout;
}
source->bad = ISC_FALSE;
cbs = &source->sources.callback;
- ret = samplesource_allocate(ent, &cbs->samplequeue);
- if (ret != ISC_R_SUCCESS)
+ result = samplesource_allocate(ent, &cbs->samplequeue);
+ if (result != ISC_R_SUCCESS)
goto errout;
cbs->start_called = ISC_FALSE;
@@ -907,7 +914,7 @@ isc_entropy_createcallbacksource(isc_entropy_t *ent,
UNLOCK(&ent->lock);
- return (ret);
+ return (result);
}
void
@@ -939,7 +946,7 @@ isc_result_t
isc_entropy_createsamplesource(isc_entropy_t *ent,
isc_entropysource_t **sourcep)
{
- isc_result_t ret;
+ isc_result_t result;
isc_entropysource_t *source;
sample_queue_t *sq;
@@ -950,13 +957,13 @@ isc_entropy_createsamplesource(isc_entropy_t *ent,
source = isc_mem_get(ent->mctx, sizeof(isc_entropysource_t));
if (source == NULL) {
- ret = ISC_R_NOMEMORY;
+ result = ISC_R_NOMEMORY;
goto errout;
}
sq = &source->sources.sample.samplequeue;
- ret = samplesource_allocate(ent, sq);
- if (ret != ISC_R_SUCCESS)
+ result = samplesource_allocate(ent, sq);
+ if (result != ISC_R_SUCCESS)
goto errout;
/*
@@ -986,10 +993,10 @@ isc_entropy_createsamplesource(isc_entropy_t *ent,
UNLOCK(&ent->lock);
- return (ret);
+ return (result);
}
-/*
+/*!
* Add a sample, and return ISC_R_SUCCESS if the queue has become full,
* ISC_R_NOENTROPY if it has space remaining, and ISC_R_NOMORE if the
* queue was full when this function was called.
diff --git a/contrib/bind9/lib/isc/error.c b/contrib/bind9/lib/isc/error.c
index ceb7d2a..282986c 100644
--- a/contrib/bind9/lib/isc/error.c
+++ b/contrib/bind9/lib/isc/error.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: error.c,v 1.16.206.1 2004/03/06 08:14:28 marka Exp $ */
+/* $Id: error.c,v 1.17.18.2 2005/04/29 00:16:45 marka Exp $ */
+
+/*! \file */
#include <config.h>
@@ -25,14 +27,17 @@
#include <isc/error.h>
#include <isc/msgs.h>
+/*% Default unexpected callback. */
static void
default_unexpected_callback(const char *, int, const char *, va_list)
ISC_FORMAT_PRINTF(3, 0);
+/*% Default fatal callback. */
static void
default_fatal_callback(const char *, int, const char *, va_list)
ISC_FORMAT_PRINTF(3, 0);
+/*% unexpected_callback */
static isc_errorcallback_t unexpected_callback = default_unexpected_callback;
static isc_errorcallback_t fatal_callback = default_fatal_callback;
diff --git a/contrib/bind9/lib/isc/event.c b/contrib/bind9/lib/isc/event.c
index f767870..7931061 100644
--- a/contrib/bind9/lib/isc/event.c
+++ b/contrib/bind9/lib/isc/event.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,10 +15,11 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: event.c,v 1.15.12.3 2004/03/08 09:04:48 marka Exp $ */
+/* $Id: event.c,v 1.17.18.2 2005/04/29 00:16:45 marka Exp $ */
-/*
- * Principal Author: Bob Halley
+/*!
+ * \file
+ * \author Principal Author: Bob Halley
*/
#include <config.h>
diff --git a/contrib/bind9/lib/isc/fsaccess.c b/contrib/bind9/lib/isc/fsaccess.c
index 1193472..cdab3d8 100644
--- a/contrib/bind9/lib/isc/fsaccess.c
+++ b/contrib/bind9/lib/isc/fsaccess.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,16 +15,17 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: fsaccess.c,v 1.5.206.1 2004/03/06 08:14:29 marka Exp $ */
+/* $Id: fsaccess.c,v 1.6.18.2 2005/04/29 00:16:45 marka Exp $ */
-/*
+/*! \file
+ * \brief
* This file contains the OS-independent functionality of the API.
*/
#include <isc/fsaccess.h>
#include <isc/result.h>
#include <isc/util.h>
-/*
+/*!
* Shorthand. Maybe ISC__FSACCESS_PERMISSIONBITS should not even be in
* <isc/fsaccess.h>. Could check consistency with sizeof(isc_fsaccess_t)
* and the number of bits in each function.
diff --git a/contrib/bind9/lib/isc/hash.c b/contrib/bind9/lib/isc/hash.c
index 1094206..4b6dc06 100644
--- a/contrib/bind9/lib/isc/hash.c
+++ b/contrib/bind9/lib/isc/hash.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2006 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2006 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,14 +15,12 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: hash.c,v 1.2.2.4.2.3 2006/01/04 00:37:22 marka Exp $ */
+/* $Id: hash.c,v 1.6.18.5 2006/01/04 00:37:23 marka Exp $ */
-/*
+/*! \file
* Some portion of this code was derived from universal hash function
* libraries of Rice University.
- */
-
-/* "UH Universal Hashing Library"
+\section license UH Universal Hashing Library
Copyright ((c)) 2002, Rice University
All rights reserved.
@@ -74,28 +72,31 @@ if advised of the possibility of such damage.
#define HASH_MAGIC ISC_MAGIC('H', 'a', 's', 'h')
#define VALID_HASH(h) ISC_MAGIC_VALID((h), HASH_MAGIC)
-/*
+/*%
* A large 32-bit prime number that specifies the range of the hash output.
*/
#define PRIME32 0xFFFFFFFB /* 2^32 - 5 */
-/*
+/*@{*/
+/*%
* Types of random seed and hash accumulator. Perhaps they can be system
* dependent.
*/
typedef isc_uint32_t hash_accum_t;
typedef isc_uint16_t hash_random_t;
+/*@}*/
+/*% isc hash structure */
struct isc_hash {
unsigned int magic;
isc_mem_t *mctx;
isc_mutex_t lock;
isc_boolean_t initialized;
isc_refcount_t refcnt;
- isc_entropy_t *entropy; /* entropy source */
- unsigned int limit; /* upper limit of key length */
- size_t vectorlen; /* size of the vector below */
- hash_random_t *rndvector; /* random vector for universal hashing */
+ isc_entropy_t *entropy; /*%< entropy source */
+ unsigned int limit; /*%< upper limit of key length */
+ size_t vectorlen; /*%< size of the vector below */
+ hash_random_t *rndvector; /*%< random vector for universal hashing */
};
static isc_mutex_t createlock;
@@ -141,7 +142,7 @@ isc_result_t
isc_hash_ctxcreate(isc_mem_t *mctx, isc_entropy_t *entropy,
unsigned int limit, isc_hash_t **hctxp)
{
- isc_result_t ret;
+ isc_result_t result;
isc_hash_t *hctx;
size_t vlen;
hash_random_t *rv;
@@ -167,17 +168,16 @@ isc_hash_ctxcreate(isc_mem_t *mctx, isc_entropy_t *entropy,
vlen = sizeof(hash_random_t) * (limit + 1);
rv = isc_mem_get(mctx, vlen);
if (rv == NULL) {
- ret = ISC_R_NOMEMORY;
+ result = ISC_R_NOMEMORY;
goto errout;
}
/*
* We need a lock.
*/
- if (isc_mutex_init(&hctx->lock) != ISC_R_SUCCESS) {
- ret = ISC_R_UNEXPECTED;
+ result = isc_mutex_init(&hctx->lock);
+ if (result != ISC_R_SUCCESS)
goto errout;
- }
/*
* From here down, no failures will/can occur.
@@ -186,7 +186,9 @@ isc_hash_ctxcreate(isc_mem_t *mctx, isc_entropy_t *entropy,
hctx->mctx = NULL;
isc_mem_attach(mctx, &hctx->mctx);
hctx->initialized = ISC_FALSE;
- isc_refcount_init(&hctx->refcnt, 1);
+ result = isc_refcount_init(&hctx->refcnt, 1);
+ if (result != ISC_R_SUCCESS)
+ goto cleanup_lock;
hctx->entropy = NULL;
hctx->limit = limit;
hctx->vectorlen = vlen;
@@ -198,12 +200,14 @@ isc_hash_ctxcreate(isc_mem_t *mctx, isc_entropy_t *entropy,
*hctxp = hctx;
return (ISC_R_SUCCESS);
+ cleanup_lock:
+ DESTROYLOCK(&hctx->lock);
errout:
isc_mem_put(mctx, hctx, sizeof(isc_hash_t));
if (rv != NULL)
isc_mem_put(mctx, rv, vlen);
- return (ret);
+ return (result);
}
static void
diff --git a/contrib/bind9/lib/isc/heap.c b/contrib/bind9/lib/isc/heap.c
index fd67d7b..9c495a7 100644
--- a/contrib/bind9/lib/isc/heap.c
+++ b/contrib/bind9/lib/isc/heap.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: heap.c,v 1.28.12.4 2006/04/17 18:27:20 explorer Exp $ */
+/* $Id: heap.c,v 1.30.18.3 2006/04/17 18:27:33 explorer Exp $ */
/*! \file
* Heap implementation of priority queues adapted from the following:
diff --git a/contrib/bind9/lib/isc/hex.c b/contrib/bind9/lib/isc/hex.c
index a90f1ce..8dfec02 100644
--- a/contrib/bind9/lib/isc/hex.c
+++ b/contrib/bind9/lib/isc/hex.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: hex.c,v 1.8.2.2.8.3 2004/03/06 08:14:30 marka Exp $ */
+/* $Id: hex.c,v 1.14.18.2 2005/04/29 00:16:46 marka Exp $ */
+
+/*! \file */
#include <config.h>
@@ -73,13 +75,13 @@ isc_hex_totext(isc_region_t *source, int wordlength,
return (ISC_R_SUCCESS);
}
-/*
+/*%
* State of a hex decoding process in progress.
*/
typedef struct {
- int length; /* Desired length of binary data or -1 */
- isc_buffer_t *target; /* Buffer for resulting binary data */
- int digits; /* Number of buffered hex digits */
+ int length; /*%< Desired length of binary data or -1 */
+ isc_buffer_t *target; /*%< Buffer for resulting binary data */
+ int digits; /*%< Number of buffered hex digits */
int val[2];
} hex_decode_ctx_t;
diff --git a/contrib/bind9/lib/isc/hmacmd5.c b/contrib/bind9/lib/isc/hmacmd5.c
index 5166a98..f832146 100644
--- a/contrib/bind9/lib/isc/hmacmd5.c
+++ b/contrib/bind9/lib/isc/hmacmd5.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2006 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2006 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,11 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: hmacmd5.c,v 1.5.12.5 2006/02/26 23:49:48 marka Exp $ */
+/* $Id: hmacmd5.c,v 1.7.18.5 2006/02/26 22:30:56 marka Exp $ */
-/*
+/*! \file
* This code implements the HMAC-MD5 keyed hash algorithm
- * described in RFC 2104.
+ * described in RFC2104.
*/
#include "config.h"
@@ -35,7 +35,7 @@
#define IPAD 0x36
#define OPAD 0x5C
-/*
+/*!
* Start HMAC-MD5 process. Initialize an md5 context and digest the key.
*/
void
@@ -67,7 +67,7 @@ isc_hmacmd5_invalidate(isc_hmacmd5_t *ctx) {
memset(ctx->key, 0, sizeof(ctx->key));
}
-/*
+/*!
* Update context to reflect the concatenation of another buffer full
* of bytes.
*/
@@ -78,7 +78,7 @@ isc_hmacmd5_update(isc_hmacmd5_t *ctx, const unsigned char *buf,
isc_md5_update(&ctx->md5ctx, buf, len);
}
-/*
+/*!
* Compute signature - finalize MD5 operation and reapply MD5.
*/
void
@@ -99,14 +99,20 @@ isc_hmacmd5_sign(isc_hmacmd5_t *ctx, unsigned char *digest) {
isc_hmacmd5_invalidate(ctx);
}
-/*
+/*!
* Verify signature - finalize MD5 operation and reapply MD5, then
* compare to the supplied digest.
*/
isc_boolean_t
isc_hmacmd5_verify(isc_hmacmd5_t *ctx, unsigned char *digest) {
+ return (isc_hmacmd5_verify2(ctx, digest, ISC_MD5_DIGESTLENGTH));
+}
+
+isc_boolean_t
+isc_hmacmd5_verify2(isc_hmacmd5_t *ctx, unsigned char *digest, size_t len) {
unsigned char newdigest[ISC_MD5_DIGESTLENGTH];
+ REQUIRE(len <= ISC_MD5_DIGESTLENGTH);
isc_hmacmd5_sign(ctx, newdigest);
- return (ISC_TF(memcmp(digest, newdigest, ISC_MD5_DIGESTLENGTH) == 0));
+ return (ISC_TF(memcmp(digest, newdigest, len) == 0));
}
diff --git a/contrib/bind9/lib/isc/hmacsha.c b/contrib/bind9/lib/isc/hmacsha.c
new file mode 100644
index 0000000..8ee16af
--- /dev/null
+++ b/contrib/bind9/lib/isc/hmacsha.c
@@ -0,0 +1,438 @@
+/*
+ * Copyright (C) 2005, 2006 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* $Id: hmacsha.c,v 1.2.2.4 2006/08/16 03:18:14 marka Exp $ */
+
+/*
+ * This code implements the HMAC-SHA1, HMAC-SHA224, HMAC-SHA256, HMAC-SHA384
+ * and HMAC-SHA512 keyed hash algorithm described in RFC 2104 and
+ * draft-ietf-dnsext-tsig-sha-01.txt.
+ */
+
+#include "config.h"
+
+#include <isc/assertions.h>
+#include <isc/hmacsha.h>
+#include <isc/sha1.h>
+#include <isc/sha2.h>
+#include <isc/string.h>
+#include <isc/types.h>
+#include <isc/util.h>
+
+#define IPAD 0x36
+#define OPAD 0x5C
+
+/*
+ * Start HMAC-SHA1 process. Initialize an sha1 context and digest the key.
+ */
+void
+isc_hmacsha1_init(isc_hmacsha1_t *ctx, const unsigned char *key,
+ unsigned int len)
+{
+ unsigned char ipad[ISC_SHA1_BLOCK_LENGTH];
+ unsigned int i;
+
+ memset(ctx->key, 0, sizeof(ctx->key));
+ if (len > sizeof(ctx->key)) {
+ isc_sha1_t sha1ctx;
+ isc_sha1_init(&sha1ctx);
+ isc_sha1_update(&sha1ctx, key, len);
+ isc_sha1_final(&sha1ctx, ctx->key);
+ } else
+ memcpy(ctx->key, key, len);
+
+ isc_sha1_init(&ctx->sha1ctx);
+ memset(ipad, IPAD, sizeof(ipad));
+ for (i = 0; i < ISC_SHA1_BLOCK_LENGTH; i++)
+ ipad[i] ^= ctx->key[i];
+ isc_sha1_update(&ctx->sha1ctx, ipad, sizeof(ipad));
+}
+
+void
+isc_hmacsha1_invalidate(isc_hmacsha1_t *ctx) {
+ isc_sha1_invalidate(&ctx->sha1ctx);
+ memset(ctx->key, 0, sizeof(ctx->key));
+ memset(ctx, 0, sizeof(ctx));
+}
+
+/*
+ * Update context to reflect the concatenation of another buffer full
+ * of bytes.
+ */
+void
+isc_hmacsha1_update(isc_hmacsha1_t *ctx, const unsigned char *buf,
+ unsigned int len)
+{
+ isc_sha1_update(&ctx->sha1ctx, buf, len);
+}
+
+/*
+ * Compute signature - finalize SHA1 operation and reapply SHA1.
+ */
+void
+isc_hmacsha1_sign(isc_hmacsha1_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char opad[ISC_SHA1_BLOCK_LENGTH];
+ unsigned char newdigest[ISC_SHA1_DIGESTLENGTH];
+ unsigned int i;
+
+ REQUIRE(len <= ISC_SHA1_DIGESTLENGTH);
+ isc_sha1_final(&ctx->sha1ctx, newdigest);
+
+ memset(opad, OPAD, sizeof(opad));
+ for (i = 0; i < ISC_SHA1_BLOCK_LENGTH; i++)
+ opad[i] ^= ctx->key[i];
+
+ isc_sha1_init(&ctx->sha1ctx);
+ isc_sha1_update(&ctx->sha1ctx, opad, sizeof(opad));
+ isc_sha1_update(&ctx->sha1ctx, newdigest, ISC_SHA1_DIGESTLENGTH);
+ isc_sha1_final(&ctx->sha1ctx, newdigest);
+ isc_hmacsha1_invalidate(ctx);
+ memcpy(digest, newdigest, len);
+ memset(newdigest, 0, sizeof(newdigest));
+}
+
+/*
+ * Verify signature - finalize SHA1 operation and reapply SHA1, then
+ * compare to the supplied digest.
+ */
+isc_boolean_t
+isc_hmacsha1_verify(isc_hmacsha1_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA1_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA1_BLOCK_LENGTH);
+ isc_hmacsha1_sign(ctx, newdigest, ISC_SHA1_DIGESTLENGTH);
+ return (ISC_TF(memcmp(digest, newdigest, len) == 0));
+}
+
+/*
+ * Start HMAC-SHA224 process. Initialize an sha224 context and digest the key.
+ */
+void
+isc_hmacsha224_init(isc_hmacsha224_t *ctx, const unsigned char *key,
+ unsigned int len)
+{
+ unsigned char ipad[ISC_SHA224_BLOCK_LENGTH];
+ unsigned int i;
+
+ memset(ctx->key, 0, sizeof(ctx->key));
+ if (len > sizeof(ctx->key)) {
+ isc_sha224_t sha224ctx;
+ isc_sha224_init(&sha224ctx);
+ isc_sha224_update(&sha224ctx, key, len);
+ isc_sha224_final(ctx->key, &sha224ctx);
+ } else
+ memcpy(ctx->key, key, len);
+
+ isc_sha224_init(&ctx->sha224ctx);
+ memset(ipad, IPAD, sizeof(ipad));
+ for (i = 0; i < ISC_SHA224_BLOCK_LENGTH; i++)
+ ipad[i] ^= ctx->key[i];
+ isc_sha224_update(&ctx->sha224ctx, ipad, sizeof(ipad));
+}
+
+void
+isc_hmacsha224_invalidate(isc_hmacsha224_t *ctx) {
+ memset(ctx->key, 0, sizeof(ctx->key));
+ memset(ctx, 0, sizeof(ctx));
+}
+
+/*
+ * Update context to reflect the concatenation of another buffer full
+ * of bytes.
+ */
+void
+isc_hmacsha224_update(isc_hmacsha224_t *ctx, const unsigned char *buf,
+ unsigned int len)
+{
+ isc_sha224_update(&ctx->sha224ctx, buf, len);
+}
+
+/*
+ * Compute signature - finalize SHA224 operation and reapply SHA224.
+ */
+void
+isc_hmacsha224_sign(isc_hmacsha224_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char opad[ISC_SHA224_BLOCK_LENGTH];
+ unsigned char newdigest[ISC_SHA224_DIGESTLENGTH];
+ unsigned int i;
+
+ REQUIRE(len <= ISC_SHA224_DIGESTLENGTH);
+ isc_sha224_final(newdigest, &ctx->sha224ctx);
+
+ memset(opad, OPAD, sizeof(opad));
+ for (i = 0; i < ISC_SHA224_BLOCK_LENGTH; i++)
+ opad[i] ^= ctx->key[i];
+
+ isc_sha224_init(&ctx->sha224ctx);
+ isc_sha224_update(&ctx->sha224ctx, opad, sizeof(opad));
+ isc_sha224_update(&ctx->sha224ctx, newdigest, ISC_SHA224_DIGESTLENGTH);
+ isc_sha224_final(newdigest, &ctx->sha224ctx);
+ memcpy(digest, newdigest, len);
+ memset(newdigest, 0, sizeof(newdigest));
+}
+
+/*
+ * Verify signature - finalize SHA224 operation and reapply SHA224, then
+ * compare to the supplied digest.
+ */
+isc_boolean_t
+isc_hmacsha224_verify(isc_hmacsha224_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA224_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA224_DIGESTLENGTH);
+ isc_hmacsha224_sign(ctx, newdigest, ISC_SHA224_DIGESTLENGTH);
+ return (ISC_TF(memcmp(digest, newdigest, len) == 0));
+}
+
+/*
+ * Start HMAC-SHA256 process. Initialize an sha256 context and digest the key.
+ */
+void
+isc_hmacsha256_init(isc_hmacsha256_t *ctx, const unsigned char *key,
+ unsigned int len)
+{
+ unsigned char ipad[ISC_SHA256_BLOCK_LENGTH];
+ unsigned int i;
+
+ memset(ctx->key, 0, sizeof(ctx->key));
+ if (len > sizeof(ctx->key)) {
+ isc_sha256_t sha256ctx;
+ isc_sha256_init(&sha256ctx);
+ isc_sha256_update(&sha256ctx, key, len);
+ isc_sha256_final(ctx->key, &sha256ctx);
+ } else
+ memcpy(ctx->key, key, len);
+
+ isc_sha256_init(&ctx->sha256ctx);
+ memset(ipad, IPAD, sizeof(ipad));
+ for (i = 0; i < ISC_SHA256_BLOCK_LENGTH; i++)
+ ipad[i] ^= ctx->key[i];
+ isc_sha256_update(&ctx->sha256ctx, ipad, sizeof(ipad));
+}
+
+void
+isc_hmacsha256_invalidate(isc_hmacsha256_t *ctx) {
+ memset(ctx->key, 0, sizeof(ctx->key));
+ memset(ctx, 0, sizeof(ctx));
+}
+
+/*
+ * Update context to reflect the concatenation of another buffer full
+ * of bytes.
+ */
+void
+isc_hmacsha256_update(isc_hmacsha256_t *ctx, const unsigned char *buf,
+ unsigned int len)
+{
+ isc_sha256_update(&ctx->sha256ctx, buf, len);
+}
+
+/*
+ * Compute signature - finalize SHA256 operation and reapply SHA256.
+ */
+void
+isc_hmacsha256_sign(isc_hmacsha256_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char opad[ISC_SHA256_BLOCK_LENGTH];
+ unsigned char newdigest[ISC_SHA256_DIGESTLENGTH];
+ unsigned int i;
+
+ REQUIRE(len <= ISC_SHA256_DIGESTLENGTH);
+ isc_sha256_final(newdigest, &ctx->sha256ctx);
+
+ memset(opad, OPAD, sizeof(opad));
+ for (i = 0; i < ISC_SHA256_BLOCK_LENGTH; i++)
+ opad[i] ^= ctx->key[i];
+
+ isc_sha256_init(&ctx->sha256ctx);
+ isc_sha256_update(&ctx->sha256ctx, opad, sizeof(opad));
+ isc_sha256_update(&ctx->sha256ctx, newdigest, ISC_SHA256_DIGESTLENGTH);
+ isc_sha256_final(newdigest, &ctx->sha256ctx);
+ memcpy(digest, newdigest, len);
+ memset(newdigest, 0, sizeof(newdigest));
+}
+
+/*
+ * Verify signature - finalize SHA256 operation and reapply SHA256, then
+ * compare to the supplied digest.
+ */
+isc_boolean_t
+isc_hmacsha256_verify(isc_hmacsha256_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA256_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA256_DIGESTLENGTH);
+ isc_hmacsha256_sign(ctx, newdigest, ISC_SHA256_DIGESTLENGTH);
+ return (ISC_TF(memcmp(digest, newdigest, len) == 0));
+}
+
+/*
+ * Start HMAC-SHA384 process. Initialize an sha384 context and digest the key.
+ */
+void
+isc_hmacsha384_init(isc_hmacsha384_t *ctx, const unsigned char *key,
+ unsigned int len)
+{
+ unsigned char ipad[ISC_SHA384_BLOCK_LENGTH];
+ unsigned int i;
+
+ memset(ctx->key, 0, sizeof(ctx->key));
+ if (len > sizeof(ctx->key)) {
+ isc_sha384_t sha384ctx;
+ isc_sha384_init(&sha384ctx);
+ isc_sha384_update(&sha384ctx, key, len);
+ isc_sha384_final(ctx->key, &sha384ctx);
+ } else
+ memcpy(ctx->key, key, len);
+
+ isc_sha384_init(&ctx->sha384ctx);
+ memset(ipad, IPAD, sizeof(ipad));
+ for (i = 0; i < ISC_SHA384_BLOCK_LENGTH; i++)
+ ipad[i] ^= ctx->key[i];
+ isc_sha384_update(&ctx->sha384ctx, ipad, sizeof(ipad));
+}
+
+void
+isc_hmacsha384_invalidate(isc_hmacsha384_t *ctx) {
+ memset(ctx->key, 0, sizeof(ctx->key));
+ memset(ctx, 0, sizeof(ctx));
+}
+
+/*
+ * Update context to reflect the concatenation of another buffer full
+ * of bytes.
+ */
+void
+isc_hmacsha384_update(isc_hmacsha384_t *ctx, const unsigned char *buf,
+ unsigned int len)
+{
+ isc_sha384_update(&ctx->sha384ctx, buf, len);
+}
+
+/*
+ * Compute signature - finalize SHA384 operation and reapply SHA384.
+ */
+void
+isc_hmacsha384_sign(isc_hmacsha384_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char opad[ISC_SHA384_BLOCK_LENGTH];
+ unsigned char newdigest[ISC_SHA384_DIGESTLENGTH];
+ unsigned int i;
+
+ REQUIRE(len <= ISC_SHA384_DIGESTLENGTH);
+ isc_sha384_final(newdigest, &ctx->sha384ctx);
+
+ memset(opad, OPAD, sizeof(opad));
+ for (i = 0; i < ISC_SHA384_BLOCK_LENGTH; i++)
+ opad[i] ^= ctx->key[i];
+
+ isc_sha384_init(&ctx->sha384ctx);
+ isc_sha384_update(&ctx->sha384ctx, opad, sizeof(opad));
+ isc_sha384_update(&ctx->sha384ctx, newdigest, ISC_SHA384_DIGESTLENGTH);
+ isc_sha384_final(newdigest, &ctx->sha384ctx);
+ memcpy(digest, newdigest, len);
+ memset(newdigest, 0, sizeof(newdigest));
+}
+
+/*
+ * Verify signature - finalize SHA384 operation and reapply SHA384, then
+ * compare to the supplied digest.
+ */
+isc_boolean_t
+isc_hmacsha384_verify(isc_hmacsha384_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA384_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA384_DIGESTLENGTH);
+ isc_hmacsha384_sign(ctx, newdigest, ISC_SHA384_DIGESTLENGTH);
+ return (ISC_TF(memcmp(digest, newdigest, len) == 0));
+}
+
+/*
+ * Start HMAC-SHA512 process. Initialize an sha512 context and digest the key.
+ */
+void
+isc_hmacsha512_init(isc_hmacsha512_t *ctx, const unsigned char *key,
+ unsigned int len)
+{
+ unsigned char ipad[ISC_SHA512_BLOCK_LENGTH];
+ unsigned int i;
+
+ memset(ctx->key, 0, sizeof(ctx->key));
+ if (len > sizeof(ctx->key)) {
+ isc_sha512_t sha512ctx;
+ isc_sha512_init(&sha512ctx);
+ isc_sha512_update(&sha512ctx, key, len);
+ isc_sha512_final(ctx->key, &sha512ctx);
+ } else
+ memcpy(ctx->key, key, len);
+
+ isc_sha512_init(&ctx->sha512ctx);
+ memset(ipad, IPAD, sizeof(ipad));
+ for (i = 0; i < ISC_SHA512_BLOCK_LENGTH; i++)
+ ipad[i] ^= ctx->key[i];
+ isc_sha512_update(&ctx->sha512ctx, ipad, sizeof(ipad));
+}
+
+void
+isc_hmacsha512_invalidate(isc_hmacsha512_t *ctx) {
+ memset(ctx->key, 0, sizeof(ctx->key));
+ memset(ctx, 0, sizeof(ctx));
+}
+
+/*
+ * Update context to reflect the concatenation of another buffer full
+ * of bytes.
+ */
+void
+isc_hmacsha512_update(isc_hmacsha512_t *ctx, const unsigned char *buf,
+ unsigned int len)
+{
+ isc_sha512_update(&ctx->sha512ctx, buf, len);
+}
+
+/*
+ * Compute signature - finalize SHA512 operation and reapply SHA512.
+ */
+void
+isc_hmacsha512_sign(isc_hmacsha512_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char opad[ISC_SHA512_BLOCK_LENGTH];
+ unsigned char newdigest[ISC_SHA512_DIGESTLENGTH];
+ unsigned int i;
+
+ REQUIRE(len <= ISC_SHA512_DIGESTLENGTH);
+ isc_sha512_final(newdigest, &ctx->sha512ctx);
+
+ memset(opad, OPAD, sizeof(opad));
+ for (i = 0; i < ISC_SHA512_BLOCK_LENGTH; i++)
+ opad[i] ^= ctx->key[i];
+
+ isc_sha512_init(&ctx->sha512ctx);
+ isc_sha512_update(&ctx->sha512ctx, opad, sizeof(opad));
+ isc_sha512_update(&ctx->sha512ctx, newdigest, ISC_SHA512_DIGESTLENGTH);
+ isc_sha512_final(newdigest, &ctx->sha512ctx);
+ memcpy(digest, newdigest, len);
+ memset(newdigest, 0, sizeof(newdigest));
+}
+
+/*
+ * Verify signature - finalize SHA512 operation and reapply SHA512, then
+ * compare to the supplied digest.
+ */
+isc_boolean_t
+isc_hmacsha512_verify(isc_hmacsha512_t *ctx, unsigned char *digest, size_t len) {
+ unsigned char newdigest[ISC_SHA512_DIGESTLENGTH];
+
+ REQUIRE(len <= ISC_SHA512_DIGESTLENGTH);
+ isc_hmacsha512_sign(ctx, newdigest, ISC_SHA512_DIGESTLENGTH);
+ return (ISC_TF(memcmp(digest, newdigest, len) == 0));
+}
diff --git a/contrib/bind9/lib/isc/ia64/include/isc/atomic.h b/contrib/bind9/lib/isc/ia64/include/isc/atomic.h
new file mode 100644
index 0000000..20cbabd
--- /dev/null
+++ b/contrib/bind9/lib/isc/ia64/include/isc/atomic.h
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2006 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* $Id: atomic.h,v 1.2.2.1 2006/06/21 03:38:32 marka Exp $ */
+
+#ifndef ISC_ATOMIC_H
+#define ISC_ATOMIC_H 1
+
+#include <isc/platform.h>
+#include <isc/types.h>
+
+#ifdef ISC_PLATFORM_USEGCCASM
+/*
+ * This routine atomically increments the value stored in 'p' by 'val', and
+ * returns the previous value.
+ *
+ * Open issue: can 'fetchadd' make the code faster for some particular values
+ * (e.g., 1 and -1)?
+ */
+static inline isc_int32_t
+isc_atomic_xadd(isc_int32_t *p, isc_int32_t val) {
+ isc_int32_t prev, swapped;
+
+ for (prev = *(volatile isc_int32_t *)p; ; prev = swapped) {
+ swapped = prev + val;
+ __asm__ volatile(
+ "mov ar.ccv=%2;"
+ "cmpxchg4.acq %0=%4,%3,ar.ccv"
+ : "=r" (swapped), "=m" (*p)
+ : "r" (prev), "r" (swapped), "m" (*p)
+ : "memory");
+ if (swapped == prev)
+ break;
+ }
+
+ return (prev);
+}
+
+/*
+ * This routine atomically stores the value 'val' in 'p'.
+ */
+static inline void
+isc_atomic_store(isc_int32_t *p, isc_int32_t val) {
+ __asm__ volatile(
+ "st4.rel %0=%1"
+ : "=m" (*p)
+ : "r" (val)
+ : "memory"
+ );
+}
+
+/*
+ * This routine atomically replaces the value in 'p' with 'val', if the
+ * original value is equal to 'cmpval'. The original value is returned in any
+ * case.
+ */
+static inline isc_int32_t
+isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val) {
+ isc_int32_t ret;
+
+ __asm__ volatile(
+ "mov ar.ccv=%2;"
+ "cmpxchg4.acq %0=%4,%3,ar.ccv"
+ : "=r" (ret), "=m" (*p)
+ : "r" (cmpval), "r" (val), "m" (*p)
+ : "memory");
+
+ return (ret);
+}
+#else /* !ISC_PLATFORM_USEGCCASM */
+
+#error "unsupported compiler. disable atomic ops by --disable-atomic"
+
+#endif
+#endif /* ISC_ATOMIC_H */
diff --git a/contrib/bind9/lib/isc/include/Makefile.in b/contrib/bind9/lib/isc/include/Makefile.in
index 59d66c7..ceb8eb6 100644
--- a/contrib/bind9/lib/isc/include/Makefile.in
+++ b/contrib/bind9/lib/isc/include/Makefile.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.10.206.1 2004/03/06 08:14:38 marka Exp $
+# $Id: Makefile.in,v 1.11 2004/03/05 05:10:53 marka Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/lib/isc/include/isc/Makefile.in b/contrib/bind9/lib/isc/include/isc/Makefile.in
index f484c0b..0f0e936 100644
--- a/contrib/bind9/lib/isc/include/isc/Makefile.in
+++ b/contrib/bind9/lib/isc/include/isc/Makefile.in
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 2004-2006 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 1998-2001, 2003 Internet Software Consortium.
#
# Permission to use, copy, modify, and distribute this software for any
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.50.12.6 2005/03/22 02:32:07 marka Exp $
+# $Id: Makefile.in,v 1.54.18.4 2006/01/27 23:57:45 marka Exp $
srcdir = @srcdir@
VPATH = @srcdir@
@@ -35,9 +35,9 @@ HEADERS = app.h assertions.h base64.h bitstring.h boolean.h buffer.h \
mutexblock.h netaddr.h ondestroy.h os.h parseint.h \
print.h quota.h random.h ratelimiter.h \
refcount.h region.h resource.h \
- result.h resultclass.h rwlock.h serial.h sha1.h sockaddr.h \
- socket.h stdio.h stdlib.h string.h symtab.h task.h taskpool.h \
- timer.h types.h util.h version.h
+ result.h resultclass.h rwlock.h serial.h sha1.h sha2.h \
+ sockaddr.h socket.h stdio.h stdlib.h string.h symtab.h \
+ task.h taskpool.h timer.h types.h util.h version.h
SUBDIRS =
TARGETS =
diff --git a/contrib/bind9/lib/isc/include/isc/app.h b/contrib/bind9/lib/isc/include/isc/app.h
index f77057b..f51aff7 100644
--- a/contrib/bind9/lib/isc/include/isc/app.h
+++ b/contrib/bind9/lib/isc/include/isc/app.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: app.h,v 1.1.206.1 2004/03/06 08:14:38 marka Exp $ */
+/* $Id: app.h,v 1.2.18.2 2005/04/29 00:16:52 marka Exp $ */
#ifndef ISC_APP_H
#define ISC_APP_H 1
@@ -24,18 +24,18 @@
***** Module Info
*****/
-/*
- * ISC Application Support
+/*! \file
+ * \brief ISC Application Support
*
* Dealing with program termination can be difficult, especially in a
* multithreaded program. The routines in this module help coordinate
* the shutdown process. They are used as follows by the initial (main)
* thread of the application:
*
- * isc_app_start(); Call very early in main(), before
+ *\li isc_app_start(); Call very early in main(), before
* any other threads have been created.
*
- * isc_app_run(); This will post any on-run events,
+ *\li isc_app_run(); This will post any on-run events,
* and then block until application
* shutdown is requested. A shutdown
* request is made by calling
@@ -44,7 +44,7 @@
* After isc_app_run() returns, the
* application should shutdown itself.
*
- * isc_app_finish(); Call very late in main().
+ *\li isc_app_finish(); Call very late in main().
*
* Applications that want to use SIGHUP/isc_app_reload() to trigger reloading
* should check the result of isc_app_run() and call the reload routine if
@@ -54,22 +54,22 @@
* Use of this module is not required. In particular, isc_app_start() is
* NOT an ISC library initialization routine.
*
- * MP:
+ * \li MP:
* Clients must ensure that isc_app_start(), isc_app_run(), and
* isc_app_finish() are called at most once. isc_app_shutdown()
* is safe to use by any thread (provided isc_app_start() has been
* called previously).
*
- * Reliability:
+ * \li Reliability:
* No anticipated impact.
*
- * Resources:
+ * \li Resources:
* None.
*
- * Security:
+ * \li Security:
* No anticipated impact.
*
- * Standards:
+ * \li Standards:
* None.
*/
@@ -87,8 +87,8 @@ ISC_LANG_BEGINDECLS
isc_result_t
isc_app_start(void);
-/*
- * Start an ISC library application.
+/*!<
+ * \brief Start an ISC library application.
*
* Notes:
* This call should be made before any other ISC library call, and as
@@ -98,8 +98,8 @@ isc_app_start(void);
isc_result_t
isc_app_onrun(isc_mem_t *mctx, isc_task_t *task, isc_taskaction_t action,
void *arg);
-/*
- * Request delivery of an event when the application is run.
+/*!<
+ * \brief Request delivery of an event when the application is run.
*
* Requires:
* isc_app_start() has been called.
@@ -111,99 +111,99 @@ isc_app_onrun(isc_mem_t *mctx, isc_task_t *task, isc_taskaction_t action,
isc_result_t
isc_app_run(void);
-/*
- * Run an ISC library application.
+/*!<
+ * \brief Run an ISC library application.
*
* Notes:
- * The caller (typically the initial thread of an application) will
+ *\li The caller (typically the initial thread of an application) will
* block until shutdown is requested. When the call returns, the
* caller should start shutting down the application.
*
* Requires:
- * isc_app_start() has been called.
+ *\li isc_app_start() has been called.
*
* Ensures:
- * Any events requested via isc_app_onrun() will have been posted (in
+ *\li Any events requested via isc_app_onrun() will have been posted (in
* FIFO order) before isc_app_run() blocks.
*
* Returns:
- * ISC_R_SUCCESS Shutdown has been requested.
- * ISC_R_RELOAD Reload has been requested.
+ *\li ISC_R_SUCCESS Shutdown has been requested.
+ *\li ISC_R_RELOAD Reload has been requested.
*/
isc_result_t
isc_app_shutdown(void);
-/*
- * Request application shutdown.
+/*!<
+ * \brief Request application shutdown.
*
* Notes:
- * It is safe to call isc_app_shutdown() multiple times. Shutdown will
+ *\li It is safe to call isc_app_shutdown() multiple times. Shutdown will
* only be triggered once.
*
* Requires:
- * isc_app_run() has been called.
+ *\li isc_app_run() has been called.
*
* Returns:
- * ISC_R_SUCCESS
- * ISC_R_UNEXPECTED
+ *\li ISC_R_SUCCESS
+ *\li ISC_R_UNEXPECTED
*/
isc_result_t
isc_app_reload(void);
-/*
- * Request application reload.
+/*!<
+ * \brief Request application reload.
*
* Requires:
- * isc_app_run() has been called.
+ *\li isc_app_run() has been called.
*
* Returns:
- * ISC_R_SUCCESS
- * ISC_R_UNEXPECTED
+ *\li ISC_R_SUCCESS
+ *\li ISC_R_UNEXPECTED
*/
void
isc_app_finish(void);
-/*
- * Finish an ISC library application.
+/*!<
+ * \brief Finish an ISC library application.
*
* Notes:
- * This call should be made at or near the end of main().
+ *\li This call should be made at or near the end of main().
*
* Requires:
- * isc_app_start() has been called.
+ *\li isc_app_start() has been called.
*
* Ensures:
- * Any resources allocated by isc_app_start() have been released.
+ *\li Any resources allocated by isc_app_start() have been released.
*/
void
isc_app_block(void);
-/*
- * Indicate that a blocking operation will be performed.
+/*!<
+ * \brief Indicate that a blocking operation will be performed.
*
* Notes:
- * If a blocking operation is in process, a call to isc_app_shutdown()
+ *\li If a blocking operation is in process, a call to isc_app_shutdown()
* or an external signal will abort the program, rather than allowing
* clean shutdown. This is primarily useful for reading user input.
*
* Requires:
- * isc_app_start() has been called.
- * No other blocking operations are in progress.
+ * \li isc_app_start() has been called.
+ * \li No other blocking operations are in progress.
*/
void
isc_app_unblock(void);
-/*
- * Indicate that a blocking operation is complete.
+/*!<
+ * \brief Indicate that a blocking operation is complete.
*
* Notes:
- * When a blocking operation has completed, return the program to a
+ * \li When a blocking operation has completed, return the program to a
* state where a call to isc_app_shutdown() or an external signal will
* shutdown normally.
*
* Requires:
- * isc_app_start() has been called.
- * isc_app_block() has been called by the same thread.
+ * \li isc_app_start() has been called.
+ * \li isc_app_block() has been called by the same thread.
*/
diff --git a/contrib/bind9/lib/isc/include/isc/assertions.h b/contrib/bind9/lib/isc/include/isc/assertions.h
index 6091de9..c1e68a1 100644
--- a/contrib/bind9/lib/isc/include/isc/assertions.h
+++ b/contrib/bind9/lib/isc/include/isc/assertions.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1997-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -16,7 +16,9 @@
*/
/*
- * $Id: assertions.h,v 1.17.206.1 2004/03/06 08:14:38 marka Exp $
+ * $Id: assertions.h,v 1.18.18.2 2005/04/29 00:16:52 marka Exp $
+ */
+/*! \file assertions.h
*/
#ifndef ISC_ASSERTIONS_H
@@ -27,6 +29,7 @@
ISC_LANG_BEGINDECLS
+/*% isc assertion type */
typedef enum {
isc_assertiontype_require,
isc_assertiontype_ensure,
diff --git a/contrib/bind9/lib/isc/include/isc/base64.h b/contrib/bind9/lib/isc/include/isc/base64.h
index 260dd1d..26ffa48 100644
--- a/contrib/bind9/lib/isc/include/isc/base64.h
+++ b/contrib/bind9/lib/isc/include/isc/base64.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: base64.h,v 1.15.206.1 2004/03/06 08:14:38 marka Exp $ */
+/* $Id: base64.h,v 1.16.18.2 2005/04/29 00:16:53 marka Exp $ */
#ifndef ISC_BASE64_H
#define ISC_BASE64_H 1
+/*! \file */
+
#include <isc/lang.h>
#include <isc/types.h>
@@ -32,59 +34,59 @@ ISC_LANG_BEGINDECLS
isc_result_t
isc_base64_totext(isc_region_t *source, int wordlength,
const char *wordbreak, isc_buffer_t *target);
-/*
- * Convert data into base64 encoded text.
+/*!<
+ * \brief Convert data into base64 encoded text.
*
* Notes:
- * The base64 encoded text in 'target' will be divided into
+ *\li The base64 encoded text in 'target' will be divided into
* words of at most 'wordlength' characters, separated by
* the 'wordbreak' string. No parentheses will surround
* the text.
*
* Requires:
- * 'source' is a region containing binary data
- * 'target' is a text buffer containing available space
- * 'wordbreak' points to a null-terminated string of
+ *\li 'source' is a region containing binary data
+ *\li 'target' is a text buffer containing available space
+ *\li 'wordbreak' points to a null-terminated string of
* zero or more whitespace characters
*
* Ensures:
- * target will contain the base64 encoded version of the data
+ *\li target will contain the base64 encoded version of the data
* in source. The 'used' pointer in target will be advanced as
* necessary.
*/
isc_result_t
isc_base64_decodestring(const char *cstr, isc_buffer_t *target);
-/*
- * Decode a null-terminated base64 string.
+/*!<
+ * \brief Decode a null-terminated base64 string.
*
* Requires:
- * 'cstr' is non-null.
- * 'target' is a valid buffer.
+ *\li 'cstr' is non-null.
+ *\li 'target' is a valid buffer.
*
* Returns:
- * ISC_R_SUCCESS -- the entire decoded representation of 'cstring'
+ *\li #ISC_R_SUCCESS -- the entire decoded representation of 'cstring'
* fit in 'target'.
- * ISC_R_BADBASE64 -- 'cstr' is not a valid base64 encoding.
+ *\li #ISC_R_BADBASE64 -- 'cstr' is not a valid base64 encoding.
*
* Other error returns are any possible error code from:
- * isc_lex_create(),
- * isc_lex_openbuffer(),
- * isc_base64_tobuffer().
+ *\li isc_lex_create(),
+ *\li isc_lex_openbuffer(),
+ *\li isc_base64_tobuffer().
*/
isc_result_t
isc_base64_tobuffer(isc_lex_t *lexer, isc_buffer_t *target, int length);
-/*
- * Convert base64 encoded text from a lexer context into data.
+/*!<
+ * \brief Convert base64 encoded text from a lexer context into data.
*
* Requires:
- * 'lex' is a valid lexer context
- * 'target' is a buffer containing binary data
- * 'length' is an integer
+ *\li 'lex' is a valid lexer context
+ *\li 'target' is a buffer containing binary data
+ *\li 'length' is an integer
*
* Ensures:
- * target will contain the data represented by the base64 encoded
+ *\li target will contain the data represented by the base64 encoded
* string parsed by the lexer. No more than length bytes will be read,
* if length is positive. The 'used' pointer in target will be
* advanced as necessary.
diff --git a/contrib/bind9/lib/isc/include/isc/bitstring.h b/contrib/bind9/lib/isc/include/isc/bitstring.h
index 6d6a555..3e626b8 100644
--- a/contrib/bind9/lib/isc/include/isc/bitstring.h
+++ b/contrib/bind9/lib/isc/include/isc/bitstring.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: bitstring.h,v 1.7.206.1 2004/03/06 08:14:38 marka Exp $ */
+/* $Id: bitstring.h,v 1.8.18.2 2005/04/29 00:16:53 marka Exp $ */
#ifndef ISC_BITSTRING_H
#define ISC_BITSTRING_H 1
@@ -24,8 +24,9 @@
***** Module Info
*****/
-/*
- * Bitstring
+/*! \file bitstring.h
+ *
+ * \brief Bitstring manipulation functions.
*
* A bitstring is a packed array of bits, stored in a contiguous
* sequence of octets. The "most significant bit" (msb) of a bitstring
@@ -46,21 +47,25 @@
* long and will take two octets. Let "p" denote a pad bit. In the msb0
* encoding, it would be
*
+ * \verbatim
* Octet 0 Octet 1
* |
* 1 1 0 1 0 0 0 1 | 1 1 1 p p p p p
* ^ | ^
* | |
* bit 0 bit 15
+ * \endverbatim
*
* In the lsb0 encoding, it would be
*
+ * \verbatim
* Octet 0 Octet 1
* |
* p p p p p 1 1 0 | 1 0 0 0 1 1 1 1
* ^ | ^
* | |
* bit 15 bit 0
+ * \endverbatim
*/
/***
@@ -91,59 +96,59 @@ struct isc_bitstring {
void
isc_bitstring_init(isc_bitstring_t *bitstring, unsigned char *data,
unsigned int length, unsigned int size, isc_boolean_t lsb0);
-/*
- * Make 'bitstring' refer to the bitstring of 'size' bits starting
+/*!<
+ * \brief Make 'bitstring' refer to the bitstring of 'size' bits starting
* at 'data'. 'length' bits of the bitstring are valid. If 'lsb0'
* is set then, bit 0 refers to the least significant bit of the
* bitstring. Otherwise bit 0 is the most significant bit.
*
* Requires:
*
- * 'bitstring' points to a isc_bitstring_t.
+ *\li 'bitstring' points to a isc_bitstring_t.
*
- * 'data' points to an array of unsigned char large enough to hold
+ *\li 'data' points to an array of unsigned char large enough to hold
* 'size' bits.
*
- * 'length' <= 'size'.
+ *\li 'length' <= 'size'.
*
* Ensures:
*
- * 'bitstring' is a valid bitstring.
+ *\li 'bitstring' is a valid bitstring.
*/
void
isc_bitstring_invalidate(isc_bitstring_t *bitstring);
-/*
- * Invalidate 'bitstring'.
+/*!<
+ * \brief Invalidate 'bitstring'.
*
* Requires:
*
- * 'bitstring' is a valid bitstring.
+ *\li 'bitstring' is a valid bitstring.
*
* Ensures:
*
- * 'bitstring' is not a valid bitstring.
+ *\li 'bitstring' is not a valid bitstring.
*/
void
isc_bitstring_copy(isc_bitstring_t *source, unsigned int sbitpos,
isc_bitstring_t *target, unsigned int tbitpos,
unsigned int n);
-/*
- * Starting at bit 'sbitpos', copy 'n' bits from 'source' to
+/*!<
+ * \brief Starting at bit 'sbitpos', copy 'n' bits from 'source' to
* the 'n' bits of 'target' starting at 'tbitpos'.
*
* Requires:
*
- * 'source' and target are valid bitstrings with the same lsb0 setting.
+ *\li 'source' and target are valid bitstrings with the same lsb0 setting.
*
- * 'sbitpos' + 'n' is less than or equal to the length of 'source'.
+ *\li 'sbitpos' + 'n' is less than or equal to the length of 'source'.
*
- * 'tbitpos' + 'n' is less than or equal to the size of 'target'.
+ *\li 'tbitpos' + 'n' is less than or equal to the size of 'target'.
*
* Ensures:
*
- * The specified bits have been copied, and the length of 'target'
+ *\li The specified bits have been copied, and the length of 'target'
* adjusted (if required).
*/
diff --git a/contrib/bind9/lib/isc/include/isc/boolean.h b/contrib/bind9/lib/isc/include/isc/boolean.h
index 0081447..ad736fe 100644
--- a/contrib/bind9/lib/isc/include/isc/boolean.h
+++ b/contrib/bind9/lib/isc/include/isc/boolean.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: boolean.h,v 1.12.206.1 2004/03/06 08:14:39 marka Exp $ */
+/* $Id: boolean.h,v 1.13.18.2 2005/04/29 00:16:53 marka Exp $ */
#ifndef ISC_BOOLEAN_H
#define ISC_BOOLEAN_H 1
+/*! \file */
+
typedef enum { isc_boolean_false = 0, isc_boolean_true = 1 } isc_boolean_t;
#define ISC_FALSE isc_boolean_false
diff --git a/contrib/bind9/lib/isc/include/isc/buffer.h b/contrib/bind9/lib/isc/include/isc/buffer.h
index 02b82bc..a285e27 100644
--- a/contrib/bind9/lib/isc/include/isc/buffer.h
+++ b/contrib/bind9/lib/isc/include/isc/buffer.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: buffer.h,v 1.39.12.2 2004/03/08 09:04:51 marka Exp $ */
+/* $Id: buffer.h,v 1.43.18.2 2005/04/29 00:16:53 marka Exp $ */
#ifndef ISC_BUFFER_H
#define ISC_BUFFER_H 1
@@ -24,10 +24,9 @@
***** Module Info
*****/
-/*
- * Buffers
+/*! \file buffer.h
*
- * A buffer is a region of memory, together with a set of related subregions.
+ * \brief A buffer is a region of memory, together with a set of related subregions.
* Buffers are used for parsing and I/O operations.
*
* The 'used region' and the 'available' region are disjoint, and their
@@ -51,6 +50,7 @@
* is empty. If the current offset advances beyond the chosen offset, the
* active region will also be empty.
*
+ * \verbatim
* /------------entire length---------------\
* /----- used region -----\/-- available --\
* +----------------------------------------+
@@ -69,9 +69,11 @@
* a-b == consumed region.
* b-d == remaining region.
* b-c == optional active region.
+ *\endverbatim
*
* The following invariants are maintained by all routines:
*
+ *\code
* length > 0
*
* base is a valid pointer to length bytes of memory
@@ -82,21 +84,22 @@
*
* 0 <= active <= used
* (although active < current implies empty active region)
+ *\endcode
*
- * MP:
+ * \li MP:
* Buffers have no synchronization. Clients must ensure exclusive
* access.
*
- * Reliability:
+ * \li Reliability:
* No anticipated impact.
*
- * Resources:
+ * \li Resources:
* Memory: 1 pointer + 6 unsigned integers per buffer.
*
- * Security:
+ * \li Security:
* No anticipated impact.
*
- * Standards:
+ * \li Standards:
* None.
*/
@@ -108,7 +111,7 @@
#include <isc/magic.h>
#include <isc/types.h>
-/*
+/*!
* To make many functions be inline macros (via #define) define this.
* If it is undefined, a function will be used.
*/
@@ -116,11 +119,13 @@
ISC_LANG_BEGINDECLS
-/***
+/*@{*/
+/*!
*** Magic numbers
***/
#define ISC_BUFFER_MAGIC 0x42756621U /* Buf!. */
#define ISC_BUFFER_VALID(b) ISC_MAGIC_VALID(b, ISC_BUFFER_MAGIC)
+/*@}*/
/*
* The following macros MUST be used only on valid buffers. It is the
@@ -129,7 +134,8 @@ ISC_LANG_BEGINDECLS
* another macro.)
*/
-/*
+/*@{*/
+/*!
* Fundamental buffer elements. (A through E in the introductory comment.)
*/
#define isc_buffer_base(b) ((void *)(b)->base) /*a*/
@@ -140,8 +146,10 @@ ISC_LANG_BEGINDECLS
#define isc_buffer_used(b) \
((void *)((unsigned char *)(b)->base + (b)->used)) /*d*/
#define isc_buffer_length(b) ((b)->length) /*e*/
+/*@}*/
-/*
+/*@{*/
+/*!
* Derived lengths. (Described in the introductory comment.)
*/
#define isc_buffer_usedlength(b) ((b)->used) /* d-a */
@@ -149,8 +157,9 @@ ISC_LANG_BEGINDECLS
#define isc_buffer_remaininglength(b) ((b)->used - (b)->current) /* d-b */
#define isc_buffer_activelength(b) ((b)->active - (b)->current) /* c-b */
#define isc_buffer_availablelength(b) ((b)->length - (b)->used) /* e-d */
+/*@}*/
-/*
+/*!
* Note that the buffer structure is public. This is principally so buffer
* operations can be implemented using macros. Applications are strongly
* discouraged from directly manipulating the structure.
@@ -159,14 +168,16 @@ ISC_LANG_BEGINDECLS
struct isc_buffer {
unsigned int magic;
void *base;
- /* The following integers are byte offsets from 'base'. */
+ /*@{*/
+ /*! The following integers are byte offsets from 'base'. */
unsigned int length;
unsigned int used;
unsigned int current;
unsigned int active;
- /* linkable */
+ /*@}*/
+ /*! linkable */
ISC_LINK(isc_buffer_t) link;
- /* private internal elements */
+ /*! private internal elements */
isc_mem_t *mctx;
};
@@ -177,397 +188,397 @@ struct isc_buffer {
isc_result_t
isc_buffer_allocate(isc_mem_t *mctx, isc_buffer_t **dynbuffer,
unsigned int length);
-/*
- * Allocate a dynamic linkable buffer which has "length" bytes in the
+/*!<
+ * \brief Allocate a dynamic linkable buffer which has "length" bytes in the
* data region.
*
* Requires:
- * "mctx" is valid.
+ *\li "mctx" is valid.
*
- * "dynbuffer" is non-NULL, and "*dynbuffer" is NULL.
+ *\li "dynbuffer" is non-NULL, and "*dynbuffer" is NULL.
*
* Returns:
- * ISC_R_SUCCESS - success
- * ISC_R_NOMEMORY - no memory available
+ *\li ISC_R_SUCCESS - success
+ *\li ISC_R_NOMEMORY - no memory available
*
* Note:
- * Changing the buffer's length field is not permitted.
+ *\li Changing the buffer's length field is not permitted.
*/
void
isc_buffer_free(isc_buffer_t **dynbuffer);
-/*
- * Release resources allocated for a dynamic buffer.
+/*!<
+ * \brief Release resources allocated for a dynamic buffer.
*
* Requires:
- * "dynbuffer" is not NULL.
+ *\li "dynbuffer" is not NULL.
*
- * "*dynbuffer" is a valid dynamic buffer.
+ *\li "*dynbuffer" is a valid dynamic buffer.
*
* Ensures:
- * "*dynbuffer" will be NULL on return, and all memory associated with
+ *\li "*dynbuffer" will be NULL on return, and all memory associated with
* the dynamic buffer is returned to the memory context used in
* isc_buffer_allocate().
*/
void
isc__buffer_init(isc_buffer_t *b, const void *base, unsigned int length);
-/*
- * Make 'b' refer to the 'length'-byte region starting at base.
+/*!<
+ * \brief Make 'b' refer to the 'length'-byte region starting at base.
*
* Requires:
*
- * 'length' > 0
+ *\li 'length' > 0
*
- * 'base' is a pointer to a sequence of 'length' bytes.
+ *\li 'base' is a pointer to a sequence of 'length' bytes.
*
*/
void
isc__buffer_invalidate(isc_buffer_t *b);
-/*
- * Make 'b' an invalid buffer.
+/*!<
+ * \brief Make 'b' an invalid buffer.
*
* Requires:
- * 'b' is a valid buffer.
+ *\li 'b' is a valid buffer.
*
* Ensures:
- * If assertion checking is enabled, future attempts to use 'b' without
+ *\li If assertion checking is enabled, future attempts to use 'b' without
* calling isc_buffer_init() on it will cause an assertion failure.
*/
void
isc__buffer_region(isc_buffer_t *b, isc_region_t *r);
-/*
- * Make 'r' refer to the region of 'b'.
+/*!<
+ * \brief Make 'r' refer to the region of 'b'.
*
* Requires:
*
- * 'b' is a valid buffer.
+ *\li 'b' is a valid buffer.
*
- * 'r' points to a region structure.
+ *\li 'r' points to a region structure.
*/
void
isc__buffer_usedregion(isc_buffer_t *b, isc_region_t *r);
-/*
- * Make 'r' refer to the used region of 'b'.
+/*!<
+ * \brief Make 'r' refer to the used region of 'b'.
*
* Requires:
*
- * 'b' is a valid buffer.
+ *\li 'b' is a valid buffer.
*
- * 'r' points to a region structure.
+ *\li 'r' points to a region structure.
*/
void
isc__buffer_availableregion(isc_buffer_t *b, isc_region_t *r);
-/*
- * Make 'r' refer to the available region of 'b'.
+/*!<
+ * \brief Make 'r' refer to the available region of 'b'.
*
* Requires:
*
- * 'b' is a valid buffer.
+ *\li 'b' is a valid buffer.
*
- * 'r' points to a region structure.
+ *\li 'r' points to a region structure.
*/
void
isc__buffer_add(isc_buffer_t *b, unsigned int n);
-/*
- * Increase the 'used' region of 'b' by 'n' bytes.
+/*!<
+ * \brief Increase the 'used' region of 'b' by 'n' bytes.
*
* Requires:
*
- * 'b' is a valid buffer
+ *\li 'b' is a valid buffer
*
- * used + n <= length
+ *\li used + n <= length
*
*/
void
isc__buffer_subtract(isc_buffer_t *b, unsigned int n);
-/*
- * Decrease the 'used' region of 'b' by 'n' bytes.
+/*!<
+ * \brief Decrease the 'used' region of 'b' by 'n' bytes.
*
* Requires:
*
- * 'b' is a valid buffer
+ *\li 'b' is a valid buffer
*
- * used >= n
+ *\li used >= n
*
*/
void
isc__buffer_clear(isc_buffer_t *b);
-/*
- * Make the used region empty.
+/*!<
+ * \brief Make the used region empty.
*
* Requires:
*
- * 'b' is a valid buffer
+ *\li 'b' is a valid buffer
*
* Ensures:
*
- * used = 0
+ *\li used = 0
*
*/
void
isc__buffer_consumedregion(isc_buffer_t *b, isc_region_t *r);
-/*
- * Make 'r' refer to the consumed region of 'b'.
+/*!<
+ * \brief Make 'r' refer to the consumed region of 'b'.
*
* Requires:
*
- * 'b' is a valid buffer.
+ *\li 'b' is a valid buffer.
*
- * 'r' points to a region structure.
+ *\li 'r' points to a region structure.
*/
void
isc__buffer_remainingregion(isc_buffer_t *b, isc_region_t *r);
-/*
- * Make 'r' refer to the remaining region of 'b'.
+/*!<
+ * \brief Make 'r' refer to the remaining region of 'b'.
*
* Requires:
*
- * 'b' is a valid buffer.
+ *\li 'b' is a valid buffer.
*
- * 'r' points to a region structure.
+ *\li 'r' points to a region structure.
*/
void
isc__buffer_activeregion(isc_buffer_t *b, isc_region_t *r);
-/*
- * Make 'r' refer to the active region of 'b'.
+/*!<
+ * \brief Make 'r' refer to the active region of 'b'.
*
* Requires:
*
- * 'b' is a valid buffer.
+ *\li 'b' is a valid buffer.
*
- * 'r' points to a region structure.
+ *\li 'r' points to a region structure.
*/
void
isc__buffer_setactive(isc_buffer_t *b, unsigned int n);
-/*
- * Sets the end of the active region 'n' bytes after current.
+/*!<
+ * \brief Sets the end of the active region 'n' bytes after current.
*
* Requires:
*
- * 'b' is a valid buffer.
+ *\li 'b' is a valid buffer.
*
- * current + n <= used
+ *\li current + n <= used
*/
void
isc__buffer_first(isc_buffer_t *b);
-/*
- * Make the consumed region empty.
+/*!<
+ * \brief Make the consumed region empty.
*
* Requires:
*
- * 'b' is a valid buffer
+ *\li 'b' is a valid buffer
*
* Ensures:
*
- * current == 0
+ *\li current == 0
*
*/
void
isc__buffer_forward(isc_buffer_t *b, unsigned int n);
-/*
- * Increase the 'consumed' region of 'b' by 'n' bytes.
+/*!<
+ * \brief Increase the 'consumed' region of 'b' by 'n' bytes.
*
* Requires:
*
- * 'b' is a valid buffer
+ *\li 'b' is a valid buffer
*
- * current + n <= used
+ *\li current + n <= used
*
*/
void
isc__buffer_back(isc_buffer_t *b, unsigned int n);
-/*
- * Decrease the 'consumed' region of 'b' by 'n' bytes.
+/*!<
+ * \brief Decrease the 'consumed' region of 'b' by 'n' bytes.
*
* Requires:
*
- * 'b' is a valid buffer
+ *\li 'b' is a valid buffer
*
- * n <= current
+ *\li n <= current
*
*/
void
isc_buffer_compact(isc_buffer_t *b);
-/*
- * Compact the used region by moving the remaining region so it occurs
+/*!<
+ * \brief Compact the used region by moving the remaining region so it occurs
* at the start of the buffer. The used region is shrunk by the size of
* the consumed region, and the consumed region is then made empty.
*
* Requires:
*
- * 'b' is a valid buffer
+ *\li 'b' is a valid buffer
*
* Ensures:
*
- * current == 0
+ *\li current == 0
*
- * The size of the used region is now equal to the size of the remaining
+ *\li The size of the used region is now equal to the size of the remaining
* region (as it was before the call). The contents of the used region
* are those of the remaining region (as it was before the call).
*/
isc_uint8_t
isc_buffer_getuint8(isc_buffer_t *b);
-/*
- * Read an unsigned 8-bit integer from 'b' and return it.
+/*!<
+ * \brief Read an unsigned 8-bit integer from 'b' and return it.
*
* Requires:
*
- * 'b' is a valid buffer.
+ *\li 'b' is a valid buffer.
*
- * The length of the available region of 'b' is at least 1.
+ *\li The length of the available region of 'b' is at least 1.
*
* Ensures:
*
- * The current pointer in 'b' is advanced by 1.
+ *\li The current pointer in 'b' is advanced by 1.
*
* Returns:
*
- * A 8-bit unsigned integer.
+ *\li A 8-bit unsigned integer.
*/
void
isc__buffer_putuint8(isc_buffer_t *b, isc_uint8_t val);
-/*
- * Store an unsigned 8-bit integer from 'val' into 'b'.
+/*!<
+ * \brief Store an unsigned 8-bit integer from 'val' into 'b'.
*
* Requires:
- * 'b' is a valid buffer.
+ *\li 'b' is a valid buffer.
*
- * The length of the unused region of 'b' is at least 1.
+ *\li The length of the unused region of 'b' is at least 1.
*
* Ensures:
- * The used pointer in 'b' is advanced by 1.
+ *\li The used pointer in 'b' is advanced by 1.
*/
isc_uint16_t
isc_buffer_getuint16(isc_buffer_t *b);
-/*
- * Read an unsigned 16-bit integer in network byte order from 'b', convert
+/*!<
+ * \brief Read an unsigned 16-bit integer in network byte order from 'b', convert
* it to host byte order, and return it.
*
* Requires:
*
- * 'b' is a valid buffer.
+ *\li 'b' is a valid buffer.
*
- * The length of the available region of 'b' is at least 2.
+ *\li The length of the available region of 'b' is at least 2.
*
* Ensures:
*
- * The current pointer in 'b' is advanced by 2.
+ *\li The current pointer in 'b' is advanced by 2.
*
* Returns:
*
- * A 16-bit unsigned integer.
+ *\li A 16-bit unsigned integer.
*/
void
isc__buffer_putuint16(isc_buffer_t *b, isc_uint16_t val);
-/*
- * Store an unsigned 16-bit integer in host byte order from 'val'
+/*!<
+ * \brief Store an unsigned 16-bit integer in host byte order from 'val'
* into 'b' in network byte order.
*
* Requires:
- * 'b' is a valid buffer.
+ *\li 'b' is a valid buffer.
*
- * The length of the unused region of 'b' is at least 2.
+ *\li The length of the unused region of 'b' is at least 2.
*
* Ensures:
- * The used pointer in 'b' is advanced by 2.
+ *\li The used pointer in 'b' is advanced by 2.
*/
isc_uint32_t
isc_buffer_getuint32(isc_buffer_t *b);
-/*
- * Read an unsigned 32-bit integer in network byte order from 'b', convert
+/*!<
+ * \brief Read an unsigned 32-bit integer in network byte order from 'b', convert
* it to host byte order, and return it.
*
* Requires:
*
- * 'b' is a valid buffer.
+ *\li 'b' is a valid buffer.
*
- * The length of the available region of 'b' is at least 4.
+ *\li The length of the available region of 'b' is at least 4.
*
* Ensures:
*
- * The current pointer in 'b' is advanced by 4.
+ *\li The current pointer in 'b' is advanced by 4.
*
* Returns:
*
- * A 32-bit unsigned integer.
+ *\li A 32-bit unsigned integer.
*/
void
isc__buffer_putuint32(isc_buffer_t *b, isc_uint32_t val);
-/*
- * Store an unsigned 32-bit integer in host byte order from 'val'
+/*!<
+ * \brief Store an unsigned 32-bit integer in host byte order from 'val'
* into 'b' in network byte order.
*
* Requires:
- * 'b' is a valid buffer.
+ *\li 'b' is a valid buffer.
*
- * The length of the unused region of 'b' is at least 4.
+ *\li The length of the unused region of 'b' is at least 4.
*
* Ensures:
- * The used pointer in 'b' is advanced by 4.
+ *\li The used pointer in 'b' is advanced by 4.
*/
void
isc__buffer_putmem(isc_buffer_t *b, const unsigned char *base,
unsigned int length);
-/*
- * Copy 'length' bytes of memory at 'base' into 'b'.
+/*!<
+ * \brief Copy 'length' bytes of memory at 'base' into 'b'.
*
* Requires:
- * 'b' is a valid buffer.
+ *\li 'b' is a valid buffer.
*
- * 'base' points to 'length' bytes of valid memory.
+ *\li 'base' points to 'length' bytes of valid memory.
*
*/
void
isc__buffer_putstr(isc_buffer_t *b, const char *source);
-/*
- * Copy 'source' into 'b', not including terminating NUL.
+/*!<
+ * \brief Copy 'source' into 'b', not including terminating NUL.
*
* Requires:
- * 'b' is a valid buffer.
+ *\li 'b' is a valid buffer.
*
- * 'source' to be a valid NULL terminated string.
+ *\li 'source' to be a valid NULL terminated string.
*
- * strlen(source) <= isc_buffer_available(b)
+ *\li strlen(source) <= isc_buffer_available(b)
*/
isc_result_t
isc_buffer_copyregion(isc_buffer_t *b, const isc_region_t *r);
-/*
- * Copy the contents of 'r' into 'b'.
+/*!<
+ * \brief Copy the contents of 'r' into 'b'.
*
* Requires:
- * 'b' is a valid buffer.
+ *\li 'b' is a valid buffer.
*
- * 'r' is a valid region.
+ *\li 'r' is a valid region.
*
* Returns:
*
- * ISC_R_SUCCESS
- * ISC_R_NOSPACE The available region of 'b' is not
+ *\li ISC_R_SUCCESS
+ *\li ISC_R_NOSPACE The available region of 'b' is not
* big enough.
*/
@@ -580,7 +591,7 @@ ISC_LANG_ENDDECLS
* ones beginning with "isc__"
*/
-/*
+/*! \note
* XXXDCL Something more could be done with initializing buffers that
* point to const data. For example, a new function, isc_buffer_initconst,
* could be used, and a new boolean flag in the buffer structure could
diff --git a/contrib/bind9/lib/isc/include/isc/bufferlist.h b/contrib/bind9/lib/isc/include/isc/bufferlist.h
index b24cde0..7fc2ecc 100644
--- a/contrib/bind9/lib/isc/include/isc/bufferlist.h
+++ b/contrib/bind9/lib/isc/include/isc/bufferlist.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: bufferlist.h,v 1.10.206.1 2004/03/06 08:14:39 marka Exp $ */
+/* $Id: bufferlist.h,v 1.11.18.2 2005/04/29 00:16:53 marka Exp $ */
#ifndef ISC_BUFFERLIST_H
#define ISC_BUFFERLIST_H 1
@@ -24,19 +24,19 @@
***** Module Info
*****/
-/*
- * Buffer Lists
+/*! \file bufferlist.h
+ *
*
- * Buffer lists have no synchronization. Clients must ensure exclusive
+ *\brief Buffer lists have no synchronization. Clients must ensure exclusive
* access.
*
- * Reliability:
+ * \li Reliability:
* No anticipated impact.
- * Security:
+ * \li Security:
* No anticipated impact.
*
- * Standards:
+ * \li Standards:
* None.
*/
@@ -55,30 +55,30 @@ ISC_LANG_BEGINDECLS
unsigned int
isc_bufferlist_usedcount(isc_bufferlist_t *bl);
-/*
- * Return the length of the sum of all used regions of all buffers in
+/*!<
+ * \brief Return the length of the sum of all used regions of all buffers in
* the buffer list 'bl'
*
* Requires:
*
- * 'bl' is not NULL.
+ *\li 'bl' is not NULL.
*
* Returns:
- * sum of all used regions' lengths.
+ *\li sum of all used regions' lengths.
*/
unsigned int
isc_bufferlist_availablecount(isc_bufferlist_t *bl);
-/*
- * Return the length of the sum of all available regions of all buffers in
+/*!<
+ * \brief Return the length of the sum of all available regions of all buffers in
* the buffer list 'bl'
*
* Requires:
*
- * 'bl' is not NULL.
+ *\li 'bl' is not NULL.
*
* Returns:
- * sum of all available regions' lengths.
+ *\li sum of all available regions' lengths.
*/
ISC_LANG_ENDDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/commandline.h b/contrib/bind9/lib/isc/include/isc/commandline.h
index 250f7f0..5ece26f 100644
--- a/contrib/bind9/lib/isc/include/isc/commandline.h
+++ b/contrib/bind9/lib/isc/include/isc/commandline.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,30 +15,33 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: commandline.h,v 1.9.206.1 2004/03/06 08:14:39 marka Exp $ */
+/* $Id: commandline.h,v 1.10.18.2 2005/04/29 00:16:53 marka Exp $ */
#ifndef ISC_COMMANDLINE_H
#define ISC_COMMANDLINE_H 1
+/*! \file */
+
#include <isc/boolean.h>
#include <isc/lang.h>
#include <isc/platform.h>
-/* Index into parent argv vector. */
+/*% Index into parent argv vector. */
LIBISC_EXTERNAL_DATA extern int isc_commandline_index;
-/* Character checked for validity. */
+/*% Character checked for validity. */
LIBISC_EXTERNAL_DATA extern int isc_commandline_option;
-/* Argument associated with option. */
+/*% Argument associated with option. */
LIBISC_EXTERNAL_DATA extern char *isc_commandline_argument;
-/* For printing error messages. */
+/*% For printing error messages. */
LIBISC_EXTERNAL_DATA extern char *isc_commandline_progname;
-/* Print error message. */
+/*% Print error message. */
LIBISC_EXTERNAL_DATA extern isc_boolean_t isc_commandline_errprint;
-/* Reset getopt. */
+/*% Reset getopt. */
LIBISC_EXTERNAL_DATA extern isc_boolean_t isc_commandline_reset;
ISC_LANG_BEGINDECLS
+/*% parse command line */
int
isc_commandline_parse(int argc, char * const *argv, const char *options);
diff --git a/contrib/bind9/lib/isc/include/isc/entropy.h b/contrib/bind9/lib/isc/include/isc/entropy.h
index 7200a12..2890f6c 100644
--- a/contrib/bind9/lib/isc/include/isc/entropy.h
+++ b/contrib/bind9/lib/isc/include/isc/entropy.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: entropy.h,v 1.23.2.1.10.1 2004/03/06 08:14:40 marka Exp $ */
+/* $Id: entropy.h,v 1.25.18.2 2005/04/29 00:16:54 marka Exp $ */
#ifndef ISC_ENTROPY_H
#define ISC_ENTROPY_H 1
@@ -24,33 +24,30 @@
***** Module Info
*****/
-/*
- * Entropy
- *
- * The entropy API
+/*! \file entropy.h
+ * \brief The entropy API
*
- * MP:
+ * \li MP:
* The entropy object is locked internally. All callbacks into
* application-provided functions (for setup, gathering, and
* shutdown of sources) are guaranteed to be called with the
* entropy API lock held. This means these functions are
* not permitted to call back into the entropy API.
*
- * Reliability:
+ * \li Reliability:
* No anticipated impact.
*
- * Resources:
+ * \li Resources:
* A buffer, used as an entropy pool.
*
- * Security:
+ * \li Security:
* While this code is believed to implement good entropy gathering
* and distribution, it has not been reviewed by a cryptographic
* expert.
- *
* Since the added entropy is only as good as the sources used,
* this module could hand out bad data and never know it.
*
- * Standards:
+ * \li Standards:
* None.
*/
@@ -63,31 +60,37 @@
#include <isc/lang.h>
#include <isc/types.h>
-/*
- * Entropy callback function.
- */
+/*@{*/
+/*% Entropy callback function. */
typedef isc_result_t (*isc_entropystart_t)(isc_entropysource_t *source,
void *arg, isc_boolean_t blocking);
typedef isc_result_t (*isc_entropyget_t)(isc_entropysource_t *source,
void *arg, isc_boolean_t blocking);
typedef void (*isc_entropystop_t)(isc_entropysource_t *source, void *arg);
+/*@}*/
/***
*** Flags.
***/
-/*
- * _GOODONLY
+/*!
+ * \brief
* Extract only "good" data; return failure if there is not enough
* data available and there are no sources which we can poll to get
* data, or those sources are empty.
*
- * _PARTIAL
+ *
+ */
+#define ISC_ENTROPY_GOODONLY 0x00000001U
+/*!
+ * \brief
* Extract as much good data as possible, but if there isn't enough
* at hand, return what is available. This flag only makes sense
* when used with _GOODONLY.
- *
- * _BLOCKING
+ */
+#define ISC_ENTROPY_PARTIAL 0x00000002U
+/*!
+ * \brief
* Block the task until data is available. This is contrary to the
* ISC task system, where tasks should never block. However, if
* this is a special purpose application where blocking a task is
@@ -95,12 +98,10 @@ typedef void (*isc_entropystop_t)(isc_entropysource_t *source, void *arg);
* This flag only makes sense when used with _GOODONLY, and will
* block regardless of the setting for _PARTIAL.
*/
-#define ISC_ENTROPY_GOODONLY 0x00000001U
-#define ISC_ENTROPY_PARTIAL 0x00000002U
#define ISC_ENTROPY_BLOCKING 0x00000004U
-/*
- * _ESTIMATE
+/*!
+ * \brief
* Estimate the amount of entropy contained in the sample pool.
* If this is not set, the source will be gathered and perodically
* mixed into the entropy pool, but no increment in contained entropy
@@ -110,17 +111,22 @@ typedef void (*isc_entropystop_t)(isc_entropysource_t *source, void *arg);
/*
* For use with isc_entropy_usebestsource().
- *
- * _KEYBOARDYES
+ */
+/*!
+ * \brief
* Use the keyboard as the only entropy source.
- * _KEYBOARDNO
+ */
+#define ISC_ENTROPY_KEYBOARDYES 1
+/*!
+ * \brief
* Never use the keyboard as an entropy source.
- * _KEYBOARDMAYBE
+ */
+#define ISC_ENTROPY_KEYBOARDNO 2
+/*!
+ * \brief
* Use the keyboard as an entropy source only if opening the
* random device fails.
*/
-#define ISC_ENTROPY_KEYBOARDYES 1
-#define ISC_ENTROPY_KEYBOARDNO 2
#define ISC_ENTROPY_KEYBOARDMAYBE 3
ISC_LANG_BEGINDECLS
@@ -131,26 +137,26 @@ ISC_LANG_BEGINDECLS
isc_result_t
isc_entropy_create(isc_mem_t *mctx, isc_entropy_t **entp);
-/*
- * Create a new entropy object.
+/*!<
+ * \brief Create a new entropy object.
*/
void
isc_entropy_attach(isc_entropy_t *ent, isc_entropy_t **entp);
-/*
+/*!<
* Attaches to an entropy object.
*/
void
isc_entropy_detach(isc_entropy_t **entp);
-/*
- * Detaches from an entropy object.
+/*!<
+ * \brief Detaches from an entropy object.
*/
isc_result_t
isc_entropy_createfilesource(isc_entropy_t *ent, const char *fname);
-/*
- * Create a new entropy source from a file.
+/*!<
+ * \brief Create a new entropy source from a file.
*
* The file is assumed to contain good randomness, and will be mixed directly
* into the pool with every byte adding 8 bits of entropy.
@@ -168,15 +174,15 @@ isc_entropy_createfilesource(isc_entropy_t *ent, const char *fname);
void
isc_entropy_destroysource(isc_entropysource_t **sourcep);
-/*
- * Removes an entropy source from the entropy system.
+/*!<
+ * \brief Removes an entropy source from the entropy system.
*/
isc_result_t
isc_entropy_createsamplesource(isc_entropy_t *ent,
isc_entropysource_t **sourcep);
-/*
- * Create an entropy source that consists of samples. Each sample is added
+/*!<
+ * \brief Create an entropy source that consists of samples. Each sample is added
* to the source via isc_entropy_addsamples(), below.
*/
@@ -187,8 +193,10 @@ isc_entropy_createcallbacksource(isc_entropy_t *ent,
isc_entropystop_t stop,
void *arg,
isc_entropysource_t **sourcep);
-/*
- * Create an entropy source that is polled via a callback. This would
+/*!<
+ * \brief Create an entropy source that is polled via a callback.
+ *
+ * This would
* be used when keyboard input is used, or a GUI input method. It can
* also be used to hook in any external entropy source.
*
@@ -199,19 +207,22 @@ isc_entropy_createcallbacksource(isc_entropy_t *ent,
void
isc_entropy_stopcallbacksources(isc_entropy_t *ent);
-/*
- * Call the stop functions for callback sources that have had their
+/*!<
+ * \brief Call the stop functions for callback sources that have had their
* start functions called.
*/
+/*@{*/
isc_result_t
isc_entropy_addcallbacksample(isc_entropysource_t *source, isc_uint32_t sample,
isc_uint32_t extra);
isc_result_t
isc_entropy_addsample(isc_entropysource_t *source, isc_uint32_t sample,
isc_uint32_t extra);
-/*
- * Add a sample to the sample source. The sample MUST be a timestamp
+/*!<
+ * \brief Add a sample to the sample source.
+ *
+ * The sample MUST be a timestamp
* that increases over time, with the exception of wrap-around for
* extremely high resolution timers which will quickly wrap-around
* a 32-bit integer.
@@ -222,20 +233,28 @@ isc_entropy_addsample(isc_entropysource_t *source, isc_uint32_t sample,
* When in an entropy API callback function, _addcallbacksource() must be
* used. At all other times, _addsample() must be used.
*/
+/*@}*/
isc_result_t
isc_entropy_getdata(isc_entropy_t *ent, void *data, unsigned int length,
unsigned int *returned, unsigned int flags);
-/*
- * Extract data from the entropy pool. This may load the pool from various
+/*!<
+ * \brief Extract data from the entropy pool. This may load the pool from various
* sources.
+ *
+ * Do this by stiring the pool and returning a part of hash as randomness.
+ * Note that no secrets are given away here since parts of the hash are
+ * xored together before returned.
+ *
+ * Honor the request from the caller to only return good data, any data,
+ * etc.
*/
void
isc_entropy_putdata(isc_entropy_t *ent, void *data, unsigned int length,
isc_uint32_t entropy);
-/*
- * Add "length" bytes in "data" to the entropy pool, incrementing the pool's
+/*!<
+ * \brief Add "length" bytes in "data" to the entropy pool, incrementing the pool's
* entropy count by "entropy."
*
* These bytes will prime the pseudorandom portion even no entropy is actually
@@ -244,42 +263,42 @@ isc_entropy_putdata(isc_entropy_t *ent, void *data, unsigned int length,
void
isc_entropy_stats(isc_entropy_t *ent, FILE *out);
-/*
- * Dump some (trivial) stats to the stdio stream "out".
+/*!<
+ * \brief Dump some (trivial) stats to the stdio stream "out".
*/
isc_result_t
isc_entropy_usebestsource(isc_entropy_t *ectx, isc_entropysource_t **source,
const char *randomfile, int use_keyboard);
-/*
- * Use whatever source of entropy is best.
+/*!<
+ * \brief Use whatever source of entropy is best.
*
* Notes:
- * If "randomfile" is not NULL, open it with
+ *\li If "randomfile" is not NULL, open it with
* isc_entropy_createfilesource().
*
- * If "randomfile" is NULL and the system's random device was detected
+ *\li If "randomfile" is NULL and the system's random device was detected
* when the program was configured and built, open that device with
* isc_entropy_createfilesource().
*
- * If "use_keyboard" is ISC_ENTROPY_KEYBOARDYES, then always open
+ *\li If "use_keyboard" is #ISC_ENTROPY_KEYBOARDYES, then always open
* the keyboard as an entropy source (possibly in addition to
* "randomfile" or the random device).
*
- * If "use_keyboard" is ISC_ENTROPY_KEYBOARDMAYBE, open the keyboard only
+ *\li If "use_keyboard" is #ISC_ENTROPY_KEYBOARDMAYBE, open the keyboard only
* if opening the random file/device fails. A message will be
* printed describing the need for keyboard input.
*
- * If "use_keyboard" is ISC_ENTROPY_KEYBOARDNO, the keyboard will
+ *\li If "use_keyboard" is #ISC_ENTROPY_KEYBOARDNO, the keyboard will
* never be opened.
*
* Returns:
- * ISC_R_SUCCESS if at least one source of entropy could be started.
+ *\li #ISC_R_SUCCESS if at least one source of entropy could be started.
*
- * ISC_R_NOENTROPY if use_keyboard is ISC_ENTROPY_KEYBOARDNO and
+ *\li #ISC_R_NOENTROPY if use_keyboard is #ISC_ENTROPY_KEYBOARDNO and
* there is no random device pathname compiled into the program.
*
- * A return code from isc_entropy_createfilesource() or
+ *\li A return code from isc_entropy_createfilesource() or
* isc_entropy_createcallbacksource().
*/
diff --git a/contrib/bind9/lib/isc/include/isc/error.h b/contrib/bind9/lib/isc/include/isc/error.h
index 6142926..3320ae9 100644
--- a/contrib/bind9/lib/isc/include/isc/error.h
+++ b/contrib/bind9/lib/isc/include/isc/error.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: error.h,v 1.13.206.1 2004/03/06 08:14:40 marka Exp $ */
+/* $Id: error.h,v 1.14.18.2 2005/04/29 00:16:54 marka Exp $ */
#ifndef ISC_ERROR_H
#define ISC_ERROR_H 1
+/*! \file */
+
#include <stdarg.h>
#include <isc/formatcheck.h>
@@ -29,20 +31,25 @@ ISC_LANG_BEGINDECLS
typedef void (*isc_errorcallback_t)(const char *, int, const char *, va_list);
+/*% set unexpected error */
void
isc_error_setunexpected(isc_errorcallback_t);
+/*% set fatal error */
void
isc_error_setfatal(isc_errorcallback_t);
+/*% unexpected error */
void
isc_error_unexpected(const char *, int, const char *, ...)
ISC_FORMAT_PRINTF(3, 4);
+/*% fatal error */
void
isc_error_fatal(const char *, int, const char *, ...)
ISC_FORMAT_PRINTF(3, 4);
+/*% runtimecheck error */
void
isc_error_runtimecheck(const char *, int, const char *);
diff --git a/contrib/bind9/lib/isc/include/isc/event.h b/contrib/bind9/lib/isc/include/isc/event.h
index 58ef2c3..f1b1d61 100644
--- a/contrib/bind9/lib/isc/include/isc/event.h
+++ b/contrib/bind9/lib/isc/include/isc/event.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: event.h,v 1.24.2.2.8.2 2004/04/15 02:10:41 marka Exp $ */
+/* $Id: event.h,v 1.27.18.3 2005/04/29 00:16:54 marka Exp $ */
#ifndef ISC_EVENT_H
#define ISC_EVENT_H 1
+/*! \file */
+
#include <isc/lang.h>
#include <isc/types.h>
@@ -41,14 +43,14 @@ typedef void (*isc_eventdestructor_t)(isc_event_t *);
void * ev_destroy_arg; \
ISC_LINK(ltype) ev_link
-/*
+/*%
* Attributes matching a mask of 0x000000ff are reserved for the task library's
* definition. Attributes of 0xffffff00 may be used by the application
* or non-ISC libraries.
*/
#define ISC_EVENTATTR_NOPURGE 0x00000001
-/*
+/*%
* The ISC_EVENTATTR_CANCELED attribute is intended to indicate
* that an event is delivered as a result of a canceled operation
* rather than successful completion, by mutual agreement
@@ -71,7 +73,7 @@ do { \
ISC_LINK_INIT((event), ev_link); \
} while (0)
-/*
+/*%
* This structure is public because "subclassing" it may be useful when
* defining new event types.
*/
@@ -89,22 +91,26 @@ ISC_LANG_BEGINDECLS
isc_event_t *
isc_event_allocate(isc_mem_t *mctx, void *sender, isc_eventtype_t type,
isc_taskaction_t action, const void *arg, size_t size);
-/*
+/*%<
+ * Allocate an event structure.
+ *
* Allocate and initialize in a structure with initial elements
* defined by:
*
+ * \code
* struct {
* ISC_EVENT_COMMON(struct isc_event);
* ...
* };
+ * \endcode
*
* Requires:
- * 'size' >= sizeof(struct isc_event)
- * 'action' to be non NULL
+ *\li 'size' >= sizeof(struct isc_event)
+ *\li 'action' to be non NULL
*
* Returns:
- * a pointer to a initialized structure of the requested size.
- * NULL if unable to allocate memory.
+ *\li a pointer to a initialized structure of the requested size.
+ *\li NULL if unable to allocate memory.
*/
void
diff --git a/contrib/bind9/lib/isc/include/isc/eventclass.h b/contrib/bind9/lib/isc/include/isc/eventclass.h
index a783d35..71de715 100644
--- a/contrib/bind9/lib/isc/include/isc/eventclass.h
+++ b/contrib/bind9/lib/isc/include/isc/eventclass.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,25 +15,28 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: eventclass.h,v 1.13.206.1 2004/03/06 08:14:40 marka Exp $ */
+/* $Id: eventclass.h,v 1.14.18.2 2005/04/29 00:16:54 marka Exp $ */
#ifndef ISC_EVENTCLASS_H
#define ISC_EVENTCLASS_H 1
-/*****
+/*! \file isc/eventclass.h
***** Registry of Predefined Event Type Classes
*****/
-/*
+/*%
* An event class is an unsigned 16 bit number. Each class may contain up
* to 65536 events. An event type is formed by adding the event number
* within the class to the class number.
+ *
*/
#define ISC_EVENTCLASS(eclass) ((eclass) << 16)
-/*
+/*@{*/
+/*!
* Classes < 1024 are reserved for ISC use.
+ * Event classes >= 1024 and <= 65535 are reserved for application use.
*/
#define ISC_EVENTCLASS_TASK ISC_EVENTCLASS(0)
@@ -45,9 +48,6 @@
#define ISC_EVENTCLASS_OMAPI ISC_EVENTCLASS(6)
#define ISC_EVENTCLASS_RATELIMITER ISC_EVENTCLASS(7)
#define ISC_EVENTCLASS_ISCCC ISC_EVENTCLASS(8)
-
-/*
- * Event classes >= 1024 and <= 65535 are reserved for application use.
- */
+/*@}*/
#endif /* ISC_EVENTCLASS_H */
diff --git a/contrib/bind9/lib/isc/include/isc/file.h b/contrib/bind9/lib/isc/include/isc/file.h
index 6de6c8a..16b0075 100644
--- a/contrib/bind9/lib/isc/include/isc/file.h
+++ b/contrib/bind9/lib/isc/include/isc/file.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: file.h,v 1.24.12.3 2004/03/08 09:04:51 marka Exp $ */
+/* $Id: file.h,v 1.27.18.2 2005/04/29 00:16:54 marka Exp $ */
#ifndef ISC_FILE_H
#define ISC_FILE_H 1
+/*! \file */
+
#include <stdio.h>
#include <isc/lang.h>
@@ -32,81 +34,81 @@ isc_file_settime(const char *file, isc_time_t *time);
isc_result_t
isc_file_getmodtime(const char *file, isc_time_t *time);
-/*
- * Get the time of last modication of a file.
+/*!<
+ * \brief Get the time of last modication of a file.
*
* Notes:
- * The time that is set is relative to the (OS-specific) epoch, as are
+ *\li The time that is set is relative to the (OS-specific) epoch, as are
* all isc_time_t structures.
*
* Requires:
- * file != NULL.
- * time != NULL.
+ *\li file != NULL.
+ *\li time != NULL.
*
* Ensures:
- * If the file could not be accessed, 'time' is unchanged.
+ *\li If the file could not be accessed, 'time' is unchanged.
*
* Returns:
- * ISC_R_SUCCESS
+ *\li #ISC_R_SUCCESS
* Success.
- * ISC_R_NOTFOUND
+ *\li #ISC_R_NOTFOUND
* No such file exists.
- * ISC_R_INVALIDFILE
+ *\li #ISC_R_INVALIDFILE
* The path specified was not usable by the operating system.
- * ISC_R_NOPERM
+ *\li #ISC_R_NOPERM
* The file's metainformation could not be retrieved because
* permission was denied to some part of the file's path.
- * ISC_R_EIO
+ *\li #ISC_R_EIO
* Hardware error interacting with the filesystem.
- * ISC_R_UNEXPECTED
+ *\li #ISC_R_UNEXPECTED
* Something totally unexpected happened.
*
*/
isc_result_t
isc_file_mktemplate(const char *path, char *buf, size_t buflen);
-/*
- * Generate a template string suitable for use with isc_file_openunique.
+/*!<
+ * \brief Generate a template string suitable for use with isc_file_openunique().
*
* Notes:
- * This function is intended to make creating temporary files
+ *\li This function is intended to make creating temporary files
* portable between different operating systems.
*
- * The path is prepended to an implementation-defined string and
+ *\li The path is prepended to an implementation-defined string and
* placed into buf. The string has no path characters in it,
* and its maximum length is 14 characters plus a NUL. Thus
* buflen should be at least strlen(path) + 15 characters or
* an error will be returned.
*
* Requires:
- * buf != NULL.
+ *\li buf != NULL.
*
* Ensures:
- * If result == ISC_R_SUCCESS:
+ *\li If result == #ISC_R_SUCCESS:
* buf contains a string suitable for use as the template argument
- * to isc_file_openunique.
+ * to isc_file_openunique().
*
- * If result != ISC_R_SUCCESS:
+ *\li If result != #ISC_R_SUCCESS:
* buf is unchanged.
*
* Returns:
- * ISC_R_SUCCESS Success.
- * ISC_R_NOSPACE buflen indicates buf is too small for the catenation
+ *\li #ISC_R_SUCCESS Success.
+ *\li #ISC_R_NOSPACE buflen indicates buf is too small for the catenation
* of the path with the internal template string.
*/
isc_result_t
isc_file_openunique(char *templet, FILE **fp);
-/*
- * Create and open a file with a unique name based on 'templet'.
+/*!<
+ * \brief Create and open a file with a unique name based on 'templet'.
*
* Notes:
- * 'template' is a reserved work in C++. If you want to complain
+ *\li 'template' is a reserved work in C++. If you want to complain
* about the spelling of 'templet', first look it up in the
* Merriam-Webster English dictionary. (http://www.m-w.com/)
*
- * This function works by using the template to generate file names.
+ *\li This function works by using the template to generate file names.
* The template must be a writable string, as it is modified in place.
* Trailing X characters in the file name (full file name on Unix,
* basename on Win32 -- eg, tmp-XXXXXX vs XXXXXX.tmp, respectively)
@@ -114,95 +116,97 @@ isc_file_openunique(char *templet, FILE **fp);
* is found. If the template does not include pathname information,
* the files in the working directory of the program are searched.
*
- * isc_file_mktemplate is a good, portable way to get a template.
+ *\li isc_file_mktemplate is a good, portable way to get a template.
*
* Requires:
- * 'fp' is non-NULL and '*fp' is NULL.
+ *\li 'fp' is non-NULL and '*fp' is NULL.
*
- * 'template' is non-NULL, and of a form suitable for use by
+ *\li 'template' is non-NULL, and of a form suitable for use by
* the system as described above.
*
* Ensures:
- * If result is ISC_R_SUCCESS:
+ *\li If result is #ISC_R_SUCCESS:
* *fp points to an stream opening in stdio's "w+" mode.
*
- * If result is not ISC_R_SUCCESS:
+ *\li If result is not #ISC_R_SUCCESS:
* *fp is NULL.
*
* No file is open. Even if one was created (but unable
* to be reopened as a stdio FILE pointer) then it has been
* removed.
*
- * This function does *not* ensure that the template string has not been
+ *\li This function does *not* ensure that the template string has not been
* modified, even if the operation was unsuccessful.
*
* Returns:
- * ISC_R_SUCCESS
+ *\li #ISC_R_SUCCESS
* Success.
- * ISC_R_EXISTS
+ *\li #ISC_R_EXISTS
* No file with a unique name could be created based on the
* template.
- * ISC_R_INVALIDFILE
+ *\li #ISC_R_INVALIDFILE
* The path specified was not usable by the operating system.
- * ISC_R_NOPERM
+ *\li #ISC_R_NOPERM
* The file could not be created because permission was denied
* to some part of the file's path.
- * ISC_R_EIO
+ *\li #ISC_R_IOERROR
* Hardware error interacting with the filesystem.
- * ISC_R_UNEXPECTED
+ *\li #ISC_R_UNEXPECTED
* Something totally unexpected happened.
*/
isc_result_t
isc_file_remove(const char *filename);
-/*
- * Remove the file named by 'filename'.
+/*!<
+ * \brief Remove the file named by 'filename'.
*/
isc_result_t
isc_file_rename(const char *oldname, const char *newname);
-/*
- * Rename the file 'oldname' to 'newname'.
+/*!<
+ * \brief Rename the file 'oldname' to 'newname'.
*/
isc_boolean_t
isc_file_exists(const char *pathname);
-/*
- * Return ISC_TRUE iff the calling process can tell that the given file exists.
+/*!<
+ * \brief Return #ISC_TRUE if the calling process can tell that the given file exists.
* Will not return true if the calling process has insufficient privileges
* to search the entire path.
*/
isc_boolean_t
isc_file_isabsolute(const char *filename);
-/*
- * Return ISC_TRUE iff the given file name is absolute.
+/*!<
+ * \brief Return #ISC_TRUE if the given file name is absolute.
*/
isc_boolean_t
isc_file_iscurrentdir(const char *filename);
-/*
- * Return ISC_TRUE iff the given file name is the current directory (".").
+/*!<
+ * \brief Return #ISC_TRUE if the given file name is the current directory (".").
*/
isc_boolean_t
isc_file_ischdiridempotent(const char *filename);
-/*
- * Return ISC_TRUE if calling chdir(filename) multiple times will give
+/*%<
+ * Return #ISC_TRUE if calling chdir(filename) multiple times will give
* the same result as calling it once.
*/
const char *
isc_file_basename(const char *filename);
-/*
+/*%<
* Return the final component of the path in the file name.
*/
isc_result_t
isc_file_progname(const char *filename, char *buf, size_t buflen);
-/*
- * Given an operating system specific file name "filename"
+/*!<
+ * \brief Given an operating system specific file name "filename"
* referring to a program, return the canonical program name.
+ *
+ *
* Any directory prefix or executable file name extension (if
* used on the OS in case) is stripped. On systems where program
* names are case insensitive, the name is canonicalized to all
@@ -210,14 +214,14 @@ isc_file_progname(const char *filename, char *buf, size_t buflen);
* chars, and null terminated.
*
* Returns:
- * ISC_R_SUCCESS
- * ISC_R_NOSPACE The name did not fit in 'buf'.
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_NOSPACE The name did not fit in 'buf'.
*/
isc_result_t
isc_file_template(const char *path, const char *templet, char *buf,
size_t buflen);
-/*
+/*%<
* Create an OS specific template using 'path' to define the directory
* 'templet' to describe the filename and store the result in 'buf'
* such that path can be renamed to buf atomically.
@@ -225,13 +229,13 @@ isc_file_template(const char *path, const char *templet, char *buf,
isc_result_t
isc_file_renameunique(const char *file, char *templet);
-/*
+/*%<
* Rename 'file' using 'templet' as a template for the new file name.
*/
isc_result_t
isc_file_absolutepath(const char *filename, char *path, size_t pathlen);
-/*
+/*%<
* Given a file name, return the fully qualified path to the file.
*/
@@ -243,7 +247,7 @@ isc_file_absolutepath(const char *filename, char *path, size_t pathlen);
isc_result_t
isc_file_truncate(const char *filename, isc_offset_t size);
-/*
+/*%<
* Truncate/extend the file specified to 'size' bytes.
*/
diff --git a/contrib/bind9/lib/isc/include/isc/formatcheck.h b/contrib/bind9/lib/isc/include/isc/formatcheck.h
index a7f26c1..93c6232 100644
--- a/contrib/bind9/lib/isc/include/isc/formatcheck.h
+++ b/contrib/bind9/lib/isc/include/isc/formatcheck.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,15 +15,21 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: formatcheck.h,v 1.6.206.1 2004/03/06 08:14:41 marka Exp $ */
+/* $Id: formatcheck.h,v 1.7.18.2 2005/04/29 00:16:54 marka Exp $ */
#ifndef ISC_FORMATCHECK_H
#define ISC_FORMATCHECK_H 1
-/*
- * fmt is the location of the format string parameter.
- * args is the location of the first argument (or 0 for no argument checking).
- * Note: the first parameter is 1, not 0.
+/*! \file */
+
+/*%
+ * ISC_FORMAT_PRINTF().
+ *
+ * \li fmt is the location of the format string parameter.
+ * \li args is the location of the first argument (or 0 for no argument checking).
+ *
+ * Note:
+ * \li The first parameter is 1, not 0.
*/
#ifdef __GNUC__
#define ISC_FORMAT_PRINTF(fmt, args) __attribute__((__format__(__printf__, fmt, args)))
diff --git a/contrib/bind9/lib/isc/include/isc/fsaccess.h b/contrib/bind9/lib/isc/include/isc/fsaccess.h
index 0f0c8ce..70c4d7c 100644
--- a/contrib/bind9/lib/isc/include/isc/fsaccess.h
+++ b/contrib/bind9/lib/isc/include/isc/fsaccess.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,13 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: fsaccess.h,v 1.7.206.1 2004/03/06 08:14:41 marka Exp $ */
+/* $Id: fsaccess.h,v 1.8.18.2 2005/04/29 00:16:55 marka Exp $ */
#ifndef ISC_FSACCESS_H
#define ISC_FSACCESS_H 1
-/*
- * The ISC filesystem access module encapsulates the setting of file
+/*! \file
+ * \brief The ISC filesystem access module encapsulates the setting of file
* and directory access permissions into one API that is meant to be
* portable to multiple operating systems.
*
@@ -41,30 +41,30 @@
*
* Some of the more notable dumbing down of NT for this API includes:
*
- * o Each of FILE_READ_DATA and FILE_READ_EA are set with ISC_FSACCESS_READ.
+ *\li Each of FILE_READ_DATA and FILE_READ_EA are set with #ISC_FSACCESS_READ.
*
- * o All of FILE_WRITE_DATA, FILE_WRITE_EA and FILE_APPEND_DATA are
- * set with ISC_FSACCESS_WRITE. FILE_WRITE_ATTRIBUTES is not set
+ * \li All of FILE_WRITE_DATA, FILE_WRITE_EA and FILE_APPEND_DATA are
+ * set with #ISC_FSACCESS_WRITE. FILE_WRITE_ATTRIBUTES is not set
* so as to be consistent with Unix, where only the owner of the file
* or the superuser can change the attributes/mode of a file.
*
- * o Both of FILE_ADD_FILE and FILE_ADD_SUBDIRECTORY are set with
- * ISC_FSACCESS_CREATECHILD. This is similar to setting the WRITE
+ * \li Both of FILE_ADD_FILE and FILE_ADD_SUBDIRECTORY are set with
+ * #ISC_FSACCESS_CREATECHILD. This is similar to setting the WRITE
* permission on a Unix directory.
*
- * o SYNCHRONIZE is always set for files and directories, unless someone
+ * \li SYNCHRONIZE is always set for files and directories, unless someone
* can give me a reason why this is a bad idea.
*
- * o READ_CONTROL and FILE_READ_ATTRIBUTES are always set; this is
+ * \li READ_CONTROL and FILE_READ_ATTRIBUTES are always set; this is
* consistent with Unix, where any file or directory can be stat()'d
* unless the directory path disallows complete access somewhere along
* the way.
*
- * o WRITE_DAC is only set for the owner. This too is consistent with
+ * \li WRITE_DAC is only set for the owner. This too is consistent with
* Unix, and is tighter security than allowing anyone else to be
* able to set permissions.
*
- * o DELETE is only set for the owner. On Unix the ability to delete
+ * \li DELETE is only set for the owner. On Unix the ability to delete
* a file is controlled by the directory permissions, but it isn't
* currently clear to me what happens on NT if the directory has
* FILE_DELETE_CHILD set but a file within it does not have DELETE
@@ -72,19 +72,19 @@
* gives maximum flexibility to the owner without exposing the
* file to deletion by others.
*
- * o WRITE_OWNER is never set. This too is consistent with Unix,
+ * \li WRITE_OWNER is never set. This too is consistent with Unix,
* and is also tighter security than allowing anyone to change the
* ownership of the file apart from the superu..ahem, Administrator.
*
- * o Inheritance is set to NO_INHERITANCE.
+ * \li Inheritance is set to NO_INHERITANCE.
*
* Unix's dumbing down includes:
*
- * o The sticky bit cannot be set.
+ * \li The sticky bit cannot be set.
*
- * o setuid and setgid cannot be set.
+ * \li setuid and setgid cannot be set.
*
- * o Only regular files and directories can be set.
+ * \li Only regular files and directories can be set.
*
* The rest of this comment discusses a few of the incompatibilities
* between the two systems that need more thought if this API is to
@@ -103,24 +103,24 @@
* set on a directory. You'd need to coordinate something with file creation
* so that every file created had DELETE set for the owner but noone else.
*
- * On Unix systems, setting ISC_FSACCESS_LISTDIRECTORY sets READ.
- * ... setting either of ISC_FSACCESS_(CREATE|DELETE)CHILD sets WRITE.
- * ... setting ISC_FSACCESS_ACCESSCHILD sets EXECUTE.
+ * On Unix systems, setting #ISC_FSACCESS_LISTDIRECTORY sets READ.
+ * ... setting either of #ISC_FSACCESS_(CREATE|DELETE)CHILD sets WRITE.
+ * ... setting #ISC_FSACCESS_ACCESSCHILD sets EXECUTE.
*
- * On NT systems, setting ISC_FSACCESS_LISTDIRECTORY sets FILE_LIST_DIRECTORY.
+ * On NT systems, setting #ISC_FSACCESS_LISTDIRECTORY sets FILE_LIST_DIRECTORY.
* ... setting ISC_FSACCESS_(CREATE|DELETE)CHILD sets
* FILE_(CREATE|DELETE)_CHILD independently.
- * ... setting ISC_FSACCESS_ACCESSCHILD sets FILE_TRAVERSE.
+ * ... setting #ISC_FSACCESS_ACCESSCHILD sets FILE_TRAVERSE.
*
* Unresolved: XXXDCL
- * What NT access right controls the ability to rename a file?
- * How does DELETE work? If a directory has FILE_DELETE_CHILD but a
+ * \li What NT access right controls the ability to rename a file?
+ * \li How does DELETE work? If a directory has FILE_DELETE_CHILD but a
* file or directory within it does not have DELETE, is that file
* or directory deletable?
- * To implement isc_fsaccess_get(), mapping an existing Unix permission
+ * \li To implement isc_fsaccess_get(), mapping an existing Unix permission
* mode_t back to an isc_fsaccess_t is pretty trivial; however, mapping
* an NT DACL could be impossible to do in a responsible way.
- * Similarly, trying to implement the functionality of being able to
+ * \li Similarly, trying to implement the functionality of being able to
* say "add group writability to whatever permissions already exist"
* could be tricky on NT because of the order-of-entry issue combined
* with possibly having one or more matching ACEs already explicitly
@@ -135,23 +135,23 @@
/*
* Trustees.
*/
-#define ISC_FSACCESS_OWNER 0x1 /* User account. */
-#define ISC_FSACCESS_GROUP 0x2 /* Primary group owner. */
-#define ISC_FSACCESS_OTHER 0x4 /* Not the owner or the group owner. */
-#define ISC_FSACCESS_WORLD 0x7 /* User, Group, Other. */
+#define ISC_FSACCESS_OWNER 0x1 /*%< User account. */
+#define ISC_FSACCESS_GROUP 0x2 /*%< Primary group owner. */
+#define ISC_FSACCESS_OTHER 0x4 /*%< Not the owner or the group owner. */
+#define ISC_FSACCESS_WORLD 0x7 /*%< User, Group, Other. */
/*
* Types of permission.
*/
-#define ISC_FSACCESS_READ 0x00000001 /* File only. */
-#define ISC_FSACCESS_WRITE 0x00000002 /* File only. */
-#define ISC_FSACCESS_EXECUTE 0x00000004 /* File only. */
-#define ISC_FSACCESS_CREATECHILD 0x00000008 /* Dir only. */
-#define ISC_FSACCESS_DELETECHILD 0x00000010 /* Dir only. */
-#define ISC_FSACCESS_LISTDIRECTORY 0x00000020 /* Dir only. */
-#define ISC_FSACCESS_ACCESSCHILD 0x00000040 /* Dir only. */
+#define ISC_FSACCESS_READ 0x00000001 /*%< File only. */
+#define ISC_FSACCESS_WRITE 0x00000002 /*%< File only. */
+#define ISC_FSACCESS_EXECUTE 0x00000004 /*%< File only. */
+#define ISC_FSACCESS_CREATECHILD 0x00000008 /*%< Dir only. */
+#define ISC_FSACCESS_DELETECHILD 0x00000010 /*%< Dir only. */
+#define ISC_FSACCESS_LISTDIRECTORY 0x00000020 /*%< Dir only. */
+#define ISC_FSACCESS_ACCESSCHILD 0x00000040 /*%< Dir only. */
-/*
+/*%
* Adding any permission bits beyond 0x200 would mean typedef'ing
* isc_fsaccess_t as isc_uint64_t, and redefining this value to
* reflect the new range of permission types, Probably to 21 for
diff --git a/contrib/bind9/lib/isc/include/isc/hash.h b/contrib/bind9/lib/isc/include/isc/hash.h
index b94142b..cd29cdf 100644
--- a/contrib/bind9/lib/isc/include/isc/hash.h
+++ b/contrib/bind9/lib/isc/include/isc/hash.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: hash.h,v 1.2.2.1.2.2 2004/03/06 08:14:41 marka Exp $ */
+/* $Id: hash.h,v 1.4.18.2 2005/04/29 00:16:55 marka Exp $ */
#ifndef ISC_HASH_H
#define ISC_HASH_H 1
@@ -24,12 +24,10 @@
***** Module Info
*****/
-/*
- * Hash
- *
- * The hash API
+/*! \file
*
- * Provides an unpredictable hash value for variable length data.
+ * \brief The hash API
+ * provides an unpredictable hash value for variable length data.
* A hash object contains a random vector (which is hidden from clients
* of this API) to make the actual hash value unpredictable.
*
@@ -48,27 +46,27 @@
* it should be typical to have a single context for an entire system.
* To support such cases, the API also provides a single-context mode.
*
- * MP:
+ * \li MP:
* The hash object is almost read-only. Once the internal random vector
* is initialized, no write operation will occur, and there will be no
* need to lock the object to calculate actual hash values.
*
- * Reliability:
+ * \li Reliability:
* In some cases this module uses low-level data copy to initialize the
* random vector. Errors in this part are likely to crash the server or
* corrupt memory.
*
- * Resources:
+ * \li Resources:
* A buffer, used as a random vector for calculating hash values.
*
- * Security:
+ * \li Security:
* This module intends to provide unpredictable hash values in
* adversarial environments in order to avoid denial of service attacks
* to hash buckets.
* Its unpredictability relies on the quality of entropy to build the
* random vector.
*
- * Standards:
+ * \li Standards:
* None.
*/
@@ -88,10 +86,11 @@ isc_hash_ctxcreate(isc_mem_t *mctx, isc_entropy_t *entropy, unsigned int limit,
isc_hash_t **hctx);
isc_result_t
isc_hash_create(isc_mem_t *mctx, isc_entropy_t *entropy, size_t limit);
-/*
- * Create a new hash object.
+/*!<
+ * \brief Create a new hash object.
*
* isc_hash_ctxcreate() creates a different object.
+ *
* isc_hash_create() creates a module-internal object to support the
* single-context mode. It should be called only once.
*
@@ -105,15 +104,16 @@ isc_hash_create(isc_mem_t *mctx, isc_entropy_t *entropy, size_t limit);
void
isc_hash_ctxattach(isc_hash_t *hctx, isc_hash_t **hctxp);
-/*
- * Attach to a hash object.
+/*!<
+ * \brief Attach to a hash object.
+ *
* This function is only necessary for the multiple-context mode.
*/
void
isc_hash_ctxdetach(isc_hash_t **hctxp);
-/*
- * Detach from a hash object.
+/*!<
+ * \brief Detach from a hash object.
*
* This function is for the multiple-context mode, and takes a valid
* hash object as an argument.
@@ -121,19 +121,23 @@ isc_hash_ctxdetach(isc_hash_t **hctxp);
void
isc_hash_destroy(void);
-/*
- * This function is for the single-context mode, and is expected to be used
+/*!<
+ * \brief This function is for the single-context mode, and is expected to be used
* as a counterpart of isc_hash_create().
+ *
* A valid module-internal hash object must have been created, and this
* function should be called only once.
*/
+/*@{*/
void
isc_hash_ctxinit(isc_hash_t *hctx);
void
isc_hash_init(void);
-/*
- * Initialize a hash object. It fills in the random vector with a proper
+/*!<
+ * \brief Initialize a hash object.
+ *
+ * It fills in the random vector with a proper
* source of entropy, which is typically from the entropy object specified
* at the creation. Thus, it is desirable to call these functions after
* initializing the entropy object with some good entropy sources.
@@ -142,26 +146,31 @@ isc_hash_init(void);
*
* isc_hash_ctxinit() is for the multiple-context mode, and takes a valid hash
* object as an argument.
+ *
* isc_hash_init() is for the single-context mode. A valid module-internal
* hash object must have been created, and this function should be called only
* once.
*/
+/*@}*/
+/*@{*/
unsigned int
isc_hash_ctxcalc(isc_hash_t *hctx, const unsigned char *key,
unsigned int keylen, isc_boolean_t case_sensitive);
unsigned int
isc_hash_calc(const unsigned char *key, unsigned int keylen,
isc_boolean_t case_sensitive);
-/*
- * Calculate a hash value.
+/*!<
+ * \brief Calculate a hash value.
*
* isc_hash_ctxinit() is for the multiple-context mode, and takes a valid hash
* object as an argument.
+ *
* isc_hash_init() is for the single-context mode. A valid module-internal
* hash object must have been created.
*
* 'key' is the hash key, which is a variable length buffer.
+ *
* 'keylen' specifies the key length, which must not be larger than the limit
* specified for the corresponding hash object.
*
@@ -169,6 +178,7 @@ isc_hash_calc(const unsigned char *key, unsigned int keylen,
* case_sensitive values. It should typically be ISC_FALSE if the hash key
* is a DNS name.
*/
+/*@}*/
ISC_LANG_ENDDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/heap.h b/contrib/bind9/lib/isc/include/isc/heap.h
index 7c7f3c2..d54a8d5 100644
--- a/contrib/bind9/lib/isc/include/isc/heap.h
+++ b/contrib/bind9/lib/isc/include/isc/heap.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: heap.h,v 1.16.206.2 2006/04/17 18:27:20 explorer Exp $ */
+/* $Id: heap.h,v 1.17.18.3 2006/04/17 18:27:33 explorer Exp $ */
#ifndef ISC_HEAP_H
#define ISC_HEAP_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/hex.h b/contrib/bind9/lib/isc/include/isc/hex.h
index cf7dfd0..9124a9b 100644
--- a/contrib/bind9/lib/isc/include/isc/hex.h
+++ b/contrib/bind9/lib/isc/include/isc/hex.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: hex.h,v 1.4.206.1 2004/03/06 08:14:41 marka Exp $ */
+/* $Id: hex.h,v 1.5.18.2 2005/04/29 00:16:55 marka Exp $ */
#ifndef ISC_HEX_H
#define ISC_HEX_H 1
+/*! \file */
+
#include <isc/lang.h>
#include <isc/types.h>
@@ -32,40 +34,40 @@ ISC_LANG_BEGINDECLS
isc_result_t
isc_hex_totext(isc_region_t *source, int wordlength,
const char *wordbreak, isc_buffer_t *target);
-/*
- * Convert data into hex encoded text.
+/*!<
+ * \brief Convert data into hex encoded text.
*
* Notes:
- * The hex encoded text in 'target' will be divided into
+ *\li The hex encoded text in 'target' will be divided into
* words of at most 'wordlength' characters, separated by
* the 'wordbreak' string. No parentheses will surround
* the text.
*
* Requires:
- * 'source' is a region containing binary data
- * 'target' is a text buffer containing available space
- * 'wordbreak' points to a null-terminated string of
+ *\li 'source' is a region containing binary data
+ *\li 'target' is a text buffer containing available space
+ *\li 'wordbreak' points to a null-terminated string of
* zero or more whitespace characters
*
* Ensures:
- * target will contain the hex encoded version of the data
+ *\li target will contain the hex encoded version of the data
* in source. The 'used' pointer in target will be advanced as
* necessary.
*/
isc_result_t
isc_hex_decodestring(char *cstr, isc_buffer_t *target);
-/*
- * Decode a null-terminated hex string.
+/*!<
+ * \brief Decode a null-terminated hex string.
*
* Requires:
- * 'cstr' is non-null.
- * 'target' is a valid buffer.
+ *\li 'cstr' is non-null.
+ *\li 'target' is a valid buffer.
*
* Returns:
- * ISC_R_SUCCESS -- the entire decoded representation of 'cstring'
+ *\li #ISC_R_SUCCESS -- the entire decoded representation of 'cstring'
* fit in 'target'.
- * ISC_R_BADHEX -- 'cstr' is not a valid hex encoding.
+ *\li #ISC_R_BADHEX -- 'cstr' is not a valid hex encoding.
*
* Other error returns are any possible error code from:
* isc_lex_create(),
@@ -75,16 +77,16 @@ isc_hex_decodestring(char *cstr, isc_buffer_t *target);
isc_result_t
isc_hex_tobuffer(isc_lex_t *lexer, isc_buffer_t *target, int length);
-/*
- * Convert hex encoded text from a lexer context into data.
+/*!<
+ * \brief Convert hex encoded text from a lexer context into data.
*
* Requires:
- * 'lex' is a valid lexer context
- * 'target' is a buffer containing binary data
- * 'length' is an integer
+ *\li 'lex' is a valid lexer context
+ *\li 'target' is a buffer containing binary data
+ *\li 'length' is an integer
*
* Ensures:
- * target will contain the data represented by the hex encoded
+ *\li target will contain the data represented by the hex encoded
* string parsed by the lexer. No more than length bytes will be read,
* if length is positive. The 'used' pointer in target will be
* advanced as necessary.
diff --git a/contrib/bind9/lib/isc/include/isc/hmacmd5.h b/contrib/bind9/lib/isc/include/isc/hmacmd5.h
index 6e8647f..5c05675 100644
--- a/contrib/bind9/lib/isc/include/isc/hmacmd5.h
+++ b/contrib/bind9/lib/isc/include/isc/hmacmd5.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2006 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,11 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: hmacmd5.h,v 1.4.206.1 2004/03/06 08:14:42 marka Exp $ */
+/* $Id: hmacmd5.h,v 1.5.18.4 2006/01/27 23:57:45 marka Exp $ */
-/*
- * This is the header file for the HMAC-MD5 keyed hash algorithm
- * described in RFC 2104.
+/*! \file
+ * \brief This is the header file for the HMAC-MD5 keyed hash algorithm
+ * described in RFC2104.
*/
#ifndef ISC_HMACMD5_H
@@ -55,6 +55,9 @@ isc_hmacmd5_sign(isc_hmacmd5_t *ctx, unsigned char *digest);
isc_boolean_t
isc_hmacmd5_verify(isc_hmacmd5_t *ctx, unsigned char *digest);
+isc_boolean_t
+isc_hmacmd5_verify2(isc_hmacmd5_t *ctx, unsigned char *digest, size_t len);
+
ISC_LANG_ENDDECLS
#endif /* ISC_HMACMD5_H */
diff --git a/contrib/bind9/lib/isc/include/isc/hmacsha.h b/contrib/bind9/lib/isc/include/isc/hmacsha.h
new file mode 100644
index 0000000..fce645c5
--- /dev/null
+++ b/contrib/bind9/lib/isc/include/isc/hmacsha.h
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2005, 2006 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* $Id: hmacsha.h,v 1.2.2.3 2006/08/16 03:18:14 marka Exp $ */
+
+/*
+ * This is the header file for the HMAC-SHA1, HMAC-SHA224, HMAC-SHA256,
+ * HMAC-SHA334 and HMAC-SHA512 hash algorithm described in RFC 2104.
+ */
+
+#ifndef ISC_HMACSHA_H
+#define ISC_HMACSHA_H 1
+
+#include <isc/lang.h>
+#include <isc/sha1.h>
+#include <isc/sha2.h>
+#include <isc/types.h>
+
+#define ISC_HMACSHA1_KEYLENGTH ISC_SHA1_BLOCK_LENGTH
+#define ISC_HMACSHA224_KEYLENGTH ISC_SHA224_BLOCK_LENGTH
+#define ISC_HMACSHA256_KEYLENGTH ISC_SHA256_BLOCK_LENGTH
+#define ISC_HMACSHA384_KEYLENGTH ISC_SHA384_BLOCK_LENGTH
+#define ISC_HMACSHA512_KEYLENGTH ISC_SHA512_BLOCK_LENGTH
+
+typedef struct {
+ isc_sha1_t sha1ctx;
+ unsigned char key[ISC_HMACSHA1_KEYLENGTH];
+} isc_hmacsha1_t;
+
+typedef struct {
+ isc_sha224_t sha224ctx;
+ unsigned char key[ISC_HMACSHA224_KEYLENGTH];
+} isc_hmacsha224_t;
+
+typedef struct {
+ isc_sha256_t sha256ctx;
+ unsigned char key[ISC_HMACSHA256_KEYLENGTH];
+} isc_hmacsha256_t;
+
+typedef struct {
+ isc_sha384_t sha384ctx;
+ unsigned char key[ISC_HMACSHA384_KEYLENGTH];
+} isc_hmacsha384_t;
+
+typedef struct {
+ isc_sha512_t sha512ctx;
+ unsigned char key[ISC_HMACSHA512_KEYLENGTH];
+} isc_hmacsha512_t;
+
+ISC_LANG_BEGINDECLS
+
+void
+isc_hmacsha1_init(isc_hmacsha1_t *ctx, const unsigned char *key,
+ unsigned int len);
+
+void
+isc_hmacsha1_invalidate(isc_hmacsha1_t *ctx);
+
+void
+isc_hmacsha1_update(isc_hmacsha1_t *ctx, const unsigned char *buf,
+ unsigned int len);
+
+void
+isc_hmacsha1_sign(isc_hmacsha1_t *ctx, unsigned char *digest, size_t len);
+
+isc_boolean_t
+isc_hmacsha1_verify(isc_hmacsha1_t *ctx, unsigned char *digest, size_t len);
+
+
+void
+isc_hmacsha224_init(isc_hmacsha224_t *ctx, const unsigned char *key,
+ unsigned int len);
+
+void
+isc_hmacsha224_invalidate(isc_hmacsha224_t *ctx);
+
+void
+isc_hmacsha224_update(isc_hmacsha224_t *ctx, const unsigned char *buf,
+ unsigned int len);
+
+void
+isc_hmacsha224_sign(isc_hmacsha224_t *ctx, unsigned char *digest, size_t len);
+
+isc_boolean_t
+isc_hmacsha224_verify(isc_hmacsha224_t *ctx, unsigned char *digest, size_t len);
+
+
+void
+isc_hmacsha256_init(isc_hmacsha256_t *ctx, const unsigned char *key,
+ unsigned int len);
+
+void
+isc_hmacsha256_invalidate(isc_hmacsha256_t *ctx);
+
+void
+isc_hmacsha256_update(isc_hmacsha256_t *ctx, const unsigned char *buf,
+ unsigned int len);
+
+void
+isc_hmacsha256_sign(isc_hmacsha256_t *ctx, unsigned char *digest, size_t len);
+
+isc_boolean_t
+isc_hmacsha256_verify(isc_hmacsha256_t *ctx, unsigned char *digest, size_t len);
+
+
+void
+isc_hmacsha384_init(isc_hmacsha384_t *ctx, const unsigned char *key,
+ unsigned int len);
+
+void
+isc_hmacsha384_invalidate(isc_hmacsha384_t *ctx);
+
+void
+isc_hmacsha384_update(isc_hmacsha384_t *ctx, const unsigned char *buf,
+ unsigned int len);
+
+void
+isc_hmacsha384_sign(isc_hmacsha384_t *ctx, unsigned char *digest, size_t len);
+
+isc_boolean_t
+isc_hmacsha384_verify(isc_hmacsha384_t *ctx, unsigned char *digest, size_t len);
+
+
+void
+isc_hmacsha512_init(isc_hmacsha512_t *ctx, const unsigned char *key,
+ unsigned int len);
+
+void
+isc_hmacsha512_invalidate(isc_hmacsha512_t *ctx);
+
+void
+isc_hmacsha512_update(isc_hmacsha512_t *ctx, const unsigned char *buf,
+ unsigned int len);
+
+void
+isc_hmacsha512_sign(isc_hmacsha512_t *ctx, unsigned char *digest, size_t len);
+
+isc_boolean_t
+isc_hmacsha512_verify(isc_hmacsha512_t *ctx, unsigned char *digest, size_t len);
+
+ISC_LANG_ENDDECLS
+
+#endif /* ISC_HMACSHA_H */
diff --git a/contrib/bind9/lib/isc/include/isc/interfaceiter.h b/contrib/bind9/lib/isc/include/isc/interfaceiter.h
index 3a9b21b..12ec188 100644
--- a/contrib/bind9/lib/isc/include/isc/interfaceiter.h
+++ b/contrib/bind9/lib/isc/include/isc/interfaceiter.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: interfaceiter.h,v 1.10.206.1 2004/03/06 08:14:42 marka Exp $ */
+/* $Id: interfaceiter.h,v 1.11.18.2 2005/04/29 00:16:55 marka Exp $ */
#ifndef ISC_INTERFACEITER_H
#define ISC_INTERFACEITER_H 1
@@ -24,10 +24,8 @@
***** Module Info
*****/
-/*
- * Interface iterator
- *
- * Iterate over the list of network interfaces.
+/*! \file
+ * \brief Iterates over the list of network interfaces.
*
* Interfaces whose address family is not supported are ignored and never
* returned by the iterator. Interfaces whose netmask, interface flags,
@@ -46,25 +44,26 @@
#include <isc/netaddr.h>
#include <isc/types.h>
-/*
- * Public structure describing a network interface.
+/*!
+ * \brief Public structure describing a network interface.
*/
struct isc_interface {
- char name[32]; /* Interface name, null-terminated. */
- unsigned int af; /* Address family. */
- isc_netaddr_t address; /* Local address. */
- isc_netaddr_t netmask; /* Network mask. */
- isc_netaddr_t dstaddress; /* Destination address
- (point-to-point only). */
- isc_uint32_t flags; /* Flags; see below. */
+ char name[32]; /*%< Interface name, null-terminated. */
+ unsigned int af; /*%< Address family. */
+ isc_netaddr_t address; /*%< Local address. */
+ isc_netaddr_t netmask; /*%< Network mask. */
+ isc_netaddr_t dstaddress; /*%< Destination address (point-to-point only). */
+ isc_uint32_t flags; /*%< Flags; see INTERFACE flags. */
};
-/* Interface flags. */
+/*@{*/
+/*! Interface flags. */
#define INTERFACE_F_UP 0x00000001U
#define INTERFACE_F_POINTTOPOINT 0x00000002U
#define INTERFACE_F_LOOPBACK 0x00000004U
+/*@}*/
/***
*** Functions
@@ -74,59 +73,59 @@ ISC_LANG_BEGINDECLS
isc_result_t
isc_interfaceiter_create(isc_mem_t *mctx, isc_interfaceiter_t **iterp);
-/*
- * Create an iterator for traversing the operating system's list
+/*!<
+ * \brief Create an iterator for traversing the operating system's list
* of network interfaces.
*
* Returns:
- * ISC_R_SUCCESS
- * ISC_R_NOMEMORY
- * Various network-related errors
+ *\li #ISC_R_SUCCESS
+ * \li #ISC_R_NOMEMORY
+ *\li Various network-related errors
*/
isc_result_t
isc_interfaceiter_first(isc_interfaceiter_t *iter);
-/*
- * Position the iterator on the first interface.
+/*!<
+ * \brief Position the iterator on the first interface.
*
* Returns:
- * ISC_R_SUCCESS Success.
- * ISC_R_NOMORE There are no interfaces.
+ *\li #ISC_R_SUCCESS Success.
+ *\li #ISC_R_NOMORE There are no interfaces.
*/
isc_result_t
isc_interfaceiter_current(isc_interfaceiter_t *iter,
isc_interface_t *ifdata);
-/*
- * Get information about the interface the iterator is currently
+/*!<
+ * \brief Get information about the interface the iterator is currently
* positioned at and store it at *ifdata.
*
* Requires:
- * The iterator has been successfully positioned using
+ *\li The iterator has been successfully positioned using
* isc_interface_iter_first() / isc_interface_iter_next().
*
* Returns:
- * ISC_R_SUCCESS Success.
+ *\li #ISC_R_SUCCESS Success.
*/
isc_result_t
isc_interfaceiter_next(isc_interfaceiter_t *iter);
-/*
- * Position the iterator on the next interface.
+/*!<
+ * \brief Position the iterator on the next interface.
*
* Requires:
- * The iterator has been successfully positioned using
+ * \li The iterator has been successfully positioned using
* isc_interface_iter_first() / isc_interface_iter_next().
*
* Returns:
- * ISC_R_SUCCESS Success.
- * ISC_R_NOMORE There are no more interfaces.
+ *\li #ISC_R_SUCCESS Success.
+ *\li #ISC_R_NOMORE There are no more interfaces.
*/
void
isc_interfaceiter_destroy(isc_interfaceiter_t **iterp);
-/*
- * Destroy the iterator.
+/*!<
+ * \brief Destroy the iterator.
*/
ISC_LANG_ENDDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/ipv6.h b/contrib/bind9/lib/isc/include/isc/ipv6.h
index 8b4b0eb..7c88f2b 100644
--- a/contrib/bind9/lib/isc/include/isc/ipv6.h
+++ b/contrib/bind9/lib/isc/include/isc/ipv6.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,12 +15,12 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ipv6.h,v 1.17.12.4 2004/03/09 05:21:09 marka Exp $ */
+/* $Id: ipv6.h,v 1.20.18.2 2005/04/29 00:16:56 marka Exp $ */
#ifndef ISC_IPV6_H
#define ISC_IPV6_H 1
-/*
+/*!
* Also define LWRES_IPV6_H to keep it from being included if liblwres is
* being used, or redefinition errors will occur.
*/
@@ -30,23 +30,23 @@
***** Module Info
*****/
-/*
- * IPv6 definitions for systems which do not support IPv6.
+/*! \file isc/ipv6.h
+ * \brief IPv6 definitions for systems which do not support IPv6.
*
- * MP:
+ * \li MP:
* No impact.
*
- * Reliability:
+ * \li Reliability:
* No anticipated impact.
*
- * Resources:
+ * \li Resources:
* N/A.
*
- * Security:
+ * \li Security:
* No anticipated impact.
*
- * Standards:
- * RFC 2553.
+ * \li Standards:
+ * RFC2553.
*/
/***
@@ -95,7 +95,7 @@ struct sockaddr_in6 {
#define SIN6_LEN 1
#endif
-/*
+/*%
* Unspecified
*/
#define IN6_IS_ADDR_UNSPECIFIED(a) \
@@ -104,7 +104,7 @@ struct sockaddr_in6 {
((a)->s6_addr32[2] == 0) && \
((a)->s6_addr32[3] == 0))
-/*
+/*%
* Loopback
*/
#define IN6_IS_ADDR_LOOPBACK(a) \
@@ -113,7 +113,7 @@ struct sockaddr_in6 {
((a)->s6_addr32[2] == 0) && \
((a)->s6_addr32[3] == htonl(1)))
-/*
+/*%
* IPv4 compatible
*/
#define IN6_IS_ADDR_V4COMPAT(a) \
@@ -123,7 +123,7 @@ struct sockaddr_in6 {
((a)->s6_addr32[3] != 0) && \
((a)->s6_addr32[3] != htonl(1)))
-/*
+/*%
* Mapped
*/
#define IN6_IS_ADDR_V4MAPPED(a) \
@@ -131,13 +131,13 @@ struct sockaddr_in6 {
((a)->s6_addr32[1] == 0) && \
((a)->s6_addr32[2] == htonl(0x0000ffff)))
-/*
+/*%
* Multicast
*/
#define IN6_IS_ADDR_MULTICAST(a) \
((a)->s6_addr8[0] == 0xffU)
-/*
+/*%
* Unicast link / site local.
*/
#define IN6_IS_ADDR_LINKLOCAL(a) \
diff --git a/contrib/bind9/lib/isc/include/isc/lang.h b/contrib/bind9/lib/isc/include/isc/lang.h
index f94f123..abe16f5 100644
--- a/contrib/bind9/lib/isc/include/isc/lang.h
+++ b/contrib/bind9/lib/isc/include/isc/lang.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lang.h,v 1.6.206.1 2004/03/06 08:14:42 marka Exp $ */
+/* $Id: lang.h,v 1.7.18.2 2005/04/29 00:16:56 marka Exp $ */
#ifndef ISC_LANG_H
#define ISC_LANG_H 1
+/*! \file */
+
#ifdef __cplusplus
#define ISC_LANG_BEGINDECLS extern "C" {
#define ISC_LANG_ENDDECLS }
diff --git a/contrib/bind9/lib/isc/include/isc/lex.h b/contrib/bind9/lib/isc/include/isc/lex.h
index 29bdb2f..8c6624a 100644
--- a/contrib/bind9/lib/isc/include/isc/lex.h
+++ b/contrib/bind9/lib/isc/include/isc/lex.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lex.h,v 1.26.2.2.8.3 2004/03/08 09:04:51 marka Exp $ */
+/* $Id: lex.h,v 1.30.18.3 2005/06/04 00:39:05 marka Exp $ */
#ifndef ISC_LEX_H
#define ISC_LEX_H 1
@@ -24,28 +24,26 @@
***** Module Info
*****/
-/*
- * Lex
- *
- * The "lex" module provides a lightweight tokenizer. It can operate
+/*! \file isc/lex.h
+ * \brief The "lex" module provides a lightweight tokenizer. It can operate
* on files or buffers, and can handle "include". It is designed for
* parsing of DNS master files and the BIND configuration file, but
* should be general enough to tokenize other things, e.g. HTTP.
*
- * MP:
+ * \li MP:
* No synchronization is provided. Clients must ensure exclusive
* access.
*
- * Reliability:
+ * \li Reliability:
* No anticipated impact.
*
- * Resources:
- * <TBS>
+ * \li Resources:
+ * TBS
*
- * Security:
+ * \li Security:
* No anticipated impact.
*
- * Standards:
+ * \li Standards:
* None.
*/
@@ -65,31 +63,36 @@ ISC_LANG_BEGINDECLS
*** Options
***/
-/*
+/*@{*/
+/*!
* Various options for isc_lex_gettoken().
*/
-#define ISC_LEXOPT_EOL 0x01 /* Want end-of-line token. */
-#define ISC_LEXOPT_EOF 0x02 /* Want end-of-file token. */
-#define ISC_LEXOPT_INITIALWS 0x04 /* Want initial whitespace. */
-#define ISC_LEXOPT_NUMBER 0x08 /* Recognize numbers. */
-#define ISC_LEXOPT_QSTRING 0x10 /* Recognize qstrings. */
+#define ISC_LEXOPT_EOL 0x01 /*%< Want end-of-line token. */
+#define ISC_LEXOPT_EOF 0x02 /*%< Want end-of-file token. */
+#define ISC_LEXOPT_INITIALWS 0x04 /*%< Want initial whitespace. */
+#define ISC_LEXOPT_NUMBER 0x08 /*%< Recognize numbers. */
+#define ISC_LEXOPT_QSTRING 0x10 /*%< Recognize qstrings. */
+/*@}*/
-/*
+/*@{*/
+/*!
* The ISC_LEXOPT_DNSMULTILINE option handles the processing of '(' and ')' in
* the DNS master file format. If this option is set, then the
* ISC_LEXOPT_INITIALWS and ISC_LEXOPT_EOL options will be ignored when
* the paren count is > 0. To use this option, '(' and ')' must be special
* characters.
*/
-#define ISC_LEXOPT_DNSMULTILINE 0x20 /* Handle '(' and ')'. */
-#define ISC_LEXOPT_NOMORE 0x40 /* Want "no more" token. */
-
-#define ISC_LEXOPT_CNUMBER 0x80 /* Regognise octal and hex */
-#define ISC_LEXOPT_ESCAPE 0x100 /* Recognize escapes. */
-#define ISC_LEXOPT_QSTRINGMULTILINE 0x200 /* Allow multiline "" strings */
-
-/*
+#define ISC_LEXOPT_DNSMULTILINE 0x20 /*%< Handle '(' and ')'. */
+#define ISC_LEXOPT_NOMORE 0x40 /*%< Want "no more" token. */
+
+#define ISC_LEXOPT_CNUMBER 0x80 /*%< Regognize octal and hex. */
+#define ISC_LEXOPT_ESCAPE 0x100 /*%< Recognize escapes. */
+#define ISC_LEXOPT_QSTRINGMULTILINE 0x200 /*%< Allow multiline "" strings */
+#define ISC_LEXOPT_OCTAL 0x400 /*%< Expect a octal number. */
+/*@}*/
+/*@{*/
+/*!
* Various commenting styles, which may be changed at any time with
* isc_lex_setcomments().
*/
@@ -98,12 +101,13 @@ ISC_LANG_BEGINDECLS
#define ISC_LEXCOMMENT_CPLUSPLUS 0x02
#define ISC_LEXCOMMENT_SHELL 0x04
#define ISC_LEXCOMMENT_DNSMASTERFILE 0x08
+/*@}*/
/***
*** Types
***/
-/* Lex */
+/*! Lex */
typedef char isc_lexspecials_t[256];
@@ -140,268 +144,285 @@ typedef struct isc_token {
isc_result_t
isc_lex_create(isc_mem_t *mctx, size_t max_token, isc_lex_t **lexp);
-/*
+/*%<
* Create a lexer.
*
* 'max_token' is a hint of the number of bytes in the largest token.
*
* Requires:
- * '*lexp' is a valid lexer.
+ *\li '*lexp' is a valid lexer.
*
- * max_token > 0.
+ *\li max_token > 0.
*
* Ensures:
- * On success, *lexp is attached to the newly created lexer.
+ *\li On success, *lexp is attached to the newly created lexer.
*
* Returns:
- * ISC_R_SUCCESS
- * ISC_R_NOMEMORY
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_NOMEMORY
*/
void
isc_lex_destroy(isc_lex_t **lexp);
-/*
+/*%<
* Destroy the lexer.
*
* Requires:
- * '*lexp' is a valid lexer.
+ *\li '*lexp' is a valid lexer.
*
* Ensures:
- * *lexp == NULL
+ *\li *lexp == NULL
*/
unsigned int
isc_lex_getcomments(isc_lex_t *lex);
-/*
+/*%<
* Return the current lexer commenting styles.
*
* Requires:
- * 'lex' is a valid lexer.
+ *\li 'lex' is a valid lexer.
*
* Returns:
- * The commenting sytles which are currently allowed.
+ *\li The commenting sytles which are currently allowed.
*/
void
isc_lex_setcomments(isc_lex_t *lex, unsigned int comments);
-/*
+/*%<
* Set allowed lexer commenting styles.
*
* Requires:
- * 'lex' is a valid lexer.
+ *\li 'lex' is a valid lexer.
*
- * 'comments' has meaningful values.
+ *\li 'comments' has meaningful values.
*/
void
isc_lex_getspecials(isc_lex_t *lex, isc_lexspecials_t specials);
-/*
+/*%<
* Put the current list of specials into 'specials'.
*
* Requires:
- * 'lex' is a valid lexer.
+ *\li 'lex' is a valid lexer.
*/
void
isc_lex_setspecials(isc_lex_t *lex, isc_lexspecials_t specials);
-/*
+/*!<
* The characters in 'specials' are returned as tokens. Along with
* whitespace, they delimit strings and numbers.
*
* Note:
- * Comment processing takes precedence over special character
+ *\li Comment processing takes precedence over special character
* recognition.
*
* Requires:
- * 'lex' is a valid lexer.
+ *\li 'lex' is a valid lexer.
*/
isc_result_t
isc_lex_openfile(isc_lex_t *lex, const char *filename);
-/*
+/*%<
* Open 'filename' and make it the current input source for 'lex'.
*
* Requires:
- * 'lex' is a valid lexer.
+ *\li 'lex' is a valid lexer.
*
- * filename is a valid C string.
+ *\li filename is a valid C string.
*
* Returns:
- * ISC_R_SUCCESS
- * ISC_R_NOMEMORY Out of memory
- * ISC_R_NOTFOUND File not found
- * ISC_R_NOPERM No permission to open file
- * ISC_R_FAILURE Couldn't open file, not sure why
- * ISC_R_UNEXPECTED
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_NOMEMORY Out of memory
+ *\li #ISC_R_NOTFOUND File not found
+ *\li #ISC_R_NOPERM No permission to open file
+ *\li #ISC_R_FAILURE Couldn't open file, not sure why
+ *\li #ISC_R_UNEXPECTED
*/
isc_result_t
isc_lex_openstream(isc_lex_t *lex, FILE *stream);
-/*
+/*%<
* Make 'stream' the current input source for 'lex'.
*
* Requires:
- * 'lex' is a valid lexer.
+ *\li 'lex' is a valid lexer.
*
- * 'stream' is a valid C stream.
+ *\li 'stream' is a valid C stream.
*
* Returns:
- * ISC_R_SUCCESS
- * ISC_R_NOMEMORY Out of memory
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_NOMEMORY Out of memory
*/
isc_result_t
isc_lex_openbuffer(isc_lex_t *lex, isc_buffer_t *buffer);
-/*
+/*%<
* Make 'buffer' the current input source for 'lex'.
*
* Requires:
- * 'lex' is a valid lexer.
+ *\li 'lex' is a valid lexer.
*
- * 'buffer' is a valid buffer.
+ *\li 'buffer' is a valid buffer.
*
* Returns:
- * ISC_R_SUCCESS
- * ISC_R_NOMEMORY Out of memory
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_NOMEMORY Out of memory
*/
isc_result_t
isc_lex_close(isc_lex_t *lex);
-/*
+/*%<
* Close the most recently opened object (i.e. file or buffer).
*
* Returns:
- * ISC_R_SUCCESS
- * ISC_R_NOMORE No more input sources
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_NOMORE No more input sources
*/
isc_result_t
isc_lex_gettoken(isc_lex_t *lex, unsigned int options, isc_token_t *tokenp);
-/*
+/*%<
* Get the next token.
*
* Requires:
- * 'lex' is a valid lexer.
+ *\li 'lex' is a valid lexer.
*
- * 'lex' has an input source.
+ *\li 'lex' has an input source.
*
- * 'options' contains valid options.
+ *\li 'options' contains valid options.
*
- * '*tokenp' is a valid pointer.
+ *\li '*tokenp' is a valid pointer.
*
* Returns:
- * ISC_R_SUCCESS
- * ISC_R_UNEXPECTEDEND
- * ISC_R_NOMEMORY
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_UNEXPECTEDEND
+ *\li #ISC_R_NOMEMORY
*
* These two results are returned only if their corresponding lexer
* options are not set.
*
- * ISC_R_EOF End of input source
- * ISC_R_NOMORE No more input sources
+ *\li #ISC_R_EOF End of input source
+ *\li #ISC_R_NOMORE No more input sources
*/
isc_result_t
isc_lex_getmastertoken(isc_lex_t *lex, isc_token_t *token,
isc_tokentype_t expect, isc_boolean_t eol);
-/*
+/*%<
* Get the next token from a DNS master file type stream. This is a
* convenience function that sets appropriate options and handles quoted
* strings and end of line correctly for master files. It also ungets
* unexpected tokens.
*
* Requires:
- * 'lex' is a valid lexer.
+ *\li 'lex' is a valid lexer.
*
- * 'token' is a valid pointer
+ *\li 'token' is a valid pointer
*
* Returns:
*
- * any return code from isc_lex_gettoken.
+ * \li any return code from isc_lex_gettoken().
+ */
+
+isc_result_t
+isc_lex_getoctaltoken(isc_lex_t *lex, isc_token_t *token, isc_boolean_t eol);
+/*%<
+ * Get the next token from a DNS master file type stream. This is a
+ * convenience function that sets appropriate options and handles end
+ * of line correctly for master files. It also ungets unexpected tokens.
+ *
+ * Requires:
+ *\li 'lex' is a valid lexer.
+ *
+ *\li 'token' is a valid pointer
+ *
+ * Returns:
+ *
+ * \li any return code from isc_lex_gettoken().
*/
void
isc_lex_ungettoken(isc_lex_t *lex, isc_token_t *tokenp);
-/*
+/*%<
* Unget the current token.
*
* Requires:
- * 'lex' is a valid lexer.
+ *\li 'lex' is a valid lexer.
*
- * 'lex' has an input source.
+ *\li 'lex' has an input source.
*
- * 'tokenp' points to a valid token.
+ *\li 'tokenp' points to a valid token.
*
- * There is no ungotten token already.
+ *\li There is no ungotten token already.
*/
void
isc_lex_getlasttokentext(isc_lex_t *lex, isc_token_t *tokenp, isc_region_t *r);
-/*
+/*%<
* Returns a region containing the text of the last token returned.
*
* Requires:
- * 'lex' is a valid lexer.
+ *\li 'lex' is a valid lexer.
*
- * 'lex' has an input source.
+ *\li 'lex' has an input source.
*
- * 'tokenp' points to a valid token.
+ *\li 'tokenp' points to a valid token.
*
- * A token has been gotten and not ungotten.
+ *\li A token has been gotten and not ungotten.
*/
char *
isc_lex_getsourcename(isc_lex_t *lex);
-/*
+/*%<
* Return the input source name.
*
* Requires:
- * 'lex' is a valid lexer.
+ *\li 'lex' is a valid lexer.
*
* Returns:
- * source name or NULL if no current source.
- * result valid while current input source exists.
+ * \li source name or NULL if no current source.
+ *\li result valid while current input source exists.
*/
unsigned long
isc_lex_getsourceline(isc_lex_t *lex);
-/*
+/*%<
* Return the input source line number.
*
* Requires:
- * 'lex' is a valid lexer.
+ *\li 'lex' is a valid lexer.
*
* Returns:
- * Current line number or 0 if no current source.
+ *\li Current line number or 0 if no current source.
*/
isc_result_t
isc_lex_setsourcename(isc_lex_t *lex, const char *name);
-/*
+/*%<
* Assigns a new name to the input source.
*
* Requires:
*
- * 'lex' is a valid lexer.
+ * \li 'lex' is a valid lexer.
*
* Returns:
- * ISC_R_SUCCESS
- * ISC_R_NOMEMORY
- * ISC_R_NOTFOUND - there are no sources.
+ * \li #ISC_R_SUCCESS
+ * \li #ISC_R_NOMEMORY
+ * \li #ISC_R_NOTFOUND - there are no sources.
*/
isc_boolean_t
isc_lex_isfile(isc_lex_t *lex);
-/*
+/*%<
* Return whether the current input source is a file.
*
* Requires:
- * 'lex' is a valid lexer.
+ *\li 'lex' is a valid lexer.
*
* Returns:
- * ISC_TRUE if the current input is a file,
- * ISC_FALSE otherwise.
+ * \li #ISC_TRUE if the current input is a file,
+ *\li #ISC_FALSE otherwise.
*/
diff --git a/contrib/bind9/lib/isc/include/isc/lfsr.h b/contrib/bind9/lib/isc/include/isc/lfsr.h
index e562380..0c2e845 100644
--- a/contrib/bind9/lib/isc/include/isc/lfsr.h
+++ b/contrib/bind9/lib/isc/include/isc/lfsr.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,17 +15,19 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lfsr.h,v 1.10.206.1 2004/03/06 08:14:43 marka Exp $ */
+/* $Id: lfsr.h,v 1.11.18.2 2005/04/29 00:16:56 marka Exp $ */
#ifndef ISC_LFSR_H
#define ISC_LFSR_H 1
+/*! \file */
+
#include <isc/lang.h>
#include <isc/types.h>
typedef struct isc_lfsr isc_lfsr_t;
-/*
+/*%
* This function is called when reseeding is needed. It is allowed to
* modify any state in the LFSR in any way it sees fit OTHER THAN "bits".
*
@@ -36,96 +38,91 @@ typedef struct isc_lfsr isc_lfsr_t;
*/
typedef void (*isc_lfsrreseed_t)(isc_lfsr_t *, void *);
-/*
+/*%
* The members of this structure can be used by the application, but care
* needs to be taken to not change state once the lfsr is in operation.
*/
struct isc_lfsr {
- isc_uint32_t state; /* previous state */
- unsigned int bits; /* length */
- isc_uint32_t tap; /* bit taps */
- unsigned int count; /* reseed count (in BITS!) */
- isc_lfsrreseed_t reseed; /* reseed function */
- void *arg; /* reseed function argument */
+ isc_uint32_t state; /*%< previous state */
+ unsigned int bits; /*%< length */
+ isc_uint32_t tap; /*%< bit taps */
+ unsigned int count; /*%< reseed count (in BITS!) */
+ isc_lfsrreseed_t reseed; /*%< reseed function */
+ void *arg; /*%< reseed function argument */
};
ISC_LANG_BEGINDECLS
-/*
- * In all these functions it is important that the caller only use as many
- * bits as the LFSR has state. Also, it isn't guaranteed that an LFSR of
- * bit length 32 will have 2^32 unique states before repeating.
- */
void
isc_lfsr_init(isc_lfsr_t *lfsr, isc_uint32_t state, unsigned int bits,
isc_uint32_t tap, unsigned int count,
isc_lfsrreseed_t reseed, void *arg);
-/*
+/*%<
* Initialize an LFSR.
*
* Note:
*
- * Putting untrusted values into this function will cause the LFSR to
+ *\li Putting untrusted values into this function will cause the LFSR to
* generate (perhaps) non-maximal length sequences.
*
* Requires:
*
- * lfsr != NULL
+ *\li lfsr != NULL
*
- * 8 <= bits <= 32
+ *\li 8 <= bits <= 32
*
- * tap != 0
+ *\li tap != 0
*/
void
isc_lfsr_generate(isc_lfsr_t *lfsr, void *data, unsigned int count);
-/*
+/*%<
* Returns "count" bytes of data from the LFSR.
*
* Requires:
*
- * lfsr be valid.
+ *\li lfsr be valid.
*
- * data != NULL.
+ *\li data != NULL.
*
- * count > 0.
+ *\li count > 0.
*/
void
isc_lfsr_skip(isc_lfsr_t *lfsr, unsigned int skip);
-/*
+/*%<
* Skip "skip" states.
*
* Requires:
*
- * lfsr be valid.
+ *\li lfsr be valid.
*/
isc_uint32_t
isc_lfsr_generate32(isc_lfsr_t *lfsr1, isc_lfsr_t *lfsr2);
-/*
+/*%<
* Given two LFSRs, use the current state from each to skip entries in the
* other. The next states are then xor'd together and returned.
*
* WARNING:
*
- * This function is used only for very, very low security data, such
+ *\li This function is used only for very, very low security data, such
* as DNS message IDs where it is desired to have an unpredictable
* stream of bytes that are harder to predict than a simple flooding
* attack.
*
* Notes:
*
- * Since the current state from each of the LFSRs is used to skip
+ *\li Since the current state from each of the LFSRs is used to skip
* state in the other, it is important that no state be leaked
* from either LFSR.
*
* Requires:
*
- * lfsr1 and lfsr2 be valid.
+ *\li lfsr1 and lfsr2 be valid.
*
- * 1 <= skipbits <= 31
+ *\li 1 <= skipbits <= 31
*/
ISC_LANG_ENDDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/lib.h b/contrib/bind9/lib/isc/include/isc/lib.h
index 1ad4493..45c547c 100644
--- a/contrib/bind9/lib/isc/include/isc/lib.h
+++ b/contrib/bind9/lib/isc/include/isc/lib.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lib.h,v 1.6.12.3 2004/03/08 09:04:51 marka Exp $ */
+/* $Id: lib.h,v 1.8.18.2 2005/04/29 00:16:58 marka Exp $ */
#ifndef ISC_LIB_H
#define ISC_LIB_H 1
+/*! \file */
+
#include <isc/types.h>
#include <isc/lang.h>
@@ -29,8 +31,8 @@ LIBISC_EXTERNAL_DATA extern isc_msgcat_t *isc_msgcat;
void
isc_lib_initmsgcat(void);
-/*
- * Initialize the ISC library's message catalog, isc_msgcat, if it
+/*!<
+ * \brief Initialize the ISC library's message catalog, isc_msgcat, if it
* has not already been initialized.
*/
diff --git a/contrib/bind9/lib/isc/include/isc/list.h b/contrib/bind9/lib/isc/include/isc/list.h
index 5fe82e3..2adc33f 100644
--- a/contrib/bind9/lib/isc/include/isc/list.h
+++ b/contrib/bind9/lib/isc/include/isc/list.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: list.h,v 1.18.2.2.8.3 2006/06/06 00:11:40 marka Exp $ */
+/* $Id: list.h,v 1.20.18.2 2006/06/06 00:11:41 marka Exp $ */
#ifndef ISC_LIST_H
#define ISC_LIST_H 1
diff --git a/contrib/bind9/lib/isc/include/isc/log.h b/contrib/bind9/lib/isc/include/isc/log.h
index 97aeba0..c381775 100644
--- a/contrib/bind9/lib/isc/include/isc/log.h
+++ b/contrib/bind9/lib/isc/include/isc/log.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: log.h,v 1.39.2.4.2.7 2004/04/10 04:31:40 marka Exp $ */
+/* $Id: log.h,v 1.47.18.3 2005/04/29 00:16:58 marka Exp $ */
#ifndef ISC_LOG_H
#define ISC_LOG_H 1
+/*! \file */
+
#include <stdio.h>
#include <stdarg.h>
#include <syslog.h> /* XXXDCL NT */
@@ -29,29 +31,36 @@
#include <isc/platform.h>
#include <isc/types.h>
-/*
- * Severity levels, patterned after Unix's syslog levels.
+/*@{*/
+/*!
+ * \brief Severity levels, patterned after Unix's syslog levels.
*
- * ISC_LOG_DYNAMIC can only be used for defining channels with
- * isc_log_createchannel(), not to specify a level in isc_log_write().
*/
#define ISC_LOG_DEBUG(level) (level)
+/*!
+ * #ISC_LOG_DYNAMIC can only be used for defining channels with
+ * isc_log_createchannel(), not to specify a level in isc_log_write().
+ */
#define ISC_LOG_DYNAMIC 0
#define ISC_LOG_INFO (-1)
#define ISC_LOG_NOTICE (-2)
#define ISC_LOG_WARNING (-3)
#define ISC_LOG_ERROR (-4)
#define ISC_LOG_CRITICAL (-5)
+/*@}*/
-/*
- * Destinations.
+/*@{*/
+/*!
+ * \brief Destinations.
*/
#define ISC_LOG_TONULL 1
#define ISC_LOG_TOSYSLOG 2
#define ISC_LOG_TOFILE 3
#define ISC_LOG_TOFILEDESC 4
+/*@}*/
-/*
+/*@{*/
+/*%
* Channel flags.
*/
#define ISC_LOG_PRINTTIME 0x0001
@@ -62,18 +71,24 @@
#define ISC_LOG_PRINTALL 0x001F
#define ISC_LOG_DEBUGONLY 0x1000
#define ISC_LOG_OPENERR 0x8000 /* internal */
+/*@}*/
-/*
- * Other options.
+/*@{*/
+/*!
+ * \brief Other options.
+ *
* XXXDCL INFINITE doesn't yet work. Arguably it isn't needed, but
* since I am intend to make large number of versions work efficiently,
* INFINITE is going to be trivial to add to that.
*/
#define ISC_LOG_ROLLINFINITE (-1)
#define ISC_LOG_ROLLNEVER (-2)
+/*@}*/
-/*
- * Used to name the categories used by a library. An array of isc_logcategory
+/*!
+ * \brief Used to name the categories used by a library.
+ *
+ * An array of isc_logcategory
* structures names each category, and the id value is initialized by calling
* isc_log_registercategories.
*/
@@ -82,28 +97,30 @@ struct isc_logcategory {
unsigned int id;
};
-/*
- * Similar to isc_logcategory above, but for all the modules a library defines.
+/*%
+ * Similar to isc_logcategory, but for all the modules a library defines.
*/
struct isc_logmodule {
const char *name;
unsigned int id;
};
-/*
+/*%
* The isc_logfile structure is initialized as part of an isc_logdestination
- * before calling isc_log_createchannel(). When defining an ISC_LOG_TOFILE
+ * before calling isc_log_createchannel().
+ *
+ * When defining an #ISC_LOG_TOFILE
* channel the name, versions and maximum_size should be set before calling
- * isc_log_createchannel(). To define an ISC_LOG_TOFILEDESC channel set only
+ * isc_log_createchannel(). To define an #ISC_LOG_TOFILEDESC channel set only
* the stream before the call.
*
* Setting maximum_size to zero implies no maximum.
*/
typedef struct isc_logfile {
- FILE *stream; /* Initialized to NULL for ISC_LOG_TOFILE. */
- const char *name; /* NULL for ISC_LOG_TOFILEDESC. */
- int versions; /* >= 0, ISC_LOG_ROLLNEVER, ISC_LOG_ROLLINFINITE. */
- /*
+ FILE *stream; /*%< Initialized to NULL for #ISC_LOG_TOFILE. */
+ const char *name; /*%< NULL for #ISC_LOG_TOFILEDESC. */
+ int versions; /* >= 0, #ISC_LOG_ROLLNEVER, #ISC_LOG_ROLLINFINITE. */
+ /*%
* stdio's ftell is standardized to return a long, which may well not
* be big enough for the largest file supportable by the operating
* system (though it is _probably_ big enough for the largest log
@@ -111,10 +128,10 @@ typedef struct isc_logfile {
* to a size large enough for the largest possible file on a system.
*/
isc_offset_t maximum_size;
- isc_boolean_t maximum_reached; /* Private. */
+ isc_boolean_t maximum_reached; /*%< Private. */
} isc_logfile_t;
-/*
+/*%
* Passed to isc_log_createchannel to define the attributes of either
* a stdio or a syslog log.
*/
@@ -123,7 +140,8 @@ typedef union isc_logdestination {
int facility; /* XXXDCL NT */
} isc_logdestination_t;
-/*
+/*@{*/
+/*%
* The built-in categories of libisc.
*
* Each library registering categories should provide library_LOGCATEGORY_name
@@ -133,13 +151,16 @@ typedef union isc_logdestination {
LIBISC_EXTERNAL_DATA extern isc_logcategory_t isc_categories[];
LIBISC_EXTERNAL_DATA extern isc_log_t *isc_lctx;
LIBISC_EXTERNAL_DATA extern isc_logmodule_t isc_modules[];
+/*@}*/
-/*
+/*@{*/
+/*%
* Do not log directly to DEFAULT. Use another category. When in doubt,
* use GENERAL.
*/
#define ISC_LOGCATEGORY_DEFAULT (&isc_categories[0])
#define ISC_LOGCATEGORY_GENERAL (&isc_categories[1])
+/*@}*/
#define ISC_LOGMODULE_SOCKET (&isc_modules[0])
#define ISC_LOGMODULE_TIME (&isc_modules[1])
@@ -150,33 +171,33 @@ ISC_LANG_BEGINDECLS
isc_result_t
isc_log_create(isc_mem_t *mctx, isc_log_t **lctxp, isc_logconfig_t **lcfgp);
-/*
+/*%<
* Establish a new logging context, with default channels.
*
* Notes:
- * isc_log_create calls isc_logconfig_create, so see its comment
+ *\li isc_log_create() calls isc_logconfig_create(), so see its comment
* below for more information.
*
* Requires:
- * mctx is a valid memory context.
- * lctxp is not null and *lctxp is null.
- * lcfgp is null or lcfgp is not null and *lcfgp is null.
+ *\li mctx is a valid memory context.
+ *\li lctxp is not null and *lctxp is null.
+ *\li lcfgp is null or lcfgp is not null and *lcfgp is null.
*
* Ensures:
- * *lctxp will point to a valid logging context if all of the necessary
+ *\li *lctxp will point to a valid logging context if all of the necessary
* memory was allocated, or NULL otherwise.
- * *lcfgp will point to a valid logging configuration if all of the
+ *\li *lcfgp will point to a valid logging configuration if all of the
* necessary memory was allocated, or NULL otherwise.
- * On failure, no additional memory is allocated.
+ *\li On failure, no additional memory is allocated.
*
* Returns:
- * ISC_R_SUCCESS Success
- * ISC_R_NOMEMORY Resource limit: Out of memory
+ *\li #ISC_R_SUCCESS Success
+ *\li #ISC_R_NOMEMORY Resource limit: Out of memory
*/
isc_result_t
isc_logconfig_create(isc_log_t *lctx, isc_logconfig_t **lcfgp);
-/*
+/*%<
* Create the data structure that holds all of the configurable information
* about where messages are actually supposed to be sent -- the information
* that could changed based on some configuration file, as opposed to the
@@ -184,190 +205,192 @@ isc_logconfig_create(isc_log_t *lctx, isc_logconfig_t **lcfgp);
* into a program, or the debug_level which is dynamic state information.
*
* Notes:
- * It is necessary to specify the logging context the configuration
+ *\li It is necessary to specify the logging context the configuration
* will be used with because the number of categories and modules
* needs to be known in order to set the configuration. However,
* the configuration is not used by the logging context until the
* isc_logconfig_use function is called.
*
- * The memory context used for operations that allocate memory for
+ *\li The memory context used for operations that allocate memory for
* the configuration is that of the logging context, as specified
* in the isc_log_create call.
*
- * Four default channels are established:
+ *\li Four default channels are established:
+ *\verbatim
* default_syslog
- * - log to syslog's daemon facility ISC_LOG_INFO or higher
+ * - log to syslog's daemon facility #ISC_LOG_INFO or higher
* default_stderr
- * - log to stderr ISC_LOG_INFO or higher
+ * - log to stderr #ISC_LOG_INFO or higher
* default_debug
- * - log to stderr ISC_LOG_DEBUG dynamically
+ * - log to stderr #ISC_LOG_DEBUG dynamically
* null
* - log nothing
+ *\endverbatim
*
* Requires:
- * lctx is a valid logging context.
- * lcftp is not null and *lcfgp is null.
+ *\li lctx is a valid logging context.
+ *\li lcftp is not null and *lcfgp is null.
*
* Ensures:
- * *lcfgp will point to a valid logging context if all of the necessary
+ *\li *lcfgp will point to a valid logging context if all of the necessary
* memory was allocated, or NULL otherwise.
- * On failure, no additional memory is allocated.
+ *\li On failure, no additional memory is allocated.
*
* Returns:
- * ISC_R_SUCCESS Success
- * ISC_R_NOMEMORY Resource limit: Out of memory
+ *\li #ISC_R_SUCCESS Success
+ *\li #ISC_R_NOMEMORY Resource limit: Out of memory
*/
isc_logconfig_t *
isc_logconfig_get(isc_log_t *lctx);
-/*
+/*%<
* Returns a pointer to the configuration currently in use by the log context.
*
* Requires:
- * lctx is a valid context.
+ *\li lctx is a valid context.
*
* Ensures:
- * The configuration pointer is non-null.
+ *\li The configuration pointer is non-null.
*
* Returns:
- * The configuration pointer.
+ *\li The configuration pointer.
*/
isc_result_t
isc_logconfig_use(isc_log_t *lctx, isc_logconfig_t *lcfg);
-/*
+/*%<
* Associate a new configuration with a logging context.
*
* Notes:
- * This is thread safe. The logging context will lock a mutex
+ *\li This is thread safe. The logging context will lock a mutex
* before attempting to swap in the new configuration, and isc_log_doit
* (the internal function used by all of isc_log_[v]write[1]) locks
* the same lock for the duration of its use of the configuration.
*
* Requires:
- * lctx is a valid logging context.
- * lcfg is a valid logging configuration.
- * lctx is the same configuration given to isc_logconfig_create
+ *\li lctx is a valid logging context.
+ *\li lcfg is a valid logging configuration.
+ *\li lctx is the same configuration given to isc_logconfig_create
* when the configuration was created.
*
* Ensures:
- * Future calls to isc_log_write will use the new configuration.
+ *\li Future calls to isc_log_write will use the new configuration.
*
* Returns:
- * ISC_R_SUCCESS Success
- * ISC_R_NOMEMORY Resource limit: Out of memory
+ *\li #ISC_R_SUCCESS Success
+ *\li #ISC_R_NOMEMORY Resource limit: Out of memory
*/
void
isc_log_destroy(isc_log_t **lctxp);
-/*
+/*%<
* Deallocate the memory associated with a logging context.
*
* Requires:
- * *lctx is a valid logging context.
+ *\li *lctx is a valid logging context.
*
* Ensures:
- * All of the memory associated with the logging context is returned
+ *\li All of the memory associated with the logging context is returned
* to the free memory pool.
*
- * Any open files are closed.
+ *\li Any open files are closed.
*
- * The logging context is marked as invalid.
+ *\li The logging context is marked as invalid.
*/
void
isc_logconfig_destroy(isc_logconfig_t **lcfgp);
-/*
+/*%<
* Destroy a logging configuration.
*
* Notes:
- * This function cannot be used directly with the return value of
+ *\li This function cannot be used directly with the return value of
* isc_logconfig_get, because a logging context must always have
* a valid configuration associated with it.
*
* Requires:
- * lcfgp is not null and *lcfgp is a valid logging configuration.
- * The logging configuration is not in use by an existing logging context.
+ *\li lcfgp is not null and *lcfgp is a valid logging configuration.
+ *\li The logging configuration is not in use by an existing logging context.
*
* Ensures:
- * All memory allocated for the configuration is freed.
+ *\li All memory allocated for the configuration is freed.
*
- * The configuration is marked as invalid.
+ *\li The configuration is marked as invalid.
*/
void
isc_log_registercategories(isc_log_t *lctx, isc_logcategory_t categories[]);
-/*
+/*%<
* Identify logging categories a library will use.
*
* Notes:
- * A category should only be registered once, but no mechanism enforces
+ *\li A category should only be registered once, but no mechanism enforces
* this rule.
*
- * The end of the categories array is identified by a NULL name.
+ *\li The end of the categories array is identified by a NULL name.
*
- * Because the name is used by ISC_LOG_PRINTCATEGORY, it should not
+ *\li Because the name is used by #ISC_LOG_PRINTCATEGORY, it should not
* be altered or destroyed after isc_log_registercategories().
*
- * Because each element of the categories array is used by
+ *\li Because each element of the categories array is used by
* isc_log_categorybyname, it should not be altered or destroyed
* after registration.
*
- * The value of the id integer in each structure is overwritten
+ *\li The value of the id integer in each structure is overwritten
* by this function, and so id need not be initialized to any particular
* value prior to the function call.
*
- * A subsequent call to isc_log_registercategories with the same
+ *\li A subsequent call to isc_log_registercategories with the same
* logging context (but new categories) will cause the last
* element of the categories array from the prior call to have
* its "name" member changed from NULL to point to the new
* categories array, and its "id" member set to UINT_MAX.
*
* Requires:
- * lctx is a valid logging context.
- * categories != NULL.
- * categories[0].name != NULL.
+ *\li lctx is a valid logging context.
+ *\li categories != NULL.
+ *\li categories[0].name != NULL.
*
* Ensures:
- * There are references to each category in the logging context,
+ * \li There are references to each category in the logging context,
* so they can be used with isc_log_usechannel() and isc_log_write().
*/
void
isc_log_registermodules(isc_log_t *lctx, isc_logmodule_t modules[]);
-/*
+/*%<
* Identify logging categories a library will use.
*
* Notes:
- * A module should only be registered once, but no mechanism enforces
+ *\li A module should only be registered once, but no mechanism enforces
* this rule.
*
- * The end of the modules array is identified by a NULL name.
+ *\li The end of the modules array is identified by a NULL name.
*
- * Because the name is used by ISC_LOG_PRINTMODULE, it should not
+ *\li Because the name is used by #ISC_LOG_PRINTMODULE, it should not
* be altered or destroyed after isc_log_registermodules().
*
- * Because each element of the modules array is used by
+ *\li Because each element of the modules array is used by
* isc_log_modulebyname, it should not be altered or destroyed
* after registration.
*
- * The value of the id integer in each structure is overwritten
+ *\li The value of the id integer in each structure is overwritten
* by this function, and so id need not be initialized to any particular
* value prior to the function call.
*
- * A subsequent call to isc_log_registermodules with the same
+ *\li A subsequent call to isc_log_registermodules with the same
* logging context (but new modules) will cause the last
* element of the modules array from the prior call to have
* its "name" member changed from NULL to point to the new
* modules array, and its "id" member set to UINT_MAX.
*
* Requires:
- * lctx is a valid logging context.
- * modules != NULL.
- * modules[0].name != NULL;
+ *\li lctx is a valid logging context.
+ *\li modules != NULL.
+ *\li modules[0].name != NULL;
*
* Ensures:
- * Each module has a reference in the logging context, so they can be
+ *\li Each module has a reference in the logging context, so they can be
* used with isc_log_usechannel() and isc_log_write().
*/
@@ -376,68 +399,67 @@ isc_log_createchannel(isc_logconfig_t *lcfg, const char *name,
unsigned int type, int level,
const isc_logdestination_t *destination,
unsigned int flags);
-/*
+/*%<
* Specify the parameters of a logging channel.
*
* Notes:
- * The name argument is copied to memory in the logging context, so
+ *\li The name argument is copied to memory in the logging context, so
* it can be altered or destroyed after isc_log_createchannel().
*
- * Defining a very large number of channels will have a performance
+ *\li Defining a very large number of channels will have a performance
* impact on isc_log_usechannel(), since the names are searched
* linearly until a match is made. This same issue does not affect
* isc_log_write, however.
*
- * Channel names can be redefined; this is primarily useful for programs
+ *\li Channel names can be redefined; this is primarily useful for programs
* that want their own definition of default_syslog, default_debug
* and default_stderr.
*
- * Any channel that is redefined will not affect logging that was
+ *\li Any channel that is redefined will not affect logging that was
* already directed to its original definition, _except_ for the
* default_stderr channel. This case is handled specially so that
* the default logging category can be changed by redefining
* default_stderr. (XXXDCL Though now that I think of it, the default
* logging category can be changed with only one additional function
* call by defining a new channel and then calling isc_log_usechannel()
- * for ISC_LOGCATEGORY_DEFAULT.)
+ * for #ISC_LOGCATEGORY_DEFAULT.)
*
- * Specifying ISC_LOG_PRINTTIME or ISC_LOG_PRINTTAG for syslog is allowed,
+ *\li Specifying #ISC_LOG_PRINTTIME or #ISC_LOG_PRINTTAG for syslog is allowed,
* but probably not what you wanted to do.
*
- * ISC_LOG_DEBUGONLY will mark the channel as usable only when the
+ * #ISC_LOG_DEBUGONLY will mark the channel as usable only when the
* debug level of the logging context (see isc_log_setdebuglevel)
* is non-zero.
*
* Requires:
- * lcfg is a valid logging configuration.
+ *\li lcfg is a valid logging configuration.
*
- * name is not NULL.
+ *\li name is not NULL.
*
- * type is ISC_LOG_TOSYSLOG, ISC_LOG_TOFILE, ISC_LOG_TOFILEDESC or
- * ISC_LOG_TONULL.
+ *\li type is #ISC_LOG_TOSYSLOG, #ISC_LOG_TOFILE, #ISC_LOG_TOFILEDESC or
+ * #ISC_LOG_TONULL.
*
- * destination is not NULL unless type is ISC_LOG_TONULL.
+ *\li destination is not NULL unless type is #ISC_LOG_TONULL.
*
- * level is >= ISC_LOG_CRITICAL (the most negative logging level).
+ *\li level is >= #ISC_LOG_CRITICAL (the most negative logging level).
*
- * flags does not include any bits aside from the ISC_LOG_PRINT* bits
- * or ISC_LOG_DEBUGONLY.
+ *\li flags does not include any bits aside from the ISC_LOG_PRINT* bits
+ * or #ISC_LOG_DEBUGONLY.
*
* Ensures:
- * ISC_R_SUCCESS
+ *\li #ISC_R_SUCCESS
* A channel with the given name is usable with
* isc_log_usechannel().
*
- * ISC_R_NOMEMORY or ISC_R_UNEXPECTED
+ *\li #ISC_R_NOMEMORY or #ISC_R_UNEXPECTED
* No additional memory is being used by the logging context.
- *
* Any channel that previously existed with the given name
* is not redefined.
*
* Returns:
- * ISC_R_SUCCESS Success
- * ISC_R_NOMEMORY Resource limit: Out of memory
- * ISC_R_UNEXPECTED type was out of range and REQUIRE()
+ *\li #ISC_R_SUCCESS Success
+ *\li #ISC_R_NOMEMORY Resource limit: Out of memory
+ *\li #ISC_R_UNEXPECTED type was out of range and REQUIRE()
* was disabled.
*/
@@ -445,166 +467,186 @@ isc_result_t
isc_log_usechannel(isc_logconfig_t *lcfg, const char *name,
const isc_logcategory_t *category,
const isc_logmodule_t *module);
-/*
+/*%<
* Associate a named logging channel with a category and module that
* will use it.
*
* Notes:
- * The name is searched for linearly in the set of known channel names
+ *\li The name is searched for linearly in the set of known channel names
* until a match is found. (Note the performance impact of a very large
* number of named channels.) When multiple channels of the same
* name are defined, the most recent definition is found.
*
- * Specifing a very large number of channels for a category will have
+ *\li Specifing a very large number of channels for a category will have
* a moderate impact on performance in isc_log_write(), as each
* call looks up the category for the start of a linked list, which
* it follows all the way to the end to find matching modules. The
* test for matching modules is integral, though.
*
- * If category is NULL, then the channel is associated with the indicated
+ *\li If category is NULL, then the channel is associated with the indicated
* module for all known categories (including the "default" category).
*
- * If module is NULL, then the channel is associated with every module
+ *\li If module is NULL, then the channel is associated with every module
* that uses that category.
*
- * Passing both category and module as NULL would make every log message
+ *\li Passing both category and module as NULL would make every log message
* use the indicated channel.
*
- * Specifying a channel that is ISC_LOG_TONULL for a category/module pair
+ * \li Specifying a channel that is #ISC_LOG_TONULL for a category/module pair
* has no effect on any other channels associated with that pair,
* regardless of ordering. Thus you cannot use it to "mask out" one
* category/module pair when you have specified some other channel that
* is also used by that category/module pair.
*
* Requires:
- * lcfg is a valid logging configuration.
+ *\li lcfg is a valid logging configuration.
*
- * category is NULL or has an id that is in the range of known ids.
+ *\li category is NULL or has an id that is in the range of known ids.
*
* module is NULL or has an id that is in the range of known ids.
*
* Ensures:
- * ISC_R_SUCCESS
+ *\li #ISC_R_SUCCESS
* The channel will be used by the indicated category/module
* arguments.
*
- * ISC_R_NOMEMORY
+ *\li #ISC_R_NOMEMORY
* If assignment for a specific category has been requested,
* the channel has not been associated with the indicated
* category/module arguments and no additional memory is
* used by the logging context.
- *
* If assignment for all categories has been requested
* then _some_ may have succeeded (starting with category
* "default" and progressing through the order of categories
- * passed to isc_log_registercategories) and additional memory
+ * passed to isc_log_registercategories()) and additional memory
* is being used by whatever assignments succeeded.
*
* Returns:
- * ISC_R_SUCCESS Success
- * ISC_R_NOMEMORY Resource limit: Out of memory
+ *\li #ISC_R_SUCCESS Success
+ *\li #ISC_R_NOMEMORY Resource limit: Out of memory
*/
-void
-isc_log_write(isc_log_t *lctx, isc_logcategory_t *category,
- isc_logmodule_t *module, int level,
- const char *format, ...)
-ISC_FORMAT_PRINTF(5, 6);
-/*
+/* Attention: next four comments PRECEED code */
+/*!
+ * \brief
* Write a message to the log channels.
*
* Notes:
- * Log messages containing natural language text should be logged with
+ *\li Log messages containing natural language text should be logged with
* isc_log_iwrite() to allow for localization.
*
- * lctx can be NULL; this is allowed so that programs which use
+ *\li lctx can be NULL; this is allowed so that programs which use
* libraries that use the ISC logging system are not required to
* also use it.
*
- * The format argument is a printf(3) string, with additional arguments
+ *\li The format argument is a printf(3) string, with additional arguments
* as necessary.
*
* Requires:
- * lctx is a valid logging context.
+ *\li lctx is a valid logging context.
*
- * The category and module arguments must have ids that are in the
+ *\li The category and module arguments must have ids that are in the
* range of known ids, as estabished by isc_log_registercategories()
* and isc_log_registermodules().
*
- * level != ISC_LOG_DYNAMIC. ISC_LOG_DYNAMIC is used only to define
+ *\li level != #ISC_LOG_DYNAMIC. ISC_LOG_DYNAMIC is used only to define
* channels, and explicit debugging level must be identified for
* isc_log_write() via ISC_LOG_DEBUG(level).
*
- * format != NULL.
+ *\li format != NULL.
*
* Ensures:
- * The log message is written to every channel associated with the
+ *\li The log message is written to every channel associated with the
* indicated category/module pair.
*
* Returns:
- * Nothing. Failure to log a message is not construed as a
+ *\li Nothing. Failure to log a message is not construed as a
* meaningful error.
*/
-
void
-isc_log_vwrite(isc_log_t *lctx, isc_logcategory_t *category,
+isc_log_write(isc_log_t *lctx, isc_logcategory_t *category,
isc_logmodule_t *module, int level,
- const char *format, va_list args)
-ISC_FORMAT_PRINTF(5, 0);
-/*
+ const char *format, ...)
+
+ISC_FORMAT_PRINTF(5, 6);
+
+/*%
* Write a message to the log channels.
*
* Notes:
- * lctx can be NULL; this is allowed so that programs which use
+ *\li lctx can be NULL; this is allowed so that programs which use
* libraries that use the ISC logging system are not required to
* also use it.
*
- * The format argument is a printf(3) string, with additional arguments
+ *\li The format argument is a printf(3) string, with additional arguments
* as necessary.
*
* Requires:
- * lctx is a valid logging context.
+ *\li lctx is a valid logging context.
*
- * The category and module arguments must have ids that are in the
+ *\li The category and module arguments must have ids that are in the
* range of known ids, as estabished by isc_log_registercategories()
* and isc_log_registermodules().
*
- * level != ISC_LOG_DYNAMIC. ISC_LOG_DYNAMIC is used only to define
+ *\li level != #ISC_LOG_DYNAMIC. ISC_LOG_DYNAMIC is used only to define
* channels, and explicit debugging level must be identified for
* isc_log_write() via ISC_LOG_DEBUG(level).
*
- * format != NULL.
+ *\li format != NULL.
*
* Ensures:
- * The log message is written to every channel associated with the
+ *\li The log message is written to every channel associated with the
* indicated category/module pair.
*
* Returns:
- * Nothing. Failure to log a message is not construed as a
+ *\li Nothing. Failure to log a message is not construed as a
* meaningful error.
*/
+void
+isc_log_vwrite(isc_log_t *lctx, isc_logcategory_t *category,
+ isc_logmodule_t *module, int level,
+ const char *format, va_list args)
+
+ISC_FORMAT_PRINTF(5, 0);
+/*%
+ * Write a message to the log channels, pruning duplicates that occur within
+ * a configurable amount of seconds (see isc_log_[sg]etduplicateinterval).
+ * This function is otherwise identical to isc_log_write().
+ */
void
isc_log_write1(isc_log_t *lctx, isc_logcategory_t *category,
isc_logmodule_t *module, int level, const char *format, ...)
+
ISC_FORMAT_PRINTF(5, 6);
-/*
+
+/*%
* Write a message to the log channels, pruning duplicates that occur within
* a configurable amount of seconds (see isc_log_[sg]etduplicateinterval).
- * This function is otherwise identical to isc_log_write().
+ * This function is otherwise identical to isc_log_vwrite().
*/
-
void
isc_log_vwrite1(isc_log_t *lctx, isc_logcategory_t *category,
isc_logmodule_t *module, int level, const char *format,
va_list args)
+
ISC_FORMAT_PRINTF(5, 0);
-/*
- * Write a message to the log channels, pruning duplicates that occur within
- * a configurable amount of seconds (see isc_log_[sg]etduplicateinterval).
- * This function is otherwise identical to isc_log_vwrite().
- */
+/*%
+ * These are four internationalized versions of the the isc_log_[v]write[1]
+ * functions.
+ *
+ * The only difference is that they take arguments for a message
+ * catalog, message set, and message number, all immediately preceding the
+ * format argument. The format argument becomes the default text, a la
+ * isc_msgcat_get. If the message catalog is NULL, no lookup is attempted
+ * for a message -- which makes the message set and message number irrelevant,
+ * and the non-internationalized call should have probably been used instead.
+ *
+ * Yes, that means there are now *eight* interfaces to logging a message.
+ * Sheesh. Make the madness stop!
+ */
+/*@{*/
void
isc_log_iwrite(isc_log_t *lctx, isc_logcategory_t *category,
isc_logmodule_t *module, int level,
@@ -632,72 +674,61 @@ isc_log_ivwrite1(isc_log_t *lctx, isc_logcategory_t *category,
isc_msgcat_t *msgcat, int msgset, int message,
const char *format, va_list args)
ISC_FORMAT_PRINTF(8, 0);
-/*
- * These are four internationalized versions of the the isc_log_[v]write[1]
- * functions. The only difference is that they take arguments for a message
- * catalog, message set, and message number, all immediately preceding the
- * format argument. The format argument becomes the default text, a la
- * isc_msgcat_get. If the message catalog is NULL, no lookup is attempted
- * for a message -- which makes the message set and message number irrelevant,
- * and the non-internationalized call should have probably been used instead.
- *
- * Yes, that means there are now *eight* interfaces to logging a message.
- * Sheesh. Make the madness stop!
- */
+/*@}*/
void
isc_log_setdebuglevel(isc_log_t *lctx, unsigned int level);
-/*
+/*%<
* Set the debugging level used for logging.
*
* Notes:
- * Setting the debugging level to 0 disables debugging log messages.
+ *\li Setting the debugging level to 0 disables debugging log messages.
*
* Requires:
- * lctx is a valid logging context.
+ *\li lctx is a valid logging context.
*
* Ensures:
- * The debugging level is set to the requested value.
+ *\li The debugging level is set to the requested value.
*/
unsigned int
isc_log_getdebuglevel(isc_log_t *lctx);
-/*
+/*%<
* Get the current debugging level.
*
* Notes:
- * This is provided so that a program can have a notion of
+ *\li This is provided so that a program can have a notion of
* "increment debugging level" or "decrement debugging level"
* without needing to keep track of what the current level is.
*
- * A return value of 0 indicates that debugging messages are disabled.
+ *\li A return value of 0 indicates that debugging messages are disabled.
*
* Requires:
- * lctx is a valid logging context.
+ *\li lctx is a valid logging context.
*
* Ensures:
- * The current logging debugging level is returned.
+ *\li The current logging debugging level is returned.
*/
isc_boolean_t
isc_log_wouldlog(isc_log_t *lctx, int level);
-/*
+/*%<
* Determine whether logging something to 'lctx' at 'level' would
* actually cause something to be logged somewhere.
*
- * If ISC_FALSE is returned, it is guaranteed that nothing would
+ * If #ISC_FALSE is returned, it is guaranteed that nothing would
* be logged, allowing the caller to omit unnecessary
* isc_log_write() calls and possible message preformatting.
*/
void
isc_log_setduplicateinterval(isc_logconfig_t *lcfg, unsigned int interval);
-/*
+/*%<
* Set the interval over which duplicate log messages will be ignored
* by isc_log_[v]write1(), in seconds.
*
* Notes:
- * Increasing the duplicate interval from X to Y will not necessarily
+ *\li Increasing the duplicate interval from X to Y will not necessarily
* filter out duplicates of messages logged in Y - X seconds since the
* increase. (Example: Message1 is logged at midnight. Message2
* is logged at 00:01:00, when the interval is only 30 seconds, causing
@@ -707,43 +738,43 @@ isc_log_setduplicateinterval(isc_logconfig_t *lcfg, unsigned int interval);
* passed since the first occurrence.
*
* Requires:
- * lctx is a valid logging context.
+ *\li lctx is a valid logging context.
*/
unsigned int
isc_log_getduplicateinterval(isc_logconfig_t *lcfg);
-/*
+/*%<
* Get the current duplicate filtering interval.
*
* Requires:
- * lctx is a valid logging context.
+ *\li lctx is a valid logging context.
*
* Returns:
- * The current duplicate filtering interval.
+ *\li The current duplicate filtering interval.
*/
isc_result_t
isc_log_settag(isc_logconfig_t *lcfg, const char *tag);
-/*
- * Set the program name or other identifier for ISC_LOG_PRINTTAG.
+/*%<
+ * Set the program name or other identifier for #ISC_LOG_PRINTTAG.
*
* Requires:
- * lcfg is a valid logging configuration.
+ *\li lcfg is a valid logging configuration.
*
* Notes:
- * If this function has not set the tag to a non-NULL, non-empty value,
- * then the ISC_LOG_PRINTTAG channel flag will not print anything.
+ *\li If this function has not set the tag to a non-NULL, non-empty value,
+ * then the #ISC_LOG_PRINTTAG channel flag will not print anything.
* Unlike some implementations of syslog on Unix systems, you *must* set
* the tag in order to get it logged. It is not implicitly derived from
* the program name (which is pretty impossible to infer portably).
*
- * Setting the tag to NULL or the empty string will also cause the
- * ISC_LOG_PRINTTAG channel flag to not print anything. If tag equals the
+ *\li Setting the tag to NULL or the empty string will also cause the
+ * #ISC_LOG_PRINTTAG channel flag to not print anything. If tag equals the
* empty string, calls to isc_log_gettag will return NULL.
*
* Returns:
- * ISC_R_SUCCESS Success
- * ISC_R_NOMEMORY Resource Limit: Out of memory
+ *\li #ISC_R_SUCCESS Success
+ *\li #ISC_R_NOMEMORY Resource Limit: Out of memory
*
* XXXDCL when creating a new isc_logconfig_t, it might be nice if the tag
* of the currently active isc_logconfig_t was inherited. this does not
@@ -752,33 +783,35 @@ isc_log_settag(isc_logconfig_t *lcfg, const char *tag);
char *
isc_log_gettag(isc_logconfig_t *lcfg);
-/*
- * Get the current identifier printed with ISC_LOG_PRINTTAG.
+/*%<
+ * Get the current identifier printed with #ISC_LOG_PRINTTAG.
*
* Requires:
- * lcfg is a valid logging configuration.
+ *\li lcfg is a valid logging configuration.
*
* Notes:
- * Since isc_log_settag() will not associate a zero-length string
+ *\li Since isc_log_settag() will not associate a zero-length string
* with the logging configuration, attempts to do so will cause
* this function to return NULL. However, a determined programmer
* will observe that (currently) a tag of length greater than zero
* could be set, and then modified to be zero length.
*
* Returns:
- * A pointer to the current identifier, or NULL if none has been set.
+ *\li A pointer to the current identifier, or NULL if none has been set.
*/
void
isc_log_opensyslog(const char *tag, int options, int facility);
-/*
+/*%<
* Initialize syslog logging.
*
* Notes:
- * XXXDCL NT
+ *\li XXXDCL NT
* This is currently equivalent to openlog(), but is not going to remain
* that way. In the meantime, the arguments are all identical to
* those used by openlog(3), as follows:
+ *
+ * \code
* tag: The string to use in the position of the program
* name in syslog messages. Most (all?) syslogs
* will use basename(argv[0]) if tag is NULL.
@@ -789,89 +822,90 @@ isc_log_opensyslog(const char *tag, int options, int facility);
* facility: The default syslog facility. This is irrelevant
* since isc_log_write will ALWAYS use the channel's
* declared facility.
+ * \endcode
*
- * Zero effort has been made (yet) to accomodate systems with openlog()
+ *\li Zero effort has been made (yet) to accomodate systems with openlog()
* that only takes two arguments, or to identify valid syslog
* facilities or options for any given architecture.
*
- * It is necessary to call isc_log_opensyslog() to initialize
+ *\li It is necessary to call isc_log_opensyslog() to initialize
* syslogging on machines which do not support network connections to
* syslogd because they require a Unix domain socket to be used. Since
* this is a chore to determine at run-time, it is suggested that it
* always be called by programs using the ISC logging system.
*
* Requires:
- * Nothing.
+ *\li Nothing.
*
* Ensures:
- * openlog() is called to initialize the syslog system.
+ *\li openlog() is called to initialize the syslog system.
*/
void
isc_log_closefilelogs(isc_log_t *lctx);
-/*
- * Close all open files used by ISC_LOG_TOFILE channels.
+/*%<
+ * Close all open files used by #ISC_LOG_TOFILE channels.
*
* Notes:
- * This function is provided for programs that want to use their own
+ *\li This function is provided for programs that want to use their own
* log rolling mechanism rather than the one provided internally.
* For example, a program that wanted to keep daily logs would define
- * a channel which used ISC_LOG_ROLLNEVER, then once a day would
+ * a channel which used #ISC_LOG_ROLLNEVER, then once a day would
* rename the log file and call isc_log_closefilelogs().
*
- * ISC_LOG_TOFILEDESC channels are unaffected.
+ *\li #ISC_LOG_TOFILEDESC channels are unaffected.
*
* Requires:
- * lctx is a valid context.
+ *\li lctx is a valid context.
*
* Ensures:
- * The open files are closed and will be reopened when they are
+ *\li The open files are closed and will be reopened when they are
* next needed.
*/
isc_logcategory_t *
isc_log_categorybyname(isc_log_t *lctx, const char *name);
-/*
+/*%<
* Find a category by its name.
*
* Notes:
- * The string name of a category is not required to be unique.
+ *\li The string name of a category is not required to be unique.
*
* Requires:
- * lctx is a valid context.
- * name is not NULL.
+ *\li lctx is a valid context.
+ *\li name is not NULL.
*
* Returns:
- * A pointer to the _first_ isc_logcategory_t structure used by "name".
+ *\li A pointer to the _first_ isc_logcategory_t structure used by "name".
*
- * NULL if no category exists by that name.
+ *\li NULL if no category exists by that name.
*/
isc_logmodule_t *
isc_log_modulebyname(isc_log_t *lctx, const char *name);
-/*
+/*%<
* Find a module by its name.
*
* Notes:
- * The string name of a module is not required to be unique.
+ *\li The string name of a module is not required to be unique.
*
* Requires:
- * lctx is a valid context.
- * name is not NULL.
+ *\li lctx is a valid context.
+ *\li name is not NULL.
*
* Returns:
- * A pointer to the _first_ isc_logmodule_t structure used by "name".
+ *\li A pointer to the _first_ isc_logmodule_t structure used by "name".
*
- * NULL if no module exists by that name.
+ *\li NULL if no module exists by that name.
*/
void
isc_log_setcontext(isc_log_t *lctx);
-/*
+/*%<
* Sets the context used by the libisc for logging.
*
* Requires:
- * lctx be a valid context.
+ *\li lctx be a valid context.
*/
ISC_LANG_ENDDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/magic.h b/contrib/bind9/lib/isc/include/isc/magic.h
index 729e512..045b54f 100644
--- a/contrib/bind9/lib/isc/include/isc/magic.h
+++ b/contrib/bind9/lib/isc/include/isc/magic.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,20 +15,21 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: magic.h,v 1.11.206.1 2004/03/06 08:14:43 marka Exp $ */
+/* $Id: magic.h,v 1.12.18.2 2005/04/29 00:16:59 marka Exp $ */
#ifndef ISC_MAGIC_H
#define ISC_MAGIC_H 1
+/*! \file */
+
typedef struct {
unsigned int magic;
} isc__magic_t;
-/*
+/*%
* To use this macro the magic number MUST be the first thing in the
* structure, and MUST be of type "unsigned int".
- *
* The intent of this is to allow magic numbers to be checked even though
* the object is otherwise opaque.
*/
diff --git a/contrib/bind9/lib/isc/include/isc/md5.h b/contrib/bind9/lib/isc/include/isc/md5.h
index c6c3825..3f9667e 100644
--- a/contrib/bind9/lib/isc/include/isc/md5.h
+++ b/contrib/bind9/lib/isc/include/isc/md5.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2006 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,10 +15,11 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: md5.h,v 1.8.206.1 2004/03/06 08:14:43 marka Exp $ */
+/* $Id: md5.h,v 1.9.18.4 2006/02/01 00:10:34 marka Exp $ */
-/*
- * This is the header file for the MD5 message-digest algorithm.
+/*! \file
+ * \brief This is the header file for the MD5 message-digest algorithm.
+ *
* The algorithm is due to Ron Rivest. This code was
* written by Colin Plumb in 1993, no copyright is claimed.
* This code is in the public domain; do with it what you wish.
@@ -45,7 +46,7 @@
#include <isc/lang.h>
#include <isc/types.h>
-#define ISC_MD5_DIGESTLENGTH 16
+#define ISC_MD5_DIGESTLENGTH 16U
typedef struct {
isc_uint32_t buf[4];
diff --git a/contrib/bind9/lib/isc/include/isc/mem.h b/contrib/bind9/lib/isc/include/isc/mem.h
index 6455924..dc68bcb 100644
--- a/contrib/bind9/lib/isc/include/isc/mem.h
+++ b/contrib/bind9/lib/isc/include/isc/mem.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2006 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1997-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mem.h,v 1.54.12.4 2004/10/11 05:55:51 marka Exp $ */
+/* $Id: mem.h,v 1.59.18.9 2006/01/04 23:50:23 marka Exp $ */
#ifndef ISC_MEM_H
#define ISC_MEM_H 1
+/*! \file */
+
#include <stdio.h>
#include <isc/lang.h>
@@ -36,7 +38,7 @@ typedef void (*isc_mem_water_t)(void *, int);
typedef void * (*isc_memalloc_t)(void *, size_t);
typedef void (*isc_memfree_t)(void *, void *);
-/*
+/*%
* Define ISC_MEM_DEBUG=1 to make all functions that free memory
* set the pointer being freed to NULL after being freed.
* This is the default; set ISC_MEM_DEBUG=0 to disable it.
@@ -45,7 +47,7 @@ typedef void (*isc_memfree_t)(void *, void *);
#define ISC_MEM_DEBUG 1
#endif
-/*
+/*%
* Define ISC_MEM_TRACKLINES=1 to turn on detailed tracing of memory
* allocation and freeing by file and line number.
*/
@@ -53,7 +55,7 @@ typedef void (*isc_memfree_t)(void *, void *);
#define ISC_MEM_TRACKLINES 1
#endif
-/*
+/*%
* Define ISC_MEM_CHECKOVERRUN=1 to turn on checks for using memory outside
* the requested space. This will increase the size of each allocation.
*/
@@ -61,7 +63,7 @@ typedef void (*isc_memfree_t)(void *, void *);
#define ISC_MEM_CHECKOVERRUN 1
#endif
-/*
+/*%
* Define ISC_MEM_FILL=1 to fill each block of memory returned to the system
* with the byte string '0xbe'. This helps track down uninitialized pointers
* and the like. On freeing memory, the space is filled with '0xde' for
@@ -71,7 +73,7 @@ typedef void (*isc_memfree_t)(void *, void *);
#define ISC_MEM_FILL 1
#endif
-/*
+/*%
* Define ISC_MEMPOOL_NAMES=1 to make memory pools store a symbolic
* name so that the leaking pool can be more readily identified in
* case of a memory leak.
@@ -81,27 +83,40 @@ typedef void (*isc_memfree_t)(void *, void *);
#endif
LIBISC_EXTERNAL_DATA extern unsigned int isc_mem_debugging;
+/*@{*/
#define ISC_MEM_DEBUGTRACE 0x00000001U
#define ISC_MEM_DEBUGRECORD 0x00000002U
#define ISC_MEM_DEBUGUSAGE 0x00000004U
-/*
+#define ISC_MEM_DEBUGSIZE 0x00000008U
+#define ISC_MEM_DEBUGCTX 0x00000010U
+#define ISC_MEM_DEBUGALL 0x0000001FU
+/*!<
* The variable isc_mem_debugging holds a set of flags for
* turning certain memory debugging options on or off at
* runtime. Its is intialized to the value ISC_MEM_DEGBUGGING,
* which is 0 by default but may be overridden at compile time.
* The following flags can be specified:
*
- * ISC_MEM_DEBUGTRACE
+ * \li #ISC_MEM_DEBUGTRACE
* Log each allocation and free to isc_lctx.
*
- * ISC_MEM_DEBUGRECORD
+ * \li #ISC_MEM_DEBUGRECORD
* Remember each allocation, and match them up on free.
* Crash if a free doesn't match an allocation.
*
- * ISC_MEM_DEBUGUSAGE
+ * \li #ISC_MEM_DEBUGUSAGE
* If a hi_water mark is set, print the maximium inuse memory
* every time it is raised once it exceeds the hi_water mark.
+ *
+ * \li #ISC_MEM_DEBUGSIZE
+ * Check the size argument being passed to isc_mem_put() matches
+ * that passed to isc_mem_get().
+ *
+ * \li #ISC_MEM_DEBUGCTX
+ * Check the mctx argument being passed to isc_mem_put() matches
+ * that passed to isc_mem_get().
*/
+/*@}*/
#if ISC_MEM_TRACKLINES
#define _ISC_MEM_FILELINE , __FILE__, __LINE__
@@ -111,17 +126,43 @@ LIBISC_EXTERNAL_DATA extern unsigned int isc_mem_debugging;
#define _ISC_MEM_FLARG
#endif
+/*!
+ * Define ISC_MEM_USE_INTERNAL_MALLOC=1 to use the internal malloc()
+ * implementation in preference to the system one. The internal malloc()
+ * is very space-efficient, and quite fast on uniprocessor systems. It
+ * performs poorly on multiprocessor machines.
+ * JT: we can overcome the performance issue on multiprocessor machines
+ * by carefully separating memory contexts.
+ */
+
+#ifndef ISC_MEM_USE_INTERNAL_MALLOC
+#define ISC_MEM_USE_INTERNAL_MALLOC 1
+#endif
+
+/*
+ * Flags for isc_mem_create2()calls.
+ */
+#define ISC_MEMFLAG_NOLOCK 0x00000001 /* no lock is necessary */
+#define ISC_MEMFLAG_INTERNAL 0x00000002 /* use internal malloc */
+#if ISC_MEM_USE_INTERNAL_MALLOC
+#define ISC_MEMFLAG_DEFAULT ISC_MEMFLAG_INTERNAL
+#else
+#define ISC_MEMFLAG_DEFAULT 0
+#endif
+
+
#define isc_mem_get(c, s) isc__mem_get((c), (s) _ISC_MEM_FILELINE)
#define isc_mem_allocate(c, s) isc__mem_allocate((c), (s) _ISC_MEM_FILELINE)
#define isc_mem_strdup(c, p) isc__mem_strdup((c), (p) _ISC_MEM_FILELINE)
#define isc_mempool_get(c) isc__mempool_get((c) _ISC_MEM_FILELINE)
-/*
+/*%
* isc_mem_putanddetach() is a convienence function for use where you
* have a structure with an attached memory context.
*
* Given:
*
+ * \code
* struct {
* ...
* isc_mem_t *mctx;
@@ -131,14 +172,17 @@ LIBISC_EXTERNAL_DATA extern unsigned int isc_mem_debugging;
* isc_mem_t *mctx;
*
* isc_mem_putanddetach(&ptr->mctx, ptr, sizeof(*ptr));
+ * \endcode
*
* is the equivalent of:
*
+ * \code
* mctx = NULL;
* isc_mem_attach(ptr->mctx, &mctx);
* isc_mem_detach(&ptr->mctx);
* isc_mem_put(mctx, ptr, sizeof(*ptr));
* isc_mem_detach(&mctx);
+ * \endcode
*/
#if ISC_MEM_DEBUG
@@ -170,25 +214,35 @@ LIBISC_EXTERNAL_DATA extern unsigned int isc_mem_debugging;
#define isc_mempool_put(c, p) isc__mempool_put((c), (p) _ISC_MEM_FILELINE)
#endif
+/*@{*/
isc_result_t
isc_mem_create(size_t max_size, size_t target_size,
isc_mem_t **mctxp);
+isc_result_t
+isc_mem_create2(size_t max_size, size_t target_size,
+ isc_mem_t **mctxp, unsigned int flags);
+
isc_result_t
isc_mem_createx(size_t max_size, size_t target_size,
isc_memalloc_t memalloc, isc_memfree_t memfree,
void *arg, isc_mem_t **mctxp);
-/*
- * Create a memory context.
+
+isc_result_t
+isc_mem_createx2(size_t max_size, size_t target_size,
+ isc_memalloc_t memalloc, isc_memfree_t memfree,
+ void *arg, isc_mem_t **mctxp, unsigned int flags);
+
+/*!<
+ * \brief Create a memory context.
*
* 'max_size' and 'target_size' are tuning parameters. When
- * ISC_MEM_USE_INTERNAL_MALLOC is true, allocations smaller than
- * 'max_size' will be satisfied by getting blocks of size
- * 'target_size' from the system allocator and breaking them up into
- * pieces; larger allocations will use the system allocator directly.
- * If 'max_size' and/or 'target_size' are zero, default values will be
- * used. When ISC_MEM_USE_INTERNAL_MALLOC is false, 'target_size' is
- * ignored.
+ * ISC_MEMFLAG_INTERNAL is set, allocations smaller than 'max_size'
+ * will be satisfied by getting blocks of size 'target_size' from the
+ * system allocator and breaking them up into pieces; larger allocations
+ * will use the system allocator directly. If 'max_size' and/or
+ * 'target_size' are zero, default values will be * used. When
+ * ISC_MEMFLAG_INTERNAL is not set, 'target_size' is ignored.
*
* 'max_size' is also used to size the statistics arrays and the array
* used to record active memory when ISC_MEM_DEBUGRECORD is set. Settin
@@ -200,15 +254,23 @@ isc_mem_createx(size_t max_size, size_t target_size,
* using isc_mem_create() will use the standard library malloc()
* and free().
*
+ * If ISC_MEMFLAG_NOLOCK is set in 'flags', the corresponding memory context
+ * will be accessed without locking. The user who creates the context must
+ * ensure there be no race. Since this can be a source of bug, it is generally
+ * inadvisable to use this flag unless the user is very sure about the race
+ * condition and the access to the object is highly performance sensitive.
+ *
* Requires:
* mctxp != NULL && *mctxp == NULL */
+/*@}*/
+/*@{*/
void
isc_mem_attach(isc_mem_t *, isc_mem_t **);
void
isc_mem_detach(isc_mem_t **);
-/*
- * Attach to / detach from a memory context.
+/*!<
+ * \brief Attach to / detach from a memory context.
*
* This is intended for applications that use multiple memory contexts
* in such a way that it is not obvious when the last allocations from
@@ -219,10 +281,11 @@ isc_mem_detach(isc_mem_t **);
* and destroy it at the end of main(), thereby guaranteeing that it
* is not destroyed while there are outstanding allocations.
*/
+/*@}*/
void
isc_mem_destroy(isc_mem_t **);
-/*
+/*%<
* Destroy a memory context.
*/
@@ -230,38 +293,40 @@ isc_result_t
isc_mem_ondestroy(isc_mem_t *ctx,
isc_task_t *task,
isc_event_t **event);
-/*
+/*%<
* Request to be notified with an event when a memory context has
* been successfully destroyed.
*/
void
isc_mem_stats(isc_mem_t *mctx, FILE *out);
-/*
+/*%<
* Print memory usage statistics for 'mctx' on the stream 'out'.
*/
void
isc_mem_setdestroycheck(isc_mem_t *mctx,
isc_boolean_t on);
-/*
- * Iff 'on' is ISC_TRUE, 'mctx' will check for memory leaks when
+/*%<
+ * If 'on' is ISC_TRUE, 'mctx' will check for memory leaks when
* destroyed and abort the program if any are present.
*/
+/*@{*/
void
isc_mem_setquota(isc_mem_t *, size_t);
size_t
isc_mem_getquota(isc_mem_t *);
-/*
+/*%<
* Set/get the memory quota of 'mctx'. This is a hard limit
* on the amount of memory that may be allocated from mctx;
* if it is exceeded, allocations will fail.
*/
+/*@}*/
size_t
isc_mem_inuse(isc_mem_t *mctx);
-/*
+/*%<
* Get an estimate of the number of memory in use in 'mctx', in bytes.
* This includes quantization overhead, but does not include memory
* allocated from the system but not yet used.
@@ -270,11 +335,13 @@ isc_mem_inuse(isc_mem_t *mctx);
void
isc_mem_setwater(isc_mem_t *mctx, isc_mem_water_t water, void *water_arg,
size_t hiwater, size_t lowater);
-/*
- * Set high and low water marks for this memory context. When the memory
- * usage of 'mctx' exceeds 'hiwater', '(water)(water_arg, ISC_MEM_HIWATER)'
+/*%<
+ * Set high and low water marks for this memory context.
+ *
+ * When the memory
+ * usage of 'mctx' exceeds 'hiwater', '(water)(water_arg, #ISC_MEM_HIWATER)'
* will be called. When the usage drops below 'lowater', 'water' will
- * again be called, this time with ISC_MEM_LOWATER.
+ * again be called, this time with #ISC_MEM_LOWATER.
*
* If 'water' is NULL then 'water_arg', 'hi_water' and 'lo_water' are
* ignored and the state is reset.
@@ -285,53 +352,77 @@ isc_mem_setwater(isc_mem_t *mctx, isc_mem_water_t water, void *water_arg,
* hi_water >= lo_water
*/
+void
+isc_mem_printactive(isc_mem_t *mctx, FILE *file);
+/*%<
+ * Print to 'file' all active memory in 'mctx'.
+ *
+ * Requires ISC_MEM_DEBUGRECORD to have been set.
+ */
+
+void
+isc_mem_printallactive(FILE *file);
+/*%<
+ * Print to 'file' all active memory in all contexts.
+ *
+ * Requires ISC_MEM_DEBUGRECORD to have been set.
+ */
+
+void
+isc_mem_checkdestroyed(FILE *file);
+/*%<
+ * Check that all memory contexts have been destroyed.
+ * Prints out those that have not been.
+ * Fatally fails if there are still active contexts.
+ */
+
/*
* Memory pools
*/
isc_result_t
isc_mempool_create(isc_mem_t *mctx, size_t size, isc_mempool_t **mpctxp);
-/*
+/*%<
* Create a memory pool.
*
* Requires:
- * mctx is a valid memory context.
- * size > 0
- * mpctxp != NULL and *mpctxp == NULL
+ *\li mctx is a valid memory context.
+ *\li size > 0
+ *\li mpctxp != NULL and *mpctxp == NULL
*
* Defaults:
- * maxalloc = UINT_MAX
- * freemax = 1
- * fillcount = 1
+ *\li maxalloc = UINT_MAX
+ *\li freemax = 1
+ *\li fillcount = 1
*
* Returns:
- * ISC_R_NOMEMORY -- not enough memory to create pool
- * ISC_R_SUCCESS -- all is well.
+ *\li #ISC_R_NOMEMORY -- not enough memory to create pool
+ *\li #ISC_R_SUCCESS -- all is well.
*/
void
isc_mempool_destroy(isc_mempool_t **mpctxp);
-/*
+/*%<
* Destroy a memory pool.
*
* Requires:
- * mpctxp != NULL && *mpctxp is a valid pool.
- * The pool has no un"put" allocations outstanding
+ *\li mpctxp != NULL && *mpctxp is a valid pool.
+ *\li The pool has no un"put" allocations outstanding
*/
void
isc_mempool_setname(isc_mempool_t *mpctx, const char *name);
-/*
+/*%<
* Associate a name with a memory pool. At most 15 characters may be used.
*
* Requires:
- * mpctx is a valid pool.
- * name != NULL;
+ *\li mpctx is a valid pool.
+ *\li name != NULL;
*/
void
isc_mempool_associatelock(isc_mempool_t *mpctx, isc_mutex_t *lock);
-/*
+/*%<
* Associate a lock with this memory pool.
*
* This lock is used when getting or putting items using this memory pool,
@@ -346,13 +437,13 @@ isc_mempool_associatelock(isc_mempool_t *mpctx, isc_mutex_t *lock);
*
* Requires:
*
- * mpctpx is a valid pool.
+ *\li mpctpx is a valid pool.
*
- * lock != NULL.
+ *\li lock != NULL.
*
- * No previous lock is assigned to this pool.
+ *\li No previous lock is assigned to this pool.
*
- * The lock is initialized before calling this function via the normal
+ *\li The lock is initialized before calling this function via the normal
* means of doing that.
*/
@@ -372,57 +463,57 @@ isc_mempool_associatelock(isc_mempool_t *mpctx, isc_mutex_t *lock);
unsigned int
isc_mempool_getfreemax(isc_mempool_t *mpctx);
-/*
+/*%<
* Returns the maximum allowed size of the free list.
*/
void
isc_mempool_setfreemax(isc_mempool_t *mpctx, unsigned int limit);
-/*
+/*%<
* Sets the maximum allowed size of the free list.
*/
unsigned int
isc_mempool_getfreecount(isc_mempool_t *mpctx);
-/*
+/*%<
* Returns current size of the free list.
*/
unsigned int
isc_mempool_getmaxalloc(isc_mempool_t *mpctx);
-/*
+/*!<
* Returns the maximum allowed number of allocations.
*/
void
isc_mempool_setmaxalloc(isc_mempool_t *mpctx, unsigned int limit);
-/*
+/*%<
* Sets the maximum allowed number of allocations.
*
* Additional requirements:
- * limit > 0
+ *\li limit > 0
*/
unsigned int
isc_mempool_getallocated(isc_mempool_t *mpctx);
-/*
+/*%<
* Returns the number of items allocated from this pool.
*/
unsigned int
isc_mempool_getfillcount(isc_mempool_t *mpctx);
-/*
+/*%<
* Returns the number of items allocated as a block from the parent memory
* context when the free list is empty.
*/
void
isc_mempool_setfillcount(isc_mempool_t *mpctx, unsigned int limit);
-/*
+/*%<
* Sets the fillcount.
*
* Additional requirements:
- * limit > 0
+ *\li limit > 0
*/
diff --git a/contrib/bind9/lib/isc/include/isc/msgcat.h b/contrib/bind9/lib/isc/include/isc/msgcat.h
index 97839fa..813b57c 100644
--- a/contrib/bind9/lib/isc/include/isc/msgcat.h
+++ b/contrib/bind9/lib/isc/include/isc/msgcat.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: msgcat.h,v 1.8.206.1 2004/03/06 08:14:44 marka Exp $ */
+/* $Id: msgcat.h,v 1.9.18.2 2005/04/29 00:16:59 marka Exp $ */
#ifndef ISC_MSGCAT_H
#define ISC_MSGCAT_H 1
@@ -24,34 +24,33 @@
***** Module Info
*****/
-/*
- * ISC Message Catalog
- *
- * Message catalogs aid internationalization of applications by allowing
+/*! \file isc/msgcat.h
+ * \brief The ISC Message Catalog
+ * aids internationalization of applications by allowing
* messages to be retrieved from locale-specific files instead of
* hardwiring them into the application. This allows translations of
* messages appropriate to the locale to be supplied without recompiling
* the application.
*
* Notes:
- * It's very important that message catalogs work, even if only the
+ *\li It's very important that message catalogs work, even if only the
* default_text can be used.
*
* MP:
- * The caller must ensure appropriate synchronization of
+ *\li The caller must ensure appropriate synchronization of
* isc_msgcat_open() and isc_msgcat_close(). isc_msgcat_get()
* ensures appropriate synchronization.
*
* Reliability:
- * No anticipated impact.
+ *\li No anticipated impact.
*
* Resources:
- * <TBS>
+ *\li TBS
*
- * Security:
+ * \li Security:
* No anticipated impact.
*
- * Standards:
+ * \li Standards:
* None.
*/
@@ -70,61 +69,61 @@ ISC_LANG_BEGINDECLS
void
isc_msgcat_open(const char *name, isc_msgcat_t **msgcatp);
-/*
+/*%<
* Open a message catalog.
*
* Notes:
*
- * If memory cannot be allocated or other failures occur, *msgcatp
+ *\li If memory cannot be allocated or other failures occur, *msgcatp
* will be set to NULL. If a NULL msgcat is given to isc_msgcat_get(),
* the default_text will be returned, ensuring that some message text
* will be available, no matter what's going wrong.
*
* Requires:
*
- * 'name' is a valid string.
+ *\li 'name' is a valid string.
*
- * msgcatp != NULL && *msgcatp == NULL
+ *\li msgcatp != NULL && *msgcatp == NULL
*/
void
isc_msgcat_close(isc_msgcat_t **msgcatp);
-/*
+/*%<
* Close a message catalog.
*
* Notes:
*
- * Any string pointers returned by prior calls to isc_msgcat_get() are
+ *\li Any string pointers returned by prior calls to isc_msgcat_get() are
* invalid after isc_msgcat_close() has been called and must not be
* used.
*
* Requires:
*
- * *msgcatp is a valid message catalog or is NULL.
+ *\li *msgcatp is a valid message catalog or is NULL.
*
* Ensures:
*
- * All resources associated with the message catalog are released.
+ *\li All resources associated with the message catalog are released.
*
- * *msgcatp == NULL
+ *\li *msgcatp == NULL
*/
const char *
isc_msgcat_get(isc_msgcat_t *msgcat, int set, int message,
const char *default_text);
-/*
+/*%<
* Get message 'message' from message set 'set' in 'msgcat'. If it
* is not available, use 'default_text'.
*
* Requires:
*
- * 'msgcat' is a valid message catalog or is NULL.
+ *\li 'msgcat' is a valid message catalog or is NULL.
*
- * set > 0
+ *\li set > 0
*
- * message > 0
+ *\li message > 0
*
- * 'default_text' is a valid string.
+ *\li 'default_text' is a valid string.
*/
ISC_LANG_ENDDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/msgs.h b/contrib/bind9/lib/isc/include/isc/msgs.h
index 967005b..97b2108 100644
--- a/contrib/bind9/lib/isc/include/isc/msgs.h
+++ b/contrib/bind9/lib/isc/include/isc/msgs.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,16 +15,20 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: msgs.h,v 1.5.2.2.8.3 2004/03/06 08:14:44 marka Exp $ */
+/* $Id: msgs.h,v 1.9.18.2 2005/04/29 00:16:59 marka Exp $ */
#ifndef ISC_MSGS_H
#define ISC_MSGS_H 1
+/*! \file */
+
#include <isc/lib.h> /* Provide isc_msgcat global variable. */
#include <isc/msgcat.h> /* Provide isc_msgcat_*() functions. */
-/*
- * Message sets, named per source file, excepting "GENERAL".
+/*@{*/
+/*!
+ * \brief Message sets, named per source file, excepting "GENERAL".
+ *
* IMPORTANT: The original list is alphabetical, but any new sets must
* be added to the end.
*/
@@ -49,135 +53,139 @@
#define ISC_MSGSET_TIMER 19
#define ISC_MSGSET_UTIL 20
#define ISC_MSGSET_IFITERGETIFADDRS 21
+/*@}*/
-/*
- * Message numbers. They are only required to be unique per message set,
+/*@{*/
+/*!
+ * Message numbers
+ * are only required to be unique per message set,
* but are unique throughout the entire catalog to not be as confusing when
* debugging.
*
* The initial numbering was done by multiply by 100 the set number the
* message appears in then adding the incremental message number.
*/
-#define ISC_MSG_FAILED 101 /* "failed" */
-#define ISC_MSG_SUCCEEDED 102 /* Compatible with "failed" */
-#define ISC_MSG_SUCCESS 103 /* More usual way to say "success" */
-#define ISC_MSG_STARTING 104 /* As in "daemon: starting" */
-#define ISC_MSG_STOPING 105 /* As in "daemon: stopping" */
-#define ISC_MSG_ENTERING 106 /* As in "some_subr: entering" */
-#define ISC_MSG_EXITING 107 /* As in "some_subr: exiting" */
-#define ISC_MSG_CALLING 108 /* As in "calling some_subr()" */
-#define ISC_MSG_RETURNED 109 /* As in "some_subr: returned <foo>" */
-#define ISC_MSG_FATALERROR 110 /* "fatal error" */
-#define ISC_MSG_SHUTTINGDOWN 111 /* "shutting down" */
-#define ISC_MSG_RUNNING 112 /* "running" */
-#define ISC_MSG_WAIT 113 /* "wait" */
-#define ISC_MSG_WAITUNTIL 114 /* "waituntil" */
-
-#define ISC_MSG_SIGNALSETUP 201 /* "handle_signal() %d setup: %s" */
-
-#define ISC_MSG_ILLEGALOPT 301 /* "illegal option" */
-#define ISC_MSG_OPTNEEDARG 302 /* "option requires an argument" */
-
-#define ISC_MSG_ENTROPYSTATS 401 /* "Entropy pool %p: refcnt %u ..." */
-
-#define ISC_MSG_MAKESCANSOCKET 501 /* "making interface scan socket: %s" */
-#define ISC_MSG_GETIFCONFIG 502 /* "get interface configuration: %s" */
-#define ISC_MSG_BUFFERMAX 503 /* "... maximum buffer size exceeded" */
-#define ISC_MSG_GETDESTADDR 504 /* "%s: getting destination address: %s" */
-#define ISC_MSG_GETNETMASK 505 /* "%s: getting netmask: %s" */
-
-#define ISC_MSG_GETIFLISTSIZE 601 /* "getting interface list size: ..." */
-#define ISC_MSG_GETIFLIST 602 /* "getting interface list: ..." */
-#define ISC_MSG_UNEXPECTEDTYPE 603 /* "... unexpected ... message type" */
-
-#define ISC_MSG_UNEXPECTEDSTATE 701 /* "Unexpected state %d" */
-
-#define ISC_MSG_BADTIME 801 /* "Bad 00 99:99:99.999 " */
-#define ISC_MSG_LEVEL 802 /* "level %d: " */
-
-#define ISC_MSG_ADDTRACE 901 /* "add %p size %u " */
-#define ISC_MSG_DELTRACE 902 /* "del %p size %u " */
-#define ISC_MSG_POOLSTATS 903 /* "[Pool statistics]\n" */
-#define ISC_MSG_POOLNAME 904 /* "name" */
-#define ISC_MSG_POOLSIZE 905 /* "size" */
-#define ISC_MSG_POOLMAXALLOC 906 /* "maxalloc" */
-#define ISC_MSG_POOLALLOCATED 907 /* "allocated" */
-#define ISC_MSG_POOLFREECOUNT 908 /* "freecount" */
-#define ISC_MSG_POOLFREEMAX 909 /* "freemax" */
-#define ISC_MSG_POOLFILLCOUNT 910 /* "fillcount" */
-#define ISC_MSG_POOLGETS 911 /* "gets" */
-#define ISC_MSG_DUMPALLOC 912 /* "DUMP OF ALL OUTSTANDING MEMORY ..." */
-#define ISC_MSG_NONE 913 /* "\tNone.\n" */
-#define ISC_MSG_PTRFILELINE 914 /* "\tptr %p file %s line %u\n" */
-
-#define ISC_MSG_UNKNOWNADDR 1001 /* "<unknown address, family %u>" */
-
-#define ISC_MSG_NOLONGDBL 1104 /* "long doubles are not supported" */
-
-#define ISC_MSG_PRINTLOCK 1201 /* "rwlock %p thread %lu ..." */
-#define ISC_MSG_READ 1202 /* "read" */
-#define ISC_MSG_WRITE 1203 /* "write" */
-#define ISC_MSG_READING 1204 /* "reading" */
-#define ISC_MSG_WRITING 1205 /* "writing" */
-#define ISC_MSG_PRELOCK 1206 /* "prelock" */
-#define ISC_MSG_POSTLOCK 1207 /* "postlock" */
-#define ISC_MSG_PREUNLOCK 1208 /* "preunlock" */
-#define ISC_MSG_POSTUNLOCK 1209 /* "postunlock" */
-
-#define ISC_MSG_UNKNOWNFAMILY 1301 /* "unknown address family: %d" */
-
-#define ISC_MSG_WRITEFAILED 1401 /* "write() failed during watcher ..." */
-#define ISC_MSG_READFAILED 1402 /* "read() failed during watcher ... " */
-#define ISC_MSG_PROCESSCMSG 1403 /* "processing cmsg %p" */
-#define ISC_MSG_IFRECEIVED 1404 /* "interface received on ifindex %u" */
-#define ISC_MSG_SENDTODATA 1405 /* "sendto pktinfo data, ifindex %u" */
-#define ISC_MSG_DOIORECV 1406 /* "doio_recv: recvmsg(%d) %d bytes ..." */
-#define ISC_MSG_PKTRECV 1407 /* "packet received correctly" */
-#define ISC_MSG_DESTROYING 1408 /* "destroying" */
-#define ISC_MSG_CREATED 1409 /* "created" */
-#define ISC_MSG_ACCEPTLOCK 1410 /* "internal_accept called, locked ..." */
-#define ISC_MSG_ACCEPTEDCXN 1411 /* "accepted connection, new socket %p" */
-#define ISC_MSG_INTERNALRECV 1412 /* "internal_recv: task %p got event %p" */
-#define ISC_MSG_INTERNALSEND 1413 /* "internal_send: task %p got event %p" */
-#define ISC_MSG_WATCHERMSG 1414 /* "watcher got message %d" */
-#define ISC_MSG_SOCKETSREMAIN 1415 /* "sockets exist" */
-#define ISC_MSG_PKTINFOPROVIDED 1416 /* "pktinfo structure provided, ..." */
-#define ISC_MSG_BOUND 1417 /* "bound" */
-#define ISC_MSG_ACCEPTRETURNED 1418 /* accept() returned %d/%s */
-#define ISC_MSG_TOOMANYFDS 1419 /* %s: too many open file descriptors */
-#define ISC_MSG_ZEROPORT 1420 /* dropping source port zero packet */
-#define ISC_MSG_FILTER 1420 /* setsockopt(SO_ACCEPTFILTER): %s */
-
-#define ISC_MSG_AWAKE 1502 /* "awake" */
-#define ISC_MSG_WORKING 1503 /* "working" */
-#define ISC_MSG_EXECUTE 1504 /* "execute action" */
-#define ISC_MSG_EMPTY 1505 /* "empty" */
-#define ISC_MSG_DONE 1506 /* "done" */
-#define ISC_MSG_QUANTUM 1507 /* "quantum" */
-
-#define ISC_MSG_SCHEDULE 1601 /* "schedule" */
-#define ISC_MSG_SIGNALSCHED 1602 /* "signal (schedule)" */
-#define ISC_MSG_SIGNALDESCHED 1603 /* "signal (deschedule)" */
-#define ISC_MSG_SIGNALDESTROY 1604 /* "signal (destroy)" */
-#define ISC_MSG_IDLERESCHED 1605 /* "idle reschedule" */
-#define ISC_MSG_EVENTNOTALLOC 1606 /* "couldn't allocate event" */
-#define ISC_MSG_SCHEDFAIL 1607 /* "couldn't schedule timer: %u" */
-#define ISC_MSG_POSTING 1608 /* "posting" */
-#define ISC_MSG_WAKEUP 1609 /* "wakeup" */
-
-#define ISC_MSG_LOCK 1701 /* "LOCK" */
-#define ISC_MSG_LOCKING 1702 /* "LOCKING" */
-#define ISC_MSG_LOCKED 1703 /* "LOCKED" */
-#define ISC_MSG_UNLOCKED 1704 /* "UNLOCKED" */
-#define ISC_MSG_RWLOCK 1705 /* "RWLOCK" */
-#define ISC_MSG_RWLOCKED 1706 /* "RWLOCKED" */
-#define ISC_MSG_RWUNLOCK 1707 /* "RWUNLOCK" */
-#define ISC_MSG_BROADCAST 1708 /* "BROADCAST" */
-#define ISC_MSG_SIGNAL 1709 /* "SIGNAL" */
-#define ISC_MSG_UTILWAIT 1710 /* "WAIT" */
-#define ISC_MSG_WAITED 1711 /* "WAITED" */
-
-#define ISC_MSG_GETIFADDRS 1801 /* "getting interface addresses: ..." */
-
+#define ISC_MSG_FAILED 101 /*%< "failed" */
+#define ISC_MSG_SUCCEEDED 102 /*%< Compatible with "failed" */
+#define ISC_MSG_SUCCESS 103 /*%< More usual way to say "success" */
+#define ISC_MSG_STARTING 104 /*%< As in "daemon: starting" */
+#define ISC_MSG_STOPING 105 /*%< As in "daemon: stopping" */
+#define ISC_MSG_ENTERING 106 /*%< As in "some_subr: entering" */
+#define ISC_MSG_EXITING 107 /*%< As in "some_subr: exiting" */
+#define ISC_MSG_CALLING 108 /*%< As in "calling some_subr()" */
+#define ISC_MSG_RETURNED 109 /*%< As in "some_subr: returned <foo>" */
+#define ISC_MSG_FATALERROR 110 /*%< "fatal error" */
+#define ISC_MSG_SHUTTINGDOWN 111 /*%< "shutting down" */
+#define ISC_MSG_RUNNING 112 /*%< "running" */
+#define ISC_MSG_WAIT 113 /*%< "wait" */
+#define ISC_MSG_WAITUNTIL 114 /*%< "waituntil" */
+
+#define ISC_MSG_SIGNALSETUP 201 /*%< "handle_signal() %d setup: %s" */
+
+#define ISC_MSG_ILLEGALOPT 301 /*%< "illegal option" */
+#define ISC_MSG_OPTNEEDARG 302 /*%< "option requires an argument" */
+
+#define ISC_MSG_ENTROPYSTATS 401 /*%< "Entropy pool %p: refcnt %u ..." */
+
+#define ISC_MSG_MAKESCANSOCKET 501 /*%< "making interface scan socket: %s" */
+#define ISC_MSG_GETIFCONFIG 502 /*%< "get interface configuration: %s" */
+#define ISC_MSG_BUFFERMAX 503 /*%< "... maximum buffer size exceeded" */
+#define ISC_MSG_GETDESTADDR 504 /*%< "%s: getting destination address: %s" */
+#define ISC_MSG_GETNETMASK 505 /*%< "%s: getting netmask: %s" */
+
+#define ISC_MSG_GETIFLISTSIZE 601 /*%< "getting interface list size: ..." */
+#define ISC_MSG_GETIFLIST 602 /*%< "getting interface list: ..." */
+#define ISC_MSG_UNEXPECTEDTYPE 603 /*%< "... unexpected ... message type" */
+
+#define ISC_MSG_UNEXPECTEDSTATE 701 /*%< "Unexpected state %d" */
+
+#define ISC_MSG_BADTIME 801 /*%< "Bad 00 99:99:99.999 " */
+#define ISC_MSG_LEVEL 802 /*%< "level %d: " */
+
+#define ISC_MSG_ADDTRACE 901 /*%< "add %p size %u " */
+#define ISC_MSG_DELTRACE 902 /*%< "del %p size %u " */
+#define ISC_MSG_POOLSTATS 903 /*%< "[Pool statistics]\n" */
+#define ISC_MSG_POOLNAME 904 /*%< "name" */
+#define ISC_MSG_POOLSIZE 905 /*%< "size" */
+#define ISC_MSG_POOLMAXALLOC 906 /*%< "maxalloc" */
+#define ISC_MSG_POOLALLOCATED 907 /*%< "allocated" */
+#define ISC_MSG_POOLFREECOUNT 908 /*%< "freecount" */
+#define ISC_MSG_POOLFREEMAX 909 /*%< "freemax" */
+#define ISC_MSG_POOLFILLCOUNT 910 /*%< "fillcount" */
+#define ISC_MSG_POOLGETS 911 /*%< "gets" */
+#define ISC_MSG_DUMPALLOC 912 /*%< "DUMP OF ALL OUTSTANDING MEMORY ..." */
+#define ISC_MSG_NONE 913 /*%< "\tNone.\n" */
+#define ISC_MSG_PTRFILELINE 914 /*%< "\tptr %p file %s line %u\n" */
+
+#define ISC_MSG_UNKNOWNADDR 1001 /*%< "<unknown address, family %u>" */
+
+#define ISC_MSG_NOLONGDBL 1104 /*%< "long doubles are not supported" */
+
+#define ISC_MSG_PRINTLOCK 1201 /*%< "rwlock %p thread %lu ..." */
+#define ISC_MSG_READ 1202 /*%< "read" */
+#define ISC_MSG_WRITE 1203 /*%< "write" */
+#define ISC_MSG_READING 1204 /*%< "reading" */
+#define ISC_MSG_WRITING 1205 /*%< "writing" */
+#define ISC_MSG_PRELOCK 1206 /*%< "prelock" */
+#define ISC_MSG_POSTLOCK 1207 /*%< "postlock" */
+#define ISC_MSG_PREUNLOCK 1208 /*%< "preunlock" */
+#define ISC_MSG_POSTUNLOCK 1209 /*%< "postunlock" */
+
+#define ISC_MSG_UNKNOWNFAMILY 1301 /*%< "unknown address family: %d" */
+
+#define ISC_MSG_WRITEFAILED 1401 /*%< "write() failed during watcher ..." */
+#define ISC_MSG_READFAILED 1402 /*%< "read() failed during watcher ... " */
+#define ISC_MSG_PROCESSCMSG 1403 /*%< "processing cmsg %p" */
+#define ISC_MSG_IFRECEIVED 1404 /*%< "interface received on ifindex %u" */
+#define ISC_MSG_SENDTODATA 1405 /*%< "sendto pktinfo data, ifindex %u" */
+#define ISC_MSG_DOIORECV 1406 /*%< "doio_recv: recvmsg(%d) %d bytes ..." */
+#define ISC_MSG_PKTRECV 1407 /*%< "packet received correctly" */
+#define ISC_MSG_DESTROYING 1408 /*%< "destroying" */
+#define ISC_MSG_CREATED 1409 /*%< "created" */
+#define ISC_MSG_ACCEPTLOCK 1410 /*%< "internal_accept called, locked ..." */
+#define ISC_MSG_ACCEPTEDCXN 1411 /*%< "accepted connection, new socket %p" */
+#define ISC_MSG_INTERNALRECV 1412 /*%< "internal_recv: task %p got event %p" */
+#define ISC_MSG_INTERNALSEND 1413 /*%< "internal_send: task %p got event %p" */
+#define ISC_MSG_WATCHERMSG 1414 /*%< "watcher got message %d" */
+#define ISC_MSG_SOCKETSREMAIN 1415 /*%< "sockets exist" */
+#define ISC_MSG_PKTINFOPROVIDED 1416 /*%< "pktinfo structure provided, ..." */
+#define ISC_MSG_BOUND 1417 /*%< "bound" */
+#define ISC_MSG_ACCEPTRETURNED 1418 /*%< accept() returned %d/%s */
+#define ISC_MSG_TOOMANYFDS 1419 /*%< %s: too many open file descriptors */
+#define ISC_MSG_ZEROPORT 1420 /*%< dropping source port zero packet */
+#define ISC_MSG_FILTER 1420 /*%< setsockopt(SO_ACCEPTFILTER): %s */
+
+#define ISC_MSG_AWAKE 1502 /*%< "awake" */
+#define ISC_MSG_WORKING 1503 /*%< "working" */
+#define ISC_MSG_EXECUTE 1504 /*%< "execute action" */
+#define ISC_MSG_EMPTY 1505 /*%< "empty" */
+#define ISC_MSG_DONE 1506 /*%< "done" */
+#define ISC_MSG_QUANTUM 1507 /*%< "quantum" */
+
+#define ISC_MSG_SCHEDULE 1601 /*%< "schedule" */
+#define ISC_MSG_SIGNALSCHED 1602 /*%< "signal (schedule)" */
+#define ISC_MSG_SIGNALDESCHED 1603 /*%< "signal (deschedule)" */
+#define ISC_MSG_SIGNALDESTROY 1604 /*%< "signal (destroy)" */
+#define ISC_MSG_IDLERESCHED 1605 /*%< "idle reschedule" */
+#define ISC_MSG_EVENTNOTALLOC 1606 /*%< "couldn't allocate event" */
+#define ISC_MSG_SCHEDFAIL 1607 /*%< "couldn't schedule timer: %u" */
+#define ISC_MSG_POSTING 1608 /*%< "posting" */
+#define ISC_MSG_WAKEUP 1609 /*%< "wakeup" */
+
+#define ISC_MSG_LOCK 1701 /*%< "LOCK" */
+#define ISC_MSG_LOCKING 1702 /*%< "LOCKING" */
+#define ISC_MSG_LOCKED 1703 /*%< "LOCKED" */
+#define ISC_MSG_UNLOCKED 1704 /*%< "UNLOCKED" */
+#define ISC_MSG_RWLOCK 1705 /*%< "RWLOCK" */
+#define ISC_MSG_RWLOCKED 1706 /*%< "RWLOCKED" */
+#define ISC_MSG_RWUNLOCK 1707 /*%< "RWUNLOCK" */
+#define ISC_MSG_BROADCAST 1708 /*%< "BROADCAST" */
+#define ISC_MSG_SIGNAL 1709 /*%< "SIGNAL" */
+#define ISC_MSG_UTILWAIT 1710 /*%< "WAIT" */
+#define ISC_MSG_WAITED 1711 /*%< "WAITED" */
+
+#define ISC_MSG_GETIFADDRS 1801 /*%< "getting interface addresses: ..." */
+
+/*@}*/
#endif /* ISC_MSGS_H */
diff --git a/contrib/bind9/lib/isc/include/isc/mutexblock.h b/contrib/bind9/lib/isc/include/isc/mutexblock.h
index 9bfd90c..fa244c9 100644
--- a/contrib/bind9/lib/isc/include/isc/mutexblock.h
+++ b/contrib/bind9/lib/isc/include/isc/mutexblock.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mutexblock.h,v 1.10.206.1 2004/03/06 08:14:44 marka Exp $ */
+/* $Id: mutexblock.h,v 1.11.18.2 2005/04/29 00:17:00 marka Exp $ */
#ifndef ISC_MUTEXBLOCK_H
#define ISC_MUTEXBLOCK_H 1
+/*! \file */
+
#include <isc/lang.h>
#include <isc/mutex.h>
#include <isc/types.h>
@@ -28,39 +30,39 @@ ISC_LANG_BEGINDECLS
isc_result_t
isc_mutexblock_init(isc_mutex_t *block, unsigned int count);
-/*
+/*%<
* Initialize a block of locks. If an error occurs all initialized locks
* will be destroyed, if possible.
*
* Requires:
*
- * block != NULL
+ *\li block != NULL
*
- * count > 0
+ *\li count > 0
*
* Returns:
*
- * Any code isc_mutex_init() can return is a valid return for this
+ *\li Any code isc_mutex_init() can return is a valid return for this
* function.
*/
isc_result_t
isc_mutexblock_destroy(isc_mutex_t *block, unsigned int count);
-/*
+/*%<
* Destroy a block of locks.
*
* Requires:
*
- * block != NULL
+ *\li block != NULL
*
- * count > 0
+ *\li count > 0
*
- * Each lock in the block be initialized via isc_mutex_init() or
+ *\li Each lock in the block be initialized via isc_mutex_init() or
* the whole block was initialized via isc_mutex_initblock().
*
* Returns:
*
- * Any code isc_mutex_init() can return is a valid return for this
+ *\li Any code isc_mutex_init() can return is a valid return for this
* function.
*/
diff --git a/contrib/bind9/lib/isc/include/isc/netaddr.h b/contrib/bind9/lib/isc/include/isc/netaddr.h
index ad3328c..06d063e 100644
--- a/contrib/bind9/lib/isc/include/isc/netaddr.h
+++ b/contrib/bind9/lib/isc/include/isc/netaddr.h
@@ -15,15 +15,22 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: netaddr.h,v 1.18.12.9 2005/07/29 00:13:10 marka Exp $ */
+/* $Id: netaddr.h,v 1.25.18.5 2005/07/28 04:58:47 marka Exp $ */
#ifndef ISC_NETADDR_H
#define ISC_NETADDR_H 1
+/*! \file */
+
#include <isc/lang.h>
#include <isc/net.h>
#include <isc/types.h>
+#ifdef ISC_PLATFORM_HAVESYSUNH
+#include <sys/types.h>
+#include <sys/un.h>
+#endif
+
ISC_LANG_BEGINDECLS
struct isc_netaddr {
@@ -31,6 +38,9 @@ struct isc_netaddr {
union {
struct in_addr in;
struct in6_addr in6;
+#ifdef ISC_PLATFORM_HAVESYSUNH
+ char un[sizeof(((struct sockaddr_un *)0)->sun_path)];
+#endif
} type;
isc_uint32_t zone;
};
@@ -41,40 +51,40 @@ isc_netaddr_equal(const isc_netaddr_t *a, const isc_netaddr_t *b);
isc_boolean_t
isc_netaddr_eqprefix(const isc_netaddr_t *a, const isc_netaddr_t *b,
unsigned int prefixlen);
-/*
+/*%<
* Compare the 'prefixlen' most significant bits of the network
- * addresses 'a' and 'b'. Return ISC_TRUE if they are equal,
- * ISC_FALSE if not.
+ * addresses 'a' and 'b'. Return #ISC_TRUE if they are equal,
+ * #ISC_FALSE if not.
*/
isc_result_t
isc_netaddr_masktoprefixlen(const isc_netaddr_t *s, unsigned int *lenp);
-/*
+/*%<
* Convert a netmask in 's' into a prefix length in '*lenp'.
* The mask should consist of zero or more '1' bits in the most
* most significant part of the address, followed by '0' bits.
- * If this is not the case, ISC_R_MASKNONCONTIG is returned.
+ * If this is not the case, #ISC_R_MASKNONCONTIG is returned.
*
* Returns:
- * ISC_R_SUCCESS
- * ISC_R_MASKNONCONTIG
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_MASKNONCONTIG
*/
isc_result_t
isc_netaddr_totext(const isc_netaddr_t *netaddr, isc_buffer_t *target);
-/*
+/*%<
* Append a text representation of 'sockaddr' to the buffer 'target'.
* The text is NOT null terminated. Handles IPv4 and IPv6 addresses.
*
* Returns:
- * ISC_R_SUCCESS
- * ISC_R_NOSPACE The text or the null termination did not fit.
- * ISC_R_FAILURE Unspecified failure
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_NOSPACE The text or the null termination did not fit.
+ *\li #ISC_R_FAILURE Unspecified failure
*/
void
isc_netaddr_format(const isc_netaddr_t *na, char *array, unsigned int size);
-/*
+/*%<
* Format a human-readable representation of the network address '*na'
* into the character array 'array', which is of size 'size'.
* The resulting string is guaranteed to be null-terminated.
@@ -82,7 +92,7 @@ isc_netaddr_format(const isc_netaddr_t *na, char *array, unsigned int size);
#define ISC_NETADDR_FORMATSIZE \
sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:XXX.XXX.XXX.XXX%SSSSSSSSSS")
-/*
+/*%<
* Minimum size of array to pass to isc_netaddr_format().
*/
@@ -95,6 +105,9 @@ isc_netaddr_fromin(isc_netaddr_t *netaddr, const struct in_addr *ina);
void
isc_netaddr_fromin6(isc_netaddr_t *netaddr, const struct in6_addr *ina6);
+isc_result_t
+isc_netaddr_frompath(isc_netaddr_t *netaddr, const char *path);
+
void
isc_netaddr_setzone(isc_netaddr_t *netaddr, isc_uint32_t zone);
@@ -103,46 +116,59 @@ isc_netaddr_getzone(const isc_netaddr_t *netaddr);
void
isc_netaddr_any(isc_netaddr_t *netaddr);
-/*
+/*%<
* Return the IPv4 wildcard address.
*/
void
isc_netaddr_any6(isc_netaddr_t *netaddr);
-/*
+/*%<
* Return the IPv6 wildcard address.
*/
isc_boolean_t
isc_netaddr_ismulticast(isc_netaddr_t *na);
-/*
+/*%<
* Returns ISC_TRUE if the address is a multicast address.
*/
isc_boolean_t
isc_netaddr_isexperimental(isc_netaddr_t *na);
-/*
+/*%<
* Returns ISC_TRUE if the address is a experimental (CLASS E) address.
*/
isc_boolean_t
isc_netaddr_islinklocal(isc_netaddr_t *na);
-/*
- * Returns ISC_TRUE if the address is a link local address.
+/*%<
+ * Returns #ISC_TRUE if the address is a link local address.
*/
isc_boolean_t
isc_netaddr_issitelocal(isc_netaddr_t *na);
-/*
- * Returns ISC_TRUE if the address is a site local address.
+/*%<
+ * Returns #ISC_TRUE if the address is a site local address.
*/
void
isc_netaddr_fromv4mapped(isc_netaddr_t *t, const isc_netaddr_t *s);
-/*
+/*%<
* Convert an IPv6 v4mapped address into an IPv4 address.
*/
+isc_result_t
+isc_netaddr_prefixok(const isc_netaddr_t *na, unsigned int prefixlen);
+/*
+ * Test whether the netaddr 'na' and 'prefixlen' are consistant.
+ * e.g. prefixlen within range.
+ * na does not have bits set which are not covered by the prefixlen.
+ *
+ * Returns:
+ * ISC_R_SUCCESS
+ * ISC_R_RANGE prefixlen out of range
+ * ISC_R_NOTIMPLENTED unsupported family
+ * ISC_R_FAILURE extra bits.
+ */
ISC_LANG_ENDDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/netscope.h b/contrib/bind9/lib/isc/include/isc/netscope.h
index 7cc0f18..d9bea54 100644
--- a/contrib/bind9/lib/isc/include/isc/netscope.h
+++ b/contrib/bind9/lib/isc/include/isc/netscope.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,22 +15,25 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: netscope.h,v 1.4.142.5 2004/03/08 09:04:52 marka Exp $ */
+/* $Id: netscope.h,v 1.5.18.2 2005/04/29 00:17:00 marka Exp $ */
#ifndef ISC_NETSCOPE_H
#define ISC_NETSCOPE_H 1
+/*! \file */
+
ISC_LANG_BEGINDECLS
-/*
+/*%
* Convert a string of an IPv6 scope zone to zone index. If the conversion
* succeeds, 'zoneid' will store the index value.
+ *
* XXXJT: when a standard interface for this purpose is defined,
* we should use it.
*
* Returns:
- * ISC_R_SUCCESS: conversion succeeds
- * ISC_R_FAILURE: conversion fails
+ * \li ISC_R_SUCCESS: conversion succeeds
+ * \li ISC_R_FAILURE: conversion fails
*/
isc_result_t
isc_netscope_pton(int af, char *scopename, void *addr, isc_uint32_t *zoneid);
diff --git a/contrib/bind9/lib/isc/include/isc/ondestroy.h b/contrib/bind9/lib/isc/include/isc/ondestroy.h
index a2c584a..035873c 100644
--- a/contrib/bind9/lib/isc/include/isc/ondestroy.h
+++ b/contrib/bind9/lib/isc/include/isc/ondestroy.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ondestroy.h,v 1.7.206.1 2004/03/06 08:14:45 marka Exp $ */
+/* $Id: ondestroy.h,v 1.8.18.2 2005/04/29 00:17:00 marka Exp $ */
#ifndef ISC_ONDESTROY_H
#define ISC_ONDESTROY_H 1
@@ -25,33 +25,39 @@
ISC_LANG_BEGINDECLS
-/*
+/*! \file
* ondestroy handling.
*
* Any class ``X'' of objects that wants to send out notifications
* on its destruction should declare a field of type isc_ondestroy_t
* (call it 'ondest').
*
+ * \code
* typedef struct {
* ...
* isc_ondestroy_t ondest;
* ...
* } X;
+ * \endcode
*
* When an object ``A'' of type X is created
* it must initialize the field ondest with a call to
*
+ * \code
* isc_ondestroy_init(&A->ondest).
+ * \endcode
*
* X should also provide a registration function for third-party
* objects to call to register their interest in being told about
* the destruction of a particular instance of X.
*
+ * \code
* isc_result_t
* X_ondestroy(X *instance, isc_task_t *task,
* isc_event_t **eventp) {
* return(isc_ondestroy_register(&instance->ondest, task,eventp));
* }
+ * \endcode
*
* Note: locking of the ondestory structure embedded inside of X, is
* X's responsibility.
@@ -59,15 +65,17 @@ ISC_LANG_BEGINDECLS
* When an instance of X is destroyed, a call to isc_ondestroy_notify()
* sends the notifications:
*
+ * \code
* X *instance;
* isc_ondestroy_t ondest = instance->ondest;
*
* ... completely cleanup 'instance' here...
*
* isc_ondestroy_notify(&ondest, instance);
+ * \endcode
*
*
- * see dns/zone.c for an ifdef'd-out example.
+ * see lib/dns/zone.c for an ifdef'd-out example.
*/
struct isc_ondestroy {
@@ -77,7 +85,7 @@ struct isc_ondestroy {
void
isc_ondestroy_init(isc_ondestroy_t *ondest);
-/*
+/*%<
* Initialize the on ondest structure. *must* be called before first call
* to isc_ondestroy_register().
*/
@@ -86,7 +94,7 @@ isc_result_t
isc_ondestroy_register(isc_ondestroy_t *ondest, isc_task_t *task,
isc_event_t **eventp);
-/*
+/*%<
* Stores task and *eventp away inside *ondest. Ownership of **event is
* taken from the caller (and *eventp is set to NULL). The task is attached
* to.
@@ -94,7 +102,7 @@ isc_ondestroy_register(isc_ondestroy_t *ondest, isc_task_t *task,
void
isc_ondestroy_notify(isc_ondestroy_t *ondest, void *sender);
-/*
+/*%<
* Dispatches the event(s) to the task(s) that were given in
* isc_ondestroy_register call(s) (done via calls to
* isc_task_sendanddetach()). Before dispatch, the sender value of each
diff --git a/contrib/bind9/lib/isc/include/isc/os.h b/contrib/bind9/lib/isc/include/isc/os.h
index 5c3bd62..b2b76d5 100644
--- a/contrib/bind9/lib/isc/include/isc/os.h
+++ b/contrib/bind9/lib/isc/include/isc/os.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,18 +15,20 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: os.h,v 1.5.206.1 2004/03/06 08:14:45 marka Exp $ */
+/* $Id: os.h,v 1.6.18.2 2005/04/29 00:17:00 marka Exp $ */
#ifndef ISC_OS_H
#define ISC_OS_H 1
+/*! \file */
+
#include <isc/lang.h>
ISC_LANG_BEGINDECLS
unsigned int
isc_os_ncpus(void);
-/*
+/*%<
* Return the number of CPUs available on the system, or 1 if this cannot
* be determined.
*/
diff --git a/contrib/bind9/lib/isc/include/isc/parseint.h b/contrib/bind9/lib/isc/include/isc/parseint.h
index c877131..6940add 100644
--- a/contrib/bind9/lib/isc/include/isc/parseint.h
+++ b/contrib/bind9/lib/isc/include/isc/parseint.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001, 2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: parseint.h,v 1.2.202.4 2004/03/08 09:04:52 marka Exp $ */
+/* $Id: parseint.h,v 1.3.18.2 2005/04/29 00:17:00 marka Exp $ */
#ifndef ISC_PARSEINT_H
#define ISC_PARSEINT_H 1
@@ -23,8 +23,8 @@
#include <isc/lang.h>
#include <isc/types.h>
-/*
- * Parse integers, in a saner way than atoi() or strtoul() do.
+/*! \file
+ * \brief Parse integers, in a saner way than atoi() or strtoul() do.
*/
/***
@@ -41,21 +41,22 @@ isc_parse_uint16(isc_uint16_t *uip, const char *string, int base);
isc_result_t
isc_parse_uint8(isc_uint8_t *uip, const char *string, int base);
-/*
+/*%<
* Parse the null-terminated string 'string' containing a base 'base'
- * integer, storing the result in '*uip'. The base is interpreted
+ * integer, storing the result in '*uip'.
+ * The base is interpreted
* as in strtoul(). Unlike strtoul(), leading whitespace, minus or
* plus signs are not accepted, and all errors (including overflow)
* are reported uniformly through the return value.
*
* Requires:
- * 'string' points to a null-terminated string
- * 0 <= 'base' <= 36
+ *\li 'string' points to a null-terminated string
+ *\li 0 <= 'base' <= 36
*
* Returns:
- * ISC_R_SUCCESS
- * ISC_R_BADNUMBER The string is not numeric (in the given base)
- * ISC_R_RANGE The number is not representable as the requested type.
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_BADNUMBER The string is not numeric (in the given base)
+ *\li #ISC_R_RANGE The number is not representable as the requested type.
*/
ISC_LANG_ENDDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/platform.h.in b/contrib/bind9/lib/isc/include/isc/platform.h.in
index 7a803d7..f74fb19 100644
--- a/contrib/bind9/lib/isc/include/isc/platform.h.in
+++ b/contrib/bind9/lib/isc/include/isc/platform.h.in
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: platform.h.in,v 1.24.2.1.10.11 2004/03/08 09:04:52 marka Exp $ */
+/* $Id: platform.h.in,v 1.34.18.7 2007/02/13 00:04:50 marka Exp $ */
#ifndef ISC_PLATFORM_H
#define ISC_PLATFORM_H 1
+/*! \file */
+
/*****
***** Platform-dependent defines.
*****/
@@ -28,195 +30,239 @@
*** Network.
***/
-/*
+/*! \brief
* Define if this system needs the <netinet/in6.h> header file included
* for full IPv6 support (pretty much only UnixWare).
*/
@ISC_PLATFORM_NEEDNETINETIN6H@
-/*
+/*! \brief
* Define if this system needs the <netinet6/in6.h> header file included
* to support in6_pkinfo (pretty much only BSD/OS).
*/
@ISC_PLATFORM_NEEDNETINET6IN6H@
-/*
+/*! \brief
* If sockaddrs on this system have an sa_len field, ISC_PLATFORM_HAVESALEN
* will be defined.
*/
@ISC_PLATFORM_HAVESALEN@
-/*
+/*! \brief
* If this system has the IPv6 structure definitions, ISC_PLATFORM_HAVEIPV6
* will be defined.
*/
@ISC_PLATFORM_HAVEIPV6@
-/*
+/*! \brief
* If this system is missing in6addr_any, ISC_PLATFORM_NEEDIN6ADDRANY will
* be defined.
*/
@ISC_PLATFORM_NEEDIN6ADDRANY@
-/*
+/*! \brief
* If this system is missing in6addr_loopback, ISC_PLATFORM_NEEDIN6ADDRLOOPBACK
* will be defined.
*/
@ISC_PLATFORM_NEEDIN6ADDRLOOPBACK@
-/*
+/*! \brief
* If this system has in6_pktinfo, ISC_PLATFORM_HAVEIN6PKTINFO will be
* defined.
*/
@ISC_PLATFORM_HAVEIN6PKTINFO@
-/*
+/*! \brief
* If this system has in_addr6, rather than in6_addr, ISC_PLATFORM_HAVEINADDR6
* will be defined.
*/
@ISC_PLATFORM_HAVEINADDR6@
-/*
+/*! \brief
* If this system has sin6_scope_id, ISC_PLATFORM_HAVESCOPEID will be defined.
*/
@ISC_PLATFORM_HAVESCOPEID@
-/*
+/*! \brief
* If this system needs inet_ntop(), ISC_PLATFORM_NEEDNTOP will be defined.
*/
@ISC_PLATFORM_NEEDNTOP@
-/*
+/*! \brief
* If this system needs inet_pton(), ISC_PLATFORM_NEEDPTON will be defined.
*/
@ISC_PLATFORM_NEEDPTON@
-/*
+/*! \brief
* If this system needs inet_aton(), ISC_PLATFORM_NEEDATON will be defined.
*/
@ISC_PLATFORM_NEEDATON@
-/*
+/*! \brief
* If this system needs in_port_t, ISC_PLATFORM_NEEDPORTT will be defined.
*/
@ISC_PLATFORM_NEEDPORTT@
-/*
+/*! \brief
* If the system needs strsep(), ISC_PLATFORM_NEEDSTRSEP will be defined.
*/
@ISC_PLATFORM_NEEDSTRSEP@
-/*
+/*! \brief
* If the system needs strlcpy(), ISC_PLATFORM_NEEDSTRLCPY will be defined.
*/
@ISC_PLATFORM_NEEDSTRLCPY@
-/*
+/*! \brief
* If the system needs strlcat(), ISC_PLATFORM_NEEDSTRLCAT will be defined.
*/
@ISC_PLATFORM_NEEDSTRLCAT@
-/*
+/*! \brief
* Define either ISC_PLATFORM_BSD44MSGHDR or ISC_PLATFORM_BSD43MSGHDR.
*/
@ISC_PLATFORM_MSGHDRFLAVOR@
-/*
+/*! \brief
* Define if PTHREAD_ONCE_INIT should be surrounded by braces to
* prevent compiler warnings (such as with gcc on Solaris 2.8).
*/
@ISC_PLATFORM_BRACEPTHREADONCEINIT@
-/*
+/*! \brief
* Define on some UnixWare systems to fix erroneous definitions of various
* IN6_IS_ADDR_* macros.
*/
@ISC_PLATFORM_FIXIN6ISADDR@
-/***
+/*
*** Printing.
***/
-/*
+/*! \brief
* If this system needs vsnprintf() and snprintf(), ISC_PLATFORM_NEEDVSNPRINTF
* will be defined.
*/
@ISC_PLATFORM_NEEDVSNPRINTF@
-/*
+/*! \brief
* If this system need a modern sprintf() that returns (int) not (char*).
*/
@ISC_PLATFORM_NEEDSPRINTF@
-/*
+/*! \brief
* The printf format string modifier to use with isc_uint64_t values.
*/
@ISC_PLATFORM_QUADFORMAT@
-/*
+/*! \brief
* Defined if we are using threads.
*/
@ISC_PLATFORM_USETHREADS@
-/*
+/*! \brief
* Defined if unistd.h does not cause fd_set to be delared.
*/
@ISC_PLATFORM_NEEDSYSSELECTH@
-/*
+/*! \brief
* Type used for resource limits.
*/
@ISC_PLATFORM_RLIMITTYPE@
-/*
+/*! \brief
* Define if your compiler supports "long long int".
*/
@ISC_PLATFORM_HAVELONGLONG@
-/*
+/*! \brief
* Define if the system has struct lifconf which is a extended struct ifconf
* for IPv6.
*/
@ISC_PLATFORM_HAVELIFCONF@
-/*
+/*! \brief
* Define if the system has struct if_laddrconf which is a extended struct
* ifconf for IPv6.
*/
@ISC_PLATFORM_HAVEIF_LADDRCONF@
-/*
+/*! \brief
* Define if the system has struct if_laddrreq.
*/
@ISC_PLATFORM_HAVEIF_LADDRREQ@
-/*
+/*! \brief
* Used to control how extern data is linked; needed for Win32 platforms.
*/
@ISC_PLATFORM_USEDECLSPEC@
-/*
+/*! \brief
* Define if the system supports if_nametoindex.
*/
@ISC_PLATFORM_HAVEIFNAMETOINDEX@
-/*
+/*! \brief
* Define if this system needs strtoul.
*/
@ISC_PLATFORM_NEEDSTRTOUL@
-/*
+/*! \brief
* Define if this system needs memmove.
*/
@ISC_PLATFORM_NEEDMEMMOVE@
+/*
+ * Define if the platform has <sys/un.h>.
+ */
+@ISC_PLATFORM_HAVESYSUNH@
+
+/*
+ * If the "xadd" operation is available on this architecture,
+ * ISC_PLATFORM_HAVEXADD will be defined.
+ */
+@ISC_PLATFORM_HAVEXADD@
+
+/*
+ * If the "atomic swap" operation is available on this architecture,
+ * ISC_PLATFORM_HAVEATOMICSTORE" will be defined.
+ */
+@ISC_PLATFORM_HAVEATOMICSTORE@
+
+/*
+ * If the "compare-and-exchange" operation is available on this architecture,
+ * ISC_PLATFORM_HAVECMPXCHG will be defined.
+ */
+@ISC_PLATFORM_HAVECMPXCHG@
+
+/*
+ * Define if gcc ASM extension is available
+ */
+@ISC_PLATFORM_USEGCCASM@
+
+/*
+ * Define if Tru64 style ASM syntax must be used.
+ */
+@ISC_PLATFORM_USEOSFASM@
+
+/*
+ * Define if the standard __asm function must be used.
+ */
+@ISC_PLATFORM_USESTDASM@
+
+/*
+ * Define if MacOS style of PPC assembly must be used.
+ * e.g. "r6", not "6", for register six.
+ */
+@ISC_PLATFORM_USEMACASM@
+
#ifndef ISC_PLATFORM_USEDECLSPEC
#define LIBISC_EXTERNAL_DATA
#define LIBDNS_EXTERNAL_DATA
#define LIBISCCC_EXTERNAL_DATA
#define LIBISCCFG_EXTERNAL_DATA
#define LIBBIND9_EXTERNAL_DATA
-#else /* ISC_PLATFORM_USEDECLSPEC */
+#else /*! \brief ISC_PLATFORM_USEDECLSPEC */
#ifdef LIBISC_EXPORTS
#define LIBISC_EXTERNAL_DATA __declspec(dllexport)
#else
@@ -242,7 +288,7 @@
#else
#define LIBBIND9_EXTERNAL_DATA __declspec(dllimport)
#endif
-#endif /* ISC_PLATFORM_USEDECLSPEC */
+#endif /*! \brief ISC_PLATFORM_USEDECLSPEC */
/*
* Tell emacs to use C mode for this file.
diff --git a/contrib/bind9/lib/isc/include/isc/print.h b/contrib/bind9/lib/isc/include/isc/print.h
index 1bf3704..95c6b1c 100644
--- a/contrib/bind9/lib/isc/include/isc/print.h
+++ b/contrib/bind9/lib/isc/include/isc/print.h
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: print.h,v 1.17.188.4 2005/06/09 23:54:30 marka Exp $ */
+/* $Id: print.h,v 1.19.18.3 2005/06/08 02:07:56 marka Exp $ */
#ifndef ISC_PRINT_H
#define ISC_PRINT_H 1
+/*! \file */
+
/***
*** Imports
***/
@@ -28,7 +30,7 @@
#include <isc/lang.h>
#include <isc/platform.h>
-/*
+/*!
* This block allows lib/isc/print.c to be cleanly compiled even if
* the platform does not need it. The standard Makefile will still
* not compile print.c or archive print.o, so this is just to make test
diff --git a/contrib/bind9/lib/isc/include/isc/quota.h b/contrib/bind9/lib/isc/include/isc/quota.h
index 4044118..6f95cd5 100644
--- a/contrib/bind9/lib/isc/include/isc/quota.h
+++ b/contrib/bind9/lib/isc/include/isc/quota.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: quota.h,v 1.8.12.6 2005/08/11 15:00:08 marka Exp $ */
+/* $Id: quota.h,v 1.10.18.4 2005/08/11 15:01:54 marka Exp $ */
#ifndef ISC_QUOTA_H
#define ISC_QUOTA_H 1
@@ -24,10 +24,9 @@
***** Module Info
*****/
-/*
- * Quota
+/*! \file isc/quota.h
*
- * The isc_quota_t object is a simple helper object for implementing
+ * \brief The isc_quota_t object is a simple helper object for implementing
* quotas on things like the number of simultaneous connections to
* a server. It keeps track of the amount of quota in use, and
* encapsulates the locking necessary to allow multiple tasks to
@@ -48,9 +47,9 @@
ISC_LANG_BEGINDECLS
+/*% isc_quota structure */
struct isc_quota {
- isc_mutex_t lock;
- /* Locked by lock. */
+ isc_mutex_t lock; /*%< Locked by lock. */
int max;
int used;
int soft;
@@ -58,7 +57,7 @@ struct isc_quota {
isc_result_t
isc_quota_init(isc_quota_t *quota, int max);
-/*
+/*%<
* Initialize a quota object.
*
* Returns:
@@ -68,49 +67,49 @@ isc_quota_init(isc_quota_t *quota, int max);
void
isc_quota_destroy(isc_quota_t *quota);
-/*
+/*%<
* Destroy a quota object.
*/
void
isc_quota_soft(isc_quota_t *quota, int soft);
-/*
- * Turn on/off soft quotas.
+/*%<
+ * Set a soft quota.
*/
void
isc_quota_max(isc_quota_t *quota, int max);
-/*
+/*%<
* Re-set a maximum quota.
*/
isc_result_t
isc_quota_reserve(isc_quota_t *quota);
-/*
+/*%<
* Attempt to reserve one unit of 'quota'.
*
* Returns:
- * ISC_R_SUCCESS Success
- * ISC_R_SOFTQUOTA Success soft quota reached
- * ISC_R_QUOTA Quota is full
+ * \li #ISC_R_SUCCESS Success
+ * \li #ISC_R_SOFTQUOTA Success soft quota reached
+ * \li #ISC_R_QUOTA Quota is full
*/
void
isc_quota_release(isc_quota_t *quota);
-/*
+/*%<
* Release one unit of quota.
*/
isc_result_t
isc_quota_attach(isc_quota_t *quota, isc_quota_t **p);
-/*
+/*%<
* Like isc_quota_reserve, and also attaches '*p' to the
* quota if successful (ISC_R_SUCCESS or ISC_R_SOFTQUOTA).
*/
void
isc_quota_detach(isc_quota_t **p);
-/*
+/*%<
* Like isc_quota_release, and also detaches '*p' from the
* quota.
*/
diff --git a/contrib/bind9/lib/isc/include/isc/random.h b/contrib/bind9/lib/isc/include/isc/random.h
index ee416c5..c5cef8b 100644
--- a/contrib/bind9/lib/isc/include/isc/random.h
+++ b/contrib/bind9/lib/isc/include/isc/random.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: random.h,v 1.11.206.1 2004/03/06 08:14:46 marka Exp $ */
+/* $Id: random.h,v 1.12.18.2 2005/04/29 00:17:01 marka Exp $ */
#ifndef ISC_RANDOM_H
#define ISC_RANDOM_H 1
@@ -23,9 +23,11 @@
#include <isc/lang.h>
#include <isc/types.h>
-/*
- * Implements a random state pool which will let the caller return a
- * series of possibly non-reproducable random values. Note that the
+/*! \file
+ * \brief Implements a random state pool which will let the caller return a
+ * series of possibly non-reproducable random values.
+ *
+ * Note that the
* strength of these numbers is not all that high, and should not be
* used in cryptography functions. It is useful for jittering values
* a bit here and there, such as timeouts, etc.
@@ -35,13 +37,13 @@ ISC_LANG_BEGINDECLS
void
isc_random_seed(isc_uint32_t seed);
-/*
+/*%<
* Set the initial seed of the random state.
*/
void
isc_random_get(isc_uint32_t *val);
-/*
+/*%<
* Get a random value.
*
* Requires:
@@ -50,7 +52,7 @@ isc_random_get(isc_uint32_t *val);
isc_uint32_t
isc_random_jitter(isc_uint32_t max, isc_uint32_t jitter);
-/*
+/*%<
* Get a random value between (max - jitter) and (max).
* This is useful for jittering timer values.
*/
diff --git a/contrib/bind9/lib/isc/include/isc/ratelimiter.h b/contrib/bind9/lib/isc/include/isc/ratelimiter.h
index 2acab34..1944754 100644
--- a/contrib/bind9/lib/isc/include/isc/ratelimiter.h
+++ b/contrib/bind9/lib/isc/include/isc/ratelimiter.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ratelimiter.h,v 1.13.14.3 2004/03/08 09:04:53 marka Exp $ */
+/* $Id: ratelimiter.h,v 1.15.18.2 2005/04/29 00:17:01 marka Exp $ */
#ifndef ISC_RATELIMITER_H
#define ISC_RATELIMITER_H 1
@@ -24,8 +24,8 @@
***** Module Info
*****/
-/*
- * A rate limiter is a mechanism for dispatching events at a limited
+/*! \file
+ * \brief A rate limiter is a mechanism for dispatching events at a limited
* rate. This is intended to be used when sending zone maintenance
* SOA queries, NOTIFY messages, etc.
*/
@@ -46,13 +46,13 @@ ISC_LANG_BEGINDECLS
isc_result_t
isc_ratelimiter_create(isc_mem_t *mctx, isc_timermgr_t *timermgr,
isc_task_t *task, isc_ratelimiter_t **ratelimiterp);
-/*
+/*%<
* Create a rate limiter. The execution interval is initially undefined.
*/
isc_result_t
isc_ratelimiter_setinterval(isc_ratelimiter_t *rl, isc_interval_t *interval);
-/*
+/*!<
* Set the mininum interval between event executions.
* The interval value is copied, so the caller need not preserve it.
*
@@ -62,7 +62,7 @@ isc_ratelimiter_setinterval(isc_ratelimiter_t *rl, isc_interval_t *interval);
void
isc_ratelimiter_setpertic(isc_ratelimiter_t *rl, isc_uint32_t perint);
-/*
+/*%<
* Set the number of events processed per interval timer tick.
* If 'perint' is zero it is treated as 1.
*/
@@ -70,8 +70,10 @@ isc_ratelimiter_setpertic(isc_ratelimiter_t *rl, isc_uint32_t perint);
isc_result_t
isc_ratelimiter_enqueue(isc_ratelimiter_t *rl, isc_task_t *task,
isc_event_t **eventp);
-/*
- * Queue an event for rate-limited execution. This is similar
+/*%<
+ * Queue an event for rate-limited execution.
+ *
+ * This is similar
* to doing an isc_task_send() to the 'task', except that the
* execution may be delayed to achieve the desired rate of
* execution.
@@ -80,50 +82,50 @@ isc_ratelimiter_enqueue(isc_ratelimiter_t *rl, isc_task_t *task,
* must ensure that the task exists until the event is delivered.
*
* Requires:
- * An interval has been set by calling
+ *\li An interval has been set by calling
* isc_ratelimiter_setinterval().
*
- * 'task' to be non NULL.
- * '(*eventp)->ev_sender' to be NULL.
+ *\li 'task' to be non NULL.
+ *\li '(*eventp)->ev_sender' to be NULL.
*/
void
isc_ratelimiter_shutdown(isc_ratelimiter_t *ratelimiter);
-/*
+/*%<
* Shut down a rate limiter.
*
* Ensures:
- * All events that have not yet been
+ *\li All events that have not yet been
* dispatched to the task are dispatched immediately with
- * the ISC_EVENTATTR_CANCELED bit set in ev_attributes.
+ * the #ISC_EVENTATTR_CANCELED bit set in ev_attributes.
*
- * Further attempts to enqueue events will fail with
- * ISC_R_SHUTTINGDOWN.
+ *\li Further attempts to enqueue events will fail with
+ * #ISC_R_SHUTTINGDOWN.
*
- * The reatelimiter is no longer attached to its task.
+ *\li The reatelimiter is no longer attached to its task.
*/
void
isc_ratelimiter_attach(isc_ratelimiter_t *source, isc_ratelimiter_t **target);
-/*
+/*%<
* Attach to a rate limiter.
*/
void
isc_ratelimiter_detach(isc_ratelimiter_t **ratelimiterp);
-/*
+/*%<
* Detach from a rate limiter.
*/
isc_result_t
isc_ratelimiter_stall(isc_ratelimiter_t *rl);
-/*
+/*%<
* Stall event processing.
*/
isc_result_t
isc_ratelimiter_release(isc_ratelimiter_t *rl);
-/*
+/*%<
* Release a stalled rate limiter.
*/
diff --git a/contrib/bind9/lib/isc/include/isc/refcount.h b/contrib/bind9/lib/isc/include/isc/refcount.h
index d2c7b6f..b930465 100644
--- a/contrib/bind9/lib/isc/include/isc/refcount.h
+++ b/contrib/bind9/lib/isc/include/isc/refcount.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,19 +15,22 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: refcount.h,v 1.3.2.2.2.2 2004/04/14 05:12:25 marka Exp $ */
+/* $Id: refcount.h,v 1.6.18.5 2005/07/12 01:22:31 marka Exp $ */
#ifndef ISC_REFCOUNT_H
#define ISC_REFCOUNT_H 1
+#include <isc/atomic.h>
#include <isc/lang.h>
#include <isc/mutex.h>
#include <isc/platform.h>
#include <isc/types.h>
#include <isc/util.h>
-/*
- * Implements a locked reference counter. These functions may actually be
+/*! \file
+ * \brief Implements a locked reference counter.
+ *
+ * These functions may actually be
* implemented using macros, and implementations of these macros are below.
* The isc_refcount_t type should not be accessed directly, as its contents
* depend on the implementation.
@@ -39,8 +42,8 @@ ISC_LANG_BEGINDECLS
* Function prototypes
*/
-/*
- * void
+/*
+ * isc_result_t
* isc_refcount_init(isc_refcount_t *ref, unsigned int n);
*
* Initialize the reference counter. There will be 'n' initial references.
@@ -63,9 +66,14 @@ ISC_LANG_BEGINDECLS
/*
* void
* isc_refcount_increment(isc_refcount_t *ref, unsigned int *targetp);
+ * isc_refcount_increment0(isc_refcount_t *ref, unsigned int *targetp);
*
* Increments the reference count, returning the new value in targetp if it's
- * not NULL.
+ * not NULL. The reference counter typically begins with the initial counter
+ * of 1, and will be destroyed once the counter reaches 0. Thus,
+ * isc_refcount_increment() additionally requires the previous counter be
+ * larger than 0 so that an error which violates the usage can be easily
+ * caught. isc_refcount_increment0() does not have this restriction.
*
* Requires:
* ref != NULL.
@@ -87,20 +95,54 @@ ISC_LANG_BEGINDECLS
* Sample implementations
*/
#ifdef ISC_PLATFORM_USETHREADS
+#ifdef ISC_PLATFORM_HAVEXADD
+
+#define ISC_REFCOUNT_HAVEATOMIC 1
typedef struct isc_refcount {
- int refs;
- isc_mutex_t lock;
+ isc_int32_t refs;
} isc_refcount_t;
-#define isc_refcount_init(rp, n) \
- do { \
- isc_result_t _r; \
- (rp)->refs = (n); \
- _r = isc_mutex_init(&(rp)->lock); \
- RUNTIME_CHECK(_r == ISC_R_SUCCESS); \
+#define isc_refcount_destroy(rp) (REQUIRE((rp)->refs == 0))
+#define isc_refcount_current(rp) ((unsigned int)((rp)->refs))
+
+#define isc_refcount_increment0(rp, tp) \
+ do { \
+ unsigned int *_tmp = (unsigned int *)(tp); \
+ isc_int32_t prev; \
+ prev = isc_atomic_xadd(&(rp)->refs, 1); \
+ if (_tmp != NULL) \
+ *_tmp = prev + 1; \
} while (0)
+#define isc_refcount_increment(rp, tp) \
+ do { \
+ unsigned int *_tmp = (unsigned int *)(tp); \
+ isc_int32_t prev; \
+ prev = isc_atomic_xadd(&(rp)->refs, 1); \
+ REQUIRE(prev > 0); \
+ if (_tmp != NULL) \
+ *_tmp = prev + 1; \
+ } while (0)
+
+#define isc_refcount_decrement(rp, tp) \
+ do { \
+ unsigned int *_tmp = (unsigned int *)(tp); \
+ isc_int32_t prev; \
+ prev = isc_atomic_xadd(&(rp)->refs, -1); \
+ REQUIRE(prev > 0); \
+ if (_tmp != NULL) \
+ *_tmp = prev - 1; \
+ } while (0)
+
+#else /* ISC_PLATFORM_HAVEXADD */
+
+typedef struct isc_refcount {
+ int refs;
+ isc_mutex_t lock;
+} isc_refcount_t;
+
+/*% Destroys a reference counter. */
#define isc_refcount_destroy(rp) \
do { \
REQUIRE((rp)->refs == 0); \
@@ -109,6 +151,17 @@ typedef struct isc_refcount {
#define isc_refcount_current(rp) ((unsigned int)((rp)->refs))
+/*% Increments the reference count, returning the new value in targetp if it's not NULL. */
+#define isc_refcount_increment0(rp, tp) \
+ do { \
+ unsigned int *_tmp = (unsigned int *)(tp); \
+ LOCK(&(rp)->lock); \
+ ++((rp)->refs); \
+ if (_tmp != NULL) \
+ *_tmp = ((rp)->refs); \
+ UNLOCK(&(rp)->lock); \
+ } while (0)
+
#define isc_refcount_increment(rp, tp) \
do { \
unsigned int *_tmp = (unsigned int *)(tp); \
@@ -120,6 +173,7 @@ typedef struct isc_refcount {
UNLOCK(&(rp)->lock); \
} while (0)
+/*% Decrements the reference count, returning the new value in targetp if it's not NULL. */
#define isc_refcount_decrement(rp, tp) \
do { \
unsigned int *_tmp = (unsigned int *)(tp); \
@@ -131,17 +185,17 @@ typedef struct isc_refcount {
UNLOCK(&(rp)->lock); \
} while (0)
-#else
+#endif /* ISC_PLATFORM_HAVEXADD */
+#else /* ISC_PLATFORM_USETHREADS */
typedef struct isc_refcount {
int refs;
} isc_refcount_t;
-#define isc_refcount_init(rp, n) ((rp)->refs = (n))
#define isc_refcount_destroy(rp) (REQUIRE((rp)->refs == 0))
#define isc_refcount_current(rp) ((unsigned int)((rp)->refs))
-#define isc_refcount_increment(rp, tp) \
+#define isc_refcount_increment0(rp, tp) \
do { \
unsigned int *_tmp = (unsigned int *)(tp); \
int _n = ++(rp)->refs; \
@@ -149,15 +203,30 @@ typedef struct isc_refcount {
*_tmp = _n; \
} while (0)
+#define isc_refcount_increment(rp, tp) \
+ do { \
+ unsigned int *_tmp = (unsigned int *)(tp); \
+ int _n; \
+ REQUIRE((rp)->refs > 0); \
+ _n = ++(rp)->refs; \
+ if (_tmp != NULL) \
+ *_tmp = _n; \
+ } while (0)
+
#define isc_refcount_decrement(rp, tp) \
do { \
unsigned int *_tmp = (unsigned int *)(tp); \
- int _n = --(rp)->refs; \
+ int _n; \
+ REQUIRE((rp)->refs > 0); \
+ _n = --(rp)->refs; \
if (_tmp != NULL) \
*_tmp = _n; \
} while (0)
-#endif
+#endif /* ISC_PLATFORM_USETHREADS */
+
+isc_result_t
+isc_refcount_init(isc_refcount_t *ref, unsigned int n);
ISC_LANG_ENDDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/region.h b/contrib/bind9/lib/isc/include/isc/region.h
index 5622394..9b651fe 100644
--- a/contrib/bind9/lib/isc/include/isc/region.h
+++ b/contrib/bind9/lib/isc/include/isc/region.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: region.h,v 1.16.12.3 2004/03/08 09:04:53 marka Exp $ */
+/* $Id: region.h,v 1.19.18.2 2005/04/29 00:17:01 marka Exp $ */
#ifndef ISC_REGION_H
#define ISC_REGION_H 1
+/*! \file */
+
#include <isc/types.h>
struct isc_region {
@@ -45,7 +47,8 @@ struct isc_consttextregion {
unsigned int length;
};
-/*
+/*@{*/
+/*!
* The region structure is not opaque, and is usually directly manipulated.
* Some macros are defined below for convenience.
*/
@@ -76,20 +79,21 @@ struct isc_consttextregion {
_r->base += _l; \
_r->length -= _l; \
} while (0)
+/*@}*/
int
isc_region_compare(isc_region_t *r1, isc_region_t *r2);
-/*
+/*%<
* Compares the contents of two regions
*
* Requires:
- * 'r1' is a valid region
- * 'r2' is a valid region
+ *\li 'r1' is a valid region
+ *\li 'r2' is a valid region
*
* Returns:
- * < 0 if r1 is lexicographically less than r2
- * = 0 if r1 is lexicographically identical to r2
- * > 0 if r1 is lexicographically greater than r2
+ *\li < 0 if r1 is lexicographically less than r2
+ *\li = 0 if r1 is lexicographically identical to r2
+ *\li > 0 if r1 is lexicographically greater than r2
*/
#endif /* ISC_REGION_H */
diff --git a/contrib/bind9/lib/isc/include/isc/resource.h b/contrib/bind9/lib/isc/include/isc/resource.h
index 2c2a829..53b2a4e 100644
--- a/contrib/bind9/lib/isc/include/isc/resource.h
+++ b/contrib/bind9/lib/isc/include/isc/resource.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: resource.h,v 1.4.206.1 2004/03/06 08:14:47 marka Exp $ */
+/* $Id: resource.h,v 1.5.18.2 2005/04/29 00:17:02 marka Exp $ */
#ifndef ISC_RESOURCE_H
#define ISC_RESOURCE_H 1
+/*! \file */
+
#include <isc/lang.h>
#include <isc/types.h>
@@ -29,40 +31,40 @@ ISC_LANG_BEGINDECLS
isc_result_t
isc_resource_setlimit(isc_resource_t resource, isc_resourcevalue_t value);
-/*
+/*%<
* Set the maximum limit for a system resource.
*
* Notes:
- * If 'value' exceeds the maximum possible on the operating system,
+ *\li If 'value' exceeds the maximum possible on the operating system,
* it is silently limited to that maximum -- or to "infinity", if
- * the operating system has that concept. ISC_RESOURCE_UNLIMITED
+ * the operating system has that concept. #ISC_RESOURCE_UNLIMITED
* can be used to explicitly ask for the maximum.
*
* Requires:
- * 'resource' is a valid member of the isc_resource_t enumeration.
+ *\li 'resource' is a valid member of the isc_resource_t enumeration.
*
* Returns:
- * ISC_R_SUCCESS Success.
- * ISC_R_NOTIMPLEMENTED 'resource' is not a type known by the OS.
- * ISC_R_NOPERM The calling process did not have adequate permission
+ *\li #ISC_R_SUCCESS Success.
+ *\li #ISC_R_NOTIMPLEMENTED 'resource' is not a type known by the OS.
+ *\li #ISC_R_NOPERM The calling process did not have adequate permission
* to change the resource limit.
*/
isc_result_t
isc_resource_getlimit(isc_resource_t resource, isc_resourcevalue_t *value);
-/*
+/*%<
* Get the maximum limit for a system resource.
*
* Notes:
- * 'value' is set to the maximum limit.
+ *\li 'value' is set to the maximum limit.
*
- * ISC_RESOURCE_UNLIMITED is the maximum value of isc_resourcevalue_t.
+ *\li #ISC_RESOURCE_UNLIMITED is the maximum value of isc_resourcevalue_t.
*
- * On many (all?) Unix systems, RLIM_INFINITY is a valid value that is
- * significantly less than ISC_RESOURCE_UNLIMITED, but which in practice
+ *\li On many (all?) Unix systems, RLIM_INFINITY is a valid value that is
+ * significantly less than #ISC_RESOURCE_UNLIMITED, but which in practice
* behaves the same.
*
- * The current ISC libdns configuration file parser assigns a value
+ *\li The current ISC libdns configuration file parser assigns a value
* of ISC_UINT32_MAX for a size_spec of "unlimited" and ISC_UNIT32_MAX - 1
* for "default", the latter of which is supposed to represent "the
* limit that was in force when the server started". Since these are
@@ -72,11 +74,11 @@ isc_resource_getlimit(isc_resource_t resource, isc_resourcevalue_t *value);
* discrete integral values or generalized concepts.
*
* Requires:
- * 'resource' is a valid member of the isc_resource_t enumeration.
+ *\li 'resource' is a valid member of the isc_resource_t enumeration.
*
* Returns:
- * ISC_R_SUCCESS Success.
- * ISC_R_NOTIMPLEMENTED 'resource' is not a type known by the OS.
+ *\li #ISC_R_SUCCESS Success.
+ *\li #ISC_R_NOTIMPLEMENTED 'resource' is not a type known by the OS.
*/
ISC_LANG_ENDDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/result.h b/contrib/bind9/lib/isc/include/isc/result.h
index 93f7cef..0de3493 100644
--- a/contrib/bind9/lib/isc/include/isc/result.h
+++ b/contrib/bind9/lib/isc/include/isc/result.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: result.h,v 1.57.2.2.8.5 2004/05/15 03:46:13 jinmei Exp $ */
+/* $Id: result.h,v 1.62.18.4 2005/06/22 22:05:49 marka Exp $ */
#ifndef ISC_RESULT_H
#define ISC_RESULT_H 1
@@ -23,77 +23,75 @@
#include <isc/lang.h>
#include <isc/types.h>
-#define ISC_R_SUCCESS 0 /* success */
-#define ISC_R_NOMEMORY 1 /* out of memory */
-#define ISC_R_TIMEDOUT 2 /* timed out */
-#define ISC_R_NOTHREADS 3 /* no available threads */
-#define ISC_R_ADDRNOTAVAIL 4 /* address not available */
-#define ISC_R_ADDRINUSE 5 /* address in use */
-#define ISC_R_NOPERM 6 /* permission denied */
-#define ISC_R_NOCONN 7 /* no pending connections */
-#define ISC_R_NETUNREACH 8 /* network unreachable */
-#define ISC_R_HOSTUNREACH 9 /* host unreachable */
-#define ISC_R_NETDOWN 10 /* network down */
-#define ISC_R_HOSTDOWN 11 /* host down */
-#define ISC_R_CONNREFUSED 12 /* connection refused */
-#define ISC_R_NORESOURCES 13 /* not enough free resources */
-#define ISC_R_EOF 14 /* end of file */
-#define ISC_R_BOUND 15 /* socket already bound */
-#define ISC_R_RELOAD 16 /* reload */
-#define ISC_R_LOCKBUSY 17 /* lock busy */
-#define ISC_R_EXISTS 18 /* already exists */
-#define ISC_R_NOSPACE 19 /* ran out of space */
-#define ISC_R_CANCELED 20 /* operation canceled */
-#define ISC_R_NOTBOUND 21 /* socket is not bound */
-#define ISC_R_SHUTTINGDOWN 22 /* shutting down */
-#define ISC_R_NOTFOUND 23 /* not found */
-#define ISC_R_UNEXPECTEDEND 24 /* unexpected end of input */
-#define ISC_R_FAILURE 25 /* generic failure */
-#define ISC_R_IOERROR 26 /* I/O error */
-#define ISC_R_NOTIMPLEMENTED 27 /* not implemented */
-#define ISC_R_UNBALANCED 28 /* unbalanced parentheses */
-#define ISC_R_NOMORE 29 /* no more */
-#define ISC_R_INVALIDFILE 30 /* invalid file */
-#define ISC_R_BADBASE64 31 /* bad base64 encoding */
-#define ISC_R_UNEXPECTEDTOKEN 32 /* unexpected token */
-#define ISC_R_QUOTA 33 /* quota reached */
-#define ISC_R_UNEXPECTED 34 /* unexpected error */
-#define ISC_R_ALREADYRUNNING 35 /* already running */
-#define ISC_R_IGNORE 36 /* ignore */
-#define ISC_R_MASKNONCONTIG 37 /* addr mask not contiguous */
-#define ISC_R_FILENOTFOUND 38 /* file not found */
-#define ISC_R_FILEEXISTS 39 /* file already exists */
-#define ISC_R_NOTCONNECTED 40 /* socket is not connected */
-#define ISC_R_RANGE 41 /* out of range */
-#define ISC_R_NOENTROPY 42 /* out of entropy */
-#define ISC_R_MULTICAST 43 /* invalid use of multicast */
-#define ISC_R_NOTFILE 44 /* not a file */
-#define ISC_R_NOTDIRECTORY 45 /* not a directory */
-#define ISC_R_QUEUEFULL 46 /* queue is full */
-#define ISC_R_FAMILYMISMATCH 47 /* address family mismatch */
-#define ISC_R_FAMILYNOSUPPORT 48 /* AF not supported */
-#define ISC_R_BADHEX 49 /* bad hex encoding */
-#define ISC_R_TOOMANYOPENFILES 50 /* too many open files */
-#define ISC_R_NOTBLOCKING 51 /* not blocking */
-#define ISC_R_UNBALANCEDQUOTES 52 /* unbalanced quotes */
-#define ISC_R_INPROGRESS 53 /* operation in progress */
-#define ISC_R_CONNECTIONRESET 54 /* connection reset */
-#define ISC_R_SOFTQUOTA 55 /* soft quota reached */
-#define ISC_R_BADNUMBER 56 /* not a valid number */
-#define ISC_R_DISABLED 57 /* disabled */
-#define ISC_R_MAXSIZE 58 /* max size */
-#define ISC_R_BADADDRESSFORM 59 /* invalid address format */
+#define ISC_R_SUCCESS 0 /*%< success */
+#define ISC_R_NOMEMORY 1 /*%< out of memory */
+#define ISC_R_TIMEDOUT 2 /*%< timed out */
+#define ISC_R_NOTHREADS 3 /*%< no available threads */
+#define ISC_R_ADDRNOTAVAIL 4 /*%< address not available */
+#define ISC_R_ADDRINUSE 5 /*%< address in use */
+#define ISC_R_NOPERM 6 /*%< permission denied */
+#define ISC_R_NOCONN 7 /*%< no pending connections */
+#define ISC_R_NETUNREACH 8 /*%< network unreachable */
+#define ISC_R_HOSTUNREACH 9 /*%< host unreachable */
+#define ISC_R_NETDOWN 10 /*%< network down */
+#define ISC_R_HOSTDOWN 11 /*%< host down */
+#define ISC_R_CONNREFUSED 12 /*%< connection refused */
+#define ISC_R_NORESOURCES 13 /*%< not enough free resources */
+#define ISC_R_EOF 14 /*%< end of file */
+#define ISC_R_BOUND 15 /*%< socket already bound */
+#define ISC_R_RELOAD 16 /*%< reload */
+#define ISC_R_LOCKBUSY 17 /*%< lock busy */
+#define ISC_R_EXISTS 18 /*%< already exists */
+#define ISC_R_NOSPACE 19 /*%< ran out of space */
+#define ISC_R_CANCELED 20 /*%< operation canceled */
+#define ISC_R_NOTBOUND 21 /*%< socket is not bound */
+#define ISC_R_SHUTTINGDOWN 22 /*%< shutting down */
+#define ISC_R_NOTFOUND 23 /*%< not found */
+#define ISC_R_UNEXPECTEDEND 24 /*%< unexpected end of input */
+#define ISC_R_FAILURE 25 /*%< generic failure */
+#define ISC_R_IOERROR 26 /*%< I/O error */
+#define ISC_R_NOTIMPLEMENTED 27 /*%< not implemented */
+#define ISC_R_UNBALANCED 28 /*%< unbalanced parentheses */
+#define ISC_R_NOMORE 29 /*%< no more */
+#define ISC_R_INVALIDFILE 30 /*%< invalid file */
+#define ISC_R_BADBASE64 31 /*%< bad base64 encoding */
+#define ISC_R_UNEXPECTEDTOKEN 32 /*%< unexpected token */
+#define ISC_R_QUOTA 33 /*%< quota reached */
+#define ISC_R_UNEXPECTED 34 /*%< unexpected error */
+#define ISC_R_ALREADYRUNNING 35 /*%< already running */
+#define ISC_R_IGNORE 36 /*%< ignore */
+#define ISC_R_MASKNONCONTIG 37 /*%< addr mask not contiguous */
+#define ISC_R_FILENOTFOUND 38 /*%< file not found */
+#define ISC_R_FILEEXISTS 39 /*%< file already exists */
+#define ISC_R_NOTCONNECTED 40 /*%< socket is not connected */
+#define ISC_R_RANGE 41 /*%< out of range */
+#define ISC_R_NOENTROPY 42 /*%< out of entropy */
+#define ISC_R_MULTICAST 43 /*%< invalid use of multicast */
+#define ISC_R_NOTFILE 44 /*%< not a file */
+#define ISC_R_NOTDIRECTORY 45 /*%< not a directory */
+#define ISC_R_QUEUEFULL 46 /*%< queue is full */
+#define ISC_R_FAMILYMISMATCH 47 /*%< address family mismatch */
+#define ISC_R_FAMILYNOSUPPORT 48 /*%< AF not supported */
+#define ISC_R_BADHEX 49 /*%< bad hex encoding */
+#define ISC_R_TOOMANYOPENFILES 50 /*%< too many open files */
+#define ISC_R_NOTBLOCKING 51 /*%< not blocking */
+#define ISC_R_UNBALANCEDQUOTES 52 /*%< unbalanced quotes */
+#define ISC_R_INPROGRESS 53 /*%< operation in progress */
+#define ISC_R_CONNECTIONRESET 54 /*%< connection reset */
+#define ISC_R_SOFTQUOTA 55 /*%< soft quota reached */
+#define ISC_R_BADNUMBER 56 /*%< not a valid number */
+#define ISC_R_DISABLED 57 /*%< disabled */
+#define ISC_R_MAXSIZE 58 /*%< max size */
+#define ISC_R_BADADDRESSFORM 59 /*%< invalid address format */
-/*
- * Not a result code: the number of results.
- */
+/*% Not a result code: the number of results. */
#define ISC_R_NRESULTS 60
ISC_LANG_BEGINDECLS
const char *
isc_result_totext(isc_result_t);
-/*
+/*%<
* Convert an isc_result_t into a string message describing the result.
*/
diff --git a/contrib/bind9/lib/isc/include/isc/resultclass.h b/contrib/bind9/lib/isc/include/isc/resultclass.h
index adb5338..5e20800 100644
--- a/contrib/bind9/lib/isc/include/isc/resultclass.h
+++ b/contrib/bind9/lib/isc/include/isc/resultclass.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,19 +15,21 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: resultclass.h,v 1.11.206.1 2004/03/06 08:14:47 marka Exp $ */
+/* $Id: resultclass.h,v 1.12.18.2 2005/04/29 00:17:02 marka Exp $ */
#ifndef ISC_RESULTCLASS_H
#define ISC_RESULTCLASS_H 1
-/*****
- ***** Registry of Predefined Result Type Classes
- *****/
-/*
+/*! \file
+ * \brief Registry of Predefined Result Type Classes
+ *
* A result class number is an unsigned 16 bit number. Each class may
* contain up to 65536 results. A result code is formed by adding the
* result number within the class to the class number multiplied by 65536.
+ *
+ * Classes < 1024 are reserved for ISC use.
+ * Result classes >= 1024 and <= 65535 are reserved for application use.
*/
#define ISC_RESULTCLASS_FROMNUM(num) ((num) << 16)
@@ -36,9 +38,6 @@
#define ISC_RESULTCLASS_INCLASS(rclass, result) \
((rclass) == ((result) & 0xFFFF0000))
-/*
- * Classes < 1024 are reserved for ISC use.
- */
#define ISC_RESULTCLASS_ISC ISC_RESULTCLASS_FROMNUM(0)
#define ISC_RESULTCLASS_DNS ISC_RESULTCLASS_FROMNUM(1)
@@ -47,8 +46,5 @@
#define ISC_RESULTCLASS_OMAPI ISC_RESULTCLASS_FROMNUM(4)
#define ISC_RESULTCLASS_ISCCC ISC_RESULTCLASS_FROMNUM(5)
-/*
- * Result classes >= 1024 and <= 65535 are reserved for application use.
- */
#endif /* ISC_RESULTCLASS_H */
diff --git a/contrib/bind9/lib/isc/include/isc/rwlock.h b/contrib/bind9/lib/isc/include/isc/rwlock.h
index 44edfcc..404f93c 100644
--- a/contrib/bind9/lib/isc/include/isc/rwlock.h
+++ b/contrib/bind9/lib/isc/include/isc/rwlock.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rwlock.h,v 1.18.2.3.2.1 2004/03/06 08:14:47 marka Exp $ */
+/* $Id: rwlock.h,v 1.21.18.3 2005/06/04 06:23:44 jinmei Exp $ */
#ifndef ISC_RWLOCK_H
#define ISC_RWLOCK_H 1
+/*! \file */
+
#include <isc/condition.h>
#include <isc/lang.h>
#include <isc/platform.h>
@@ -34,19 +36,56 @@ typedef enum {
} isc_rwlocktype_t;
#ifdef ISC_PLATFORM_USETHREADS
+#if defined(ISC_PLATFORM_HAVEXADD) && defined(ISC_PLATFORM_HAVECMPXCHG)
+#define ISC_RWLOCK_USEATOMIC 1
+#endif
+
struct isc_rwlock {
/* Unlocked. */
unsigned int magic;
isc_mutex_t lock;
+
+#if defined(ISC_PLATFORM_HAVEXADD) && defined(ISC_PLATFORM_HAVECMPXCHG)
+ /*
+ * When some atomic instructions with hardware assistance are
+ * available, rwlock will use those so that concurrent readers do not
+ * interfere with each other through mutex as long as no writers
+ * appear, massively reducing the lock overhead in the typical case.
+ *
+ * The basic algorithm of this approach is the "simple
+ * writer-preference lock" shown in the following URL:
+ * http://www.cs.rochester.edu/u/scott/synchronization/pseudocode/rw.html
+ * but our implementation does not rely on the spin lock unlike the
+ * original algorithm to be more portable as a user space application.
+ */
+
+ /* Read or modified atomically. */
+ isc_int32_t write_requests;
+ isc_int32_t write_completions;
+ isc_int32_t cnt_and_flag;
+
/* Locked by lock. */
isc_condition_t readable;
isc_condition_t writeable;
+ unsigned int readers_waiting;
+
+ /* Locked by rwlock itself. */
+ unsigned int write_granted;
+
+ /* Unlocked. */
+ unsigned int write_quota;
+
+#else /* ISC_PLATFORM_HAVEXADD && ISC_PLATFORM_HAVECMPXCHG */
+
+ /*%< Locked by lock. */
+ isc_condition_t readable;
+ isc_condition_t writeable;
isc_rwlocktype_t type;
- /* The number of threads that have the lock. */
+ /*% The number of threads that have the lock. */
unsigned int active;
- /*
+ /*%
* The number of lock grants made since the lock was last switched
* from reading to writing or vice versa; used in determining
* when the quota is reached and it is time to switch.
@@ -58,6 +97,7 @@ struct isc_rwlock {
unsigned int read_quota;
unsigned int write_quota;
isc_rwlocktype_t original;
+#endif /* ISC_PLATFORM_HAVEXADD && ISC_PLATFORM_HAVECMPXCHG */
};
#else /* ISC_PLATFORM_USETHREADS */
struct isc_rwlock {
diff --git a/contrib/bind9/lib/isc/include/isc/serial.h b/contrib/bind9/lib/isc/include/isc/serial.h
index cb054a6..86d9b2f 100644
--- a/contrib/bind9/lib/isc/include/isc/serial.h
+++ b/contrib/bind9/lib/isc/include/isc/serial.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: serial.h,v 1.9.206.1 2004/03/06 08:14:48 marka Exp $ */
+/* $Id: serial.h,v 1.10.18.2 2005/04/29 00:17:02 marka Exp $ */
#ifndef ISC_SERIAL_H
#define ISC_SERIAL_H 1
@@ -23,9 +23,8 @@
#include <isc/lang.h>
#include <isc/types.h>
-/*
- * Implement 32 bit serial space arithmetic comparision functions.
- *
+/*! \file
+ * \brief Implement 32 bit serial space arithmetic comparision functions.
* Note: Undefined results are returned as ISC_FALSE.
*/
@@ -37,37 +36,37 @@ ISC_LANG_BEGINDECLS
isc_boolean_t
isc_serial_lt(isc_uint32_t a, isc_uint32_t b);
-/*
+/*%<
* Return true if 'a' < 'b' otherwise false.
*/
isc_boolean_t
isc_serial_gt(isc_uint32_t a, isc_uint32_t b);
-/*
+/*%<
* Return true if 'a' > 'b' otherwise false.
*/
isc_boolean_t
isc_serial_le(isc_uint32_t a, isc_uint32_t b);
-/*
+/*%<
* Return true if 'a' <= 'b' otherwise false.
*/
isc_boolean_t
isc_serial_ge(isc_uint32_t a, isc_uint32_t b);
-/*
+/*%<
* Return true if 'a' >= 'b' otherwise false.
*/
isc_boolean_t
isc_serial_eq(isc_uint32_t a, isc_uint32_t b);
-/*
+/*%<
* Return true if 'a' == 'b' otherwise false.
*/
isc_boolean_t
isc_serial_ne(isc_uint32_t a, isc_uint32_t b);
-/*
+/*%<
* Return true if 'a' != 'b' otherwise false.
*/
diff --git a/contrib/bind9/lib/isc/include/isc/sha1.h b/contrib/bind9/lib/isc/include/isc/sha1.h
index 935578b..bb22f06 100644
--- a/contrib/bind9/lib/isc/include/isc/sha1.h
+++ b/contrib/bind9/lib/isc/include/isc/sha1.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2006 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -18,25 +18,26 @@
#ifndef ISC_SHA1_H
#define ISC_SHA1_H 1
-/* $Id: sha1.h,v 1.8.206.1 2004/03/06 08:14:48 marka Exp $ */
+/* $Id: sha1.h,v 1.9.18.5 2006/08/16 03:18:14 marka Exp $ */
/* $NetBSD: sha1.h,v 1.2 1998/05/29 22:55:44 thorpej Exp $ */
-/*
- * SHA-1 in C
- * By Steve Reid <steve@edmweb.com>
- * 100% Public Domain
+/*! \file
+ * \brief SHA-1 in C
+ * \author By Steve Reid <steve@edmweb.com>
+ * \note 100% Public Domain
*/
#include <isc/lang.h>
#include <isc/types.h>
-#define ISC_SHA1_DIGESTLENGTH 20
+#define ISC_SHA1_DIGESTLENGTH 20U
+#define ISC_SHA1_BLOCK_LENGTH 64U
typedef struct {
isc_uint32_t state[5];
isc_uint32_t count[2];
- unsigned char buffer[64];
+ unsigned char buffer[ISC_SHA1_BLOCK_LENGTH];
} isc_sha1_t;
ISC_LANG_BEGINDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/sha2.h b/contrib/bind9/lib/isc/include/isc/sha2.h
new file mode 100644
index 0000000..e54c620
--- /dev/null
+++ b/contrib/bind9/lib/isc/include/isc/sha2.h
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2005, 2006 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* $Id: sha2.h,v 1.2.2.6 2006/08/16 03:18:14 marka Exp $ */
+
+/* $FreeBSD$ */
+/* $KAME: sha2.h,v 1.3 2001/03/12 08:27:48 itojun Exp $ */
+
+/*
+ * sha2.h
+ *
+ * Version 1.0.0beta1
+ *
+ * Written by Aaron D. Gifford <me@aarongifford.com>
+ *
+ * Copyright 2000 Aaron D. Gifford. 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.
+ * 3. Neither the name of the copyright holder nor the names of contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTOR(S) ``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(S) OR CONTRIBUTOR(S) 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 ISC_SHA2_H
+#define ISC_SHA2_H
+
+#include <isc/lang.h>
+#include <isc/types.h>
+
+/*** SHA-224/256/384/512 Various Length Definitions ***********************/
+
+#define ISC_SHA224_BLOCK_LENGTH 64U
+#define ISC_SHA224_DIGESTLENGTH 28U
+#define ISC_SHA224_DIGESTSTRINGLENGTH (ISC_SHA224_DIGESTLENGTH * 2 + 1)
+#define ISC_SHA256_BLOCK_LENGTH 64U
+#define ISC_SHA256_DIGESTLENGTH 32U
+#define ISC_SHA256_DIGESTSTRINGLENGTH (ISC_SHA256_DIGESTLENGTH * 2 + 1)
+#define ISC_SHA384_BLOCK_LENGTH 128
+#define ISC_SHA384_DIGESTLENGTH 48U
+#define ISC_SHA384_DIGESTSTRINGLENGTH (ISC_SHA384_DIGESTLENGTH * 2 + 1)
+#define ISC_SHA512_BLOCK_LENGTH 128U
+#define ISC_SHA512_DIGESTLENGTH 64U
+#define ISC_SHA512_DIGESTSTRINGLENGTH (ISC_SHA512_DIGESTLENGTH * 2 + 1)
+
+
+ISC_LANG_BEGINDECLS
+
+/*** SHA-256/384/512 Context Structures *******************************/
+
+/*
+ * Keep buffer immediately after bitcount to preserve alignment.
+ */
+typedef struct {
+ isc_uint32_t state[8];
+ isc_uint64_t bitcount;
+ isc_uint8_t buffer[ISC_SHA256_BLOCK_LENGTH];
+} isc_sha256_t;
+
+/*
+ * Keep buffer immediately after bitcount to preserve alignment.
+ */
+typedef struct {
+ isc_uint64_t state[8];
+ isc_uint64_t bitcount[2];
+ isc_uint8_t buffer[ISC_SHA512_BLOCK_LENGTH];
+} isc_sha512_t;
+
+typedef isc_sha256_t isc_sha224_t;
+typedef isc_sha512_t isc_sha384_t;
+
+/*** SHA-224/256/384/512 Function Prototypes ******************************/
+
+void isc_sha224_init (isc_sha224_t *);
+void isc_sha224_update (isc_sha224_t *, const isc_uint8_t *, size_t);
+void isc_sha224_final (isc_uint8_t[ISC_SHA224_DIGESTLENGTH], isc_sha224_t *);
+char *isc_sha224_end (isc_sha224_t *, char[ISC_SHA224_DIGESTSTRINGLENGTH]);
+char *isc_sha224_data (const isc_uint8_t *, size_t, char[ISC_SHA224_DIGESTSTRINGLENGTH]);
+
+void isc_sha256_init (isc_sha256_t *);
+void isc_sha256_update (isc_sha256_t *, const isc_uint8_t *, size_t);
+void isc_sha256_final (isc_uint8_t[ISC_SHA256_DIGESTLENGTH], isc_sha256_t *);
+char *isc_sha256_end (isc_sha256_t *, char[ISC_SHA256_DIGESTSTRINGLENGTH]);
+char *isc_sha256_data (const isc_uint8_t *, size_t, char[ISC_SHA256_DIGESTSTRINGLENGTH]);
+
+void isc_sha384_init (isc_sha384_t *);
+void isc_sha384_update (isc_sha384_t *, const isc_uint8_t *, size_t);
+void isc_sha384_final (isc_uint8_t[ISC_SHA384_DIGESTLENGTH], isc_sha384_t *);
+char *isc_sha384_end (isc_sha384_t *, char[ISC_SHA384_DIGESTSTRINGLENGTH]);
+char *isc_sha384_data (const isc_uint8_t *, size_t, char[ISC_SHA384_DIGESTSTRINGLENGTH]);
+
+void isc_sha512_init (isc_sha512_t *);
+void isc_sha512_update (isc_sha512_t *, const isc_uint8_t *, size_t);
+void isc_sha512_final (isc_uint8_t[ISC_SHA512_DIGESTLENGTH], isc_sha512_t *);
+char *isc_sha512_end (isc_sha512_t *, char[ISC_SHA512_DIGESTSTRINGLENGTH]);
+char *isc_sha512_data (const isc_uint8_t *, size_t, char[ISC_SHA512_DIGESTSTRINGLENGTH]);
+
+ISC_LANG_ENDDECLS
+
+#endif /* ISC_SHA2_H */
diff --git a/contrib/bind9/lib/isc/include/isc/sockaddr.h b/contrib/bind9/lib/isc/include/isc/sockaddr.h
index 88e4594..83412d2 100644
--- a/contrib/bind9/lib/isc/include/isc/sockaddr.h
+++ b/contrib/bind9/lib/isc/include/isc/sockaddr.h
@@ -15,20 +15,28 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sockaddr.h,v 1.35.12.10 2006/03/02 00:37:20 marka Exp $ */
+/* $Id: sockaddr.h,v 1.42.18.8 2006/03/02 00:37:22 marka Exp $ */
#ifndef ISC_SOCKADDR_H
#define ISC_SOCKADDR_H 1
+/*! \file */
+
#include <isc/lang.h>
#include <isc/net.h>
#include <isc/types.h>
+#ifdef ISC_PLATFORM_HAVESYSUNH
+#include <sys/un.h>
+#endif
struct isc_sockaddr {
union {
struct sockaddr sa;
struct sockaddr_in sin;
struct sockaddr_in6 sin6;
+#ifdef ISC_PLATFORM_HAVESYSUNH
+ struct sockaddr_un sunix;
+#endif
} type;
unsigned int length; /* XXXRTH beginning? */
ISC_LINK(struct isc_sockaddr) link;
@@ -36,17 +44,36 @@ struct isc_sockaddr {
typedef ISC_LIST(struct isc_sockaddr) isc_sockaddrlist_t;
+#define ISC_SOCKADDR_CMPADDR 0x0001 /*%< compare the address
+ * sin_addr/sin6_addr */
+#define ISC_SOCKADDR_CMPPORT 0x0002 /*%< compare the port
+ * sin_port/sin6_port */
+#define ISC_SOCKADDR_CMPSCOPE 0x0004 /*%< compare the scope
+ * sin6_scope */
+#define ISC_SOCKADDR_CMPSCOPEZERO 0x0008 /*%< when comparing scopes
+ * zero scopes always match */
+
ISC_LANG_BEGINDECLS
isc_boolean_t
+isc_sockaddr_compare(const isc_sockaddr_t *a, const isc_sockaddr_t *b,
+ unsigned int flags);
+/*%<
+ * Compare the elements of the two address ('a' and 'b') as specified
+ * by 'flags' and report if they are equal or not.
+ *
+ * 'flags' is set from ISC_SOCKADDR_CMP*.
+ */
+
+isc_boolean_t
isc_sockaddr_equal(const isc_sockaddr_t *a, const isc_sockaddr_t *b);
-/*
+/*%<
* Return ISC_TRUE iff the socket addresses 'a' and 'b' are equal.
*/
isc_boolean_t
isc_sockaddr_eqaddr(const isc_sockaddr_t *a, const isc_sockaddr_t *b);
-/*
+/*%<
* Return ISC_TRUE iff the address parts of the socket addresses
* 'a' and 'b' are equal, ignoring the ports.
*/
@@ -54,14 +81,14 @@ isc_sockaddr_eqaddr(const isc_sockaddr_t *a, const isc_sockaddr_t *b);
isc_boolean_t
isc_sockaddr_eqaddrprefix(const isc_sockaddr_t *a, const isc_sockaddr_t *b,
unsigned int prefixlen);
-/*
+/*%<
* Return ISC_TRUE iff the most significant 'prefixlen' bits of the
* socket addresses 'a' and 'b' are equal, ignoring the ports.
*/
unsigned int
isc_sockaddr_hash(const isc_sockaddr_t *sockaddr, isc_boolean_t address_only);
-/*
+/*%<
* Return a hash value for the socket address 'sockaddr'. If 'address_only'
* is ISC_TRUE, the hash value will not depend on the port.
*
@@ -71,97 +98,97 @@ isc_sockaddr_hash(const isc_sockaddr_t *sockaddr, isc_boolean_t address_only);
void
isc_sockaddr_any(isc_sockaddr_t *sockaddr);
-/*
+/*%<
* Return the IPv4 wildcard address.
*/
void
isc_sockaddr_any6(isc_sockaddr_t *sockaddr);
-/*
+/*%<
* Return the IPv6 wildcard address.
*/
void
isc_sockaddr_anyofpf(isc_sockaddr_t *sockaddr, int family);
-/*
+/*%<
* Set '*sockaddr' to the wildcard address of protocol family
* 'family'.
*
* Requires:
- * 'family' is AF_INET or AF_INET6.
+ * \li 'family' is AF_INET or AF_INET6.
*/
void
isc_sockaddr_fromin(isc_sockaddr_t *sockaddr, const struct in_addr *ina,
in_port_t port);
-/*
+/*%<
* Construct an isc_sockaddr_t from an IPv4 address and port.
*/
void
isc_sockaddr_fromin6(isc_sockaddr_t *sockaddr, const struct in6_addr *ina6,
in_port_t port);
-/*
+/*%<
* Construct an isc_sockaddr_t from an IPv6 address and port.
*/
void
isc_sockaddr_v6fromin(isc_sockaddr_t *sockaddr, const struct in_addr *ina,
in_port_t port);
-/*
+/*%<
* Construct an IPv6 isc_sockaddr_t representing a mapped IPv4 address.
*/
void
isc_sockaddr_fromnetaddr(isc_sockaddr_t *sockaddr, const isc_netaddr_t *na,
in_port_t port);
-/*
+/*%<
* Construct an isc_sockaddr_t from an isc_netaddr_t and port.
*/
int
isc_sockaddr_pf(const isc_sockaddr_t *sockaddr);
-/*
+/*%<
* Get the protocol family of 'sockaddr'.
*
* Requires:
*
- * 'sockaddr' is a valid sockaddr with an address family of AF_INET
+ *\li 'sockaddr' is a valid sockaddr with an address family of AF_INET
* or AF_INET6.
*
* Returns:
*
- * The protocol family of 'sockaddr', e.g. PF_INET or PF_INET6.
+ *\li The protocol family of 'sockaddr', e.g. PF_INET or PF_INET6.
*/
void
isc_sockaddr_setport(isc_sockaddr_t *sockaddr, in_port_t port);
-/*
+/*%<
* Set the port of 'sockaddr' to 'port'.
*/
in_port_t
isc_sockaddr_getport(const isc_sockaddr_t *sockaddr);
-/*
+/*%<
* Get the port stored in 'sockaddr'.
*/
isc_result_t
isc_sockaddr_totext(const isc_sockaddr_t *sockaddr, isc_buffer_t *target);
-/*
+/*%<
* Append a text representation of 'sockaddr' to the buffer 'target'.
* The text will include both the IP address (v4 or v6) and the port.
* The text is null terminated, but the terminating null is not
* part of the buffer's used region.
*
* Returns:
- * ISC_R_SUCCESS
- * ISC_R_NOSPACE The text or the null termination did not fit.
+ * \li ISC_R_SUCCESS
+ * \li ISC_R_NOSPACE The text or the null termination did not fit.
*/
void
isc_sockaddr_format(const isc_sockaddr_t *sa, char *array, unsigned int size);
-/*
+/*%<
* Format a human-readable representation of the socket address '*sa'
* into the character array 'array', which is of size 'size'.
* The resulting string is guaranteed to be null-terminated.
@@ -169,8 +196,8 @@ isc_sockaddr_format(const isc_sockaddr_t *sa, char *array, unsigned int size);
isc_boolean_t
isc_sockaddr_ismulticast(const isc_sockaddr_t *sa);
-/*
- * Returns ISC_TRUE if the address is a multicast address.
+/*%<
+ * Returns #ISC_TRUE if the address is a multicast address.
*/
isc_boolean_t
@@ -181,19 +208,30 @@ isc_sockaddr_isexperimental(const isc_sockaddr_t *sa);
isc_boolean_t
isc_sockaddr_islinklocal(const isc_sockaddr_t *sa);
-/*
+/*%<
* Returns ISC_TRUE if the address is a link local addresss.
*/
isc_boolean_t
isc_sockaddr_issitelocal(const isc_sockaddr_t *sa);
-/*
+/*%<
* Returns ISC_TRUE if the address is a sitelocal address.
*/
-#define ISC_SOCKADDR_FORMATSIZE \
- sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:XXX.XXX.XXX.XXX#YYYYY%SSSSSSSSSS")
+isc_result_t
+isc_sockaddr_frompath(isc_sockaddr_t *sockaddr, const char *path);
/*
+ * Create a UNIX domain sockaddr that refers to path.
+ *
+ * Returns:
+ * \li ISC_R_NOSPACE
+ * \li ISC_R_NOTIMPLEMENTED
+ * \li ISC_R_SUCCESS
+ */
+
+#define ISC_SOCKADDR_FORMATSIZE \
+ sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:XXX.XXX.XXX.XXX%SSSSSSSSSS#YYYYY")
+/*%<
* Minimum size of array to pass to isc_sockaddr_format().
*/
diff --git a/contrib/bind9/lib/isc/include/isc/socket.h b/contrib/bind9/lib/isc/include/isc/socket.h
index 9dcadb2..ccc49f5 100644
--- a/contrib/bind9/lib/isc/include/isc/socket.h
+++ b/contrib/bind9/lib/isc/include/isc/socket.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2006 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: socket.h,v 1.54.12.4 2004/03/08 09:04:53 marka Exp $ */
+/* $Id: socket.h,v 1.57.18.6 2006/06/07 00:29:45 marka Exp $ */
#ifndef ISC_SOCKET_H
#define ISC_SOCKET_H 1
@@ -24,36 +24,32 @@
***** Module Info
*****/
-/*
- * Sockets
- *
- * Provides TCP and UDP sockets for network I/O. The sockets are event
+/*! \file
+ * \brief Provides TCP and UDP sockets for network I/O. The sockets are event
* sources in the task system.
*
* When I/O completes, a completion event for the socket is posted to the
* event queue of the task which requested the I/O.
*
- * MP:
+ * \li MP:
* The module ensures appropriate synchronization of data structures it
* creates and manipulates.
- *
* Clients of this module must not be holding a socket's task's lock when
* making a call that affects that socket. Failure to follow this rule
* can result in deadlock.
- *
* The caller must ensure that isc_socketmgr_destroy() is called only
* once for a given manager.
*
- * Reliability:
+ * \li Reliability:
* No anticipated impact.
*
- * Resources:
- * <TBS>
+ * \li Resources:
+ * TBS
*
- * Security:
+ * \li Security:
* No anticipated impact.
*
- * Standards:
+ * \li Standards:
* None.
*/
@@ -75,7 +71,7 @@ ISC_LANG_BEGINDECLS
*** Constants
***/
-/*
+/*%
* Maximum number of buffers in a scatter/gather read/write. The operating
* system in use must support at least this number (plus one on some.)
*/
@@ -87,33 +83,35 @@ ISC_LANG_BEGINDECLS
struct isc_socketevent {
ISC_EVENT_COMMON(isc_socketevent_t);
- isc_result_t result; /* OK, EOF, whatever else */
- unsigned int minimum; /* minimum i/o for event */
- unsigned int n; /* bytes read or written */
- unsigned int offset; /* offset into buffer list */
- isc_region_t region; /* for single-buffer i/o */
- isc_bufferlist_t bufferlist; /* list of buffers */
- isc_sockaddr_t address; /* source address */
- isc_time_t timestamp; /* timestamp of packet recv */
- struct in6_pktinfo pktinfo; /* ipv6 pktinfo */
- isc_uint32_t attributes; /* see below */
+ isc_result_t result; /*%< OK, EOF, whatever else */
+ unsigned int minimum; /*%< minimum i/o for event */
+ unsigned int n; /*%< bytes read or written */
+ unsigned int offset; /*%< offset into buffer list */
+ isc_region_t region; /*%< for single-buffer i/o */
+ isc_bufferlist_t bufferlist; /*%< list of buffers */
+ isc_sockaddr_t address; /*%< source address */
+ isc_time_t timestamp; /*%< timestamp of packet recv */
+ struct in6_pktinfo pktinfo; /*%< ipv6 pktinfo */
+ isc_uint32_t attributes; /*%< see below */
+ isc_eventdestructor_t destroy; /*%< original destructor */
};
typedef struct isc_socket_newconnev isc_socket_newconnev_t;
struct isc_socket_newconnev {
ISC_EVENT_COMMON(isc_socket_newconnev_t);
isc_socket_t * newsocket;
- isc_result_t result; /* OK, EOF, whatever else */
- isc_sockaddr_t address; /* source address */
+ isc_result_t result; /*%< OK, EOF, whatever else */
+ isc_sockaddr_t address; /*%< source address */
};
typedef struct isc_socket_connev isc_socket_connev_t;
struct isc_socket_connev {
ISC_EVENT_COMMON(isc_socket_connev_t);
- isc_result_t result; /* OK, EOF, whatever else */
+ isc_result_t result; /*%< OK, EOF, whatever else */
};
-/*
+/*@{*/
+/*!
* _ATTACHED: Internal use only.
* _TRUNC: Packet was truncated on receive.
* _CTRUNC: Packet control information was truncated. This can
@@ -129,6 +127,7 @@ struct isc_socket_connev {
#define ISC_SOCKEVENTATTR_TIMESTAMP 0x00200000U /* public */
#define ISC_SOCKEVENTATTR_PKTINFO 0x00100000U /* public */
#define ISC_SOCKEVENTATTR_MULTICAST 0x00080000U /* public */
+/*@}*/
#define ISC_SOCKEVENT_ANYEVENT (0)
#define ISC_SOCKEVENT_RECVDONE (ISC_EVENTCLASS_SOCKET + 1)
@@ -144,30 +143,37 @@ struct isc_socket_connev {
typedef enum {
isc_sockettype_udp = 1,
- isc_sockettype_tcp = 2
+ isc_sockettype_tcp = 2,
+ isc_sockettype_unix = 3
} isc_sockettype_t;
-/*
+/*@{*/
+/*!
* How a socket should be shutdown in isc_socket_shutdown() calls.
*/
-#define ISC_SOCKSHUT_RECV 0x00000001 /* close read side */
-#define ISC_SOCKSHUT_SEND 0x00000002 /* close write side */
-#define ISC_SOCKSHUT_ALL 0x00000003 /* close them all */
+#define ISC_SOCKSHUT_RECV 0x00000001 /*%< close read side */
+#define ISC_SOCKSHUT_SEND 0x00000002 /*%< close write side */
+#define ISC_SOCKSHUT_ALL 0x00000003 /*%< close them all */
+/*@}*/
-/*
+/*@{*/
+/*!
* What I/O events to cancel in isc_socket_cancel() calls.
*/
-#define ISC_SOCKCANCEL_RECV 0x00000001 /* cancel recv */
-#define ISC_SOCKCANCEL_SEND 0x00000002 /* cancel send */
-#define ISC_SOCKCANCEL_ACCEPT 0x00000004 /* cancel accept */
-#define ISC_SOCKCANCEL_CONNECT 0x00000008 /* cancel connect */
-#define ISC_SOCKCANCEL_ALL 0x0000000f /* cancel everything */
-
-/*
+#define ISC_SOCKCANCEL_RECV 0x00000001 /*%< cancel recv */
+#define ISC_SOCKCANCEL_SEND 0x00000002 /*%< cancel send */
+#define ISC_SOCKCANCEL_ACCEPT 0x00000004 /*%< cancel accept */
+#define ISC_SOCKCANCEL_CONNECT 0x00000008 /*%< cancel connect */
+#define ISC_SOCKCANCEL_ALL 0x0000000f /*%< cancel everything */
+/*@}*/
+
+/*@{*/
+/*!
* Flags for isc_socket_send() and isc_socket_recv() calls.
*/
-#define ISC_SOCKFLAG_IMMEDIATE 0x00000001 /* send event only if needed */
-#define ISC_SOCKFLAG_NORETRY 0x00000002 /* drop failed UDP sends */
+#define ISC_SOCKFLAG_IMMEDIATE 0x00000001 /*%< send event only if needed */
+#define ISC_SOCKFLAG_NORETRY 0x00000002 /*%< drop failed UDP sends */
+/*@}*/
/***
*** Socket and Socket Manager Functions
@@ -181,18 +187,18 @@ isc_socket_create(isc_socketmgr_t *manager,
int pf,
isc_sockettype_t type,
isc_socket_t **socketp);
-/*
+/*%<
* Create a new 'type' socket managed by 'manager'.
*
* Note:
*
- * 'pf' is the desired protocol family, e.g. PF_INET or PF_INET6.
+ *\li 'pf' is the desired protocol family, e.g. PF_INET or PF_INET6.
*
* Requires:
*
- * 'manager' is a valid manager
+ *\li 'manager' is a valid manager
*
- * 'socketp' is a valid pointer, and *socketp == NULL
+ *\li 'socketp' is a valid pointer, and *socketp == NULL
*
* Ensures:
*
@@ -200,16 +206,16 @@ isc_socket_create(isc_socketmgr_t *manager,
*
* Returns:
*
- * ISC_R_SUCCESS
- * ISC_R_NOMEMORY
- * ISC_R_NORESOURCES
- * ISC_R_UNEXPECTED
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_NOMEMORY
+ *\li #ISC_R_NORESOURCES
+ *\li #ISC_R_UNEXPECTED
*/
void
isc_socket_cancel(isc_socket_t *sock, isc_task_t *task,
unsigned int how);
-/*
+/*%<
* Cancel pending I/O of the type specified by "how".
*
* Note: if "task" is NULL, then the cancel applies to all tasks using the
@@ -217,45 +223,45 @@ isc_socket_cancel(isc_socket_t *sock, isc_task_t *task,
*
* Requires:
*
- * "socket" is a valid socket
+ * \li "socket" is a valid socket
*
- * "task" is NULL or a valid task
+ * \li "task" is NULL or a valid task
*
* "how" is a bitmask describing the type of cancelation to perform.
* The type ISC_SOCKCANCEL_ALL will cancel all pending I/O on this
* socket.
*
- * ISC_SOCKCANCEL_RECV:
+ * \li ISC_SOCKCANCEL_RECV:
* Cancel pending isc_socket_recv() calls.
*
- * ISC_SOCKCANCEL_SEND:
+ * \li ISC_SOCKCANCEL_SEND:
* Cancel pending isc_socket_send() and isc_socket_sendto() calls.
*
- * ISC_SOCKCANCEL_ACCEPT:
+ * \li ISC_SOCKCANCEL_ACCEPT:
* Cancel pending isc_socket_accept() calls.
*
- * ISC_SOCKCANCEL_CONNECT:
+ * \li ISC_SOCKCANCEL_CONNECT:
* Cancel pending isc_socket_connect() call.
*/
void
isc_socket_shutdown(isc_socket_t *sock, unsigned int how);
-/*
+/*%<
* Shutdown 'socket' according to 'how'.
*
* Requires:
*
- * 'socket' is a valid socket.
+ * \li 'socket' is a valid socket.
*
- * 'task' is NULL or is a valid task.
+ * \li 'task' is NULL or is a valid task.
*
- * If 'how' is 'ISC_SOCKSHUT_RECV' or 'ISC_SOCKSHUT_ALL' then
+ * \li If 'how' is 'ISC_SOCKSHUT_RECV' or 'ISC_SOCKSHUT_ALL' then
*
* The read queue must be empty.
*
* No further read requests may be made.
*
- * If 'how' is 'ISC_SOCKSHUT_SEND' or 'ISC_SOCKSHUT_ALL' then
+ * \li If 'how' is 'ISC_SOCKSHUT_SEND' or 'ISC_SOCKSHUT_ALL' then
*
* The write queue must be empty.
*
@@ -264,39 +270,39 @@ isc_socket_shutdown(isc_socket_t *sock, unsigned int how);
void
isc_socket_attach(isc_socket_t *sock, isc_socket_t **socketp);
-/*
+/*%<
* Attach *socketp to socket.
*
* Requires:
*
- * 'socket' is a valid socket.
+ * \li 'socket' is a valid socket.
*
- * 'socketp' points to a NULL socket.
+ * \li 'socketp' points to a NULL socket.
*
* Ensures:
*
- * *socketp is attached to socket.
+ * \li *socketp is attached to socket.
*/
void
isc_socket_detach(isc_socket_t **socketp);
-/*
+/*%<
* Detach *socketp from its socket.
*
* Requires:
*
- * 'socketp' points to a valid socket.
+ * \li 'socketp' points to a valid socket.
*
- * If '*socketp' is the last reference to the socket,
+ * \li If '*socketp' is the last reference to the socket,
* then:
*
* There must be no pending I/O requests.
*
* Ensures:
*
- * *socketp is NULL.
+ * \li *socketp is NULL.
*
- * If '*socketp' is the last reference to the socket,
+ * \li If '*socketp' is the last reference to the socket,
* then:
*
* The socket will be shutdown (both reading and writing)
@@ -307,145 +313,146 @@ isc_socket_detach(isc_socket_t **socketp);
isc_result_t
isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *addressp);
-/*
+/*%<
* Bind 'socket' to '*addressp'.
*
* Requires:
*
- * 'socket' is a valid socket
+ * \li 'socket' is a valid socket
*
- * 'addressp' points to a valid isc_sockaddr.
+ * \li 'addressp' points to a valid isc_sockaddr.
*
* Returns:
*
- * ISC_R_SUCCESS
- * ISC_R_NOPERM
- * ISC_R_ADDRNOTAVAIL
- * ISC_R_ADDRINUSE
- * ISC_R_BOUND
- * ISC_R_UNEXPECTED
+ * \li ISC_R_SUCCESS
+ * \li ISC_R_NOPERM
+ * \li ISC_R_ADDRNOTAVAIL
+ * \li ISC_R_ADDRINUSE
+ * \li ISC_R_BOUND
+ * \li ISC_R_UNEXPECTED
*/
isc_result_t
isc_socket_filter(isc_socket_t *sock, const char *filter);
-/*
+/*%<
* Inform the kernel that it should perform accept filtering.
* If filter is NULL the current filter will be removed.:w
*/
isc_result_t
isc_socket_listen(isc_socket_t *sock, unsigned int backlog);
-/*
+/*%<
* Set listen mode on the socket. After this call, the only function that
* can be used (other than attach and detach) is isc_socket_accept().
*
* Notes:
*
- * 'backlog' is as in the UNIX system call listen() and may be
+ * \li 'backlog' is as in the UNIX system call listen() and may be
* ignored by non-UNIX implementations.
*
- * If 'backlog' is zero, a reasonable system default is used, usually
+ * \li If 'backlog' is zero, a reasonable system default is used, usually
* SOMAXCONN.
*
* Requires:
*
- * 'socket' is a valid, bound TCP socket.
+ * \li 'socket' is a valid, bound TCP socket or a valid, bound UNIX socket.
*
* Returns:
*
- * ISC_R_SUCCESS
- * ISC_R_UNEXPECTED
+ * \li ISC_R_SUCCESS
+ * \li ISC_R_UNEXPECTED
*/
isc_result_t
isc_socket_accept(isc_socket_t *sock,
isc_task_t *task, isc_taskaction_t action, const void *arg);
-/*
+/*%<
* Queue accept event. When a new connection is received, the task will
* get an ISC_SOCKEVENT_NEWCONN event with the sender set to the listen
* socket. The new socket structure is sent inside the isc_socket_newconnev_t
* event type, and is attached to the task 'task'.
*
* REQUIRES:
- * 'socket' is a valid TCP socket that isc_socket_listen() was called
+ * \li 'socket' is a valid TCP socket that isc_socket_listen() was called
* on.
*
- * 'task' is a valid task
+ * \li 'task' is a valid task
*
- * 'action' is a valid action
+ * \li 'action' is a valid action
*
* RETURNS:
- * ISC_R_SUCCESS
- * ISC_R_NOMEMORY
- * ISC_R_UNEXPECTED
+ * \li ISC_R_SUCCESS
+ * \li ISC_R_NOMEMORY
+ * \li ISC_R_UNEXPECTED
*/
isc_result_t
isc_socket_connect(isc_socket_t *sock, isc_sockaddr_t *addressp,
isc_task_t *task, isc_taskaction_t action,
const void *arg);
-/*
+/*%<
* Connect 'socket' to peer with address *saddr. When the connection
* succeeds, or when an error occurs, a CONNECT event with action 'action'
* and arg 'arg' will be posted to the event queue for 'task'.
*
* Requires:
*
- * 'socket' is a valid TCP socket
+ * \li 'socket' is a valid TCP socket
*
- * 'addressp' points to a valid isc_sockaddr
+ * \li 'addressp' points to a valid isc_sockaddr
*
- * 'task' is a valid task
+ * \li 'task' is a valid task
*
- * 'action' is a valid action
+ * \li 'action' is a valid action
*
* Returns:
*
- * ISC_R_SUCCESS
- * ISC_R_NOMEMORY
- * ISC_R_UNEXPECTED
+ * \li ISC_R_SUCCESS
+ * \li ISC_R_NOMEMORY
+ * \li ISC_R_UNEXPECTED
*
* Posted event's result code:
*
- * ISC_R_SUCCESS
- * ISC_R_TIMEDOUT
- * ISC_R_CONNREFUSED
- * ISC_R_NETUNREACH
- * ISC_R_UNEXPECTED
+ * \li ISC_R_SUCCESS
+ * \li ISC_R_TIMEDOUT
+ * \li ISC_R_CONNREFUSED
+ * \li ISC_R_NETUNREACH
+ * \li ISC_R_UNEXPECTED
*/
isc_result_t
isc_socket_getpeername(isc_socket_t *sock, isc_sockaddr_t *addressp);
-/*
+/*%<
* Get the name of the peer connected to 'socket'.
*
* Requires:
*
- * 'socket' is a valid TCP socket.
+ * \li 'socket' is a valid TCP socket.
*
* Returns:
*
- * ISC_R_SUCCESS
- * ISC_R_TOOSMALL
- * ISC_R_UNEXPECTED
+ * \li ISC_R_SUCCESS
+ * \li ISC_R_TOOSMALL
+ * \li ISC_R_UNEXPECTED
*/
isc_result_t
isc_socket_getsockname(isc_socket_t *sock, isc_sockaddr_t *addressp);
-/*
+/*%<
* Get the name of 'socket'.
*
* Requires:
*
- * 'socket' is a valid socket.
+ * \li 'socket' is a valid socket.
*
* Returns:
*
- * ISC_R_SUCCESS
- * ISC_R_TOOSMALL
- * ISC_R_UNEXPECTED
+ * \li ISC_R_SUCCESS
+ * \li ISC_R_TOOSMALL
+ * \li ISC_R_UNEXPECTED
*/
+/*@{*/
isc_result_t
isc_socket_recv(isc_socket_t *sock, isc_region_t *region,
unsigned int minimum,
@@ -460,39 +467,39 @@ isc_socket_recv2(isc_socket_t *sock, isc_region_t *region,
unsigned int minimum, isc_task_t *task,
isc_socketevent_t *event, unsigned int flags);
-/*
+/*!
* Receive from 'socket', storing the results in region.
*
* Notes:
*
- * Let 'length' refer to the length of 'region' or to the sum of all
+ *\li Let 'length' refer to the length of 'region' or to the sum of all
* available regions in the list of buffers '*buflist'.
*
- * If 'minimum' is non-zero and at least that many bytes are read,
+ *\li If 'minimum' is non-zero and at least that many bytes are read,
* the completion event will be posted to the task 'task.' If minimum
* is zero, the exact number of bytes requested in the region must
* be read for an event to be posted. This only makes sense for TCP
* connections, and is always set to 1 byte for UDP.
*
- * The read will complete when the desired number of bytes have been
+ *\li The read will complete when the desired number of bytes have been
* read, if end-of-input occurs, or if an error occurs. A read done
* event with the given 'action' and 'arg' will be posted to the
* event queue of 'task'.
*
- * The caller may not modify 'region', the buffers which are passed
+ *\li The caller may not modify 'region', the buffers which are passed
* into this function, or any data they refer to until the completion
* event is received.
*
- * For isc_socket_recvv():
+ *\li For isc_socket_recvv():
* On successful completion, '*buflist' will be empty, and the list of
* all buffers will be returned in the done event's 'bufferlist'
* member. On error return, '*buflist' will be unchanged.
*
- * For isc_socket_recv2():
+ *\li For isc_socket_recv2():
* 'event' is not NULL, and the non-socket specific fields are
* expected to be initialized.
*
- * For isc_socket_recv2():
+ *\li For isc_socket_recv2():
* The only defined value for 'flags' is ISC_SOCKFLAG_IMMEDIATE. If
* set and the operation completes, the return value will be
* ISC_R_SUCCESS and the event will be filled in and not sent. If the
@@ -502,36 +509,38 @@ isc_socket_recv2(isc_socket_t *sock, isc_region_t *region,
*
* Requires:
*
- * 'socket' is a valid, bound socket.
+ *\li 'socket' is a valid, bound socket.
*
- * For isc_socket_recv():
+ *\li For isc_socket_recv():
* 'region' is a valid region
*
- * For isc_socket_recvv():
+ *\li For isc_socket_recvv():
* 'buflist' is non-NULL, and '*buflist' contain at least one buffer.
*
- * 'task' is a valid task
+ *\li 'task' is a valid task
*
- * For isc_socket_recv() and isc_socket_recvv():
+ *\li For isc_socket_recv() and isc_socket_recvv():
* action != NULL and is a valid action
*
- * For isc_socket_recv2():
+ *\li For isc_socket_recv2():
* event != NULL
*
* Returns:
*
- * ISC_R_SUCCESS
- * ISC_R_INPROGRESS
- * ISC_R_NOMEMORY
- * ISC_R_UNEXPECTED
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_INPROGRESS
+ *\li #ISC_R_NOMEMORY
+ *\li #ISC_R_UNEXPECTED
*
* Event results:
*
- * ISC_R_SUCCESS
- * ISC_R_UNEXPECTED
- * XXX needs other net-type errors
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_UNEXPECTED
+ *\li XXX needs other net-type errors
*/
+/*@}*/
+/*@{*/
isc_result_t
isc_socket_send(isc_socket_t *sock, isc_region_t *region,
isc_task_t *task, isc_taskaction_t action, const void *arg);
@@ -552,41 +561,41 @@ isc_socket_sendto2(isc_socket_t *sock, isc_region_t *region,
isc_sockaddr_t *address, struct in6_pktinfo *pktinfo,
isc_socketevent_t *event, unsigned int flags);
-/*
+/*!
* Send the contents of 'region' to the socket's peer.
*
* Notes:
*
- * Shutting down the requestor's task *may* result in any
+ *\li Shutting down the requestor's task *may* result in any
* still pending writes being dropped or completed, depending on the
* underlying OS implementation.
*
- * If 'action' is NULL, then no completion event will be posted.
+ *\li If 'action' is NULL, then no completion event will be posted.
*
- * The caller may not modify 'region', the buffers which are passed
+ *\li The caller may not modify 'region', the buffers which are passed
* into this function, or any data they refer to until the completion
* event is received.
*
- * For isc_socket_sendv() and isc_socket_sendtov():
+ *\li For isc_socket_sendv() and isc_socket_sendtov():
* On successful completion, '*buflist' will be empty, and the list of
* all buffers will be returned in the done event's 'bufferlist'
* member. On error return, '*buflist' will be unchanged.
*
- * For isc_socket_sendto2():
+ *\li For isc_socket_sendto2():
* 'event' is not NULL, and the non-socket specific fields are
* expected to be initialized.
*
- * For isc_socket_sendto2():
+ *\li For isc_socket_sendto2():
* The only defined values for 'flags' are ISC_SOCKFLAG_IMMEDIATE
* and ISC_SOCKFLAG_NORETRY.
*
- * If ISC_SOCKFLAG_IMMEDIATE is set and the operation completes, the
+ *\li If ISC_SOCKFLAG_IMMEDIATE is set and the operation completes, the
* return value will be ISC_R_SUCCESS and the event will be filled
* in and not sent. If the operation does not complete, the return
* value will be ISC_R_INPROGRESS and the event will be sent when
* the operation completes.
*
- * ISC_SOCKFLAG_NORETRY can only be set for UDP sockets. If set
+ *\li ISC_SOCKFLAG_NORETRY can only be set for UDP sockets. If set
* and the send operation fails due to a transient error, the send
* will not be retried and the error will be indicated in the event.
* Using this option along with ISC_SOCKFLAG_IMMEDIATE allows the caller
@@ -594,109 +603,148 @@ isc_socket_sendto2(isc_socket_t *sock, isc_region_t *region,
*
* Requires:
*
- * 'socket' is a valid, bound socket.
+ *\li 'socket' is a valid, bound socket.
*
- * For isc_socket_send():
+ *\li For isc_socket_send():
* 'region' is a valid region
*
- * For isc_socket_sendv() and isc_socket_sendtov():
+ *\li For isc_socket_sendv() and isc_socket_sendtov():
* 'buflist' is non-NULL, and '*buflist' contain at least one buffer.
*
- * 'task' is a valid task
+ *\li 'task' is a valid task
*
- * For isc_socket_sendv(), isc_socket_sendtov(), isc_socket_send(), and
+ *\li For isc_socket_sendv(), isc_socket_sendtov(), isc_socket_send(), and
* isc_socket_sendto():
* action == NULL or is a valid action
*
- * For isc_socket_sendto2():
+ *\li For isc_socket_sendto2():
* event != NULL
*
* Returns:
*
- * ISC_R_SUCCESS
- * ISC_R_INPROGRESS
- * ISC_R_NOMEMORY
- * ISC_R_UNEXPECTED
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_INPROGRESS
+ *\li #ISC_R_NOMEMORY
+ *\li #ISC_R_UNEXPECTED
*
* Event results:
*
- * ISC_R_SUCCESS
- * ISC_R_UNEXPECTED
- * XXX needs other net-type errors
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_UNEXPECTED
+ *\li XXX needs other net-type errors
*/
+/*@}*/
isc_result_t
isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp);
-/*
+/*%<
* Create a socket manager.
*
* Notes:
*
- * All memory will be allocated in memory context 'mctx'.
+ *\li All memory will be allocated in memory context 'mctx'.
*
* Requires:
*
- * 'mctx' is a valid memory context.
+ *\li 'mctx' is a valid memory context.
*
- * 'managerp' points to a NULL isc_socketmgr_t.
+ *\li 'managerp' points to a NULL isc_socketmgr_t.
*
* Ensures:
*
- * '*managerp' is a valid isc_socketmgr_t.
+ *\li '*managerp' is a valid isc_socketmgr_t.
*
* Returns:
*
- * ISC_R_SUCCESS
- * ISC_R_NOMEMORY
- * ISC_R_UNEXPECTED
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_NOMEMORY
+ *\li #ISC_R_UNEXPECTED
*/
void
isc_socketmgr_destroy(isc_socketmgr_t **managerp);
-/*
+/*%<
* Destroy a socket manager.
*
* Notes:
*
- * This routine blocks until there are no sockets left in the manager,
+ *\li This routine blocks until there are no sockets left in the manager,
* so if the caller holds any socket references using the manager, it
* must detach them before calling isc_socketmgr_destroy() or it will
* block forever.
*
* Requires:
*
- * '*managerp' is a valid isc_socketmgr_t.
+ *\li '*managerp' is a valid isc_socketmgr_t.
*
- * All sockets managed by this manager are fully detached.
+ *\li All sockets managed by this manager are fully detached.
*
* Ensures:
*
- * *managerp == NULL
+ *\li *managerp == NULL
*
- * All resources used by the manager have been freed.
+ *\li All resources used by the manager have been freed.
*/
isc_sockettype_t
isc_socket_gettype(isc_socket_t *sock);
-/*
+/*%<
* Returns the socket type for "sock."
*
* Requires:
*
- * "sock" is a valid socket.
+ *\li "sock" is a valid socket.
*/
+/*@{*/
isc_boolean_t
isc_socket_isbound(isc_socket_t *sock);
void
isc_socket_ipv6only(isc_socket_t *sock, isc_boolean_t yes);
-/*
+/*%<
* If the socket is an IPv6 socket set/clear the IPV6_IPV6ONLY socket
* option if the host OS supports this option.
*
* Requires:
- * 'sock' is a valid socket.
+ *\li 'sock' is a valid socket.
+ */
+/*@}*/
+
+void
+isc_socket_cleanunix(isc_sockaddr_t *addr, isc_boolean_t active);
+
+/*%<
+ * Cleanup UNIX domain sockets in the file-system. If 'active' is true
+ * then just unlink the socket. If 'active' is false try to determine
+ * if there is a listener of the socket or not. If no listener is found
+ * then unlink socket.
+ *
+ * Prior to unlinking the path is tested to see if it a socket.
+ *
+ * Note: there are a number of race conditions which cannot be avoided
+ * both in the filesystem and any application using UNIX domain
+ * sockets (e.g. socket is tested between bind() and listen(),
+ * the socket is deleted and replaced in the file-system between
+ * stat() and unlink()).
+ */
+
+isc_result_t
+isc_socket_permunix(isc_sockaddr_t *sockaddr, isc_uint32_t perm,
+ isc_uint32_t owner, isc_uint32_t group);
+/*%<
+ * Set ownership and file permissions on the UNIX domain socket.
+ *
+ * Note: On Solaris and SunOS this secures the directory containing
+ * the socket as Solaris and SunOS do not honour the filesytem
+ * permissions on the socket.
+ *
+ * Requires:
+ * \li 'sockaddr' to be a valid UNIX domain sockaddr.
+ *
+ * Returns:
+ * \li #ISC_R_SUCCESS
+ * \li #ISC_R_FAILURE
*/
ISC_LANG_ENDDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/stdio.h b/contrib/bind9/lib/isc/include/isc/stdio.h
index 7dad284..e3bf0cd 100644
--- a/contrib/bind9/lib/isc/include/isc/stdio.h
+++ b/contrib/bind9/lib/isc/include/isc/stdio.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,22 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: stdio.h,v 1.6.206.1 2004/03/06 08:14:48 marka Exp $ */
+/* $Id: stdio.h,v 1.7.18.2 2005/04/29 00:17:03 marka Exp $ */
#ifndef ISC_STDIO_H
#define ISC_STDIO_H 1
+/*! \file */
+
+/*%
+ * These functions are wrappers around the corresponding stdio functions.
+ *
+ * They return a detailed error code in the form of an an isc_result_t. ANSI C
+ * does not guarantee that stdio functions set errno, hence these functions
+ * must use platform dependent methods (e.g., the POSIX errno) to construct the
+ * error code.
+ */
+
#include <stdio.h>
#include <isc/lang.h>
@@ -27,36 +38,35 @@
ISC_LANG_BEGINDECLS
+/*% Open */
isc_result_t
isc_stdio_open(const char *filename, const char *mode, FILE **fp);
+/*% Close */
isc_result_t
isc_stdio_close(FILE *f);
+/*% Seek */
isc_result_t
isc_stdio_seek(FILE *f, long offset, int whence);
+/*% Read */
isc_result_t
isc_stdio_read(void *ptr, size_t size, size_t nmemb, FILE *f,
size_t *nret);
+/*% Write */
isc_result_t
isc_stdio_write(const void *ptr, size_t size, size_t nmemb, FILE *f,
size_t *nret);
+/*% Flush */
isc_result_t
isc_stdio_flush(FILE *f);
-/*
- * These functions are wrappers around the corresponding stdio functions,
- * returning a detailed error code in the form of an an isc_result_t. ANSI C
- * does not guarantee that stdio functions set errno, hence these functions
- * must use platform dependent methods (e.g., the POSIX errno) to construct the
- * error code.
- */
isc_result_t
isc_stdio_sync(FILE *f);
-/*
+/*%<
* Invoke fsync() on the file descriptor underlying an stdio stream, or an
* equivalent system-dependent operation. Note that this function has no
* direct counterpart in the stdio library.
diff --git a/contrib/bind9/lib/isc/include/isc/stdlib.h b/contrib/bind9/lib/isc/include/isc/stdlib.h
index 7b75584..0e2c697 100644
--- a/contrib/bind9/lib/isc/include/isc/stdlib.h
+++ b/contrib/bind9/lib/isc/include/isc/stdlib.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: stdlib.h,v 1.1.32.2 2004/03/06 08:14:48 marka Exp $ */
+/* $Id: stdlib.h,v 1.2.18.2 2005/04/29 00:17:03 marka Exp $ */
#ifndef ISC_STDLIB_H
#define ISC_STDLIB_H 1
+/*! \file */
+
#include <stdlib.h>
#include <isc/lang.h>
diff --git a/contrib/bind9/lib/isc/include/isc/string.h b/contrib/bind9/lib/isc/include/isc/string.h
index 4fbfe19..1373cf2 100644
--- a/contrib/bind9/lib/isc/include/isc/string.h
+++ b/contrib/bind9/lib/isc/include/isc/string.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,22 +15,28 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: string.h,v 1.9.164.3 2004/03/06 08:14:49 marka Exp $ */
+/* $Id: string.h,v 1.12.18.3 2005/08/16 04:39:05 marka Exp $ */
#ifndef ISC_STRING_H
#define ISC_STRING_H 1
+/*! \file */
+
#include <string.h>
+#include <isc/formatcheck.h>
#include <isc/int.h>
#include <isc/lang.h>
#include <isc/platform.h>
+#include <isc/types.h>
+
+#define ISC_STRING_MAGIC 0x5e
ISC_LANG_BEGINDECLS
isc_uint64_t
isc_string_touint64(char *source, char **endp, int base);
-/*
+/*%<
* Convert the string pointed to by 'source' to isc_uint64_t.
*
* On successful conversion 'endp' points to the first character
@@ -43,6 +49,150 @@ isc_string_touint64(char *source, char **endp, int base);
* On error 'endp' points to 'source'.
*/
+isc_result_t
+isc_string_copy(char *target, size_t size, const char *source);
+/*
+ * Copy the string pointed to by 'source' to 'target' which is a
+ * pointer to a string of at least 'size' bytes.
+ *
+ * Requires:
+ * 'target' is a pointer to a char[] of at least 'size' bytes.
+ * 'size' an integer > 0.
+ * 'source' == NULL or points to a NUL terminated string.
+ *
+ * Ensures:
+ * If result == ISC_R_SUCCESS
+ * 'target' will be a NUL terminated string of no more
+ * than 'size' bytes (including NUL).
+ *
+ * If result == ISC_R_NOSPACE
+ * 'target' is undefined.
+ *
+ * Returns:
+ * ISC_R_SUCCESS -- 'source' was successfully copied to 'target'.
+ * ISC_R_NOSPACE -- 'source' could not be copied since 'target'
+ * is too small.
+ */
+
+void
+isc_string_copy_truncate(char *target, size_t size, const char *source);
+/*
+ * Copy the string pointed to by 'source' to 'target' which is a
+ * pointer to a string of at least 'size' bytes.
+ *
+ * Requires:
+ * 'target' is a pointer to a char[] of at least 'size' bytes.
+ * 'size' an integer > 0.
+ * 'source' == NULL or points to a NUL terminated string.
+ *
+ * Ensures:
+ * 'target' will be a NUL terminated string of no more
+ * than 'size' bytes (including NUL).
+ */
+
+isc_result_t
+isc_string_append(char *target, size_t size, const char *source);
+/*
+ * Append the string pointed to by 'source' to 'target' which is a
+ * pointer to a NUL terminated string of at least 'size' bytes.
+ *
+ * Requires:
+ * 'target' is a pointer to a NUL terminated char[] of at
+ * least 'size' bytes.
+ * 'size' an integer > 0.
+ * 'source' == NULL or points to a NUL terminated string.
+ *
+ * Ensures:
+ * If result == ISC_R_SUCCESS
+ * 'target' will be a NUL terminated string of no more
+ * than 'size' bytes (including NUL).
+ *
+ * If result == ISC_R_NOSPACE
+ * 'target' is undefined.
+ *
+ * Returns:
+ * ISC_R_SUCCESS -- 'source' was successfully appended to 'target'.
+ * ISC_R_NOSPACE -- 'source' could not be appended since 'target'
+ * is too small.
+ */
+
+void
+isc_string_append_truncate(char *target, size_t size, const char *source);
+/*
+ * Append the string pointed to by 'source' to 'target' which is a
+ * pointer to a NUL terminated string of at least 'size' bytes.
+ *
+ * Requires:
+ * 'target' is a pointer to a NUL terminated char[] of at
+ * least 'size' bytes.
+ * 'size' an integer > 0.
+ * 'source' == NULL or points to a NUL terminated string.
+ *
+ * Ensures:
+ * 'target' will be a NUL terminated string of no more
+ * than 'size' bytes (including NUL).
+ */
+
+isc_result_t
+isc_string_printf(char *target, size_t size, const char *format, ...);
+/*
+ * Print 'format' to 'target' which is a pointer to a string of at least
+ * 'size' bytes.
+ *
+ * Requires:
+ * 'target' is a pointer to a char[] of at least 'size' bytes.
+ * 'size' an integer > 0.
+ * 'format' == NULL or points to a NUL terminated string.
+ *
+ * Ensures:
+ * If result == ISC_R_SUCCESS
+ * 'target' will be a NUL terminated string of no more
+ * than 'size' bytes (including NUL).
+ *
+ * If result == ISC_R_NOSPACE
+ * 'target' is undefined.
+ *
+ * Returns:
+ * ISC_R_SUCCESS -- 'format' was successfully printed to 'target'.
+ * ISC_R_NOSPACE -- 'format' could not be printed to 'target' since it
+ * is too small.
+ */
+
+void
+isc_string_printf_truncate(char *target, size_t size, const char *format, ...)
+ ISC_FORMAT_PRINTF(3, 4);
+/*
+ * Print 'format' to 'target' which is a pointer to a string of at least
+ * 'size' bytes.
+ *
+ * Requires:
+ * 'target' is a pointer to a char[] of at least 'size' bytes.
+ * 'size' an integer > 0.
+ * 'format' == NULL or points to a NUL terminated string.
+ *
+ * Ensures:
+ * 'target' will be a NUL terminated string of no more
+ * than 'size' bytes (including NUL).
+ */
+
+
+char *
+isc_string_regiondup(isc_mem_t *mctx, const isc_region_t *source);
+/*
+ * Copy the region pointed to by r to a NUL terminated string
+ * allocated from the memory context pointed to by mctx.
+ *
+ * The result should be deallocated using isc_mem_free()
+ *
+ * Requires:
+ * 'mctx' is a point to a valid memory context.
+ * 'source' is a pointer to a valid region.
+ *
+ * Returns:
+ * a pointer to a NUL terminated string or
+ * NULL if memory for the copy could not be allocated
+ *
+ */
char *
isc_string_separate(char **stringp, const char *delim);
diff --git a/contrib/bind9/lib/isc/include/isc/symtab.h b/contrib/bind9/lib/isc/include/isc/symtab.h
index b22fe81..94ea173 100644
--- a/contrib/bind9/lib/isc/include/isc/symtab.h
+++ b/contrib/bind9/lib/isc/include/isc/symtab.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2006 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2006 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1996-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: symtab.h,v 1.16.206.3 2006/03/02 00:37:20 marka Exp $ */
+/* $Id: symtab.h,v 1.17.18.4 2006/03/02 00:37:22 marka Exp $ */
#ifndef ISC_SYMTAB_H
#define ISC_SYMTAB_H 1
@@ -24,10 +24,8 @@
***** Module Info
*****/
-/*
- * Symbol Table
- *
- * Provides a simple memory-based symbol table.
+/*! \file
+ * \brief Provides a simple memory-based symbol table.
*
* Keys are C strings, and key comparisons are case-insenstive. A type may
* be specified when looking up, defining, or undefining. A type value of
@@ -38,11 +36,11 @@
* tuple when a tuple with the given key and type already exists in the table.
* What to do in this case is specified by the client. Possible policies are:
*
- * isc_symexists_reject Disallow the define, returning ISC_R_EXISTS
- * isc_symexists_replace Replace the old value with the new. The
+ *\li #isc_symexists_reject Disallow the define, returning #ISC_R_EXISTS
+ *\li #isc_symexists_replace Replace the old value with the new. The
* undefine action (if provided) will be called
* with the old <key, type, value> tuple.
- * isc_symexists_add Add the new tuple, leaving the old tuple in
+ *\li #isc_symexists_add Add the new tuple, leaving the old tuple in
* the table. Subsequent lookups will retrieve
* the most-recently-defined tuple.
*
@@ -59,19 +57,19 @@
* undefined. It can be used to free memory associated with keys and/or
* values.
*
- * MP:
+ * \li MP:
* The callers of this module must ensure any required synchronization.
*
- * Reliability:
+ * \li Reliability:
* No anticipated impact.
*
- * Resources:
- * <TBS>
+ * \li Resources:
+ * TBS
*
- * Security:
+ * \li Security:
* No anticipated impact.
*
- * Standards:
+ * \li Standards:
* None.
*/
@@ -82,10 +80,10 @@
#include <isc/lang.h>
#include <isc/types.h>
-/***
+/*
*** Symbol Tables.
***/
-
+/*% Symbol table value. */
typedef union isc_symvalue {
void * as_pointer;
const void * as_cpointer;
@@ -95,31 +93,36 @@ typedef union isc_symvalue {
typedef void (*isc_symtabaction_t)(char *key, unsigned int type,
isc_symvalue_t value, void *userarg);
-
+/*% Symbol table exists. */
typedef enum {
- isc_symexists_reject = 0,
- isc_symexists_replace = 1,
- isc_symexists_add = 2
+ isc_symexists_reject = 0, /*%< Disallow the define */
+ isc_symexists_replace = 1, /*%< Replace the old value with the new */
+ isc_symexists_add = 2 /*%< Add the new tuple */
} isc_symexists_t;
ISC_LANG_BEGINDECLS
+/*% Create a symbol table. */
isc_result_t
isc_symtab_create(isc_mem_t *mctx, unsigned int size,
isc_symtabaction_t undefine_action, void *undefine_arg,
isc_boolean_t case_sensitive, isc_symtab_t **symtabp);
+/*% Destroy a symbol table. */
void
isc_symtab_destroy(isc_symtab_t **symtabp);
+/*% Lookup a symbol table. */
isc_result_t
isc_symtab_lookup(isc_symtab_t *symtab, const char *key, unsigned int type,
isc_symvalue_t *value);
+/*% Define a symbol table. */
isc_result_t
isc_symtab_define(isc_symtab_t *symtab, const char *key, unsigned int type,
isc_symvalue_t value, isc_symexists_t exists_policy);
+/*% Undefine a symbol table. */
isc_result_t
isc_symtab_undefine(isc_symtab_t *symtab, const char *key, unsigned int type);
diff --git a/contrib/bind9/lib/isc/include/isc/task.h b/contrib/bind9/lib/isc/include/isc/task.h
index 0e8190a..f7d237c 100644
--- a/contrib/bind9/lib/isc/include/isc/task.h
+++ b/contrib/bind9/lib/isc/include/isc/task.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: task.h,v 1.49.206.3 2004/03/09 05:21:09 marka Exp $ */
+/* $Id: task.h,v 1.51.18.2 2005/04/29 00:17:03 marka Exp $ */
#ifndef ISC_TASK_H
#define ISC_TASK_H 1
@@ -24,33 +24,55 @@
***** Module Info
*****/
-/*
- * Task System
- *
- * The task system provides a lightweight execution context, which is
- * basically an event queue. When a task's event queue is non-empty, the
+/*! \file
+ * \brief The task system provides a lightweight execution context, which is
+ * basically an event queue.
+
+ * When a task's event queue is non-empty, the
* task is runnable. A small work crew of threads, typically one per CPU,
* execute runnable tasks by dispatching the events on the tasks' event
* queues. Context switching between tasks is fast.
*
- * MP:
+ * \li MP:
* The module ensures appropriate synchronization of data structures it
* creates and manipulates.
- *
* The caller must ensure that isc_taskmgr_destroy() is called only
* once for a given manager.
*
- * Reliability:
+ * \li Reliability:
* No anticipated impact.
*
- * Resources:
- * <TBS>
+ * \li Resources:
+ * TBS
*
- * Security:
+ * \li Security:
* No anticipated impact.
*
- * Standards:
+ * \li Standards:
* None.
+ *
+ * \section purge Purging and Unsending
+ *
+ * Events which have been queued for a task but not delivered may be removed
+ * from the task's event queue by purging or unsending.
+ *
+ * With both types, the caller specifies a matching pattern that selects
+ * events based upon their sender, type, and tag.
+ *
+ * Purging calls isc_event_free() on the matching events.
+ *
+ * Unsending returns a list of events that matched the pattern.
+ * The caller is then responsible for them.
+ *
+ * Consumers of events should purge, not unsend.
+ *
+ * Producers of events often want to remove events when the caller indicates
+ * it is no longer interested in the object, e.g. by cancelling a timer.
+ * Sometimes this can be done by purging, but for some event types, the
+ * calls to isc_event_free() cause deadlock because the event free routine
+ * wants to acquire a lock the caller is already holding. Unsending instead
+ * of purging solves this problem. As a general rule, producers should only
+ * unsend events which they have sent.
*/
@@ -76,355 +98,335 @@ ISC_LANG_BEGINDECLS
isc_result_t
isc_task_create(isc_taskmgr_t *manager, unsigned int quantum,
isc_task_t **taskp);
-/*
+/*%<
* Create a task.
*
* Notes:
*
- * If 'quantum' is non-zero, then only that many events can be dispatched
+ *\li If 'quantum' is non-zero, then only that many events can be dispatched
* before the task must yield to other tasks waiting to execute. If
* quantum is zero, then the default quantum of the task manager will
* be used.
*
- * The 'quantum' option may be removed from isc_task_create() in the
+ *\li The 'quantum' option may be removed from isc_task_create() in the
* future. If this happens, isc_task_getquantum() and
* isc_task_setquantum() will be provided.
*
* Requires:
*
- * 'manager' is a valid task manager.
+ *\li 'manager' is a valid task manager.
*
- * taskp != NULL && *taskp == NULL
+ *\li taskp != NULL && *taskp == NULL
*
* Ensures:
*
- * On success, '*taskp' is bound to the new task.
+ *\li On success, '*taskp' is bound to the new task.
*
* Returns:
*
- * ISC_R_SUCCESS
- * ISC_R_NOMEMORY
- * ISC_R_UNEXPECTED
- * ISC_R_SHUTTINGDOWN
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_NOMEMORY
+ *\li #ISC_R_UNEXPECTED
+ *\li #ISC_R_SHUTTINGDOWN
*/
void
isc_task_attach(isc_task_t *source, isc_task_t **targetp);
-/*
+/*%<
* Attach *targetp to source.
*
* Requires:
*
- * 'source' is a valid task.
+ *\li 'source' is a valid task.
*
- * 'targetp' points to a NULL isc_task_t *.
+ *\li 'targetp' points to a NULL isc_task_t *.
*
* Ensures:
*
- * *targetp is attached to source.
+ *\li *targetp is attached to source.
*/
void
isc_task_detach(isc_task_t **taskp);
-/*
+/*%<
* Detach *taskp from its task.
*
* Requires:
*
- * '*taskp' is a valid task.
+ *\li '*taskp' is a valid task.
*
* Ensures:
*
- * *taskp is NULL.
+ *\li *taskp is NULL.
*
- * If '*taskp' is the last reference to the task, the task is idle (has
+ *\li If '*taskp' is the last reference to the task, the task is idle (has
* an empty event queue), and has not been shutdown, the task will be
* shutdown.
*
- * If '*taskp' is the last reference to the task and
+ *\li If '*taskp' is the last reference to the task and
* the task has been shutdown,
- *
- * All resources used by the task will be freed.
+ * all resources used by the task will be freed.
*/
void
isc_task_send(isc_task_t *task, isc_event_t **eventp);
-/*
+/*%<
* Send '*event' to 'task'.
*
* Requires:
*
- * 'task' is a valid task.
- * eventp != NULL && *eventp != NULL.
+ *\li 'task' is a valid task.
+ *\li eventp != NULL && *eventp != NULL.
*
* Ensures:
*
- * *eventp == NULL.
+ *\li *eventp == NULL.
*/
void
isc_task_sendanddetach(isc_task_t **taskp, isc_event_t **eventp);
-/*
+/*%<
* Send '*event' to '*taskp' and then detach '*taskp' from its
* task.
*
* Requires:
*
- * '*taskp' is a valid task.
- * eventp != NULL && *eventp != NULL.
+ *\li '*taskp' is a valid task.
+ *\li eventp != NULL && *eventp != NULL.
*
* Ensures:
*
- * *eventp == NULL.
+ *\li *eventp == NULL.
*
- * *taskp == NULL.
+ *\li *taskp == NULL.
*
- * If '*taskp' is the last reference to the task, the task is
+ *\li If '*taskp' is the last reference to the task, the task is
* idle (has an empty event queue), and has not been shutdown,
* the task will be shutdown.
*
- * If '*taskp' is the last reference to the task and
+ *\li If '*taskp' is the last reference to the task and
* the task has been shutdown,
- *
- * All resources used by the task will be freed.
+ * all resources used by the task will be freed.
*/
-/*
- * Purging and Unsending
- *
- * Events which have been queued for a task but not delivered may be removed
- * from the task's event queue by purging or unsending.
- *
- * With both types, the caller specifies a matching pattern that selects
- * events based upon their sender, type, and tag.
- *
- * Purging calls isc_event_free() on the matching events.
- *
- * Unsending returns a list of events that matched the pattern.
- * The caller is then responsible for them.
- *
- * Consumers of events should purge, not unsend.
- *
- * Producers of events often want to remove events when the caller indicates
- * it is no longer interested in the object, e.g. by cancelling a timer.
- * Sometimes this can be done by purging, but for some event types, the
- * calls to isc_event_free() cause deadlock because the event free routine
- * wants to acquire a lock the caller is already holding. Unsending instead
- * of purging solves this problem. As a general rule, producers should only
- * unsend events which they have sent.
- */
unsigned int
isc_task_purgerange(isc_task_t *task, void *sender, isc_eventtype_t first,
isc_eventtype_t last, void *tag);
-/*
+/*%<
* Purge events from a task's event queue.
*
* Requires:
*
- * 'task' is a valid task.
+ *\li 'task' is a valid task.
*
- * last >= first
+ *\li last >= first
*
* Ensures:
*
- * Events in the event queue of 'task' whose sender is 'sender', whose
+ *\li Events in the event queue of 'task' whose sender is 'sender', whose
* type is >= first and <= last, and whose tag is 'tag' will be purged,
* unless they are marked as unpurgable.
*
- * A sender of NULL will match any sender. A NULL tag matches any
+ *\li A sender of NULL will match any sender. A NULL tag matches any
* tag.
*
* Returns:
*
- * The number of events purged.
+ *\li The number of events purged.
*/
unsigned int
isc_task_purge(isc_task_t *task, void *sender, isc_eventtype_t type,
void *tag);
-/*
+/*%<
* Purge events from a task's event queue.
*
* Notes:
*
- * This function is equivalent to
+ *\li This function is equivalent to
*
+ *\code
* isc_task_purgerange(task, sender, type, type, tag);
+ *\endcode
*
* Requires:
*
- * 'task' is a valid task.
+ *\li 'task' is a valid task.
*
* Ensures:
*
- * Events in the event queue of 'task' whose sender is 'sender', whose
+ *\li Events in the event queue of 'task' whose sender is 'sender', whose
* type is 'type', and whose tag is 'tag' will be purged, unless they
* are marked as unpurgable.
*
- * A sender of NULL will match any sender. A NULL tag matches any
+ *\li A sender of NULL will match any sender. A NULL tag matches any
* tag.
*
* Returns:
*
- * The number of events purged.
+ *\li The number of events purged.
*/
isc_boolean_t
isc_task_purgeevent(isc_task_t *task, isc_event_t *event);
-/*
+/*%<
* Purge 'event' from a task's event queue.
*
* XXXRTH: WARNING: This method may be removed before beta.
*
* Notes:
*
- * If 'event' is on the task's event queue, it will be purged,
+ *\li If 'event' is on the task's event queue, it will be purged,
* unless it is marked as unpurgeable. 'event' does not have to be
* on the task's event queue; in fact, it can even be an invalid
* pointer. Purging only occurs if the event is actually on the task's
* event queue.
*
- * Purging never changes the state of the task.
+ * \li Purging never changes the state of the task.
*
* Requires:
*
- * 'task' is a valid task.
+ *\li 'task' is a valid task.
*
* Ensures:
*
- * 'event' is not in the event queue for 'task'.
+ *\li 'event' is not in the event queue for 'task'.
*
* Returns:
*
- * ISC_TRUE The event was purged.
- * ISC_FALSE The event was not in the event queue,
+ *\li #ISC_TRUE The event was purged.
+ *\li #ISC_FALSE The event was not in the event queue,
* or was marked unpurgeable.
*/
unsigned int
isc_task_unsendrange(isc_task_t *task, void *sender, isc_eventtype_t first,
isc_eventtype_t last, void *tag, isc_eventlist_t *events);
-/*
+/*%<
* Remove events from a task's event queue.
*
* Requires:
*
- * 'task' is a valid task.
+ *\li 'task' is a valid task.
*
- * last >= first.
+ *\li last >= first.
*
- * *events is a valid list.
+ *\li *events is a valid list.
*
* Ensures:
*
- * Events in the event queue of 'task' whose sender is 'sender', whose
+ *\li Events in the event queue of 'task' whose sender is 'sender', whose
* type is >= first and <= last, and whose tag is 'tag' will be dequeued
* and appended to *events.
*
- * A sender of NULL will match any sender. A NULL tag matches any
+ *\li A sender of NULL will match any sender. A NULL tag matches any
* tag.
*
* Returns:
*
- * The number of events unsent.
+ *\li The number of events unsent.
*/
unsigned int
isc_task_unsend(isc_task_t *task, void *sender, isc_eventtype_t type,
void *tag, isc_eventlist_t *events);
-/*
+/*%<
* Remove events from a task's event queue.
*
* Notes:
*
- * This function is equivalent to
+ *\li This function is equivalent to
*
+ *\code
* isc_task_unsendrange(task, sender, type, type, tag, events);
+ *\endcode
*
* Requires:
*
- * 'task' is a valid task.
+ *\li 'task' is a valid task.
*
- * *events is a valid list.
+ *\li *events is a valid list.
*
* Ensures:
*
- * Events in the event queue of 'task' whose sender is 'sender', whose
+ *\li Events in the event queue of 'task' whose sender is 'sender', whose
* type is 'type', and whose tag is 'tag' will be dequeued and appended
* to *events.
*
* Returns:
*
- * The number of events unsent.
+ *\li The number of events unsent.
*/
isc_result_t
isc_task_onshutdown(isc_task_t *task, isc_taskaction_t action,
const void *arg);
-/*
+/*%<
* Send a shutdown event with action 'action' and argument 'arg' when
* 'task' is shutdown.
*
* Notes:
*
- * Shutdown events are posted in LIFO order.
+ *\li Shutdown events are posted in LIFO order.
*
* Requires:
*
- * 'task' is a valid task.
+ *\li 'task' is a valid task.
*
- * 'action' is a valid task action.
+ *\li 'action' is a valid task action.
*
* Ensures:
*
- * When the task is shutdown, shutdown events requested with
+ *\li When the task is shutdown, shutdown events requested with
* isc_task_onshutdown() will be appended to the task's event queue.
*
* Returns:
*
- * ISC_R_SUCCESS
- * ISC_R_NOMEMORY
- * ISC_R_TASKSHUTTINGDOWN Task is shutting down.
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_NOMEMORY
+ *\li #ISC_R_TASKSHUTTINGDOWN Task is shutting down.
*/
void
isc_task_shutdown(isc_task_t *task);
-/*
+/*%<
* Shutdown 'task'.
*
* Notes:
*
- * Shutting down a task causes any shutdown events requested with
+ *\li Shutting down a task causes any shutdown events requested with
* isc_task_onshutdown() to be posted (in LIFO order). The task
* moves into a "shutting down" mode which prevents further calls
* to isc_task_onshutdown().
*
- * Trying to shutdown a task that has already been shutdown has no
+ *\li Trying to shutdown a task that has already been shutdown has no
* effect.
*
* Requires:
*
- * 'task' is a valid task.
+ *\li 'task' is a valid task.
*
* Ensures:
*
- * Any shutdown events requested with isc_task_onshutdown() have been
+ *\li Any shutdown events requested with isc_task_onshutdown() have been
* posted (in LIFO order).
*/
void
isc_task_destroy(isc_task_t **taskp);
-/*
+/*%<
* Destroy '*taskp'.
*
* Notes:
*
- * This call is equivalent to:
+ *\li This call is equivalent to:
*
+ *\code
* isc_task_shutdown(*taskp);
* isc_task_detach(taskp);
+ *\endcode
*
* Requires:
*
@@ -432,45 +434,44 @@ isc_task_destroy(isc_task_t **taskp);
*
* Ensures:
*
- * Any shutdown events requested with isc_task_onshutdown() have been
+ *\li Any shutdown events requested with isc_task_onshutdown() have been
* posted (in LIFO order).
*
- * *taskp == NULL
+ *\li *taskp == NULL
*
- * If '*taskp' is the last reference to the task,
- *
- * All resources used by the task will be freed.
+ *\li If '*taskp' is the last reference to the task,
+ * all resources used by the task will be freed.
*/
void
isc_task_setname(isc_task_t *task, const char *name, void *tag);
-/*
+/*%<
* Name 'task'.
*
* Notes:
*
- * Only the first 15 characters of 'name' will be copied.
+ *\li Only the first 15 characters of 'name' will be copied.
*
- * Naming a task is currently only useful for debugging purposes.
+ *\li Naming a task is currently only useful for debugging purposes.
*
* Requires:
*
- * 'task' is a valid task.
+ *\li 'task' is a valid task.
*/
const char *
isc_task_getname(isc_task_t *task);
-/*
+/*%<
* Get the name of 'task', as previously set using isc_task_setname().
*
* Notes:
- * This function is for debugging purposes only.
+ *\li This function is for debugging purposes only.
*
* Requires:
- * 'task' is a valid task.
+ *\li 'task' is a valid task.
*
* Returns:
- * A non-NULL pointer to a null-terminated string.
+ *\li A non-NULL pointer to a null-terminated string.
* If the task has not been named, the string is
* empty.
*
@@ -478,19 +479,19 @@ isc_task_getname(isc_task_t *task);
void *
isc_task_gettag(isc_task_t *task);
-/*
+/*%<
* Get the tag value for 'task', as previously set using isc_task_settag().
*
* Notes:
- * This function is for debugging purposes only.
+ *\li This function is for debugging purposes only.
*
* Requires:
- * 'task' is a valid task.
+ *\li 'task' is a valid task.
*/
isc_result_t
isc_task_beginexclusive(isc_task_t *task);
-/*
+/*%<
* Request exclusive access for 'task', which must be the calling
* task. Waits for any other concurrently executing tasks to finish their
* current event, and prevents any new events from executing in any of the
@@ -500,37 +501,37 @@ isc_task_beginexclusive(isc_task_t *task);
* isc_task_endexclusive() before returning from the current event handler.
*
* Requires:
- * 'task' is the calling task.
+ *\li 'task' is the calling task.
*
* Returns:
- * ISC_R_SUCCESS The current task now has exclusive access.
- * ISC_R_LOCKBUSY Another task has already requested exclusive
+ *\li #ISC_R_SUCCESS The current task now has exclusive access.
+ *\li #ISC_R_LOCKBUSY Another task has already requested exclusive
* access.
*/
void
isc_task_endexclusive(isc_task_t *task);
-/*
+/*%<
* Relinquish the exclusive access obtained by isc_task_beginexclusive(),
* allowing other tasks to execute.
*
* Requires:
- * 'task' is the calling task, and has obtained
+ *\li 'task' is the calling task, and has obtained
* exclusive access by calling isc_task_spl().
*/
void
isc_task_getcurrenttime(isc_task_t *task, isc_stdtime_t *t);
-/*
+/*%<
* Provide the most recent timestamp on the task. The timestamp is considered
* as the "current time" in the second-order granularity.
*
* Requires:
- * 'task' is a valid task.
- * 't' is a valid non NULL pointer.
+ *\li 'task' is a valid task.
+ *\li 't' is a valid non NULL pointer.
*
* Ensures:
- * '*t' has the "current time".
+ *\li '*t' has the "current time".
*/
/*****
@@ -540,73 +541,73 @@ isc_task_getcurrenttime(isc_task_t *task, isc_stdtime_t *t);
isc_result_t
isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
unsigned int default_quantum, isc_taskmgr_t **managerp);
-/*
+/*%<
* Create a new task manager.
*
* Notes:
*
- * 'workers' in the number of worker threads to create. In general,
+ *\li 'workers' in the number of worker threads to create. In general,
* the value should be close to the number of processors in the system.
* The 'workers' value is advisory only. An attempt will be made to
* create 'workers' threads, but if at least one thread creation
* succeeds, isc_taskmgr_create() may return ISC_R_SUCCESS.
*
- * If 'default_quantum' is non-zero, then it will be used as the default
+ *\li If 'default_quantum' is non-zero, then it will be used as the default
* quantum value when tasks are created. If zero, then an implementation
* defined default quantum will be used.
*
* Requires:
*
- * 'mctx' is a valid memory context.
+ *\li 'mctx' is a valid memory context.
*
- * workers > 0
+ *\li workers > 0
*
- * managerp != NULL && *managerp == NULL
+ *\li managerp != NULL && *managerp == NULL
*
* Ensures:
*
- * On success, '*managerp' will be attached to the newly created task
+ *\li On success, '*managerp' will be attached to the newly created task
* manager.
*
* Returns:
*
- * ISC_R_SUCCESS
- * ISC_R_NOMEMORY
- * ISC_R_NOTHREADS No threads could be created.
- * ISC_R_UNEXPECTED An unexpected error occurred.
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_NOMEMORY
+ *\li #ISC_R_NOTHREADS No threads could be created.
+ *\li #ISC_R_UNEXPECTED An unexpected error occurred.
*/
void
isc_taskmgr_destroy(isc_taskmgr_t **managerp);
-/*
+/*%<
* Destroy '*managerp'.
*
* Notes:
*
- * Calling isc_taskmgr_destroy() will shutdown all tasks managed by
+ *\li Calling isc_taskmgr_destroy() will shutdown all tasks managed by
* *managerp that haven't already been shutdown. The call will block
* until all tasks have entered the done state.
*
- * isc_taskmgr_destroy() must not be called by a task event action,
+ *\li isc_taskmgr_destroy() must not be called by a task event action,
* because it would block forever waiting for the event action to
* complete. An event action that wants to cause task manager shutdown
* should request some non-event action thread of execution to do the
* shutdown, e.g. by signalling a condition variable or using
* isc_app_shutdown().
*
- * Task manager references are not reference counted, so the caller
+ *\li Task manager references are not reference counted, so the caller
* must ensure that no attempt will be made to use the manager after
* isc_taskmgr_destroy() returns.
*
* Requires:
*
- * '*managerp' is a valid task manager.
+ *\li '*managerp' is a valid task manager.
*
- * isc_taskmgr_destroy() has not be called previously on '*managerp'.
+ *\li isc_taskmgr_destroy() has not be called previously on '*managerp'.
*
* Ensures:
*
- * All resources used by the task manager, and any tasks it managed,
+ *\li All resources used by the task manager, and any tasks it managed,
* have been freed.
*/
diff --git a/contrib/bind9/lib/isc/include/isc/taskpool.h b/contrib/bind9/lib/isc/include/isc/taskpool.h
index 42066d2..6c97605 100644
--- a/contrib/bind9/lib/isc/include/isc/taskpool.h
+++ b/contrib/bind9/lib/isc/include/isc/taskpool.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: taskpool.h,v 1.8.206.1 2004/03/06 08:14:49 marka Exp $ */
+/* $Id: taskpool.h,v 1.9.18.2 2005/04/29 00:17:04 marka Exp $ */
#ifndef ISC_TASKPOOL_H
#define ISC_TASKPOOL_H 1
@@ -24,10 +24,8 @@
***** Module Info
*****/
-/*
- * Task Pool
- *
- * A task pool is a mechanism for sharing a small number of tasks
+/*! \file
+ * \brief A task pool is a mechanism for sharing a small number of tasks
* among a large number of objects such that each object is
* assigned a unique task, but each task may be shared by several
* objects.
@@ -62,44 +60,44 @@ isc_result_t
isc_taskpool_create(isc_taskmgr_t *tmgr, isc_mem_t *mctx,
unsigned int ntasks, unsigned int quantum,
isc_taskpool_t **poolp);
-/*
+/*%<
* Create a task pool of "ntasks" tasks, each with quantum
* "quantum".
*
* Requires:
*
- * 'tmgr' is a valid task manager.
+ *\li 'tmgr' is a valid task manager.
*
- * 'mctx' is a valid memory context.
+ *\li 'mctx' is a valid memory context.
*
- * poolp != NULL && *poolp == NULL
+ *\li poolp != NULL && *poolp == NULL
*
* Ensures:
*
- * On success, '*taskp' points to the new task pool.
+ *\li On success, '*taskp' points to the new task pool.
*
* Returns:
*
- * ISC_R_SUCCESS
- * ISC_R_NOMEMORY
- * ISC_R_UNEXPECTED
+ *\li #ISC_R_SUCCESS
+ *\li #ISC_R_NOMEMORY
+ *\li #ISC_R_UNEXPECTED
*/
void
isc_taskpool_gettask(isc_taskpool_t *pool, unsigned int hash,
isc_task_t **targetp);
-/*
+/*%<
* Attach to the task corresponding to the hash value "hash".
*/
void
isc_taskpool_destroy(isc_taskpool_t **poolp);
-/*
+/*%<
* Destroy a task pool. The tasks in the pool are detached but not
* shut down.
*
* Requires:
- * '*poolp' is a valid task pool.
+ * \li '*poolp' is a valid task pool.
*/
ISC_LANG_ENDDECLS
diff --git a/contrib/bind9/lib/isc/include/isc/timer.h b/contrib/bind9/lib/isc/include/isc/timer.h
index 439c943..1e139dd 100644
--- a/contrib/bind9/lib/isc/include/isc/timer.h
+++ b/contrib/bind9/lib/isc/include/isc/timer.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: timer.h,v 1.28.12.6 2005/10/27 00:27:30 marka Exp $ */
+/* $Id: timer.h,v 1.31.18.3 2005/10/26 06:50:50 marka Exp $ */
#ifndef ISC_TIMER_H
#define ISC_TIMER_H 1
@@ -24,50 +24,46 @@
***** Module Info
*****/
-/*
- * Timers
- *
- * Provides timers which are event sources in the task system.
+/*! \file
+ * \brief Provides timers which are event sources in the task system.
*
* Three types of timers are supported:
*
- * 'ticker' timers generate a periodic tick event.
+ *\li 'ticker' timers generate a periodic tick event.
*
- * 'once' timers generate an idle timeout event if they are idle for too
+ *\li 'once' timers generate an idle timeout event if they are idle for too
* long, and generate a life timeout event if their lifetime expires.
* They are used to implement both (possibly expiring) idle timers and
* 'one-shot' timers.
*
- * 'limited' timers generate a periodic tick event until they reach
+ *\li 'limited' timers generate a periodic tick event until they reach
* their lifetime when they generate a life timeout event.
*
- * 'inactive' timers generate no events.
+ *\li 'inactive' timers generate no events.
*
* Timers can change type. It is typical to create a timer as
* an 'inactive' timer and then change it into a 'ticker' or
* 'once' timer.
*
- * MP:
+ *\li MP:
* The module ensures appropriate synchronization of data structures it
* creates and manipulates.
- *
* Clients of this module must not be holding a timer's task's lock when
* making a call that affects that timer. Failure to follow this rule
* can result in deadlock.
- *
* The caller must ensure that isc_timermgr_destroy() is called only
* once for a given manager.
*
- * Reliability:
+ * \li Reliability:
* No anticipated impact.
*
- * Resources:
- * <TBS>
+ * \li Resources:
+ * TBS
*
- * Security:
+ * \li Security:
* No anticipated impact.
*
- * Standards:
+ * \li Standards:
* None.
*/
@@ -87,11 +83,12 @@ ISC_LANG_BEGINDECLS
*** Types
***/
+/*% Timer Type */
typedef enum {
- isc_timertype_ticker = 0,
- isc_timertype_once = 1,
- isc_timertype_limited = 2,
- isc_timertype_inactive = 3
+ isc_timertype_ticker = 0, /*%< Ticker */
+ isc_timertype_once = 1, /*%< Once */
+ isc_timertype_limited = 2, /*%< Limited */
+ isc_timertype_inactive = 3 /*%< Inactive */
} isc_timertype_t;
typedef struct isc_timerevent {
@@ -120,7 +117,7 @@ isc_timer_create(isc_timermgr_t *manager,
isc_taskaction_t action,
const void *arg,
isc_timer_t **timerp);
-/*
+/*%<
* Create a new 'type' timer managed by 'manager'. The timers parameters
* are specified by 'expires' and 'interval'. Events will be posted to
* 'task' and when dispatched 'action' will be called with 'arg' as the
@@ -128,51 +125,51 @@ isc_timer_create(isc_timermgr_t *manager,
*
* Notes:
*
- * For ticker timers, the timer will generate a 'tick' event every
+ *\li For ticker timers, the timer will generate a 'tick' event every
* 'interval' seconds. The value of 'expires' is ignored.
*
- * For once timers, 'expires' specifies the time when a life timeout
+ *\li For once timers, 'expires' specifies the time when a life timeout
* event should be generated. If 'expires' is 0 (the epoch), then no life
* timeout will be generated. 'interval' specifies how long the timer
* can be idle before it generates an idle timeout. If 0, then no
* idle timeout will be generated.
*
- * If 'expires' is NULL, the epoch will be used.
+ *\li If 'expires' is NULL, the epoch will be used.
*
* If 'interval' is NULL, the zero interval will be used.
*
* Requires:
*
- * 'manager' is a valid manager
+ *\li 'manager' is a valid manager
*
- * 'task' is a valid task
+ *\li 'task' is a valid task
*
- * 'action' is a valid action
+ *\li 'action' is a valid action
*
- * 'expires' points to a valid time, or is NULL.
+ *\li 'expires' points to a valid time, or is NULL.
*
- * 'interval' points to a valid interval, or is NULL.
+ *\li 'interval' points to a valid interval, or is NULL.
*
- * type == isc_timertype_inactive ||
+ *\li type == isc_timertype_inactive ||
* ('expires' and 'interval' are not both 0)
*
- * 'timerp' is a valid pointer, and *timerp == NULL
+ *\li 'timerp' is a valid pointer, and *timerp == NULL
*
* Ensures:
*
- * '*timerp' is attached to the newly created timer
+ *\li '*timerp' is attached to the newly created timer
*
- * The timer is attached to the task
+ *\li The timer is attached to the task
*
- * An idle timeout will not be generated until at least Now + the
+ *\li An idle timeout will not be generated until at least Now + the
* timer's interval if 'timer' is a once timer with a non-zero
* interval.
*
* Returns:
*
- * Success
- * No memory
- * Unexpected error
+ *\li Success
+ *\li No memory
+ *\li Unexpected error
*/
isc_result_t
@@ -181,90 +178,91 @@ isc_timer_reset(isc_timer_t *timer,
isc_time_t *expires,
isc_interval_t *interval,
isc_boolean_t purge);
-/*
+/*%<
* Change the timer's type, expires, and interval values to the given
* values. If 'purge' is TRUE, any pending events from this timer
* are purged from its task's event queue.
*
* Notes:
*
- * If 'expires' is NULL, the epoch will be used.
+ *\li If 'expires' is NULL, the epoch will be used.
*
- * If 'interval' is NULL, the zero interval will be used.
+ *\li If 'interval' is NULL, the zero interval will be used.
*
* Requires:
*
- * 'timer' is a valid timer
+ *\li 'timer' is a valid timer
*
- * The same requirements that isc_timer_create() imposes on 'type',
+ *\li The same requirements that isc_timer_create() imposes on 'type',
* 'expires' and 'interval' apply.
*
* Ensures:
*
- * An idle timeout will not be generated until at least Now + the
+ *\li An idle timeout will not be generated until at least Now + the
* timer's interval if 'timer' is a once timer with a non-zero
* interval.
*
* Returns:
*
- * Success
- * No memory
- * Unexpected error
+ *\li Success
+ *\li No memory
+ *\li Unexpected error
*/
isc_result_t
isc_timer_touch(isc_timer_t *timer);
-/*
+/*%<
* Set the last-touched time of 'timer' to the current time.
*
* Requires:
*
- * 'timer' is a valid once timer.
+ *\li 'timer' is a valid once timer.
*
* Ensures:
*
- * An idle timeout will not be generated until at least Now + the
+ *\li An idle timeout will not be generated until at least Now + the
* timer's interval if 'timer' is a once timer with a non-zero
* interval.
*
* Returns:
*
- * Success
- * Unexpected error
+ *\li Success
+ *\li Unexpected error
*/
void
isc_timer_attach(isc_timer_t *timer, isc_timer_t **timerp);
-/*
+/*%<
* Attach *timerp to timer.
*
* Requires:
*
- * 'timer' is a valid timer.
+ *\li 'timer' is a valid timer.
*
- * 'timerp' points to a NULL timer.
+ *\li 'timerp' points to a NULL timer.
*
* Ensures:
*
- * *timerp is attached to timer.
+ *\li *timerp is attached to timer.
*/
void
isc_timer_detach(isc_timer_t **timerp);
-/*
+/*%<
* Detach *timerp from its timer.
*
* Requires:
*
- * 'timerp' points to a valid timer.
+ *\li 'timerp' points to a valid timer.
*
* Ensures:
*
- * *timerp is NULL.
+ *\li *timerp is NULL.
*
- * If '*timerp' is the last reference to the timer,
+ *\li If '*timerp' is the last reference to the timer,
* then:
*
+ *\code
* The timer will be shutdown
*
* The timer will detach from its task
@@ -275,6 +273,7 @@ isc_timer_detach(isc_timer_t **timerp);
* Therefore, if isc_timer_detach() is called in the context
* of the timer's task, it is guaranteed that no more
* timer event callbacks will run after the call.
+ *\endcode
*/
isc_timertype_t
@@ -289,51 +288,51 @@ isc_timer_gettype(isc_timer_t *timer);
isc_result_t
isc_timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp);
-/*
+/*%<
* Create a timer manager.
*
* Notes:
*
- * All memory will be allocated in memory context 'mctx'.
+ *\li All memory will be allocated in memory context 'mctx'.
*
* Requires:
*
- * 'mctx' is a valid memory context.
+ *\li 'mctx' is a valid memory context.
*
- * 'managerp' points to a NULL isc_timermgr_t.
+ *\li 'managerp' points to a NULL isc_timermgr_t.
*
* Ensures:
*
- * '*managerp' is a valid isc_timermgr_t.
+ *\li '*managerp' is a valid isc_timermgr_t.
*
* Returns:
*
- * Success
- * No memory
- * Unexpected error
+ *\li Success
+ *\li No memory
+ *\li Unexpected error
*/
void
isc_timermgr_destroy(isc_timermgr_t **managerp);
-/*
+/*%<
* Destroy a timer manager.
*
* Notes:
*
- * This routine blocks until there are no timers left in the manager,
+ *\li This routine blocks until there are no timers left in the manager,
* so if the caller holds any timer references using the manager, it
* must detach them before calling isc_timermgr_destroy() or it will
* block forever.
*
* Requires:
*
- * '*managerp' is a valid isc_timermgr_t.
+ *\li '*managerp' is a valid isc_timermgr_t.
*
* Ensures:
*
- * *managerp == NULL
+ *\li *managerp == NULL
*
- * All resources used by the manager have been freed.
+ *\li All resources used by the manager have been freed.
*/
void isc_timermgr_poke(isc_timermgr_t *m);
diff --git a/contrib/bind9/lib/isc/include/isc/types.h b/contrib/bind9/lib/isc/include/isc/types.h
index fad77da..35a0be7 100644
--- a/contrib/bind9/lib/isc/include/isc/types.h
+++ b/contrib/bind9/lib/isc/include/isc/types.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,12 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: types.h,v 1.32.2.3.2.1 2004/03/06 08:14:50 marka Exp $ */
+/* $Id: types.h,v 1.35.18.2 2005/04/29 00:17:04 marka Exp $ */
#ifndef ISC_TYPES_H
#define ISC_TYPES_H 1
-/*
+/*! \file
+ * \brief
* OS-specific types, from the OS-specific include directories.
*/
#include <isc/int.h>
@@ -37,57 +38,56 @@
*/
#include <isc/list.h>
-/***
- *** Core Types. Alphabetized by defined type.
- ***/
+/* Core Types. Alphabetized by defined type. */
-typedef struct isc_bitstring isc_bitstring_t;
-typedef struct isc_buffer isc_buffer_t;
-typedef ISC_LIST(isc_buffer_t) isc_bufferlist_t;
-typedef struct isc_constregion isc_constregion_t;
-typedef struct isc_consttextregion isc_consttextregion_t;
-typedef struct isc_entropy isc_entropy_t;
-typedef struct isc_entropysource isc_entropysource_t;
-typedef struct isc_event isc_event_t;
-typedef ISC_LIST(isc_event_t) isc_eventlist_t;
-typedef unsigned int isc_eventtype_t;
-typedef isc_uint32_t isc_fsaccess_t;
-typedef struct isc_hash isc_hash_t;
-typedef struct isc_interface isc_interface_t;
-typedef struct isc_interfaceiter isc_interfaceiter_t;
-typedef struct isc_interval isc_interval_t;
-typedef struct isc_lex isc_lex_t;
-typedef struct isc_log isc_log_t;
-typedef struct isc_logcategory isc_logcategory_t;
-typedef struct isc_logconfig isc_logconfig_t;
-typedef struct isc_logmodule isc_logmodule_t;
-typedef struct isc_mem isc_mem_t;
-typedef struct isc_mempool isc_mempool_t;
-typedef struct isc_msgcat isc_msgcat_t;
-typedef struct isc_ondestroy isc_ondestroy_t;
-typedef struct isc_netaddr isc_netaddr_t;
-typedef struct isc_quota isc_quota_t;
-typedef struct isc_random isc_random_t;
-typedef struct isc_ratelimiter isc_ratelimiter_t;
-typedef struct isc_region isc_region_t;
-typedef isc_uint64_t isc_resourcevalue_t;
-typedef unsigned int isc_result_t;
-typedef struct isc_rwlock isc_rwlock_t;
-typedef struct isc_sockaddr isc_sockaddr_t;
-typedef struct isc_socket isc_socket_t;
-typedef struct isc_socketevent isc_socketevent_t;
-typedef struct isc_socketmgr isc_socketmgr_t;
-typedef struct isc_symtab isc_symtab_t;
-typedef struct isc_task isc_task_t;
-typedef ISC_LIST(isc_task_t) isc_tasklist_t;
-typedef struct isc_taskmgr isc_taskmgr_t;
-typedef struct isc_textregion isc_textregion_t;
-typedef struct isc_time isc_time_t;
-typedef struct isc_timer isc_timer_t;
-typedef struct isc_timermgr isc_timermgr_t;
+typedef struct isc_bitstring isc_bitstring_t; /*%< Bitstring */
+typedef struct isc_buffer isc_buffer_t; /*%< Buffer */
+typedef ISC_LIST(isc_buffer_t) isc_bufferlist_t; /*%< Buffer List */
+typedef struct isc_constregion isc_constregion_t; /*%< Const region */
+typedef struct isc_consttextregion isc_consttextregion_t; /*%< Const Text Region */
+typedef struct isc_entropy isc_entropy_t; /*%< Entropy */
+typedef struct isc_entropysource isc_entropysource_t; /*%< Entropy Source */
+typedef struct isc_event isc_event_t; /*%< Event */
+typedef ISC_LIST(isc_event_t) isc_eventlist_t; /*%< Event List */
+typedef unsigned int isc_eventtype_t; /*%< Event Type */
+typedef isc_uint32_t isc_fsaccess_t; /*%< FS Access */
+typedef struct isc_hash isc_hash_t; /*%< Hash */
+typedef struct isc_interface isc_interface_t; /*%< Interface */
+typedef struct isc_interfaceiter isc_interfaceiter_t; /*%< Interface Iterator */
+typedef struct isc_interval isc_interval_t; /*%< Interval */
+typedef struct isc_lex isc_lex_t; /*%< Lex */
+typedef struct isc_log isc_log_t; /*%< Log */
+typedef struct isc_logcategory isc_logcategory_t; /*%< Log Category */
+typedef struct isc_logconfig isc_logconfig_t; /*%< Log Configuration */
+typedef struct isc_logmodule isc_logmodule_t; /*%< Log Module */
+typedef struct isc_mem isc_mem_t; /*%< Memory */
+typedef struct isc_mempool isc_mempool_t; /*%< Memory Pool */
+typedef struct isc_msgcat isc_msgcat_t; /*%< Message Catalog */
+typedef struct isc_ondestroy isc_ondestroy_t; /*%< On Destroy */
+typedef struct isc_netaddr isc_netaddr_t; /*%< Net Address */
+typedef struct isc_quota isc_quota_t; /*%< Quota */
+typedef struct isc_random isc_random_t; /*%< Random */
+typedef struct isc_ratelimiter isc_ratelimiter_t; /*%< Rate Limiter */
+typedef struct isc_region isc_region_t; /*%< Region */
+typedef isc_uint64_t isc_resourcevalue_t; /*%< Resource Value */
+typedef unsigned int isc_result_t; /*%< Result */
+typedef struct isc_rwlock isc_rwlock_t; /*%< Read Write Lock */
+typedef struct isc_sockaddr isc_sockaddr_t; /*%< Socket Address */
+typedef struct isc_socket isc_socket_t; /*%< Socket */
+typedef struct isc_socketevent isc_socketevent_t; /*%< Socket Event */
+typedef struct isc_socketmgr isc_socketmgr_t; /*%< Socket Manager */
+typedef struct isc_symtab isc_symtab_t; /*%< Symbol Table */
+typedef struct isc_task isc_task_t; /*%< Task */
+typedef ISC_LIST(isc_task_t) isc_tasklist_t; /*%< Task List */
+typedef struct isc_taskmgr isc_taskmgr_t; /*%< Task Manager */
+typedef struct isc_textregion isc_textregion_t; /*%< Text Region */
+typedef struct isc_time isc_time_t; /*%< Time */
+typedef struct isc_timer isc_timer_t; /*%< Timer */
+typedef struct isc_timermgr isc_timermgr_t; /*%< Timer Manager */
typedef void (*isc_taskaction_t)(isc_task_t *, isc_event_t *);
+/*% Resource */
typedef enum {
isc_resource_coresize = 1,
isc_resource_cputime,
diff --git a/contrib/bind9/lib/isc/include/isc/util.h b/contrib/bind9/lib/isc/include/isc/util.h
index c2798d6..95fe436 100644
--- a/contrib/bind9/lib/isc/include/isc/util.h
+++ b/contrib/bind9/lib/isc/include/isc/util.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,17 +15,18 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: util.h,v 1.21.12.5 2004/03/08 09:04:53 marka Exp $ */
+/* $Id: util.h,v 1.24.18.2 2005/04/29 00:17:04 marka Exp $ */
#ifndef ISC_UTIL_H
#define ISC_UTIL_H 1
-/*
+/*! \file util.h
* NOTE:
*
* This file is not to be included from any <isc/???.h> (or other) library
* files.
*
+ * \brief
* Including this file puts several macros in your name space that are
* not protected (as all the other ISC functions/macros do) by prepending
* ISC_ or isc_ to the name.
@@ -35,21 +36,22 @@
*** General Macros.
***/
-/*
+/*%
* Use this to hide unused function arguments.
- *
+ * \code
* int
* foo(char *bar)
* {
* UNUSED(bar);
* }
+ * \endcode
*/
#define UNUSED(x) (void)(x)
#define ISC_MAX(a, b) ((a) > (b) ? (a) : (b))
#define ISC_MIN(a, b) ((a) < (b) ? (a) : (b))
-/*
+/*%
* Use this to remove the const qualifier of a variable to assign it to
* a non-const variable or pass it as a non-const function argument ...
* but only when you are sure it won't then be changed!
@@ -64,16 +66,15 @@
var = _u.v; \
} while (0)
-/*
+/*%
* Use this in translation units that would otherwise be empty, to
* suppress compiler warnings.
*/
#define EMPTY_TRANSLATION_UNIT static void isc__empty(void) { isc__empty(); }
-/*
+/*%
* We use macros instead of calling the routines directly because
* the capital letters make the locking stand out.
- *
* We RUNTIME_CHECK for success since in general there's no way
* for us to continue if they fail.
*/
@@ -203,9 +204,13 @@
*/
#include <isc/assertions.h> /* Contractual promise. */
+/*% Require Assertion */
#define REQUIRE(e) ISC_REQUIRE(e)
+/*% Ensure Assertion */
#define ENSURE(e) ISC_ENSURE(e)
+/*% Insist Assertion */
#define INSIST(e) ISC_INSIST(e)
+/*% Invariant Assertion */
#define INVARIANT(e) ISC_INVARIANT(e)
/*
@@ -213,11 +218,14 @@
*/
#include <isc/error.h> /* Contractual promise. */
+/*% Unexpected Error */
#define UNEXPECTED_ERROR isc_error_unexpected
+/*% Fatal Error */
#define FATAL_ERROR isc_error_fatal
+/*% Runtime Check */
#define RUNTIME_CHECK(cond) ISC_ERROR_RUNTIMECHECK(cond)
-/*
+/*%
* Time
*/
#define TIME_NOW(tp) RUNTIME_CHECK(isc_time_now((tp)) == ISC_R_SUCCESS)
diff --git a/contrib/bind9/lib/isc/include/isc/version.h b/contrib/bind9/lib/isc/include/isc/version.h
index 3da836c..82d4617 100644
--- a/contrib/bind9/lib/isc/include/isc/version.h
+++ b/contrib/bind9/lib/isc/include/isc/version.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: version.h,v 1.2.220.3 2004/03/08 09:04:54 marka Exp $ */
+/* $Id: version.h,v 1.3.18.2 2005/04/29 00:17:04 marka Exp $ */
+
+/*! \file */
#include <isc/platform.h>
diff --git a/contrib/bind9/lib/isc/inet_aton.c b/contrib/bind9/lib/isc/inet_aton.c
index 530b010..1602521 100644
--- a/contrib/bind9/lib/isc/inet_aton.c
+++ b/contrib/bind9/lib/isc/inet_aton.c
@@ -1,5 +1,5 @@
/*
- * Portions Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Portions Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Portions Copyright (C) 1996-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -67,10 +67,11 @@
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
+/*! \file */
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)inet_addr.c 8.1 (Berkeley) 6/17/93";
-static char rcsid[] = "$Id: inet_aton.c,v 1.15.12.3 2004/03/08 09:04:49 marka Exp $";
+static char rcsid[] = "$Id: inet_aton.c,v 1.17.18.2 2005/04/29 00:16:46 marka Exp $";
#endif /* LIBC_SCCS and not lint */
#include <config.h>
@@ -81,7 +82,7 @@ static char rcsid[] = "$Id: inet_aton.c,v 1.15.12.3 2004/03/08 09:04:49 marka Ex
#include <isc/types.h>
#include <isc/net.h>
-/*
+/*%
* Check whether "cp" is a valid ascii representation
* of an Internet address and convert to a binary address.
* Returns 1 if the address is valid, 0 if not.
diff --git a/contrib/bind9/lib/isc/inet_ntop.c b/contrib/bind9/lib/isc/inet_ntop.c
index 6dadd73..c0d1161 100644
--- a/contrib/bind9/lib/isc/inet_ntop.c
+++ b/contrib/bind9/lib/isc/inet_ntop.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1996-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,9 +15,11 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
+/*! \file */
+
#if defined(LIBC_SCCS) && !defined(lint)
static char rcsid[] =
- "$Id: inet_ntop.c,v 1.12.12.4 2004/08/28 06:25:21 marka Exp $";
+ "$Id: inet_ntop.c,v 1.14.18.3 2005/04/29 00:16:46 marka Exp $";
#endif /* LIBC_SCCS and not lint */
#include <config.h>
@@ -45,12 +47,12 @@ static const char *inet_ntop6(const unsigned char *src, char *dst,
size_t size);
#endif
-/* char *
+/*! char *
* isc_net_ntop(af, src, dst, size)
* convert a network format address to presentation format.
- * return:
+ * \return
* pointer to presentation format address (`dst'), or NULL (see errno).
- * author:
+ * \author
* Paul Vixie, 1996.
*/
const char *
@@ -70,15 +72,16 @@ isc_net_ntop(int af, const void *src, char *dst, size_t size)
/* NOTREACHED */
}
-/* const char *
+/*! const char *
* inet_ntop4(src, dst, size)
* format an IPv4 address
- * return:
+ * \return
* `dst' (as a const)
- * notes:
+ * \note
* (1) uses no statics
+ * \note
* (2) takes a unsigned char* not an in_addr as input
- * author:
+ * \author
* Paul Vixie, 1996.
*/
static const char *
@@ -97,10 +100,10 @@ inet_ntop4(const unsigned char *src, char *dst, size_t size)
return (dst);
}
-/* const char *
+/*! const char *
* isc_inet_ntop6(src, dst, size)
* convert IPv6 binary address into presentation (printable) format
- * author:
+ * \author
* Paul Vixie, 1996.
*/
#ifdef AF_INET6
diff --git a/contrib/bind9/lib/isc/inet_pton.c b/contrib/bind9/lib/isc/inet_pton.c
index 026fedf..a537e9c 100644
--- a/contrib/bind9/lib/isc/inet_pton.c
+++ b/contrib/bind9/lib/isc/inet_pton.c
@@ -15,9 +15,11 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
+/*! \file */
+
#if defined(LIBC_SCCS) && !defined(lint)
static char rcsid[] =
- "$Id: inet_pton.c,v 1.10.2.4.2.3 2005/03/31 23:56:14 marka Exp $";
+ "$Id: inet_pton.c,v 1.13.18.4 2005/04/29 00:16:46 marka Exp $";
#endif /* LIBC_SCCS and not lint */
#include <config.h>
@@ -27,8 +29,11 @@ static char rcsid[] =
#include <isc/net.h>
+/*% INT16 Size */
#define NS_INT16SZ 2
+/*% IPv4 Address Size */
#define NS_INADDRSZ 4
+/*% IPv6 Address Size */
#define NS_IN6ADDRSZ 16
/*
@@ -39,15 +44,14 @@ static char rcsid[] =
static int inet_pton4(const char *src, unsigned char *dst);
static int inet_pton6(const char *src, unsigned char *dst);
-/* int
- * isc_net_pton(af, src, dst)
+/*%
* convert from presentation format (which usually means ASCII printable)
* to network format (which is usually some kind of binary format).
- * return:
+ * \return
* 1 if the address was valid for the specified address family
* 0 if the address wasn't valid (`dst' is untouched in this case)
* -1 if some other error occurred (`dst' is untouched in this case, too)
- * author:
+ * \author
* Paul Vixie, 1996.
*/
int
@@ -64,14 +68,14 @@ isc_net_pton(int af, const char *src, void *dst) {
/* NOTREACHED */
}
-/* int
- * inet_pton4(src, dst)
+/*!\fn static int inet_pton4(const char *src, unsigned char *dst)
+ * \brief
* like inet_aton() but without all the hexadecimal and shorthand.
- * return:
+ * \return
* 1 if `src' is a valid dotted quad, else 0.
- * notice:
+ * \note
* does not touch `dst' unless it's returning 1.
- * author:
+ * \author
* Paul Vixie, 1996.
*/
static int
@@ -113,17 +117,17 @@ inet_pton4(const char *src, unsigned char *dst) {
return (1);
}
-/* int
- * inet_pton6(src, dst)
+/*%
* convert presentation level address to network order binary form.
- * return:
+ * \return
* 1 if `src' is a valid [RFC1884 2.2] address, else 0.
- * notice:
+ * \note
* (1) does not touch `dst' unless it's returning 1.
+ * \note
* (2) :: in a full address is silently ignored.
- * credit:
+ * \author
* inspired by Mark Andrews.
- * author:
+ * \author
* Paul Vixie, 1996.
*/
static int
diff --git a/contrib/bind9/lib/isc/lex.c b/contrib/bind9/lib/isc/lex.c
index 3511d6b..2e4e48a 100644
--- a/contrib/bind9/lib/isc/lex.c
+++ b/contrib/bind9/lib/isc/lex.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2006 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lex.c,v 1.66.2.6.2.10 2006/01/04 23:50:21 marka Exp $ */
+/* $Id: lex.c,v 1.78.18.5 2005/11/30 03:44:39 marka Exp $ */
+
+/*! \file */
#include <config.h>
@@ -563,7 +565,11 @@ isc_lex_gettoken(isc_lex_t *lex, unsigned int options, isc_token_t *tokenp) {
} else if (isdigit((unsigned char)c) &&
(options & ISC_LEXOPT_NUMBER) != 0) {
lex->last_was_eol = ISC_FALSE;
- state = lexstate_number;
+ if ((options & ISC_LEXOPT_OCTAL) != 0 &&
+ (c == '8' || c == '9'))
+ state = lexstate_string;
+ else
+ state = lexstate_number;
goto no_read;
} else {
lex->last_was_eol = ISC_FALSE;
@@ -584,7 +590,9 @@ isc_lex_gettoken(isc_lex_t *lex, unsigned int options, isc_token_t *tokenp) {
c == '\n' || c == EOF ||
lex->specials[c]) {
int base;
- if ((options & ISC_LEXOPT_CNUMBER) != 0)
+ if ((options & ISC_LEXOPT_OCTAL) != 0)
+ base = 8;
+ else if ((options & ISC_LEXOPT_CNUMBER) != 0)
base = 0;
else
base = 10;
@@ -620,6 +628,9 @@ isc_lex_gettoken(isc_lex_t *lex, unsigned int options, isc_token_t *tokenp) {
/* Above test supports hex numbers */
state = lexstate_string;
}
+ } else if ((options & ISC_LEXOPT_OCTAL) != 0 &&
+ (c == '8' || c == '9')) {
+ state = lexstate_string;
}
if (remaining == 0U) {
result = grow_data(lex, &remaining,
@@ -821,6 +832,33 @@ isc_lex_getmastertoken(isc_lex_t *lex, isc_token_t *token,
return (ISC_R_SUCCESS);
}
+isc_result_t
+isc_lex_getoctaltoken(isc_lex_t *lex, isc_token_t *token, isc_boolean_t eol)
+{
+ unsigned int options = ISC_LEXOPT_EOL | ISC_LEXOPT_EOF |
+ ISC_LEXOPT_DNSMULTILINE | ISC_LEXOPT_ESCAPE|
+ ISC_LEXOPT_NUMBER | ISC_LEXOPT_OCTAL;
+ isc_result_t result;
+
+ result = isc_lex_gettoken(lex, options, token);
+ if (result == ISC_R_RANGE)
+ isc_lex_ungettoken(lex, token);
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
+ if (eol && ((token->type == isc_tokentype_eol) ||
+ (token->type == isc_tokentype_eof)))
+ return (ISC_R_SUCCESS);
+ if (token->type != isc_tokentype_number) {
+ isc_lex_ungettoken(lex, token);
+ if (token->type == isc_tokentype_eol ||
+ token->type == isc_tokentype_eof)
+ return (ISC_R_UNEXPECTEDEND);
+ return (ISC_R_BADNUMBER);
+ }
+ return (ISC_R_SUCCESS);
+}
+
void
isc_lex_ungettoken(isc_lex_t *lex, isc_token_t *tokenp) {
inputsource *source;
diff --git a/contrib/bind9/lib/isc/lfsr.c b/contrib/bind9/lib/isc/lfsr.c
index 6d5b7ff..61f9386 100644
--- a/contrib/bind9/lib/isc/lfsr.c
+++ b/contrib/bind9/lib/isc/lfsr.c
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lfsr.c,v 1.11.2.2.2.6 2005/10/14 01:38:50 marka Exp $ */
+/* $Id: lfsr.c,v 1.14.18.4 2005/10/14 01:28:29 marka Exp $ */
+
+/*! \file */
#include <config.h>
@@ -50,7 +52,7 @@ isc_lfsr_init(isc_lfsr_t *lfsr, isc_uint32_t state, unsigned int bits,
lfsr->state = 0xffffffffU >> (32 - lfsr->bits);
}
-/*
+/*!
* Return the next state of the lfsr.
*/
static inline isc_uint32_t
diff --git a/contrib/bind9/lib/isc/lib.c b/contrib/bind9/lib/isc/lib.c
index fa30abf..7a70c12 100644
--- a/contrib/bind9/lib/isc/lib.c
+++ b/contrib/bind9/lib/isc/lib.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lib.c,v 1.8.12.3 2004/03/08 09:04:49 marka Exp $ */
+/* $Id: lib.c,v 1.10.18.2 2005/04/29 00:16:47 marka Exp $ */
+
+/*! \file */
#include <config.h>
@@ -53,7 +55,7 @@ void
isc_lib_initmsgcat(void) {
isc_result_t result;
- /*
+ /*!
* Initialize the ISC library's message catalog, isc_msgcat, if it
* has not already been initialized.
*/
diff --git a/contrib/bind9/lib/isc/log.c b/contrib/bind9/lib/isc/log.c
index 511573b..27c01d1 100644
--- a/contrib/bind9/lib/isc/log.c
+++ b/contrib/bind9/lib/isc/log.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2006 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2006 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,9 +15,10 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: log.c,v 1.70.2.8.2.14 2006/03/02 00:37:20 marka Exp $ */
+/* $Id: log.c,v 1.84.18.8 2006/03/02 00:37:22 marka Exp $ */
-/* Principal Authors: DCL */
+/*! \file
+ * \author Principal Authors: DCL */
#include <config.h>
@@ -56,7 +57,7 @@
#define PATH_MAX 1024 /* AIX and others don't define this. */
#endif
-/*
+/*!
* This is the structure that holds each named channel. A simple linked
* list chains all of the channels together, so an individual channel is
* found by doing strcmp()s with the names down the list. Their should
@@ -76,7 +77,7 @@ struct isc_logchannel {
ISC_LINK(isc_logchannel_t) link;
};
-/*
+/*!
* The logchannellist structure associates categories and modules with
* channels. First the appropriate channellist is found based on the
* category, and then each structure in the linked list is checked for
@@ -92,7 +93,7 @@ struct isc_logchannellist {
ISC_LINK(isc_logchannellist_t) link;
};
-/*
+/*!
* This structure is used to remember messages for pruning via
* isc_log_[v]write1().
*/
@@ -104,7 +105,7 @@ struct isc_logmessage {
ISC_LINK(isc_logmessage_t) link;
};
-/*
+/*!
* The isc_logconfig structure is used to store the configurable information
* about where messages are actually supposed to be sent -- the information
* that could changed based on some configuration file, as opposed to the
@@ -123,7 +124,7 @@ struct isc_logconfig {
isc_boolean_t dynamic;
};
-/*
+/*!
* This isc_log structure provides the context for the isc_log functions.
* The log context locks itself in isc_log_doit, the internal backend to
* isc_log_write. The locking is necessary both to provide exclusive access
@@ -156,7 +157,7 @@ struct isc_log {
ISC_LIST(isc_logmessage_t) messages;
};
-/*
+/*!
* Used when ISC_LOG_PRINTLEVEL is enabled for a channel.
*/
static const char *log_level_strings[] = {
@@ -168,7 +169,7 @@ static const char *log_level_strings[] = {
"critical"
};
-/*
+/*!
* Used to convert ISC_LOG_* priorities into syslog priorities.
* XXXDCL This will need modification for NT.
*/
@@ -181,7 +182,7 @@ static const int syslog_map[] = {
LOG_CRIT
};
-/*
+/*!
* When adding new categories, a corresponding ISC_LOGCATEGORY_foo
* definition needs to be added to <isc/log.h>.
*
@@ -195,8 +196,8 @@ LIBISC_EXTERNAL_DATA isc_logcategory_t isc_categories[] = {
{ NULL, 0 }
};
-/*
- * See above comment for categories, and apply it to modules.
+/*!
+ * See above comment for categories on LIBISC_EXTERNAL_DATA, and apply it to modules.
*/
LIBISC_EXTERNAL_DATA isc_logmodule_t isc_modules[] = {
{ "socket", 0 },
@@ -206,19 +207,19 @@ LIBISC_EXTERNAL_DATA isc_logmodule_t isc_modules[] = {
{ NULL, 0 }
};
-/*
+/*!
* This essentially constant structure must be filled in at run time,
* because its channel member is pointed to a channel that is created
* dynamically with isc_log_createchannel.
*/
static isc_logchannellist_t default_channel;
-/*
+/*!
* libisc logs to this context.
*/
LIBISC_EXTERNAL_DATA isc_log_t *isc_lctx = NULL;
-/*
+/*!
* Forward declarations.
*/
static isc_result_t
@@ -241,7 +242,8 @@ isc_log_doit(isc_log_t *lctx, isc_logcategory_t *category,
const char *format, va_list args)
ISC_FORMAT_PRINTF(9, 0);
-/*
+/*@{*/
+/*!
* Convenience macros.
*/
@@ -252,6 +254,7 @@ isc_log_doit(isc_log_t *lctx, isc_logcategory_t *category,
#define FILE_MAXSIZE(channel) (channel->destination.file.maximum_size)
#define FILE_MAXREACHED(channel) (channel->destination.file.maximum_reached)
+/*@}*/
/****
**** Public interfaces.
****/
@@ -280,7 +283,11 @@ isc_log_create(isc_mem_t *mctx, isc_log_t **lctxp, isc_logconfig_t **lcfgp) {
ISC_LIST_INIT(lctx->messages);
- RUNTIME_CHECK(isc_mutex_init(&lctx->lock) == ISC_R_SUCCESS);
+ result = isc_mutex_init(&lctx->lock);
+ if (result != ISC_R_SUCCESS) {
+ isc_mem_put(mctx, lctx, sizeof(*lctx));
+ return (result);
+ }
/*
* Normally setting the magic number is the last step done
diff --git a/contrib/bind9/lib/isc/md5.c b/contrib/bind9/lib/isc/md5.c
index 863612b..07d7546 100644
--- a/contrib/bind9/lib/isc/md5.c
+++ b/contrib/bind9/lib/isc/md5.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,9 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: md5.c,v 1.9.206.1 2004/03/06 08:14:32 marka Exp $ */
+/* $Id: md5.c,v 1.10.18.2 2005/04/29 00:16:47 marka Exp $ */
-/*
+/*! \file
* This code implements the MD5 message-digest algorithm.
* The algorithm is due to Ron Rivest. This code was
* written by Colin Plumb in 1993, no copyright is claimed.
@@ -54,7 +54,7 @@ byteSwap(isc_uint32_t *buf, unsigned words)
} while (--words);
}
-/*
+/*!
* Start MD5 accumulation. Set bit count to 0 and buffer to mysterious
* initialization constants.
*/
@@ -74,19 +74,21 @@ isc_md5_invalidate(isc_md5_t *ctx) {
memset(ctx, 0, sizeof(isc_md5_t));
}
-/* The four core functions - F1 is optimized somewhat */
+/*@{*/
+/*! The four core functions - F1 is optimized somewhat */
/* #define F1(x, y, z) (x & y | ~x & z) */
#define F1(x, y, z) (z ^ (x & (y ^ z)))
#define F2(x, y, z) F1(z, x, y)
#define F3(x, y, z) (x ^ y ^ z)
#define F4(x, y, z) (y ^ (x | ~z))
+/*@}*/
-/* This is the central step in the MD5 algorithm. */
+/*! This is the central step in the MD5 algorithm. */
#define MD5STEP(f,w,x,y,z,in,s) \
(w += f(x,y,z) + in, w = (w<<s | w>>(32-s)) + x)
-/*
+/*!
* The core of the MD5 algorithm, this alters an existing MD5 hash to
* reflect the addition of 16 longwords of new data. MD5Update blocks
* the data and converts bytes into longwords for this routine.
@@ -174,7 +176,7 @@ transform(isc_uint32_t buf[4], isc_uint32_t const in[16]) {
buf[3] += d;
}
-/*
+/*!
* Update context to reflect the concatenation of another buffer full
* of bytes.
*/
@@ -213,7 +215,7 @@ isc_md5_update(isc_md5_t *ctx, const unsigned char *buf, unsigned int len) {
memcpy(ctx->in, buf, len);
}
-/*
+/*!
* Final wrapup - pad to 64-byte boundary with the bit pattern
* 1 0* (64-bit count of bits processed, MSB-first)
*/
diff --git a/contrib/bind9/lib/isc/mem.c b/contrib/bind9/lib/isc/mem.c
index f5069fb..35918dc 100644
--- a/contrib/bind9/lib/isc/mem.c
+++ b/contrib/bind9/lib/isc/mem.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2006 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1997-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mem.c,v 1.98.2.7.2.7 2005/03/17 03:58:32 marka Exp $ */
+/* $Id: mem.c,v 1.116.18.12 2006/12/08 05:07:59 marka Exp $ */
+
+/*! \file */
#include <config.h>
@@ -28,35 +30,29 @@
#include <isc/magic.h>
#include <isc/mem.h>
#include <isc/msgs.h>
+#include <isc/once.h>
#include <isc/ondestroy.h>
#include <isc/string.h>
#include <isc/mutex.h>
#include <isc/util.h>
+#define MCTXLOCK(m, l) if (((m)->flags & ISC_MEMFLAG_NOLOCK) == 0) LOCK(l)
+#define MCTXUNLOCK(m, l) if (((m)->flags & ISC_MEMFLAG_NOLOCK) == 0) UNLOCK(l)
+
#ifndef ISC_MEM_DEBUGGING
#define ISC_MEM_DEBUGGING 0
#endif
LIBISC_EXTERNAL_DATA unsigned int isc_mem_debugging = ISC_MEM_DEBUGGING;
/*
- * Define ISC_MEM_USE_INTERNAL_MALLOC=1 to use the internal malloc()
- * implementation in preference to the system one. The internal malloc()
- * is very space-efficient, and quite fast on uniprocessor systems. It
- * performs poorly on multiprocessor machines.
- */
-#ifndef ISC_MEM_USE_INTERNAL_MALLOC
-#define ISC_MEM_USE_INTERNAL_MALLOC 0
-#endif
-
-/*
* Constants.
*/
#define DEF_MAX_SIZE 1100
#define DEF_MEM_TARGET 4096
-#define ALIGNMENT_SIZE 8 /* must be a power of 2 */
-#define NUM_BASIC_BLOCKS 64 /* must be > 1 */
+#define ALIGNMENT_SIZE 8 /*%< must be a power of 2 */
+#define NUM_BASIC_BLOCKS 64 /*%< must be > 1 */
#define TABLE_INCREMENT 1024
#define DEBUGLIST_COUNT 1024
@@ -87,11 +83,12 @@ struct element {
};
typedef struct {
- /*
+ /*!
* This structure must be ALIGNMENT_SIZE bytes.
*/
union {
size_t size;
+ isc_mem_t *ctx;
char bytes[ALIGNMENT_SIZE];
} u;
} size_info;
@@ -99,10 +96,8 @@ typedef struct {
struct stats {
unsigned long gets;
unsigned long totalgets;
-#if ISC_MEM_USE_INTERNAL_MALLOC
unsigned long blocks;
unsigned long freefrags;
-#endif /* ISC_MEM_USE_INTERNAL_MALLOC */
};
#define MEM_MAGIC ISC_MAGIC('M', 'e', 'm', 'C')
@@ -112,9 +107,16 @@ struct stats {
typedef ISC_LIST(debuglink_t) debuglist_t;
#endif
+/* List of all active memory contexts. */
+
+static ISC_LIST(isc_mem_t) contexts;
+static isc_once_t once = ISC_ONCE_INIT;
+static isc_mutex_t lock;
+
struct isc_mem {
unsigned int magic;
isc_ondestroy_t ondestroy;
+ unsigned int flags;
isc_mutex_t lock;
isc_memalloc_t memalloc;
isc_memfree_t memfree;
@@ -134,7 +136,7 @@ struct isc_mem {
void * water_arg;
ISC_LIST(isc_mempool_t) pools;
-#if ISC_MEM_USE_INTERNAL_MALLOC
+ /* ISC_MEMFLAG_INTERNAL */
size_t mem_target;
element ** freelists;
element * basic_blocks;
@@ -143,13 +145,13 @@ struct isc_mem {
unsigned int basic_table_size;
unsigned char * lowest;
unsigned char * highest;
-#endif /* ISC_MEM_USE_INTERNAL_MALLOC */
#if ISC_MEM_TRACKLINES
debuglist_t * debuglist;
#endif
unsigned int memalloc_failures;
+ ISC_LINK(isc_mem_t) link;
};
#define MEMPOOL_MAGIC ISC_MAGIC('M', 'E', 'M', 'p')
@@ -157,24 +159,24 @@ struct isc_mem {
struct isc_mempool {
/* always unlocked */
- unsigned int magic; /* magic number */
- isc_mutex_t *lock; /* optional lock */
- isc_mem_t *mctx; /* our memory context */
- /* locked via the memory context's lock */
- ISC_LINK(isc_mempool_t) link; /* next pool in this mem context */
- /* optionally locked from here down */
- element *items; /* low water item list */
- size_t size; /* size of each item on this pool */
- unsigned int maxalloc; /* max number of items allowed */
- unsigned int allocated; /* # of items currently given out */
- unsigned int freecount; /* # of items on reserved list */
- unsigned int freemax; /* # of items allowed on free list */
- unsigned int fillcount; /* # of items to fetch on each fill */
- /* Stats only. */
- unsigned int gets; /* # of requests to this pool */
- /* Debugging only. */
+ unsigned int magic; /*%< magic number */
+ isc_mutex_t *lock; /*%< optional lock */
+ isc_mem_t *mctx; /*%< our memory context */
+ /*%< locked via the memory context's lock */
+ ISC_LINK(isc_mempool_t) link; /*%< next pool in this mem context */
+ /*%< optionally locked from here down */
+ element *items; /*%< low water item list */
+ size_t size; /*%< size of each item on this pool */
+ unsigned int maxalloc; /*%< max number of items allowed */
+ unsigned int allocated; /*%< # of items currently given out */
+ unsigned int freecount; /*%< # of items on reserved list */
+ unsigned int freemax; /*%< # of items allowed on free list */
+ unsigned int fillcount; /*%< # of items to fetch on each fill */
+ /*%< Stats only. */
+ unsigned int gets; /*%< # of requests to this pool */
+ /*%< Debugging only. */
#if ISC_MEMPOOL_NAMES
- char name[16]; /* printed name in stats reports */
+ char name[16]; /*%< printed name in stats reports */
#endif
};
@@ -198,7 +200,7 @@ struct isc_mempool {
static void
print_active(isc_mem_t *ctx, FILE *out);
-/*
+/*!
* mctx must be locked.
*/
static inline void
@@ -309,7 +311,6 @@ delete_trace_entry(isc_mem_t *mctx, const void *ptr, unsigned int size,
}
#endif /* ISC_MEM_TRACKLINES */
-#if ISC_MEM_USE_INTERNAL_MALLOC
static inline size_t
rmsize(size_t size) {
/*
@@ -320,13 +321,13 @@ rmsize(size_t size) {
static inline size_t
quantize(size_t size) {
- /*
+ /*!
* Round up the result in order to get a size big
* enough to satisfy the request and be aligned on ALIGNMENT_SIZE
* byte boundaries.
*/
- if (size == 0)
+ if (size == 0U)
return (ALIGNMENT_SIZE);
return ((size + ALIGNMENT_SIZE - 1) & (~(ALIGNMENT_SIZE - 1)));
}
@@ -347,7 +348,7 @@ more_basic_blocks(isc_mem_t *ctx) {
* Did we hit the quota for this context?
*/
increment = NUM_BASIC_BLOCKS * ctx->mem_target;
- if (ctx->quota != 0 && ctx->total + increment > ctx->quota)
+ if (ctx->quota != 0U && ctx->total + increment > ctx->quota)
return (ISC_FALSE);
INSIST(ctx->basic_table_count <= ctx->basic_table_size);
@@ -408,7 +409,7 @@ more_frags(isc_mem_t *ctx, size_t new_size) {
void *new;
unsigned char *curr, *next;
- /*
+ /*!
* Try to get more fragments by chopping up a basic block.
*/
@@ -448,7 +449,7 @@ more_frags(isc_mem_t *ctx, size_t new_size) {
* Add the remaining fragment of the basic block to a free list.
*/
total_size = rmsize(total_size);
- if (total_size > 0) {
+ if (total_size > 0U) {
((element *)next)->next = ctx->freelists[total_size];
ctx->freelists[total_size] = (element *)next;
ctx->stats[total_size].freefrags++;
@@ -472,7 +473,7 @@ mem_getunlocked(isc_mem_t *ctx, size_t size) {
/*
* memget() was called on something beyond our upper limit.
*/
- if (ctx->quota != 0 && ctx->total + size > ctx->quota) {
+ if (ctx->quota != 0U && ctx->total + size > ctx->quota) {
ret = NULL;
goto done;
}
@@ -556,7 +557,7 @@ mem_putunlocked(isc_mem_t *ctx, void *mem, size_t size) {
memset(mem, 0xde, size); /* Mnemonic for "dead". */
#endif
(ctx->memfree)(ctx->arg, mem);
- INSIST(ctx->stats[ctx->max_size].gets != 0);
+ INSIST(ctx->stats[ctx->max_size].gets != 0U);
ctx->stats[ctx->max_size].gets--;
INSIST(size <= ctx->total);
ctx->inuse -= size;
@@ -583,15 +584,13 @@ mem_putunlocked(isc_mem_t *ctx, void *mem, size_t size) {
* max. size (max_size) ends up getting recorded as a call to
* max_size.
*/
- INSIST(ctx->stats[size].gets != 0);
+ INSIST(ctx->stats[size].gets != 0U);
ctx->stats[size].gets--;
ctx->stats[new_size].freefrags++;
ctx->inuse -= new_size;
}
-#else /* ISC_MEM_USE_INTERNAL_MALLOC */
-
-/*
+/*!
* Perform a malloc, doing memory filling and overrun detection as necessary.
*/
static inline void *
@@ -619,7 +618,7 @@ mem_get(isc_mem_t *ctx, size_t size) {
return (ret);
}
-/*
+/*!
* Perform a free, doing memory filling and overrun detection as necessary.
*/
static inline void
@@ -635,7 +634,7 @@ mem_put(isc_mem_t *ctx, void *mem, size_t size) {
(ctx->memfree)(ctx->arg, mem);
}
-/*
+/*!
* Update internal counters after a memory get.
*/
static inline void
@@ -652,7 +651,7 @@ mem_getstats(isc_mem_t *ctx, size_t size) {
}
}
-/*
+/*!
* Update internal counters after a memory put.
*/
static inline void
@@ -671,8 +670,6 @@ mem_putstats(isc_mem_t *ctx, void *ptr, size_t size) {
}
}
-#endif /* ISC_MEM_USE_INTERNAL_MALLOC */
-
/*
* Private.
*/
@@ -691,6 +688,11 @@ default_memfree(void *arg, void *ptr) {
free(ptr);
}
+static void
+initialize_action(void) {
+ RUNTIME_CHECK(isc_mutex_init(&lock) == ISC_R_SUCCESS);
+}
+
/*
* Public.
*/
@@ -700,6 +702,16 @@ isc_mem_createx(size_t init_max_size, size_t target_size,
isc_memalloc_t memalloc, isc_memfree_t memfree, void *arg,
isc_mem_t **ctxp)
{
+ return (isc_mem_createx2(init_max_size, target_size, memalloc, memfree,
+ arg, ctxp, ISC_MEMFLAG_DEFAULT));
+
+}
+
+isc_result_t
+isc_mem_createx2(size_t init_max_size, size_t target_size,
+ isc_memalloc_t memalloc, isc_memfree_t memfree, void *arg,
+ isc_mem_t **ctxp, unsigned int flags)
+{
isc_mem_t *ctx;
isc_result_t result;
@@ -709,27 +721,25 @@ isc_mem_createx(size_t init_max_size, size_t target_size,
INSIST((ALIGNMENT_SIZE & (ALIGNMENT_SIZE - 1)) == 0);
-#if !ISC_MEM_USE_INTERNAL_MALLOC
- UNUSED(target_size);
-#endif
+ RUNTIME_CHECK(isc_once_do(&once, initialize_action) == ISC_R_SUCCESS);
ctx = (memalloc)(arg, sizeof(*ctx));
if (ctx == NULL)
return (ISC_R_NOMEMORY);
- if (isc_mutex_init(&ctx->lock) != ISC_R_SUCCESS) {
- UNEXPECTED_ERROR(__FILE__, __LINE__,
- "isc_mutex_init() %s",
- isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
- ISC_MSG_FAILED, "failed"));
- (memfree)(arg, ctx);
- return (ISC_R_UNEXPECTED);
+ if ((flags & ISC_MEMFLAG_NOLOCK) == 0) {
+ result = isc_mutex_init(&ctx->lock);
+ if (result != ISC_R_SUCCESS) {
+ (memfree)(arg, ctx);
+ return (result);
+ }
}
if (init_max_size == 0U)
ctx->max_size = DEF_MAX_SIZE;
else
ctx->max_size = init_max_size;
+ ctx->flags = flags;
ctx->references = 1;
ctx->quota = 0;
ctx->total = 0;
@@ -751,10 +761,13 @@ isc_mem_createx(size_t init_max_size, size_t target_size,
ctx->debuglist = NULL;
#endif
ISC_LIST_INIT(ctx->pools);
-
-#if ISC_MEM_USE_INTERNAL_MALLOC
ctx->freelists = NULL;
-#endif /* ISC_MEM_USE_INTERNAL_MALLOC */
+ ctx->basic_blocks = NULL;
+ ctx->basic_table = NULL;
+ ctx->basic_table_count = 0;
+ ctx->basic_table_size = 0;
+ ctx->lowest = NULL;
+ ctx->highest = NULL;
ctx->stats = (memalloc)(arg,
(ctx->max_size+1) * sizeof(struct stats));
@@ -764,25 +777,20 @@ isc_mem_createx(size_t init_max_size, size_t target_size,
}
memset(ctx->stats, 0, (ctx->max_size + 1) * sizeof(struct stats));
-#if ISC_MEM_USE_INTERNAL_MALLOC
- if (target_size == 0)
- ctx->mem_target = DEF_MEM_TARGET;
- else
- ctx->mem_target = target_size;
- ctx->freelists = (memalloc)(arg, ctx->max_size * sizeof(element *));
- if (ctx->freelists == NULL) {
- result = ISC_R_NOMEMORY;
- goto error;
+ if ((flags & ISC_MEMFLAG_INTERNAL) != 0) {
+ if (target_size == 0U)
+ ctx->mem_target = DEF_MEM_TARGET;
+ else
+ ctx->mem_target = target_size;
+ ctx->freelists = (memalloc)(arg, ctx->max_size *
+ sizeof(element *));
+ if (ctx->freelists == NULL) {
+ result = ISC_R_NOMEMORY;
+ goto error;
+ }
+ memset(ctx->freelists, 0,
+ ctx->max_size * sizeof(element *));
}
- memset(ctx->freelists, 0,
- ctx->max_size * sizeof(element *));
- ctx->basic_blocks = NULL;
- ctx->basic_table = NULL;
- ctx->basic_table_count = 0;
- ctx->basic_table_size = 0;
- ctx->lowest = NULL;
- ctx->highest = NULL;
-#endif /* ISC_MEM_USE_INTERNAL_MALLOC */
#if ISC_MEM_TRACKLINES
if ((isc_mem_debugging & ISC_MEM_DEBUGRECORD) != 0) {
@@ -801,6 +809,10 @@ isc_mem_createx(size_t init_max_size, size_t target_size,
ctx->memalloc_failures = 0;
+ LOCK(&lock);
+ ISC_LIST_INITANDAPPEND(contexts, ctx, link);
+ UNLOCK(&lock);
+
*ctxp = ctx;
return (ISC_R_SUCCESS);
@@ -808,15 +820,14 @@ isc_mem_createx(size_t init_max_size, size_t target_size,
if (ctx != NULL) {
if (ctx->stats != NULL)
(memfree)(arg, ctx->stats);
-#if ISC_MEM_USE_INTERNAL_MALLOC
if (ctx->freelists != NULL)
(memfree)(arg, ctx->freelists);
-#endif /* ISC_MEM_USE_INTERNAL_MALLOC */
#if ISC_MEM_TRACKLINES
if (ctx->debuglist != NULL)
(ctx->memfree)(ctx->arg, ctx->debuglist);
#endif /* ISC_MEM_TRACKLINES */
- DESTROYLOCK(&ctx->lock);
+ if ((ctx->flags & ISC_MEMFLAG_NOLOCK) == 0)
+ DESTROYLOCK(&ctx->lock);
(memfree)(arg, ctx);
}
@@ -827,9 +838,18 @@ isc_result_t
isc_mem_create(size_t init_max_size, size_t target_size,
isc_mem_t **ctxp)
{
- return (isc_mem_createx(init_max_size, target_size,
- default_memalloc, default_memfree, NULL,
- ctxp));
+ return (isc_mem_createx2(init_max_size, target_size,
+ default_memalloc, default_memfree, NULL,
+ ctxp, ISC_MEMFLAG_DEFAULT));
+}
+
+isc_result_t
+isc_mem_create2(size_t init_max_size, size_t target_size,
+ isc_mem_t **ctxp, unsigned int flags)
+{
+ return (isc_mem_createx2(init_max_size, target_size,
+ default_memalloc, default_memfree, NULL,
+ ctxp, flags));
}
static void
@@ -839,9 +859,11 @@ destroy(isc_mem_t *ctx) {
ctx->magic = 0;
-#if ISC_MEM_USE_INTERNAL_MALLOC
+ LOCK(&lock);
+ ISC_LIST_UNLINK(contexts, ctx, link);
+ UNLOCK(&lock);
+
INSIST(ISC_LIST_EMPTY(ctx->pools));
-#endif /* ISC_MEM_USE_INTERNAL_MALLOC */
#if ISC_MEM_TRACKLINES
if (ctx->debuglist != NULL) {
@@ -880,16 +902,17 @@ destroy(isc_mem_t *ctx) {
(ctx->memfree)(ctx->arg, ctx->stats);
-#if ISC_MEM_USE_INTERNAL_MALLOC
- for (i = 0; i < ctx->basic_table_count; i++)
- (ctx->memfree)(ctx->arg, ctx->basic_table[i]);
- (ctx->memfree)(ctx->arg, ctx->freelists);
- (ctx->memfree)(ctx->arg, ctx->basic_table);
-#endif /* ISC_MEM_USE_INTERNAL_MALLOC */
+ if ((ctx->flags & ISC_MEMFLAG_INTERNAL) != 0) {
+ for (i = 0; i < ctx->basic_table_count; i++)
+ (ctx->memfree)(ctx->arg, ctx->basic_table[i]);
+ (ctx->memfree)(ctx->arg, ctx->freelists);
+ (ctx->memfree)(ctx->arg, ctx->basic_table);
+ }
ondest = ctx->ondestroy;
- DESTROYLOCK(&ctx->lock);
+ if ((ctx->flags & ISC_MEMFLAG_NOLOCK) == 0)
+ DESTROYLOCK(&ctx->lock);
(ctx->memfree)(ctx->arg, ctx);
isc_ondestroy_notify(&ondest, ctx);
@@ -900,9 +923,9 @@ isc_mem_attach(isc_mem_t *source, isc_mem_t **targetp) {
REQUIRE(VALID_CONTEXT(source));
REQUIRE(targetp != NULL && *targetp == NULL);
- LOCK(&source->lock);
+ MCTXLOCK(source, &source->lock);
source->references++;
- UNLOCK(&source->lock);
+ MCTXUNLOCK(source, &source->lock);
*targetp = source;
}
@@ -916,12 +939,12 @@ isc_mem_detach(isc_mem_t **ctxp) {
ctx = *ctxp;
REQUIRE(VALID_CONTEXT(ctx));
- LOCK(&ctx->lock);
+ MCTXLOCK(ctx, &ctx->lock);
INSIST(ctx->references > 0);
ctx->references--;
if (ctx->references == 0)
want_destroy = ISC_TRUE;
- UNLOCK(&ctx->lock);
+ MCTXUNLOCK(ctx, &ctx->lock);
if (want_destroy)
destroy(ctx);
@@ -943,6 +966,8 @@ void
isc__mem_putanddetach(isc_mem_t **ctxp, void *ptr, size_t size FLARG) {
isc_mem_t *ctx;
isc_boolean_t want_destroy = ISC_FALSE;
+ size_info *si;
+ size_t oldsize;
REQUIRE(ctxp != NULL);
ctx = *ctxp;
@@ -955,14 +980,35 @@ isc__mem_putanddetach(isc_mem_t **ctxp, void *ptr, size_t size FLARG) {
*/
*ctxp = NULL;
-#if ISC_MEM_USE_INTERNAL_MALLOC
- LOCK(&ctx->lock);
- mem_putunlocked(ctx, ptr, size);
-#else /* ISC_MEM_USE_INTERNAL_MALLOC */
- mem_put(ctx, ptr, size);
- LOCK(&ctx->lock);
- mem_putstats(ctx, ptr, size);
-#endif /* ISC_MEM_USE_INTERNAL_MALLOC */
+ if ((isc_mem_debugging & (ISC_MEM_DEBUGSIZE|ISC_MEM_DEBUGCTX)) != 0) {
+ if ((isc_mem_debugging & ISC_MEM_DEBUGSIZE) != 0) {
+ si = &(((size_info *)ptr)[-1]);
+ oldsize = si->u.size - ALIGNMENT_SIZE;
+ if ((isc_mem_debugging & ISC_MEM_DEBUGCTX) != 0)
+ oldsize -= ALIGNMENT_SIZE;
+ INSIST(oldsize == size);
+ }
+ isc__mem_free(ctx, ptr FLARG_PASS);
+
+ MCTXLOCK(ctx, &ctx->lock);
+ ctx->references--;
+ if (ctx->references == 0)
+ want_destroy = ISC_TRUE;
+ MCTXUNLOCK(ctx, &ctx->lock);
+ if (want_destroy)
+ destroy(ctx);
+
+ return;
+ }
+
+ if ((ctx->flags & ISC_MEMFLAG_INTERNAL) != 0) {
+ MCTXLOCK(ctx, &ctx->lock);
+ mem_putunlocked(ctx, ptr, size);
+ } else {
+ mem_put(ctx, ptr, size);
+ MCTXLOCK(ctx, &ctx->lock);
+ mem_putstats(ctx, ptr, size);
+ }
DELETE_TRACE(ctx, ptr, size, file, line);
INSIST(ctx->references > 0);
@@ -970,7 +1016,7 @@ isc__mem_putanddetach(isc_mem_t **ctxp, void *ptr, size_t size FLARG) {
if (ctx->references == 0)
want_destroy = ISC_TRUE;
- UNLOCK(&ctx->lock);
+ MCTXUNLOCK(ctx, &ctx->lock);
if (want_destroy)
destroy(ctx);
@@ -989,14 +1035,14 @@ isc_mem_destroy(isc_mem_t **ctxp) {
ctx = *ctxp;
REQUIRE(VALID_CONTEXT(ctx));
- LOCK(&ctx->lock);
+ MCTXLOCK(ctx, &ctx->lock);
#if ISC_MEM_TRACKLINES
if (ctx->references != 1)
print_active(ctx, stderr);
#endif
REQUIRE(ctx->references == 1);
ctx->references--;
- UNLOCK(&ctx->lock);
+ MCTXUNLOCK(ctx, &ctx->lock);
destroy(ctx);
@@ -1007,9 +1053,9 @@ isc_result_t
isc_mem_ondestroy(isc_mem_t *ctx, isc_task_t *task, isc_event_t **event) {
isc_result_t res;
- LOCK(&ctx->lock);
+ MCTXLOCK(ctx, &ctx->lock);
res = isc_ondestroy_register(&ctx->ondestroy, task, event);
- UNLOCK(&ctx->lock);
+ MCTXUNLOCK(ctx, &ctx->lock);
return (res);
}
@@ -1022,15 +1068,18 @@ isc__mem_get(isc_mem_t *ctx, size_t size FLARG) {
REQUIRE(VALID_CONTEXT(ctx));
-#if ISC_MEM_USE_INTERNAL_MALLOC
- LOCK(&ctx->lock);
- ptr = mem_getunlocked(ctx, size);
-#else /* ISC_MEM_USE_INTERNAL_MALLOC */
- ptr = mem_get(ctx, size);
- LOCK(&ctx->lock);
- if (ptr != NULL)
- mem_getstats(ctx, size);
-#endif /* ISC_MEM_USE_INTERNAL_MALLOC */
+ if ((isc_mem_debugging & (ISC_MEM_DEBUGSIZE|ISC_MEM_DEBUGCTX)) != 0)
+ return (isc__mem_allocate(ctx, size FLARG_PASS));
+
+ if ((ctx->flags & ISC_MEMFLAG_INTERNAL) != 0) {
+ MCTXLOCK(ctx, &ctx->lock);
+ ptr = mem_getunlocked(ctx, size);
+ } else {
+ ptr = mem_get(ctx, size);
+ MCTXLOCK(ctx, &ctx->lock);
+ if (ptr != NULL)
+ mem_getstats(ctx, size);
+ }
ADD_TRACE(ctx, ptr, size, file, line);
if (ctx->hi_water != 0U && !ctx->hi_called &&
@@ -1045,7 +1094,7 @@ isc__mem_get(isc_mem_t *ctx, size_t size FLARG) {
fprintf(stderr, "maxinuse = %lu\n",
(unsigned long)ctx->inuse);
}
- UNLOCK(&ctx->lock);
+ MCTXUNLOCK(ctx, &ctx->lock);
if (call_water)
(ctx->water)(ctx->water_arg, ISC_MEM_HIWATER);
@@ -1057,18 +1106,32 @@ void
isc__mem_put(isc_mem_t *ctx, void *ptr, size_t size FLARG)
{
isc_boolean_t call_water = ISC_FALSE;
+ size_info *si;
+ size_t oldsize;
REQUIRE(VALID_CONTEXT(ctx));
REQUIRE(ptr != NULL);
-#if ISC_MEM_USE_INTERNAL_MALLOC
- LOCK(&ctx->lock);
- mem_putunlocked(ctx, ptr, size);
-#else /* ISC_MEM_USE_INTERNAL_MALLOC */
- mem_put(ctx, ptr, size);
- LOCK(&ctx->lock);
- mem_putstats(ctx, ptr, size);
-#endif /* ISC_MEM_USE_INTERNAL_MALLOC */
+ if ((isc_mem_debugging & (ISC_MEM_DEBUGSIZE|ISC_MEM_DEBUGCTX)) != 0) {
+ if ((isc_mem_debugging & ISC_MEM_DEBUGSIZE) != 0) {
+ si = &(((size_info *)ptr)[-1]);
+ oldsize = si->u.size - ALIGNMENT_SIZE;
+ if ((isc_mem_debugging & ISC_MEM_DEBUGCTX) != 0)
+ oldsize -= ALIGNMENT_SIZE;
+ INSIST(oldsize == size);
+ }
+ isc__mem_free(ctx, ptr FLARG_PASS);
+ return;
+ }
+
+ if ((ctx->flags & ISC_MEMFLAG_INTERNAL) != 0) {
+ MCTXLOCK(ctx, &ctx->lock);
+ mem_putunlocked(ctx, ptr, size);
+ } else {
+ mem_put(ctx, ptr, size);
+ MCTXLOCK(ctx, &ctx->lock);
+ mem_putstats(ctx, ptr, size);
+ }
DELETE_TRACE(ctx, ptr, size, file, line);
@@ -1084,7 +1147,7 @@ isc__mem_put(isc_mem_t *ctx, void *ptr, size_t size FLARG)
if (ctx->water != NULL)
call_water = ISC_TRUE;
}
- UNLOCK(&ctx->lock);
+ MCTXUNLOCK(ctx, &ctx->lock);
if (call_water)
(ctx->water)(ctx->water_arg, ISC_MEM_LOWATER);
@@ -1141,7 +1204,7 @@ isc_mem_stats(isc_mem_t *ctx, FILE *out) {
const isc_mempool_t *pool;
REQUIRE(VALID_CONTEXT(ctx));
- LOCK(&ctx->lock);
+ MCTXLOCK(ctx, &ctx->lock);
for (i = 0; i <= ctx->max_size; i++) {
s = &ctx->stats[i];
@@ -1151,11 +1214,10 @@ isc_mem_stats(isc_mem_t *ctx, FILE *out) {
fprintf(out, "%s%5lu: %11lu gets, %11lu rem",
(i == ctx->max_size) ? ">=" : " ",
(unsigned long) i, s->totalgets, s->gets);
-#if ISC_MEM_USE_INTERNAL_MALLOC
- if (s->blocks != 0 || s->freefrags != 0)
+ if ((ctx->flags & ISC_MEMFLAG_INTERNAL) != 0 &&
+ (s->blocks != 0U || s->freefrags != 0U))
fprintf(out, " (%lu bl, %lu ff)",
s->blocks, s->freefrags);
-#endif /* ISC_MEM_USE_INTERNAL_MALLOC */
fputc('\n', out);
}
@@ -1203,7 +1265,7 @@ isc_mem_stats(isc_mem_t *ctx, FILE *out) {
print_active(ctx, out);
#endif
- UNLOCK(&ctx->lock);
+ MCTXUNLOCK(ctx, &ctx->lock);
}
/*
@@ -1216,13 +1278,20 @@ isc__mem_allocateunlocked(isc_mem_t *ctx, size_t size) {
size_info *si;
size += ALIGNMENT_SIZE;
-#if ISC_MEM_USE_INTERNAL_MALLOC
- si = mem_getunlocked(ctx, size);
-#else /* ISC_MEM_USE_INTERNAL_MALLOC */
- si = mem_get(ctx, size);
-#endif /* ISC_MEM_USE_INTERNAL_MALLOC */
+ if ((isc_mem_debugging & ISC_MEM_DEBUGCTX) != 0)
+ size += ALIGNMENT_SIZE;
+
+ if ((ctx->flags & ISC_MEMFLAG_INTERNAL) != 0)
+ si = mem_getunlocked(ctx, size);
+ else
+ si = mem_get(ctx, size);
+
if (si == NULL)
return (NULL);
+ if ((isc_mem_debugging & ISC_MEM_DEBUGCTX) != 0) {
+ si->u.ctx = ctx;
+ si++;
+ }
si->u.size = size;
return (&si[1]);
}
@@ -1230,24 +1299,39 @@ isc__mem_allocateunlocked(isc_mem_t *ctx, size_t size) {
void *
isc__mem_allocate(isc_mem_t *ctx, size_t size FLARG) {
size_info *si;
+ isc_boolean_t call_water = ISC_FALSE;
REQUIRE(VALID_CONTEXT(ctx));
-#if ISC_MEM_USE_INTERNAL_MALLOC
- LOCK(&ctx->lock);
- si = isc__mem_allocateunlocked(ctx, size);
-#else /* ISC_MEM_USE_INTERNAL_MALLOC */
- si = isc__mem_allocateunlocked(ctx, size);
- LOCK(&ctx->lock);
- if (si != NULL)
- mem_getstats(ctx, si[-1].u.size);
-#endif /* ISC_MEM_USE_INTERNAL_MALLOC */
+ if ((ctx->flags & ISC_MEMFLAG_INTERNAL) != 0) {
+ MCTXLOCK(ctx, &ctx->lock);
+ si = isc__mem_allocateunlocked(ctx, size);
+ } else {
+ si = isc__mem_allocateunlocked(ctx, size);
+ MCTXLOCK(ctx, &ctx->lock);
+ if (si != NULL)
+ mem_getstats(ctx, si[-1].u.size);
+ }
#if ISC_MEM_TRACKLINES
ADD_TRACE(ctx, si, si[-1].u.size, file, line);
#endif
+ if (ctx->hi_water != 0U && !ctx->hi_called &&
+ ctx->inuse > ctx->hi_water) {
+ ctx->hi_called = ISC_TRUE;
+ call_water = ISC_TRUE;
+ }
+ if (ctx->inuse > ctx->maxinuse) {
+ ctx->maxinuse = ctx->inuse;
+ if (ctx->hi_water != 0U && ctx->inuse > ctx->hi_water &&
+ (isc_mem_debugging & ISC_MEM_DEBUGUSAGE) != 0)
+ fprintf(stderr, "maxinuse = %lu\n",
+ (unsigned long)ctx->inuse);
+ }
+ MCTXUNLOCK(ctx, &ctx->lock);
- UNLOCK(&ctx->lock);
+ if (call_water)
+ (ctx->water)(ctx->water_arg, ISC_MEM_HIWATER);
return (si);
}
@@ -1256,25 +1340,47 @@ void
isc__mem_free(isc_mem_t *ctx, void *ptr FLARG) {
size_info *si;
size_t size;
+ isc_boolean_t call_water= ISC_FALSE;
REQUIRE(VALID_CONTEXT(ctx));
REQUIRE(ptr != NULL);
- si = &(((size_info *)ptr)[-1]);
- size = si->u.size;
+ if ((isc_mem_debugging & ISC_MEM_DEBUGCTX) != 0) {
+ si = &(((size_info *)ptr)[-2]);
+ REQUIRE(si->u.ctx == ctx);
+ size = si[1].u.size;
+ } else {
+ si = &(((size_info *)ptr)[-1]);
+ size = si->u.size;
+ }
-#if ISC_MEM_USE_INTERNAL_MALLOC
- LOCK(&ctx->lock);
- mem_putunlocked(ctx, si, size);
-#else /* ISC_MEM_USE_INTERNAL_MALLOC */
- mem_put(ctx, si, size);
- LOCK(&ctx->lock);
- mem_putstats(ctx, si, size);
-#endif /* ISC_MEM_USE_INTERNAL_MALLOC */
+ if ((ctx->flags & ISC_MEMFLAG_INTERNAL) != 0) {
+ MCTXLOCK(ctx, &ctx->lock);
+ mem_putunlocked(ctx, si, size);
+ } else {
+ mem_put(ctx, si, size);
+ MCTXLOCK(ctx, &ctx->lock);
+ mem_putstats(ctx, si, size);
+ }
DELETE_TRACE(ctx, ptr, size, file, line);
- UNLOCK(&ctx->lock);
+ /*
+ * The check against ctx->lo_water == 0 is for the condition
+ * when the context was pushed over hi_water but then had
+ * isc_mem_setwater() called with 0 for hi_water and lo_water.
+ */
+ if (ctx->hi_called &&
+ (ctx->inuse < ctx->lo_water || ctx->lo_water == 0U)) {
+ ctx->hi_called = ISC_FALSE;
+
+ if (ctx->water != NULL)
+ call_water = ISC_TRUE;
+ }
+ MCTXUNLOCK(ctx, &ctx->lock);
+
+ if (call_water)
+ (ctx->water)(ctx->water_arg, ISC_MEM_LOWATER);
}
@@ -1303,11 +1409,11 @@ isc__mem_strdup(isc_mem_t *mctx, const char *s FLARG) {
void
isc_mem_setdestroycheck(isc_mem_t *ctx, isc_boolean_t flag) {
REQUIRE(VALID_CONTEXT(ctx));
- LOCK(&ctx->lock);
+ MCTXLOCK(ctx, &ctx->lock);
ctx->checkfree = flag;
- UNLOCK(&ctx->lock);
+ MCTXUNLOCK(ctx, &ctx->lock);
}
/*
@@ -1317,11 +1423,11 @@ isc_mem_setdestroycheck(isc_mem_t *ctx, isc_boolean_t flag) {
void
isc_mem_setquota(isc_mem_t *ctx, size_t quota) {
REQUIRE(VALID_CONTEXT(ctx));
- LOCK(&ctx->lock);
+ MCTXLOCK(ctx, &ctx->lock);
ctx->quota = quota;
- UNLOCK(&ctx->lock);
+ MCTXUNLOCK(ctx, &ctx->lock);
}
size_t
@@ -1329,11 +1435,11 @@ isc_mem_getquota(isc_mem_t *ctx) {
size_t quota;
REQUIRE(VALID_CONTEXT(ctx));
- LOCK(&ctx->lock);
+ MCTXLOCK(ctx, &ctx->lock);
quota = ctx->quota;
- UNLOCK(&ctx->lock);
+ MCTXUNLOCK(ctx, &ctx->lock);
return (quota);
}
@@ -1343,11 +1449,11 @@ isc_mem_inuse(isc_mem_t *ctx) {
size_t inuse;
REQUIRE(VALID_CONTEXT(ctx));
- LOCK(&ctx->lock);
+ MCTXLOCK(ctx, &ctx->lock);
inuse = ctx->inuse;
- UNLOCK(&ctx->lock);
+ MCTXUNLOCK(ctx, &ctx->lock);
return (inuse);
}
@@ -1356,24 +1462,38 @@ void
isc_mem_setwater(isc_mem_t *ctx, isc_mem_water_t water, void *water_arg,
size_t hiwater, size_t lowater)
{
+ isc_boolean_t callwater = ISC_FALSE;
+ isc_mem_water_t oldwater;
+ void *oldwater_arg;
+
REQUIRE(VALID_CONTEXT(ctx));
REQUIRE(hiwater >= lowater);
- LOCK(&ctx->lock);
+ MCTXLOCK(ctx, &ctx->lock);
+ oldwater = ctx->water;
+ oldwater_arg = ctx->water_arg;
if (water == NULL) {
+ callwater = ctx->hi_called;
ctx->water = NULL;
ctx->water_arg = NULL;
ctx->hi_water = 0;
ctx->lo_water = 0;
ctx->hi_called = ISC_FALSE;
} else {
+ if (ctx->hi_called &&
+ (ctx->water != water || ctx->water_arg != water_arg ||
+ ctx->inuse < lowater || lowater == 0U))
+ callwater = ISC_TRUE;
ctx->water = water;
ctx->water_arg = water_arg;
ctx->hi_water = hiwater;
ctx->lo_water = lowater;
ctx->hi_called = ISC_FALSE;
}
- UNLOCK(&ctx->lock);
+ MCTXUNLOCK(ctx, &ctx->lock);
+
+ if (callwater && oldwater != NULL)
+ (oldwater)(oldwater_arg, ISC_MEM_LOWATER);
}
/*
@@ -1413,9 +1533,9 @@ isc_mempool_create(isc_mem_t *mctx, size_t size, isc_mempool_t **mpctxp) {
*mpctxp = mpctx;
- LOCK(&mctx->lock);
+ MCTXLOCK(mctx, &mctx->lock);
ISC_LIST_INITANDAPPEND(mctx->pools, mpctx, link);
- UNLOCK(&mctx->lock);
+ MCTXUNLOCK(mctx, &mctx->lock);
return (ISC_R_SUCCESS);
}
@@ -1468,28 +1588,28 @@ isc_mempool_destroy(isc_mempool_t **mpctxp) {
/*
* Return any items on the free list
*/
- LOCK(&mctx->lock);
+ MCTXLOCK(mctx, &mctx->lock);
while (mpctx->items != NULL) {
INSIST(mpctx->freecount > 0);
mpctx->freecount--;
item = mpctx->items;
mpctx->items = item->next;
-#if ISC_MEM_USE_INTERNAL_MALLOC
- mem_putunlocked(mctx, item, mpctx->size);
-#else /* ISC_MEM_USE_INTERNAL_MALLOC */
- mem_put(mctx, item, mpctx->size);
- mem_putstats(mctx, item, mpctx->size);
-#endif /* ISC_MEM_USE_INTERNAL_MALLOC */
+ if ((mctx->flags & ISC_MEMFLAG_INTERNAL) != 0) {
+ mem_putunlocked(mctx, item, mpctx->size);
+ } else {
+ mem_put(mctx, item, mpctx->size);
+ mem_putstats(mctx, item, mpctx->size);
+ }
}
- UNLOCK(&mctx->lock);
+ MCTXUNLOCK(mctx, &mctx->lock);
/*
* Remove our linked list entry from the memory context.
*/
- LOCK(&mctx->lock);
+ MCTXLOCK(mctx, &mctx->lock);
ISC_LIST_UNLINK(mctx->pools, mpctx, link);
- UNLOCK(&mctx->lock);
+ MCTXUNLOCK(mctx, &mctx->lock);
mpctx->magic = 0;
@@ -1548,22 +1668,22 @@ isc__mempool_get(isc_mempool_t *mpctx FLARG) {
* We need to dip into the well. Lock the memory context here and
* fill up our free list.
*/
- LOCK(&mctx->lock);
+ MCTXLOCK(mctx, &mctx->lock);
for (i = 0; i < mpctx->fillcount; i++) {
-#if ISC_MEM_USE_INTERNAL_MALLOC
- item = mem_getunlocked(mctx, mpctx->size);
-#else /* ISC_MEM_USE_INTERNAL_MALLOC */
- item = mem_get(mctx, mpctx->size);
- if (item != NULL)
- mem_getstats(mctx, mpctx->size);
-#endif /* ISC_MEM_USE_INTERNAL_MALLOC */
+ if ((mctx->flags & ISC_MEMFLAG_INTERNAL) != 0) {
+ item = mem_getunlocked(mctx, mpctx->size);
+ } else {
+ item = mem_get(mctx, mpctx->size);
+ if (item != NULL)
+ mem_getstats(mctx, mpctx->size);
+ }
if (item == NULL)
break;
item->next = mpctx->items;
mpctx->items = item;
mpctx->freecount++;
}
- UNLOCK(&mctx->lock);
+ MCTXUNLOCK(mctx, &mctx->lock);
/*
* If we didn't get any items, return NULL.
@@ -1583,9 +1703,9 @@ isc__mempool_get(isc_mempool_t *mpctx FLARG) {
#if ISC_MEM_TRACKLINES
if (item != NULL) {
- LOCK(&mctx->lock);
+ MCTXLOCK(mctx, &mctx->lock);
ADD_TRACE(mctx, item, mpctx->size, file, line);
- UNLOCK(&mctx->lock);
+ MCTXUNLOCK(mctx, &mctx->lock);
}
#endif /* ISC_MEM_TRACKLINES */
@@ -1609,25 +1729,25 @@ isc__mempool_put(isc_mempool_t *mpctx, void *mem FLARG) {
mpctx->allocated--;
#if ISC_MEM_TRACKLINES
- LOCK(&mctx->lock);
+ MCTXLOCK(mctx, &mctx->lock);
DELETE_TRACE(mctx, mem, mpctx->size, file, line);
- UNLOCK(&mctx->lock);
+ MCTXUNLOCK(mctx, &mctx->lock);
#endif /* ISC_MEM_TRACKLINES */
/*
* If our free list is full, return this to the mctx directly.
*/
if (mpctx->freecount >= mpctx->freemax) {
-#if ISC_MEM_USE_INTERNAL_MALLOC
- LOCK(&mctx->lock);
- mem_putunlocked(mctx, mem, mpctx->size);
- UNLOCK(&mctx->lock);
-#else /* ISC_MEM_USE_INTERNAL_MALLOC */
- mem_put(mctx, mem, mpctx->size);
- LOCK(&mctx->lock);
- mem_putstats(mctx, mem, mpctx->size);
- UNLOCK(&mctx->lock);
-#endif /* ISC_MEM_USE_INTERNAL_MALLOC */
+ if ((mctx->flags & ISC_MEMFLAG_INTERNAL) != 0) {
+ MCTXLOCK(mctx, &mctx->lock);
+ mem_putunlocked(mctx, mem, mpctx->size);
+ MCTXUNLOCK(mctx, &mctx->lock);
+ } else {
+ mem_put(mctx, mem, mpctx->size);
+ MCTXLOCK(mctx, &mctx->lock);
+ mem_putstats(mctx, mem, mpctx->size);
+ MCTXUNLOCK(mctx, &mctx->lock);
+ }
if (mpctx->lock != NULL)
UNLOCK(mpctx->lock);
return;
@@ -1775,3 +1895,60 @@ isc_mempool_getfillcount(isc_mempool_t *mpctx) {
return (fillcount);
}
+
+void
+isc_mem_printactive(isc_mem_t *ctx, FILE *file) {
+
+ REQUIRE(VALID_CONTEXT(ctx));
+ REQUIRE(file != NULL);
+
+#if !ISC_MEM_TRACKLINES
+ UNUSED(ctx);
+ UNUSED(file);
+#else
+ print_active(ctx, file);
+#endif
+}
+
+void
+isc_mem_printallactive(FILE *file) {
+#if !ISC_MEM_TRACKLINES
+ UNUSED(file);
+#else
+ isc_mem_t *ctx;
+
+ RUNTIME_CHECK(isc_once_do(&once, initialize_action) == ISC_R_SUCCESS);
+
+ LOCK(&lock);
+ for (ctx = ISC_LIST_HEAD(contexts);
+ ctx != NULL;
+ ctx = ISC_LIST_NEXT(ctx, link)) {
+ fprintf(file, "context: %p\n", ctx);
+ print_active(ctx, file);
+ }
+ UNLOCK(&lock);
+#endif
+}
+
+void
+isc_mem_checkdestroyed(FILE *file) {
+
+ RUNTIME_CHECK(isc_once_do(&once, initialize_action) == ISC_R_SUCCESS);
+
+ LOCK(&lock);
+ if (!ISC_LIST_EMPTY(contexts)) {
+#if ISC_MEM_TRACKLINES
+ isc_mem_t *ctx;
+
+ for (ctx = ISC_LIST_HEAD(contexts);
+ ctx != NULL;
+ ctx = ISC_LIST_NEXT(ctx, link)) {
+ fprintf(file, "context: %p\n", ctx);
+ print_active(ctx, file);
+ }
+ fflush(file);
+#endif
+ INSIST(1);
+ }
+ UNLOCK(&lock);
+}
diff --git a/contrib/bind9/lib/isc/mips/include/isc/atomic.h b/contrib/bind9/lib/isc/mips/include/isc/atomic.h
new file mode 100644
index 0000000..368a6ef
--- /dev/null
+++ b/contrib/bind9/lib/isc/mips/include/isc/atomic.h
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2005 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* $Id: atomic.h,v 1.1.2.1 2005/07/09 07:14:00 jinmei Exp $ */
+
+#ifndef ISC_ATOMIC_H
+#define ISC_ATOMIC_H 1
+
+#include <isc/platform.h>
+#include <isc/types.h>
+
+#ifdef ISC_PLATFORM_USEGCCASM
+/*
+ * This routine atomically increments the value stored in 'p' by 'val', and
+ * returns the previous value.
+ */
+static inline isc_int32_t
+isc_atomic_xadd(isc_int32_t *p, int val) {
+ isc_int32_t orig;
+
+ /* add is a cheat, since MIPS has no mov instruction */
+ __asm__ volatile (
+ "1:"
+ "ll $3, %1\n"
+ "add %0, $0, $3\n"
+ "add $3, $3, %2\n"
+ "sc $3, %1\n"
+ "beq $3, 0, 1b"
+ : "=&r"(orig)
+ : "m"(*p), "r"(val)
+ : "memory", "$3"
+ );
+
+ return (orig);
+}
+
+/*
+ * This routine atomically stores the value 'val' in 'p'.
+ */
+static inline void
+isc_atomic_store(isc_int32_t *p, isc_int32_t val) {
+ __asm__ volatile (
+ "1:"
+ "ll $3, %0\n"
+ "add $3, $0, %1\n"
+ "sc $3, %0\n"
+ "beq $3, 0, 1b"
+ :
+ : "m"(*p), "r"(val)
+ : "memory", "$3"
+ );
+}
+
+/*
+ * This routine atomically replaces the value in 'p' with 'val', if the
+ * original value is equal to 'cmpval'. The original value is returned in any
+ * case.
+ */
+static inline isc_int32_t
+isc_atomic_cmpxchg(isc_int32_t *p, int cmpval, int val) {
+ isc_int32_t orig;
+
+ __asm__ volatile(
+ "1:"
+ "ll $3, %1\n"
+ "add %0, $0, $3\n"
+ "bne $3, %2, 2f\n"
+ "add $3, $0, %3\n"
+ "sc $3, %1\n"
+ "beq $3, 0, 1b\n"
+ "2:"
+ : "=&r"(orig)
+ : "m"(*p), "r"(cmpval), "r"(val)
+ : "memory", "$3"
+ );
+
+ return (orig);
+}
+
+#else /* !ISC_PLATFORM_USEGCCASM */
+
+#error "unsupported compiler. disable atomic ops by --disable-atomic"
+
+#endif
+#endif /* ISC_ATOMIC_H */
diff --git a/contrib/bind9/lib/isc/mutexblock.c b/contrib/bind9/lib/isc/mutexblock.c
index dc7c23d..d8a82cc 100644
--- a/contrib/bind9/lib/isc/mutexblock.c
+++ b/contrib/bind9/lib/isc/mutexblock.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mutexblock.c,v 1.14.12.3 2004/03/08 09:04:49 marka Exp $ */
+/* $Id: mutexblock.c,v 1.16.18.2 2005/04/29 00:16:47 marka Exp $ */
+
+/*! \file */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/netaddr.c b/contrib/bind9/lib/isc/netaddr.c
index 712ad2c..e56e05b 100644
--- a/contrib/bind9/lib/isc/netaddr.c
+++ b/contrib/bind9/lib/isc/netaddr.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: netaddr.c,v 1.18.12.9 2004/05/15 03:46:12 jinmei Exp $ */
+/* $Id: netaddr.c,v 1.27.18.8 2005/04/27 05:02:03 sra Exp $ */
+
+/*! \file */
#include <config.h>
@@ -51,6 +53,12 @@ isc_netaddr_equal(const isc_netaddr_t *a, const isc_netaddr_t *b) {
a->zone != b->zone)
return (ISC_FALSE);
break;
+#ifdef ISC_PLATFORM_HAVESYSUNH
+ case AF_UNIX:
+ if (strcmp(a->type.un, b->type.un) != 0)
+ return (ISC_FALSE);
+ break;
+#endif
default:
return (ISC_FALSE);
}
@@ -135,6 +143,16 @@ isc_netaddr_totext(const isc_netaddr_t *netaddr, isc_buffer_t *target) {
case AF_INET6:
type = &netaddr->type.in6;
break;
+#ifdef ISC_PLATFORM_HAVESYSUNH
+ case AF_UNIX:
+ alen = strlen(netaddr->type.un);
+ if (alen > isc_buffer_availablelength(target))
+ return (ISC_R_NOSPACE);
+ isc_buffer_putmem(target,
+ (const unsigned char *)(netaddr->type.un),
+ alen);
+ return (ISC_R_SUCCESS);
+#endif
default:
return (ISC_R_FAILURE);
}
@@ -190,6 +208,42 @@ isc_netaddr_format(const isc_netaddr_t *na, char *array, unsigned int size) {
}
}
+
+isc_result_t
+isc_netaddr_prefixok(const isc_netaddr_t *na, unsigned int prefixlen) {
+ static const unsigned char zeros[16];
+ unsigned int nbits, nbytes, ipbytes;
+ const unsigned char *p;
+
+ switch (na->family) {
+ case AF_INET:
+ p = (const unsigned char *) &na->type.in;
+ ipbytes = 4;
+ if (prefixlen > 32)
+ return (ISC_R_RANGE);
+ break;
+ case AF_INET6:
+ p = (const unsigned char *) &na->type.in6;
+ ipbytes = 16;
+ if (prefixlen > 128)
+ return (ISC_R_RANGE);
+ break;
+ default:
+ ipbytes = 0;
+ return (ISC_R_NOTIMPLEMENTED);
+ }
+ nbytes = prefixlen / 8;
+ nbits = prefixlen % 8;
+ if (nbits != 0) {
+ if ((p[nbytes] & (0xff>>nbits)) != 0U)
+ return (ISC_R_FAILURE);
+ nbytes++;
+ }
+ if (memcmp(p + nbytes, zeros, ipbytes - nbytes) != 0)
+ return (ISC_R_FAILURE);
+ return (ISC_R_SUCCESS);
+}
+
isc_result_t
isc_netaddr_masktoprefixlen(const isc_netaddr_t *s, unsigned int *lenp) {
unsigned int nbits, nbytes, ipbytes, i;
@@ -246,6 +300,25 @@ isc_netaddr_fromin6(isc_netaddr_t *netaddr, const struct in6_addr *ina6) {
netaddr->type.in6 = *ina6;
}
+isc_result_t
+isc_netaddr_frompath(isc_netaddr_t *netaddr, const char *path) {
+#ifdef ISC_PLATFORM_HAVESYSUNH
+ if (strlen(path) > sizeof(netaddr->type.un) - 1)
+ return (ISC_R_NOSPACE);
+
+ memset(netaddr, 0, sizeof(*netaddr));
+ netaddr->family = AF_UNIX;
+ strcpy(netaddr->type.un, path);
+ netaddr->zone = 0;
+ return (ISC_R_SUCCESS);
+#else
+ UNUSED(netaddr);
+ UNUSED(path);
+ return (ISC_R_NOTIMPLEMENTED);
+#endif
+}
+
+
void
isc_netaddr_setzone(isc_netaddr_t *netaddr, isc_uint32_t zone) {
/* we currently only support AF_INET6. */
@@ -276,6 +349,12 @@ isc_netaddr_fromsockaddr(isc_netaddr_t *t, const isc_sockaddr_t *s) {
t->zone = 0;
#endif
break;
+#ifdef ISC_PLATFORM_HAVESYSUNH
+ case AF_UNIX:
+ memcpy(t->type.un, s->type.sunix.sun_path, sizeof(t->type.un));
+ t->zone = 0;
+ break;
+#endif
default:
INSIST(0);
}
diff --git a/contrib/bind9/lib/isc/netscope.c b/contrib/bind9/lib/isc/netscope.c
index 8df4483..75827d2 100644
--- a/contrib/bind9/lib/isc/netscope.c
+++ b/contrib/bind9/lib/isc/netscope.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2006 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2006 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,9 +15,11 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
+/*! \file */
+
#if defined(LIBC_SCCS) && !defined(lint)
static char rcsid[] =
- "$Id: netscope.c,v 1.5.142.9 2006/08/25 05:25:50 marka Exp $";
+ "$Id: netscope.c,v 1.7.18.4 2006/08/25 05:25:51 marka Exp $";
#endif /* LIBC_SCCS and not lint */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/nls/Makefile.in b/contrib/bind9/lib/isc/nls/Makefile.in
index f16b4cb..8211d9b 100644
--- a/contrib/bind9/lib/isc/nls/Makefile.in
+++ b/contrib/bind9/lib/isc/nls/Makefile.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.11.206.1 2004/03/06 08:14:50 marka Exp $
+# $Id: Makefile.in,v 1.12 2004/03/05 05:11:05 marka Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/lib/isc/nls/msgcat.c b/contrib/bind9/lib/isc/nls/msgcat.c
index 906e26e..ae56de7 100644
--- a/contrib/bind9/lib/isc/nls/msgcat.c
+++ b/contrib/bind9/lib/isc/nls/msgcat.c
@@ -15,10 +15,11 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: msgcat.c,v 1.10.12.6 2005/06/09 23:54:31 marka Exp $ */
+/* $Id: msgcat.c,v 1.13.18.3 2005/06/08 02:07:57 marka Exp $ */
-/*
- * Principal Author: Bob Halley
+/*! \file msgcat.c
+ *
+ * \author Principal Author: Bob Halley
*/
#include <config.h>
diff --git a/contrib/bind9/lib/isc/noatomic/include/isc/atomic.h b/contrib/bind9/lib/isc/noatomic/include/isc/atomic.h
new file mode 100644
index 0000000..1c7035f
--- /dev/null
+++ b/contrib/bind9/lib/isc/noatomic/include/isc/atomic.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2005 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* $Id: atomic.h,v 1.2.2.1 2005/06/04 06:23:44 jinmei Exp $ */
+
+#ifndef ISC_ATOMIC_H
+#define ISC_ATOMIC_H 1
+
+/* This file is inherently empty. */
+
+#endif /* ISC_ATOMIC_H */
diff --git a/contrib/bind9/lib/isc/nothreads/Makefile.in b/contrib/bind9/lib/isc/nothreads/Makefile.in
index 639c9fa..c9e8637 100644
--- a/contrib/bind9/lib/isc/nothreads/Makefile.in
+++ b/contrib/bind9/lib/isc/nothreads/Makefile.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.4.206.1 2004/03/06 08:14:51 marka Exp $
+# $Id: Makefile.in,v 1.5 2004/03/05 05:11:08 marka Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/lib/isc/nothreads/condition.c b/contrib/bind9/lib/isc/nothreads/condition.c
index 395d52f..329fbc8 100644
--- a/contrib/bind9/lib/isc/nothreads/condition.c
+++ b/contrib/bind9/lib/isc/nothreads/condition.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: condition.c,v 1.4.12.5 2006/08/25 05:25:50 marka Exp $ */
+/* $Id: condition.c,v 1.6.18.2 2006/08/25 05:25:51 marka Exp $ */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/nothreads/include/Makefile.in b/contrib/bind9/lib/isc/nothreads/include/Makefile.in
index 4c58269..ecfc329 100644
--- a/contrib/bind9/lib/isc/nothreads/include/Makefile.in
+++ b/contrib/bind9/lib/isc/nothreads/include/Makefile.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.2.206.1 2004/03/06 08:14:52 marka Exp $
+# $Id: Makefile.in,v 1.3 2004/03/05 05:11:11 marka Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/lib/isc/nothreads/include/isc/Makefile.in b/contrib/bind9/lib/isc/nothreads/include/isc/Makefile.in
index 6717404..f6482fb 100644
--- a/contrib/bind9/lib/isc/nothreads/include/isc/Makefile.in
+++ b/contrib/bind9/lib/isc/nothreads/include/isc/Makefile.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.4.206.1 2004/03/06 08:14:52 marka Exp $
+# $Id: Makefile.in,v 1.5 2004/03/05 05:11:13 marka Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/lib/isc/nothreads/include/isc/condition.h b/contrib/bind9/lib/isc/nothreads/include/isc/condition.h
index b899a82..39889b1 100644
--- a/contrib/bind9/lib/isc/nothreads/include/isc/condition.h
+++ b/contrib/bind9/lib/isc/nothreads/include/isc/condition.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: condition.h,v 1.3.206.1 2004/03/06 08:14:52 marka Exp $ */
+/* $Id: condition.h,v 1.4 2004/03/05 05:11:13 marka Exp $ */
/*
* This provides a limited subset of the isc_condition_t
diff --git a/contrib/bind9/lib/isc/nothreads/include/isc/mutex.h b/contrib/bind9/lib/isc/nothreads/include/isc/mutex.h
index c80a945..a586435 100644
--- a/contrib/bind9/lib/isc/nothreads/include/isc/mutex.h
+++ b/contrib/bind9/lib/isc/nothreads/include/isc/mutex.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mutex.h,v 1.3.206.1 2004/03/06 08:14:53 marka Exp $ */
+/* $Id: mutex.h,v 1.4 2004/03/05 05:11:13 marka Exp $ */
#ifndef ISC_MUTEX_H
#define ISC_MUTEX_H 1
diff --git a/contrib/bind9/lib/isc/nothreads/include/isc/once.h b/contrib/bind9/lib/isc/nothreads/include/isc/once.h
index 9f54ac8..470120a 100644
--- a/contrib/bind9/lib/isc/nothreads/include/isc/once.h
+++ b/contrib/bind9/lib/isc/nothreads/include/isc/once.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: once.h,v 1.3.206.1 2004/03/06 08:14:53 marka Exp $ */
+/* $Id: once.h,v 1.4 2004/03/05 05:11:13 marka Exp $ */
#ifndef ISC_ONCE_H
#define ISC_ONCE_H 1
diff --git a/contrib/bind9/lib/isc/nothreads/include/isc/thread.h b/contrib/bind9/lib/isc/nothreads/include/isc/thread.h
index e045b98..6c85913 100644
--- a/contrib/bind9/lib/isc/nothreads/include/isc/thread.h
+++ b/contrib/bind9/lib/isc/nothreads/include/isc/thread.h
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: thread.h,v 1.3.206.1 2004/03/06 08:14:53 marka Exp $ */
+/* $Id: thread.h,v 1.4 2004/03/05 05:11:13 marka Exp $ */
#ifndef ISC_THREAD_H
#define ISC_THREAD_H 1
diff --git a/contrib/bind9/lib/isc/nothreads/mutex.c b/contrib/bind9/lib/isc/nothreads/mutex.c
index a707947..0048d87 100644
--- a/contrib/bind9/lib/isc/nothreads/mutex.c
+++ b/contrib/bind9/lib/isc/nothreads/mutex.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mutex.c,v 1.4.12.5 2006/08/25 05:25:50 marka Exp $ */
+/* $Id: mutex.c,v 1.6.18.2 2006/08/25 05:25:51 marka Exp $ */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/nothreads/thread.c b/contrib/bind9/lib/isc/nothreads/thread.c
index 1aea72a..0f20927 100644
--- a/contrib/bind9/lib/isc/nothreads/thread.c
+++ b/contrib/bind9/lib/isc/nothreads/thread.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: thread.c,v 1.2.206.1 2004/03/06 08:14:52 marka Exp $ */
+/* $Id: thread.c,v 1.3 2004/03/05 05:11:09 marka Exp $ */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/ondestroy.c b/contrib/bind9/lib/isc/ondestroy.c
index aacb8f2..2cd9687 100644
--- a/contrib/bind9/lib/isc/ondestroy.c
+++ b/contrib/bind9/lib/isc/ondestroy.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ondestroy.c,v 1.11.206.1 2004/03/06 08:14:33 marka Exp $ */
+/* $Id: ondestroy.c,v 1.12.18.2 2005/04/29 00:16:48 marka Exp $ */
+
+/*! \file */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/parseint.c b/contrib/bind9/lib/isc/parseint.c
index fe74e57..0696344 100644
--- a/contrib/bind9/lib/isc/parseint.c
+++ b/contrib/bind9/lib/isc/parseint.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: parseint.c,v 1.3.26.5 2004/03/08 09:04:49 marka Exp $ */
+/* $Id: parseint.c,v 1.4.18.2 2005/04/29 00:16:48 marka Exp $ */
+
+/*! \file */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/powerpc/include/isc/atomic.h b/contrib/bind9/lib/isc/powerpc/include/isc/atomic.h
new file mode 100644
index 0000000..2af9835
--- /dev/null
+++ b/contrib/bind9/lib/isc/powerpc/include/isc/atomic.h
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* $Id: atomic.h,v 1.1.6.5 2007/02/13 00:04:50 marka Exp $ */
+
+#ifndef ISC_ATOMIC_H
+#define ISC_ATOMIC_H 1
+
+#include <isc/platform.h>
+#include <isc/types.h>
+
+/*!\file
+ * static inline isc_int32_t
+ * isc_atomic_xadd(isc_int32_t *p, isc_int32_t val);
+ *
+ * This routine atomically increments the value stored in 'p' by 'val', and
+ * returns the previous value.
+ *
+ * static inline void
+ * isc_atomic_store(void *p, isc_int32_t val);
+ *
+ * This routine atomically stores the value 'val' in 'p'.
+ *
+ * static inline isc_int32_t
+ * isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val);
+ *
+ * This routine atomically replaces the value in 'p' with 'val', if the
+ * original value is equal to 'cmpval'. The original value is returned in any
+ * case.
+ */
+
+#if defined(_AIX)
+
+#include <sys/atomic_op.h>
+
+#define isc_atomic_xadd(p, v) fetch_and_add(p, v)
+#define isc_atomic_store(p, v) _clear_lock(p, v)
+
+#ifdef __GNUC__
+static inline int
+#else
+static int
+#endif
+isc_atomic_cmpxchg(atomic_p p, int old, int new) {
+ int orig = old;
+
+#ifdef __GNUC__
+ asm("ics");
+#else
+ __isync();
+#endif
+ if (compare_and_swap(p, &orig, new))
+ return (old);
+ return (orig);
+}
+
+#elif defined(ISC_PLATFORM_USEGCCASM) || defined(ISC_PLATFORM_USEMACASM)
+static inline isc_int32_t
+isc_atomic_xadd(isc_int32_t *p, isc_int32_t val) {
+ isc_int32_t orig;
+
+ __asm__ volatile (
+#ifdef ISC_PLATFORM_USEMACASM
+ "1:"
+ "lwarx r6, 0, %1\n"
+ "mr %0, r6\n"
+ "add r6, r6, %2\n"
+ "stwcx. r6, 0, %1\n"
+ "bne- 1b"
+#else
+ "1:"
+ "lwarx 6, 0, %1\n"
+ "mr %0, 6\n"
+ "add 6, 6, %2\n"
+ "stwcx. 6, 0, %1\n"
+ "bne- 1b"
+#endif
+ : "=&r"(orig)
+ : "r"(p), "r"(val)
+ : "r6", "memory"
+ );
+
+ return (orig);
+}
+
+static inline void
+isc_atomic_store(void *p, isc_int32_t val) {
+ __asm__ volatile (
+#ifdef ISC_PLATFORM_USEMACASM
+ "1:"
+ "lwarx r6, 0, %0\n"
+ "lwz r6, %1\n"
+ "stwcx. r6, 0, %0\n"
+ "bne- 1b"
+#else
+ "1:"
+ "lwarx 6, 0, %0\n"
+ "lwz 6, %1\n"
+ "stwcx. 6, 0, %0\n"
+ "bne- 1b"
+#endif
+ :
+ : "r"(p), "m"(val)
+ : "r6", "memory"
+ );
+}
+
+static inline isc_int32_t
+isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val) {
+ isc_int32_t orig;
+
+ __asm__ volatile (
+#ifdef ISC_PLATFORM_USEMACASM
+ "1:"
+ "lwarx r6, 0, %1\n"
+ "mr %0,r6\n"
+ "cmpw r6, %2\n"
+ "bne 2f\n"
+ "mr r6, %3\n"
+ "stwcx. r6, 0, %1\n"
+ "bne- 1b\n"
+ "2:"
+#else
+ "1:"
+ "lwarx 6, 0, %1\n"
+ "mr %0,6\n"
+ "cmpw 6, %2\n"
+ "bne 2f\n"
+ "mr 6, %3\n"
+ "stwcx. 6, 0, %1\n"
+ "bne- 1b\n"
+ "2:"
+#endif
+ : "=&r" (orig)
+ : "r"(p), "r"(cmpval), "r"(val)
+ : "r6", "memory"
+ );
+
+ return (orig);
+}
+
+#else
+
+#error "unsupported compiler. disable atomic ops by --disable-atomic"
+
+#endif
+#endif /* ISC_ATOMIC_H */
diff --git a/contrib/bind9/lib/isc/print.c b/contrib/bind9/lib/isc/print.c
index ee50b29..59c528b 100644
--- a/contrib/bind9/lib/isc/print.c
+++ b/contrib/bind9/lib/isc/print.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: print.c,v 1.22.2.3.2.4 2006/04/17 18:27:20 explorer Exp $ */
+/* $Id: print.c,v 1.27.18.3 2006/04/17 18:27:33 explorer Exp $ */
/*! \file */
diff --git a/contrib/bind9/lib/isc/pthreads/Makefile.in b/contrib/bind9/lib/isc/pthreads/Makefile.in
index f245afa..b9cc906 100644
--- a/contrib/bind9/lib/isc/pthreads/Makefile.in
+++ b/contrib/bind9/lib/isc/pthreads/Makefile.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.16.206.1 2004/03/06 08:14:53 marka Exp $
+# $Id: Makefile.in,v 1.17 2004/03/05 05:11:16 marka Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/lib/isc/pthreads/condition.c b/contrib/bind9/lib/isc/pthreads/condition.c
index 489980c..b9c26c6 100644
--- a/contrib/bind9/lib/isc/pthreads/condition.c
+++ b/contrib/bind9/lib/isc/pthreads/condition.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: condition.c,v 1.30.2.1.10.1 2004/03/06 08:14:53 marka Exp $ */
+/* $Id: condition.c,v 1.32.18.2 2005/04/29 00:17:05 marka Exp $ */
+
+/*! \file */
#include <config.h>
@@ -44,7 +46,7 @@ isc_condition_waituntil(isc_condition_t *c, isc_mutex_t *m, isc_time_t *t) {
if (result != ISC_R_SUCCESS)
return (result);
- /*
+ /*!
* POSIX defines a timespec's tv_nsec as long. isc_time_nanoseconds
* ensures its return value is < 1 billion, which will fit in a long.
*/
diff --git a/contrib/bind9/lib/isc/pthreads/include/Makefile.in b/contrib/bind9/lib/isc/pthreads/include/Makefile.in
index 5fec836..b1164b6 100644
--- a/contrib/bind9/lib/isc/pthreads/include/Makefile.in
+++ b/contrib/bind9/lib/isc/pthreads/include/Makefile.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.11.206.1 2004/03/06 08:14:54 marka Exp $
+# $Id: Makefile.in,v 1.12 2004/03/05 05:11:19 marka Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/lib/isc/pthreads/include/isc/Makefile.in b/contrib/bind9/lib/isc/pthreads/include/isc/Makefile.in
index dd15a11..2e11f6c 100644
--- a/contrib/bind9/lib/isc/pthreads/include/isc/Makefile.in
+++ b/contrib/bind9/lib/isc/pthreads/include/isc/Makefile.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.13.206.1 2004/03/06 08:14:56 marka Exp $
+# $Id: Makefile.in,v 1.14 2004/03/05 05:11:40 marka Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/lib/isc/pthreads/include/isc/condition.h b/contrib/bind9/lib/isc/pthreads/include/isc/condition.h
index c33772f..f7cea75 100644
--- a/contrib/bind9/lib/isc/pthreads/include/isc/condition.h
+++ b/contrib/bind9/lib/isc/pthreads/include/isc/condition.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: condition.h,v 1.21.206.1 2004/03/06 08:14:56 marka Exp $ */
+/* $Id: condition.h,v 1.22.18.2 2005/04/29 00:17:05 marka Exp $ */
#ifndef ISC_CONDITION_H
#define ISC_CONDITION_H 1
+/*! \file */
+
#include <isc/lang.h>
#include <isc/mutex.h>
#include <isc/result.h>
diff --git a/contrib/bind9/lib/isc/pthreads/include/isc/mutex.h b/contrib/bind9/lib/isc/pthreads/include/isc/mutex.h
index f6e526d..edafaf6 100644
--- a/contrib/bind9/lib/isc/pthreads/include/isc/mutex.h
+++ b/contrib/bind9/lib/isc/pthreads/include/isc/mutex.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,17 +15,22 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mutex.h,v 1.23.26.3 2004/03/08 09:04:55 marka Exp $ */
+/* $Id: mutex.h,v 1.25.18.3 2005/07/12 01:22:33 marka Exp $ */
#ifndef ISC_MUTEX_H
#define ISC_MUTEX_H 1
+/*! \file */
+
#include <pthread.h>
#include <stdio.h>
+#include <isc/lang.h>
#include <isc/result.h> /* for ISC_R_ codes */
-/*
+ISC_LANG_BEGINDECLS
+
+/*!
* Supply mutex attributes that enable deadlock detection
* (helpful when debugging). This is system dependent and
* currently only supported on NetBSD.
@@ -39,7 +44,7 @@ extern pthread_mutexattr_t isc__mutex_attrs;
/* XXX We could do fancier error handling... */
-/*
+/*!
* Define ISC_MUTEX_PROFILE to turn on profiling of mutexes by line. When
* enabled, isc_mutex_stats() can be used to print a table showing the
* number of times each type of mutex was locked and the amount of time
@@ -53,8 +58,8 @@ extern pthread_mutexattr_t isc__mutex_attrs;
typedef struct isc_mutexstats isc_mutexstats_t;
typedef struct {
- pthread_mutex_t mutex; /* The actual mutex. */
- isc_mutexstats_t * stats; /* Mutex statistics. */
+ pthread_mutex_t mutex; /*%< The actual mutex. */
+ isc_mutexstats_t * stats; /*%< Mutex statistics. */
} isc_mutex_t;
#else
typedef pthread_mutex_t isc_mutex_t;
@@ -70,8 +75,8 @@ typedef pthread_mutex_t isc_mutex_t;
isc_mutex_init_errcheck((mp))
#else
#define isc_mutex_init(mp) \
- ((pthread_mutex_init((mp), ISC__MUTEX_ATTRS) == 0) ? \
- ISC_R_SUCCESS : ISC_R_UNEXPECTED)
+ isc__mutex_init((mp), __FILE__, __LINE__)
+isc_result_t isc__mutex_init(isc_mutex_t *mp, const char *file, unsigned int line);
#endif
#endif
@@ -136,4 +141,5 @@ isc_mutex_init_errcheck(isc_mutex_t *mp);
#endif /* ISC_MUTEX_PROFILE */
+ISC_LANG_ENDDECLS
#endif /* ISC_MUTEX_H */
diff --git a/contrib/bind9/lib/isc/pthreads/include/isc/once.h b/contrib/bind9/lib/isc/pthreads/include/isc/once.h
index 39b4885..7e9f672 100644
--- a/contrib/bind9/lib/isc/pthreads/include/isc/once.h
+++ b/contrib/bind9/lib/isc/pthreads/include/isc/once.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: once.h,v 1.8.206.1 2004/03/06 08:14:57 marka Exp $ */
+/* $Id: once.h,v 1.9.18.2 2005/04/29 00:17:06 marka Exp $ */
#ifndef ISC_ONCE_H
#define ISC_ONCE_H 1
+/*! \file */
+
#include <pthread.h>
#include <isc/platform.h>
@@ -28,12 +30,12 @@
typedef pthread_once_t isc_once_t;
#ifdef ISC_PLATFORM_BRACEPTHREADONCEINIT
-/*
+/*!
* This accomodates systems that define PTHRAD_ONCE_INIT improperly.
*/
#define ISC_ONCE_INIT { PTHREAD_ONCE_INIT }
#else
-/*
+/*!
* This is the usual case.
*/
#define ISC_ONCE_INIT PTHREAD_ONCE_INIT
diff --git a/contrib/bind9/lib/isc/pthreads/include/isc/thread.h b/contrib/bind9/lib/isc/pthreads/include/isc/thread.h
index 6287dcd..3262607 100644
--- a/contrib/bind9/lib/isc/pthreads/include/isc/thread.h
+++ b/contrib/bind9/lib/isc/pthreads/include/isc/thread.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: thread.h,v 1.19.206.1 2004/03/06 08:14:57 marka Exp $ */
+/* $Id: thread.h,v 1.20.18.4 2005/09/18 07:58:08 marka Exp $ */
#ifndef ISC_THREAD_H
#define ISC_THREAD_H 1
+/*! \file */
+
#include <pthread.h>
#include <isc/lang.h>
@@ -31,6 +33,7 @@ typedef pthread_t isc_thread_t;
typedef void * isc_threadresult_t;
typedef void * isc_threadarg_t;
typedef isc_threadresult_t (*isc_threadfunc_t)(isc_threadarg_t);
+typedef pthread_key_t isc_thread_key_t;
isc_result_t
isc_thread_create(isc_threadfunc_t, isc_threadarg_t, isc_thread_t *);
@@ -47,6 +50,11 @@ isc_thread_setconcurrency(unsigned int level);
#define isc_thread_self \
(unsigned long)pthread_self
+#define isc_thread_key_create pthread_key_create
+#define isc_thread_key_getspecific pthread_getspecific
+#define isc_thread_key_setspecific pthread_setspecific
+#define isc_thread_key_delete pthread_key_delete
+
ISC_LANG_ENDDECLS
#endif /* ISC_THREAD_H */
diff --git a/contrib/bind9/lib/isc/pthreads/mutex.c b/contrib/bind9/lib/isc/pthreads/mutex.c
index 71db669..7716980 100644
--- a/contrib/bind9/lib/isc/pthreads/mutex.c
+++ b/contrib/bind9/lib/isc/pthreads/mutex.c
@@ -15,20 +15,25 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: mutex.c,v 1.6.26.5 2005/03/17 03:58:32 marka Exp $ */
+/* $Id: mutex.c,v 1.8.18.4 2005/07/12 01:22:32 marka Exp $ */
+
+/*! \file */
#include <config.h>
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
+#include <errno.h>
#include <isc/mutex.h>
#include <isc/util.h>
+#include <isc/strerror.h>
#if ISC_MUTEX_PROFILE
-/* Operations on timevals; adapted from FreeBSD's sys/time.h */
+/*@{*/
+/*% Operations on timevals; adapted from FreeBSD's sys/time.h */
#define timevalclear(tvp) ((tvp)->tv_sec = (tvp)->tv_usec = 0)
#define timevaladd(vvp, uvp) \
do { \
@@ -49,6 +54,8 @@
} \
} while (0)
+/*@}*/
+
#define ISC_MUTEX_MAX_LOCKERS 32
typedef struct {
@@ -60,8 +67,8 @@ typedef struct {
} isc_mutexlocker_t;
struct isc_mutexstats {
- const char * file; /* File mutex was created in. */
- int line; /* Line mutex was created on. */
+ const char * file; /*%< File mutex was created in. */
+ int line; /*%< Line mutex was created on. */
unsigned count;
struct timeval lock_t;
struct timeval locked_total;
@@ -78,10 +85,13 @@ static pthread_mutex_t statslock = PTHREAD_MUTEX_INITIALIZER;
isc_result_t
isc_mutex_init_profile(isc_mutex_t *mp, const char *file, int line) {
- int i;
+ int i, err;
- if (pthread_mutex_init(&mp->mutex, NULL) != 0)
- return ISC_R_UNEXPECTED;
+ err = pthread_mutex_init(&mp->mutex, NULL);
+ if (err == ENOMEM)
+ return (ISC_R_NOMEMORY);
+ if (err != 0)
+ return (ISC_R_UNEXPECTED);
RUNTIME_CHECK(pthread_mutex_lock(&statslock) == 0);
@@ -116,7 +126,7 @@ isc_mutex_init_profile(isc_mutex_t *mp, const char *file, int line) {
timevalclear(&mp->stats->lockers[i].wait_total);
}
- return ISC_R_SUCCESS;
+ return (ISC_R_SUCCESS);
}
isc_result_t
@@ -159,7 +169,7 @@ isc_mutex_lock_profile(isc_mutex_t *mp, const char *file, int line) {
mp->stats->cur_locker = locker;
- return ISC_R_SUCCESS;
+ return (ISC_R_SUCCESS);
}
isc_result_t
@@ -219,17 +229,18 @@ isc_result_t
isc_mutex_init_errcheck(isc_mutex_t *mp)
{
pthread_mutexattr_t attr;
+ int err;
if (pthread_mutexattr_init(&attr) != 0)
- return ISC_R_UNEXPECTED;
+ return (ISC_R_UNEXPECTED);
if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK) != 0)
- return ISC_R_UNEXPECTED;
+ return (ISC_R_UNEXPECTED);
- if (pthread_mutex_init(mp, &attr) != 0)
- return ISC_R_UNEXPECTED;
-
- return ISC_R_SUCCESS;
+ err = pthread_mutex_init(mp, &attr) != 0)
+ if (err == ENOMEM)
+ return (ISC_R_NOMEMORY);
+ return ((err == 0) ? ISC_R_SUCCESS : ISC_R_UNEXPECTED);
}
#endif
@@ -239,3 +250,21 @@ pthread_mutexattr_t isc__mutex_attrs = {
0 /* m_flags, which appears to be unused. */
};
#endif
+
+isc_result_t
+isc__mutex_init(isc_mutex_t *mp, const char *file, unsigned int line) {
+ char strbuf[ISC_STRERRORSIZE];
+ isc_result_t result = ISC_R_SUCCESS;
+ int err;
+
+ err = pthread_mutex_init(mp, ISC__MUTEX_ATTRS);
+ if (err == ENOMEM)
+ return (ISC_R_NOMEMORY);
+ if (err != 0) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ UNEXPECTED_ERROR(file, line, "isc_mutex_init() failed: %s",
+ strbuf);
+ result = ISC_R_UNEXPECTED;
+ }
+ return (result);
+}
diff --git a/contrib/bind9/lib/isc/pthreads/thread.c b/contrib/bind9/lib/isc/pthreads/thread.c
index a07daf8..bdbb593 100644
--- a/contrib/bind9/lib/isc/pthreads/thread.c
+++ b/contrib/bind9/lib/isc/pthreads/thread.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: thread.c,v 1.9.2.2.2.2 2004/12/04 06:50:03 marka Exp $ */
+/* $Id: thread.c,v 1.12.18.3 2005/04/29 00:17:05 marka Exp $ */
+
+/*! \file */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/quota.c b/contrib/bind9/lib/isc/quota.c
index 273a1b2..9290167 100644
--- a/contrib/bind9/lib/isc/quota.c
+++ b/contrib/bind9/lib/isc/quota.c
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: quota.c,v 1.11.12.5 2005/07/29 00:13:09 marka Exp $ */
+/* $Id: quota.c,v 1.13.18.3 2005/07/27 02:44:21 marka Exp $ */
+
+/*! \file */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/random.c b/contrib/bind9/lib/isc/random.c
index e5c4d31..f6c7d6e 100644
--- a/contrib/bind9/lib/isc/random.c
+++ b/contrib/bind9/lib/isc/random.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: random.c,v 1.15.74.5 2004/03/08 09:04:49 marka Exp $ */
+/* $Id: random.c,v 1.21.18.2 2005/04/29 00:16:48 marka Exp $ */
+
+/*! \file */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/ratelimiter.c b/contrib/bind9/lib/isc/ratelimiter.c
index 211363c..3d65139 100644
--- a/contrib/bind9/lib/isc/ratelimiter.c
+++ b/contrib/bind9/lib/isc/ratelimiter.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ratelimiter.c,v 1.18.14.4 2004/03/08 09:04:50 marka Exp $ */
+/* $Id: ratelimiter.c,v 1.21.18.2 2005/04/29 00:16:49 marka Exp $ */
+
+/*! \file */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/refcount.c b/contrib/bind9/lib/isc/refcount.c
new file mode 100644
index 0000000..d5095eb
--- /dev/null
+++ b/contrib/bind9/lib/isc/refcount.c
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2005 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* $Id: refcount.c,v 1.2.2.2 2005/07/25 00:51:46 marka Exp $ */
+
+#include <config.h>
+
+#include <stddef.h>
+
+#include <isc/mutex.h>
+#include <isc/refcount.h>
+#include <isc/result.h>
+
+isc_result_t
+isc_refcount_init(isc_refcount_t *ref, unsigned int n) {
+ REQUIRE(ref != NULL);
+
+ ref->refs = n;
+#if defined(ISC_PLATFORM_USETHREADS) && !defined(ISC_PLATFORM_HAVEXADD)
+ return (isc_mutex_init(&ref->lock));
+#else
+ return (ISC_R_SUCCESS);
+#endif
+}
diff --git a/contrib/bind9/lib/isc/region.c b/contrib/bind9/lib/isc/region.c
index 92f4f02..bc32b86 100644
--- a/contrib/bind9/lib/isc/region.c
+++ b/contrib/bind9/lib/isc/region.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: region.c,v 1.2.202.3 2004/03/08 09:04:50 marka Exp $ */
+/* $Id: region.c,v 1.3.18.2 2005/04/29 00:16:49 marka Exp $ */
+
+/*! \file */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/result.c b/contrib/bind9/lib/isc/result.c
index fd4e5c6..e0c8653 100644
--- a/contrib/bind9/lib/isc/result.c
+++ b/contrib/bind9/lib/isc/result.c
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: result.c,v 1.56.2.2.8.9 2005/06/09 23:54:30 marka Exp $ */
+/* $Id: result.c,v 1.62.18.6 2005/06/22 22:05:48 marka Exp $ */
+
+/*! \file */
#include <config.h>
@@ -39,66 +41,66 @@ typedef struct resulttable {
} resulttable;
static const char *text[ISC_R_NRESULTS] = {
- "success", /* 0 */
- "out of memory", /* 1 */
- "timed out", /* 2 */
- "no available threads", /* 3 */
- "address not available", /* 4 */
- "address in use", /* 5 */
- "permission denied", /* 6 */
- "no pending connections", /* 7 */
- "network unreachable", /* 8 */
- "host unreachable", /* 9 */
- "network down", /* 10 */
- "host down", /* 11 */
- "connection refused", /* 12 */
- "not enough free resources", /* 13 */
- "end of file", /* 14 */
- "socket already bound", /* 15 */
- "reload", /* 16 */
- "lock busy", /* 17 */
- "already exists", /* 18 */
- "ran out of space", /* 19 */
- "operation canceled", /* 20 */
- "socket is not bound", /* 21 */
- "shutting down", /* 22 */
- "not found", /* 23 */
- "unexpected end of input", /* 24 */
- "failure", /* 25 */
- "I/O error", /* 26 */
- "not implemented", /* 27 */
- "unbalanced parentheses", /* 28 */
- "no more", /* 29 */
- "invalid file", /* 30 */
- "bad base64 encoding", /* 31 */
- "unexpected token", /* 32 */
- "quota reached", /* 33 */
- "unexpected error", /* 34 */
- "already running", /* 35 */
- "ignore", /* 36 */
- "address mask not contiguous", /* 37 */
- "file not found", /* 38 */
- "file already exists", /* 39 */
- "socket is not connected", /* 40 */
- "out of range", /* 41 */
- "out of entropy", /* 42 */
- "invalid use of multicast address", /* 43 */
- "not a file", /* 44 */
- "not a directory", /* 45 */
- "queue is full", /* 46 */
- "address family mismatch", /* 47 */
- "address family not supported", /* 48 */
- "bad hex encoding", /* 49 */
- "too many open files", /* 50 */
- "not blocking", /* 51 */
- "unbalanced quotes", /* 52 */
- "operation in progress", /* 53 */
- "connection reset", /* 54 */
- "soft quota reached", /* 55 */
- "not a valid number", /* 56 */
- "disabled", /* 57 */
- "max size", /* 58 */
- "invalid address format" /* 59 */
+ "success", /*%< 0 */
+ "out of memory", /*%< 1 */
+ "timed out", /*%< 2 */
+ "no available threads", /*%< 3 */
+ "address not available", /*%< 4 */
+ "address in use", /*%< 5 */
+ "permission denied", /*%< 6 */
+ "no pending connections", /*%< 7 */
+ "network unreachable", /*%< 8 */
+ "host unreachable", /*%< 9 */
+ "network down", /*%< 10 */
+ "host down", /*%< 11 */
+ "connection refused", /*%< 12 */
+ "not enough free resources", /*%< 13 */
+ "end of file", /*%< 14 */
+ "socket already bound", /*%< 15 */
+ "reload", /*%< 16 */
+ "lock busy", /*%< 17 */
+ "already exists", /*%< 18 */
+ "ran out of space", /*%< 19 */
+ "operation canceled", /*%< 20 */
+ "socket is not bound", /*%< 21 */
+ "shutting down", /*%< 22 */
+ "not found", /*%< 23 */
+ "unexpected end of input", /*%< 24 */
+ "failure", /*%< 25 */
+ "I/O error", /*%< 26 */
+ "not implemented", /*%< 27 */
+ "unbalanced parentheses", /*%< 28 */
+ "no more", /*%< 29 */
+ "invalid file", /*%< 30 */
+ "bad base64 encoding", /*%< 31 */
+ "unexpected token", /*%< 32 */
+ "quota reached", /*%< 33 */
+ "unexpected error", /*%< 34 */
+ "already running", /*%< 35 */
+ "ignore", /*%< 36 */
+ "address mask not contiguous", /*%< 37 */
+ "file not found", /*%< 38 */
+ "file already exists", /*%< 39 */
+ "socket is not connected", /*%< 40 */
+ "out of range", /*%< 41 */
+ "out of entropy", /*%< 42 */
+ "invalid use of multicast address", /*%< 43 */
+ "not a file", /*%< 44 */
+ "not a directory", /*%< 45 */
+ "queue is full", /*%< 46 */
+ "address family mismatch", /*%< 47 */
+ "address family not supported", /*%< 48 */
+ "bad hex encoding", /*%< 49 */
+ "too many open files", /*%< 50 */
+ "not blocking", /*%< 51 */
+ "unbalanced quotes", /*%< 52 */
+ "operation in progress", /*%< 53 */
+ "connection reset", /*%< 54 */
+ "soft quota reached", /*%< 55 */
+ "not a valid number", /*%< 56 */
+ "disabled", /*%< 57 */
+ "max size", /*%< 58 */
+ "invalid address format" /*%< 59 */
};
#define ISC_RESULT_RESULTSET 2
diff --git a/contrib/bind9/lib/isc/rwlock.c b/contrib/bind9/lib/isc/rwlock.c
index 3e444d8..69b8f56 100644
--- a/contrib/bind9/lib/isc/rwlock.c
+++ b/contrib/bind9/lib/isc/rwlock.c
@@ -15,12 +15,15 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: rwlock.c,v 1.33.2.4.2.3 2005/03/17 03:58:32 marka Exp $ */
+/* $Id: rwlock.c,v 1.37.18.5 2005/07/12 01:22:30 marka Exp $ */
+
+/*! \file */
#include <config.h>
#include <stddef.h>
+#include <isc/atomic.h>
#include <isc/magic.h>
#include <isc/msgs.h>
#include <isc/platform.h>
@@ -81,6 +84,20 @@ isc_rwlock_init(isc_rwlock_t *rwl, unsigned int read_quota,
*/
rwl->magic = 0;
+#if defined(ISC_PLATFORM_HAVEXADD) && defined(ISC_PLATFORM_HAVECMPXCHG)
+ rwl->write_requests = 0;
+ rwl->write_completions = 0;
+ rwl->cnt_and_flag = 0;
+ rwl->readers_waiting = 0;
+ rwl->write_granted = 0;
+ if (read_quota != 0) {
+ UNEXPECTED_ERROR(__FILE__, __LINE__,
+ "read quota is not supported");
+ }
+ if (write_quota == 0)
+ write_quota = RWLOCK_DEFAULT_WRITE_QUOTA;
+ rwl->write_quota = write_quota;
+#else
rwl->type = isc_rwlocktype_read;
rwl->original = isc_rwlocktype_none;
rwl->active = 0;
@@ -93,15 +110,12 @@ isc_rwlock_init(isc_rwlock_t *rwl, unsigned int read_quota,
if (write_quota == 0)
write_quota = RWLOCK_DEFAULT_WRITE_QUOTA;
rwl->write_quota = write_quota;
+#endif
+
result = isc_mutex_init(&rwl->lock);
- if (result != ISC_R_SUCCESS) {
- UNEXPECTED_ERROR(__FILE__, __LINE__,
- "isc_mutex_init() %s: %s",
- isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
- ISC_MSG_FAILED, "failed"),
- isc_result_totext(result));
- return (ISC_R_UNEXPECTED);
- }
+ if (result != ISC_R_SUCCESS)
+ return (result);
+
result = isc_condition_init(&rwl->readable);
if (result != ISC_R_SUCCESS) {
UNEXPECTED_ERROR(__FILE__, __LINE__,
@@ -111,7 +125,6 @@ isc_rwlock_init(isc_rwlock_t *rwl, unsigned int read_quota,
isc_result_totext(result));
result = ISC_R_UNEXPECTED;
goto destroy_lock;
-
}
result = isc_condition_init(&rwl->writeable);
if (result != ISC_R_SUCCESS) {
@@ -136,6 +149,389 @@ isc_rwlock_init(isc_rwlock_t *rwl, unsigned int read_quota,
return (result);
}
+void
+isc_rwlock_destroy(isc_rwlock_t *rwl) {
+ REQUIRE(VALID_RWLOCK(rwl));
+
+#if defined(ISC_PLATFORM_HAVEXADD) && defined(ISC_PLATFORM_HAVECMPXCHG)
+ REQUIRE(rwl->write_requests == rwl->write_completions &&
+ rwl->cnt_and_flag == 0 && rwl->readers_waiting == 0);
+#else
+ LOCK(&rwl->lock);
+ REQUIRE(rwl->active == 0 &&
+ rwl->readers_waiting == 0 &&
+ rwl->writers_waiting == 0);
+ UNLOCK(&rwl->lock);
+#endif
+
+ rwl->magic = 0;
+ (void)isc_condition_destroy(&rwl->readable);
+ (void)isc_condition_destroy(&rwl->writeable);
+ DESTROYLOCK(&rwl->lock);
+}
+
+#if defined(ISC_PLATFORM_HAVEXADD) && defined(ISC_PLATFORM_HAVECMPXCHG)
+
+/*
+ * When some architecture-dependent atomic operations are available,
+ * rwlock can be more efficient than the generic algorithm defined below.
+ * The basic algorithm is described in the following URL:
+ * http://www.cs.rochester.edu/u/scott/synchronization/pseudocode/rw.html
+ *
+ * The key is to use the following integer variables modified atomically:
+ * write_requests, write_completions, and cnt_and_flag.
+ *
+ * write_requests and write_completions act as a waiting queue for writers
+ * in order to ensure the FIFO order. Both variables begin with the initial
+ * value of 0. When a new writer tries to get a write lock, it increments
+ * write_requests and gets the previous value of the variable as a "ticket".
+ * When write_completions reaches the ticket number, the new writer can start
+ * writing. When the writer completes its work, it increments
+ * write_completions so that another new writer can start working. If the
+ * write_requests is not equal to write_completions, it means a writer is now
+ * working or waiting. In this case, a new readers cannot start reading, or
+ * in other words, this algorithm basically prefers writers.
+ *
+ * cnt_and_flag is a "lock" shared by all readers and writers. This integer
+ * variable is a kind of structure with two members: writer_flag (1 bit) and
+ * reader_count (31 bits). The writer_flag shows whether a writer is working,
+ * and the reader_count shows the number of readers currently working or almost
+ * ready for working. A writer who has the current "ticket" tries to get the
+ * lock by exclusively setting the writer_flag to 1, provided that the whole
+ * 32-bit is 0 (meaning no readers or writers working). On the other hand,
+ * a new reader tries to increment the "reader_count" field provided that
+ * the writer_flag is 0 (meaning there is no writer working).
+ *
+ * If some of the above operations fail, the reader or the writer sleeps
+ * until the related condition changes. When a working reader or writer
+ * completes its work, some readers or writers are sleeping, and the condition
+ * that suspended the reader or writer has changed, it wakes up the sleeping
+ * readers or writers.
+ *
+ * As already noted, this algorithm basically prefers writers. In order to
+ * prevent readers from starving, however, the algorithm also introduces the
+ * "writer quota" (Q). When Q consecutive writers have completed their work,
+ * suspending readers, the last writer will wake up the readers, even if a new
+ * writer is waiting.
+ *
+ * Implementation specific note: due to the combination of atomic operations
+ * and a mutex lock, ordering between the atomic operation and locks can be
+ * very sensitive in some cases. In particular, it is generally very important
+ * to check the atomic variable that requires a reader or writer to sleep after
+ * locking the mutex and before actually sleeping; otherwise, it could be very
+ * likely to cause a deadlock. For example, assume "var" is a variable
+ * atomically modified, then the corresponding code would be:
+ * if (var == need_sleep) {
+ * LOCK(lock);
+ * if (var == need_sleep)
+ * WAIT(cond, lock);
+ * UNLOCK(lock);
+ * }
+ * The second check is important, since "var" is protected by the atomic
+ * operation, not by the mutex, and can be changed just before sleeping.
+ * (The first "if" could be omitted, but this is also important in order to
+ * make the code efficient by avoiding the use of the mutex unless it is
+ * really necessary.)
+ */
+
+#define WRITER_ACTIVE 0x1
+#define READER_INCR 0x2
+
+isc_result_t
+isc_rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
+ isc_int32_t cntflag;
+
+ REQUIRE(VALID_RWLOCK(rwl));
+
+#ifdef ISC_RWLOCK_TRACE
+ print_lock(isc_msgcat_get(isc_msgcat, ISC_MSGSET_RWLOCK,
+ ISC_MSG_PRELOCK, "prelock"), rwl, type);
+#endif
+
+ if (type == isc_rwlocktype_read) {
+ if (rwl->write_requests != rwl->write_completions) {
+ /* there is a waiting or active writer */
+ LOCK(&rwl->lock);
+ if (rwl->write_requests != rwl->write_completions) {
+ rwl->readers_waiting++;
+ WAIT(&rwl->readable, &rwl->lock);
+ rwl->readers_waiting--;
+ }
+ UNLOCK(&rwl->lock);
+ }
+
+ cntflag = isc_atomic_xadd(&rwl->cnt_and_flag, READER_INCR);
+ while (1) {
+ if ((rwl->cnt_and_flag & WRITER_ACTIVE) == 0)
+ break;
+
+ /* A writer is still working */
+ LOCK(&rwl->lock);
+ rwl->readers_waiting++;
+ if ((rwl->cnt_and_flag & WRITER_ACTIVE) != 0)
+ WAIT(&rwl->readable, &rwl->lock);
+ rwl->readers_waiting--;
+ UNLOCK(&rwl->lock);
+
+ /*
+ * Typically, the reader should be able to get a lock
+ * at this stage:
+ * (1) there should have been no pending writer when
+ * the reader was trying to increment the
+ * counter; otherwise, the writer should be in
+ * the waiting queue, preventing the reader from
+ * proceeding to this point.
+ * (2) once the reader increments the counter, no
+ * more writer can get a lock.
+ * Still, it is possible another writer can work at
+ * this point, e.g. in the following scenario:
+ * A previous writer unlocks the writer lock.
+ * This reader proceeds to point (1).
+ * A new writer appears, and gets a new lock before
+ * the reader increments the counter.
+ * The reader then increments the counter.
+ * The previous writer notices there is a waiting
+ * reader who is almost ready, and wakes it up.
+ * So, the reader needs to confirm whether it can now
+ * read explicitly (thus we loop). Note that this is
+ * not an infinite process, since the reader has
+ * incremented the counter at this point.
+ */
+ }
+
+ /*
+ * If we are temporarily preferred to writers due to the writer
+ * quota, reset the condition (race among readers doesn't
+ * matter).
+ */
+ rwl->write_granted = 0;
+ } else {
+ isc_int32_t prev_writer;
+
+ /* enter the waiting queue, and wait for our turn */
+ prev_writer = isc_atomic_xadd(&rwl->write_requests, 1);
+ while (rwl->write_completions != prev_writer) {
+ LOCK(&rwl->lock);
+ if (rwl->write_completions != prev_writer) {
+ WAIT(&rwl->writeable, &rwl->lock);
+ UNLOCK(&rwl->lock);
+ continue;
+ }
+ UNLOCK(&rwl->lock);
+ break;
+ }
+
+ while (1) {
+ cntflag = isc_atomic_cmpxchg(&rwl->cnt_and_flag, 0,
+ WRITER_ACTIVE);
+ if (cntflag == 0)
+ break;
+
+ /* Another active reader or writer is working. */
+ LOCK(&rwl->lock);
+ if (rwl->cnt_and_flag != 0)
+ WAIT(&rwl->writeable, &rwl->lock);
+ UNLOCK(&rwl->lock);
+ }
+
+ INSIST((rwl->cnt_and_flag & WRITER_ACTIVE) != 0);
+ rwl->write_granted++;
+ }
+
+#ifdef ISC_RWLOCK_TRACE
+ print_lock(isc_msgcat_get(isc_msgcat, ISC_MSGSET_RWLOCK,
+ ISC_MSG_POSTLOCK, "postlock"), rwl, type);
+#endif
+
+ return (ISC_R_SUCCESS);
+}
+
+isc_result_t
+isc_rwlock_trylock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
+ isc_int32_t cntflag;
+
+ REQUIRE(VALID_RWLOCK(rwl));
+
+#ifdef ISC_RWLOCK_TRACE
+ print_lock(isc_msgcat_get(isc_msgcat, ISC_MSGSET_RWLOCK,
+ ISC_MSG_PRELOCK, "prelock"), rwl, type);
+#endif
+
+ if (type == isc_rwlocktype_read) {
+ /* If a writer is waiting or working, we fail. */
+ if (rwl->write_requests != rwl->write_completions)
+ return (ISC_R_LOCKBUSY);
+
+ /* Otherwise, be ready for reading. */
+ cntflag = isc_atomic_xadd(&rwl->cnt_and_flag, READER_INCR);
+ if ((cntflag & WRITER_ACTIVE) != 0) {
+ /*
+ * A writer is working. We lose, and cancel the read
+ * request.
+ */
+ cntflag = isc_atomic_xadd(&rwl->cnt_and_flag,
+ -READER_INCR);
+ /*
+ * If no other readers are waiting and we've suspended
+ * new writers in this short period, wake them up.
+ */
+ if (cntflag == READER_INCR &&
+ rwl->write_completions != rwl->write_requests) {
+ LOCK(&rwl->lock);
+ BROADCAST(&rwl->writeable);
+ UNLOCK(&rwl->lock);
+ }
+
+ return (ISC_R_LOCKBUSY);
+ }
+ } else {
+ /* Try locking without entering the waiting queue. */
+ cntflag = isc_atomic_cmpxchg(&rwl->cnt_and_flag, 0,
+ WRITER_ACTIVE);
+ if (cntflag != 0)
+ return (ISC_R_LOCKBUSY);
+
+ /*
+ * XXXJT: jump into the queue, possibly breaking the writer
+ * order.
+ */
+ (void)isc_atomic_xadd(&rwl->write_completions, -1);
+
+ rwl->write_granted++;
+ }
+
+#ifdef ISC_RWLOCK_TRACE
+ print_lock(isc_msgcat_get(isc_msgcat, ISC_MSGSET_RWLOCK,
+ ISC_MSG_POSTLOCK, "postlock"), rwl, type);
+#endif
+
+ return (ISC_R_SUCCESS);
+}
+
+isc_result_t
+isc_rwlock_tryupgrade(isc_rwlock_t *rwl) {
+ isc_int32_t prevcnt;
+
+ REQUIRE(VALID_RWLOCK(rwl));
+
+ /* Try to acquire write access. */
+ prevcnt = isc_atomic_cmpxchg(&rwl->cnt_and_flag,
+ READER_INCR, WRITER_ACTIVE);
+ /*
+ * There must have been no writer, and there must have been at least
+ * one reader.
+ */
+ INSIST((prevcnt & WRITER_ACTIVE) == 0 &&
+ (prevcnt & ~WRITER_ACTIVE) != 0);
+
+ if (prevcnt == READER_INCR) {
+ /*
+ * We are the only reader and have been upgraded.
+ * Now jump into the head of the writer waiting queue.
+ */
+ (void)isc_atomic_xadd(&rwl->write_completions, -1);
+ } else
+ return (ISC_R_LOCKBUSY);
+
+ return (ISC_R_SUCCESS);
+
+}
+
+void
+isc_rwlock_downgrade(isc_rwlock_t *rwl) {
+ isc_int32_t prev_readers;
+
+ REQUIRE(VALID_RWLOCK(rwl));
+
+ /* Become an active reader. */
+ prev_readers = isc_atomic_xadd(&rwl->cnt_and_flag, READER_INCR);
+ /* We must have been a writer. */
+ INSIST((prev_readers & WRITER_ACTIVE) != 0);
+
+ /* Complete write */
+ (void)isc_atomic_xadd(&rwl->cnt_and_flag, -WRITER_ACTIVE);
+ (void)isc_atomic_xadd(&rwl->write_completions, 1);
+
+ /* Resume other readers */
+ LOCK(&rwl->lock);
+ if (rwl->readers_waiting > 0)
+ BROADCAST(&rwl->readable);
+ UNLOCK(&rwl->lock);
+}
+
+isc_result_t
+isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
+ isc_int32_t prev_cnt;
+
+ REQUIRE(VALID_RWLOCK(rwl));
+
+#ifdef ISC_RWLOCK_TRACE
+ print_lock(isc_msgcat_get(isc_msgcat, ISC_MSGSET_RWLOCK,
+ ISC_MSG_PREUNLOCK, "preunlock"), rwl, type);
+#endif
+
+ if (type == isc_rwlocktype_read) {
+ prev_cnt = isc_atomic_xadd(&rwl->cnt_and_flag, -READER_INCR);
+
+ /*
+ * If we're the last reader and any writers are waiting, wake
+ * them up. We need to wake up all of them to ensure the
+ * FIFO order.
+ */
+ if (prev_cnt == READER_INCR &&
+ rwl->write_completions != rwl->write_requests) {
+ LOCK(&rwl->lock);
+ BROADCAST(&rwl->writeable);
+ UNLOCK(&rwl->lock);
+ }
+ } else {
+ isc_boolean_t wakeup_writers = ISC_TRUE;
+
+ /*
+ * Reset the flag, and (implicitly) tell other writers
+ * we are done.
+ */
+ (void)isc_atomic_xadd(&rwl->cnt_and_flag, -WRITER_ACTIVE);
+ (void)isc_atomic_xadd(&rwl->write_completions, 1);
+
+ if (rwl->write_granted >= rwl->write_quota ||
+ rwl->write_requests == rwl->write_completions ||
+ (rwl->cnt_and_flag & ~WRITER_ACTIVE) != 0) {
+ /*
+ * We have passed the write quota, no writer is
+ * waiting, or some readers are almost ready, pending
+ * possible writers. Note that the last case can
+ * happen even if write_requests != write_completions
+ * (which means a new writer in the queue), so we need
+ * to catch the case explicitly.
+ */
+ LOCK(&rwl->lock);
+ if (rwl->readers_waiting > 0) {
+ wakeup_writers = ISC_FALSE;
+ BROADCAST(&rwl->readable);
+ }
+ UNLOCK(&rwl->lock);
+ }
+
+ if (rwl->write_requests != rwl->write_completions &&
+ wakeup_writers) {
+ LOCK(&rwl->lock);
+ BROADCAST(&rwl->writeable);
+ UNLOCK(&rwl->lock);
+ }
+ }
+
+#ifdef ISC_RWLOCK_TRACE
+ print_lock(isc_msgcat_get(isc_msgcat, ISC_MSGSET_RWLOCK,
+ ISC_MSG_POSTUNLOCK, "postunlock"),
+ rwl, type);
+#endif
+
+ return (ISC_R_SUCCESS);
+}
+
+#else /* ISC_PLATFORM_HAVEXADD && ISC_PLATFORM_HAVECMPXCHG */
+
static isc_result_t
doit(isc_rwlock_t *rwl, isc_rwlocktype_t type, isc_boolean_t nonblock) {
isc_boolean_t skip = ISC_FALSE;
@@ -321,22 +717,7 @@ isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) {
return (ISC_R_SUCCESS);
}
-void
-isc_rwlock_destroy(isc_rwlock_t *rwl) {
- REQUIRE(VALID_RWLOCK(rwl));
-
- LOCK(&rwl->lock);
- REQUIRE(rwl->active == 0 &&
- rwl->readers_waiting == 0 &&
- rwl->writers_waiting == 0);
- UNLOCK(&rwl->lock);
-
- rwl->magic = 0;
- (void)isc_condition_destroy(&rwl->readable);
- (void)isc_condition_destroy(&rwl->writeable);
- DESTROYLOCK(&rwl->lock);
-}
-
+#endif /* ISC_PLATFORM_HAVEXADD && ISC_PLATFORM_HAVECMPXCHG */
#else /* ISC_PLATFORM_USETHREADS */
isc_result_t
diff --git a/contrib/bind9/lib/isc/serial.c b/contrib/bind9/lib/isc/serial.c
index 4fe0ee5..5d1bde7 100644
--- a/contrib/bind9/lib/isc/serial.c
+++ b/contrib/bind9/lib/isc/serial.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,10 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: serial.c,v 1.7.206.1 2004/03/06 08:14:35 marka Exp $ */
+/* $Id: serial.c,v 1.8.18.2 2005/04/29 00:16:49 marka Exp $ */
+
+/*! \file */
+
#include <config.h>
#include <isc/serial.h>
diff --git a/contrib/bind9/lib/isc/sha1.c b/contrib/bind9/lib/isc/sha1.c
index 0549e88..6f4af6d 100644
--- a/contrib/bind9/lib/isc/sha1.c
+++ b/contrib/bind9/lib/isc/sha1.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,16 +15,16 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sha1.c,v 1.10.2.2.2.3 2004/03/06 08:14:35 marka Exp $ */
+/* $Id: sha1.c,v 1.14.18.2 2005/04/29 00:16:49 marka Exp $ */
/* $NetBSD: sha1.c,v 1.5 2000/01/22 22:19:14 mycroft Exp $ */
/* $OpenBSD: sha1.c,v 1.9 1997/07/23 21:12:32 kstailey Exp $ */
-/*
+/*! \file
* SHA-1 in C
- * By Steve Reid <steve@edmweb.com>
+ * \author By Steve Reid <steve@edmweb.com>
* 100% Public Domain
- *
+ * \verbatim
* Test Vectors (from FIPS PUB 180-1)
* "abc"
* A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
@@ -32,6 +32,7 @@
* 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
* A million repetitions of "a"
* 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
+ * \endverbatim
*/
#include "config.h"
@@ -44,7 +45,8 @@
#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
-/*
+/*@{*/
+/*!
* blk0() and blk() perform the initial expand.
* I got the idea of expanding during the round function from SSLeay
*/
@@ -61,7 +63,9 @@
^ block->l[(i + 2) & 15] \
^ block->l[i & 15], 1))
-/*
+/*@}*/
+/*@{*/
+/*!
* (R0+R1), R2, R3, R4 are the different operations (rounds) used in SHA1
*/
#define R0(v,w,x,y,z,i) \
@@ -80,6 +84,8 @@
z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
w = rol(w, 30);
+/*@}*/
+
typedef union {
unsigned char c[64];
unsigned int l[16];
@@ -154,7 +160,7 @@ do_R4(isc_uint32_t *a, isc_uint32_t *b, isc_uint32_t *c, isc_uint32_t *d,
}
#endif
-/*
+/*!
* Hash a single 512-bit block. This is the core of the algorithm.
*/
static void
@@ -217,7 +223,7 @@ transform(isc_uint32_t state[5], const unsigned char buffer[64]) {
}
-/*
+/*!
* isc_sha1_init - Initialize new context
*/
void
@@ -240,7 +246,7 @@ isc_sha1_invalidate(isc_sha1_t *context) {
memset(context, 0, sizeof(isc_sha1_t));
}
-/*
+/*!
* Run your data through this.
*/
void
@@ -270,7 +276,7 @@ isc_sha1_update(isc_sha1_t *context, const unsigned char *data,
}
-/*
+/*!
* Add padding and return the message digest.
*/
diff --git a/contrib/bind9/lib/isc/sha2.c b/contrib/bind9/lib/isc/sha2.c
new file mode 100644
index 0000000..7b41a28
--- /dev/null
+++ b/contrib/bind9/lib/isc/sha2.c
@@ -0,0 +1,1234 @@
+/*
+ * Copyright (C) 2005, 2006 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* $Id: sha2.c,v 1.2.2.12 2006/08/16 03:18:14 marka Exp $ */
+
+/* $FreeBSD$ */
+/* $KAME: sha2.c,v 1.8 2001/11/08 01:07:52 itojun Exp $ */
+
+/*
+ * sha2.c
+ *
+ * Version 1.0.0beta1
+ *
+ * Written by Aaron D. Gifford <me@aarongifford.com>
+ *
+ * Copyright 2000 Aaron D. Gifford. 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.
+ * 3. Neither the name of the copyright holder nor the names of contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTOR(S) ``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(S) OR CONTRIBUTOR(S) 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.
+ *
+ */
+
+
+#include <config.h>
+
+#include <isc/assertions.h>
+#include <isc/sha2.h>
+#include <isc/string.h>
+#include <isc/util.h>
+
+/*
+ * UNROLLED TRANSFORM LOOP NOTE:
+ * You can define SHA2_UNROLL_TRANSFORM to use the unrolled transform
+ * loop version for the hash transform rounds (defined using macros
+ * later in this file). Either define on the command line, for example:
+ *
+ * cc -DISC_SHA2_UNROLL_TRANSFORM -o sha2 sha2.c sha2prog.c
+ *
+ * or define below:
+ *
+ * #define ISC_SHA2_UNROLL_TRANSFORM
+ *
+ */
+
+/*** SHA-256/384/512 Machine Architecture Definitions *****************/
+/*
+ * BYTE_ORDER NOTE:
+ *
+ * Please make sure that your system defines BYTE_ORDER. If your
+ * architecture is little-endian, make sure it also defines
+ * LITTLE_ENDIAN and that the two (BYTE_ORDER and LITTLE_ENDIAN) are
+ * equivilent.
+ *
+ * If your system does not define the above, then you can do so by
+ * hand like this:
+ *
+ * #define LITTLE_ENDIAN 1234
+ * #define BIG_ENDIAN 4321
+ *
+ * And for little-endian machines, add:
+ *
+ * #define BYTE_ORDER LITTLE_ENDIAN
+ *
+ * Or for big-endian machines:
+ *
+ * #define BYTE_ORDER BIG_ENDIAN
+ *
+ * The FreeBSD machine this was written on defines BYTE_ORDER
+ * appropriately by including <sys/types.h> (which in turn includes
+ * <machine/endian.h> where the appropriate definitions are actually
+ * made).
+ */
+#if !defined(BYTE_ORDER) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN)
+#ifndef BYTE_ORDER
+#ifndef BIG_ENDIAN
+#define BIG_ENDIAN 4321
+#endif
+#ifndef LITTLE_ENDIAN
+#define LITTLE_ENDIAN 1234
+#endif
+#ifdef WORDS_BIGENDIAN
+#define BYTE_ORDER BIG_ENDIAN
+#else
+#define BYTE_ORDER LITTLE_ENDIAN
+#endif
+#else
+#error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN
+#endif
+#endif
+
+/*** SHA-256/384/512 Various Length Definitions ***********************/
+/* NOTE: Most of these are in sha2.h */
+#define ISC_SHA256_SHORT_BLOCK_LENGTH (ISC_SHA256_BLOCK_LENGTH - 8)
+#define ISC_SHA384_SHORT_BLOCK_LENGTH (ISC_SHA384_BLOCK_LENGTH - 16)
+#define ISC_SHA512_SHORT_BLOCK_LENGTH (ISC_SHA512_BLOCK_LENGTH - 16)
+
+
+/*** ENDIAN REVERSAL MACROS *******************************************/
+#if BYTE_ORDER == LITTLE_ENDIAN
+#define REVERSE32(w,x) { \
+ isc_uint32_t tmp = (w); \
+ tmp = (tmp >> 16) | (tmp << 16); \
+ (x) = ((tmp & 0xff00ff00UL) >> 8) | ((tmp & 0x00ff00ffUL) << 8); \
+}
+#ifdef WIN32
+#define REVERSE64(w,x) { \
+ isc_uint64_t tmp = (w); \
+ tmp = (tmp >> 32) | (tmp << 32); \
+ tmp = ((tmp & 0xff00ff00ff00ff00UL) >> 8) | \
+ ((tmp & 0x00ff00ff00ff00ffUL) << 8); \
+ (x) = ((tmp & 0xffff0000ffff0000UL) >> 16) | \
+ ((tmp & 0x0000ffff0000ffffUL) << 16); \
+}
+#else
+#define REVERSE64(w,x) { \
+ isc_uint64_t tmp = (w); \
+ tmp = (tmp >> 32) | (tmp << 32); \
+ tmp = ((tmp & 0xff00ff00ff00ff00ULL) >> 8) | \
+ ((tmp & 0x00ff00ff00ff00ffULL) << 8); \
+ (x) = ((tmp & 0xffff0000ffff0000ULL) >> 16) | \
+ ((tmp & 0x0000ffff0000ffffULL) << 16); \
+}
+#endif
+#endif /* BYTE_ORDER == LITTLE_ENDIAN */
+
+/*
+ * Macro for incrementally adding the unsigned 64-bit integer n to the
+ * unsigned 128-bit integer (represented using a two-element array of
+ * 64-bit words):
+ */
+#define ADDINC128(w,n) { \
+ (w)[0] += (isc_uint64_t)(n); \
+ if ((w)[0] < (n)) { \
+ (w)[1]++; \
+ } \
+}
+
+/*** THE SIX LOGICAL FUNCTIONS ****************************************/
+/*
+ * Bit shifting and rotation (used by the six SHA-XYZ logical functions:
+ *
+ * NOTE: The naming of R and S appears backwards here (R is a SHIFT and
+ * S is a ROTATION) because the SHA-256/384/512 description document
+ * (see http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf) uses this
+ * same "backwards" definition.
+ */
+/* Shift-right (used in SHA-256, SHA-384, and SHA-512): */
+#define R(b,x) ((x) >> (b))
+/* 32-bit Rotate-right (used in SHA-256): */
+#define S32(b,x) (((x) >> (b)) | ((x) << (32 - (b))))
+/* 64-bit Rotate-right (used in SHA-384 and SHA-512): */
+#define S64(b,x) (((x) >> (b)) | ((x) << (64 - (b))))
+
+/* Two of six logical functions used in SHA-256, SHA-384, and SHA-512: */
+#define Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z)))
+#define Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
+
+/* Four of six logical functions used in SHA-256: */
+#define Sigma0_256(x) (S32(2, (x)) ^ S32(13, (x)) ^ S32(22, (x)))
+#define Sigma1_256(x) (S32(6, (x)) ^ S32(11, (x)) ^ S32(25, (x)))
+#define sigma0_256(x) (S32(7, (x)) ^ S32(18, (x)) ^ R(3 , (x)))
+#define sigma1_256(x) (S32(17, (x)) ^ S32(19, (x)) ^ R(10, (x)))
+
+/* Four of six logical functions used in SHA-384 and SHA-512: */
+#define Sigma0_512(x) (S64(28, (x)) ^ S64(34, (x)) ^ S64(39, (x)))
+#define Sigma1_512(x) (S64(14, (x)) ^ S64(18, (x)) ^ S64(41, (x)))
+#define sigma0_512(x) (S64( 1, (x)) ^ S64( 8, (x)) ^ R( 7, (x)))
+#define sigma1_512(x) (S64(19, (x)) ^ S64(61, (x)) ^ R( 6, (x)))
+
+/*** INTERNAL FUNCTION PROTOTYPES *************************************/
+/* NOTE: These should not be accessed directly from outside this
+ * library -- they are intended for private internal visibility/use
+ * only.
+ */
+void isc_sha512_last(isc_sha512_t *);
+void isc_sha256_transform(isc_sha256_t *, const isc_uint32_t*);
+void isc_sha512_transform(isc_sha512_t *, const isc_uint64_t*);
+
+
+/*** SHA-XYZ INITIAL HASH VALUES AND CONSTANTS ************************/
+/* Hash constant words K for SHA-224 and SHA-256: */
+static const isc_uint32_t K256[64] = {
+ 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
+ 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
+ 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
+ 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
+ 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
+ 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
+ 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
+ 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
+ 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
+ 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
+ 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
+ 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
+ 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
+ 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
+ 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
+ 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
+};
+
+/* Initial hash value H for SHA-224: */
+static const isc_uint32_t sha224_initial_hash_value[8] = {
+ 0xc1059ed8UL,
+ 0x367cd507UL,
+ 0x3070dd17UL,
+ 0xf70e5939UL,
+ 0xffc00b31UL,
+ 0x68581511UL,
+ 0x64f98fa7UL,
+ 0xbefa4fa4UL
+};
+
+/* Initial hash value H for SHA-256: */
+static const isc_uint32_t sha256_initial_hash_value[8] = {
+ 0x6a09e667UL,
+ 0xbb67ae85UL,
+ 0x3c6ef372UL,
+ 0xa54ff53aUL,
+ 0x510e527fUL,
+ 0x9b05688cUL,
+ 0x1f83d9abUL,
+ 0x5be0cd19UL
+};
+
+#ifdef WIN32
+/* Hash constant words K for SHA-384 and SHA-512: */
+static const isc_uint64_t K512[80] = {
+ 0x428a2f98d728ae22UL, 0x7137449123ef65cdUL,
+ 0xb5c0fbcfec4d3b2fUL, 0xe9b5dba58189dbbcUL,
+ 0x3956c25bf348b538UL, 0x59f111f1b605d019UL,
+ 0x923f82a4af194f9bUL, 0xab1c5ed5da6d8118UL,
+ 0xd807aa98a3030242UL, 0x12835b0145706fbeUL,
+ 0x243185be4ee4b28cUL, 0x550c7dc3d5ffb4e2UL,
+ 0x72be5d74f27b896fUL, 0x80deb1fe3b1696b1UL,
+ 0x9bdc06a725c71235UL, 0xc19bf174cf692694UL,
+ 0xe49b69c19ef14ad2UL, 0xefbe4786384f25e3UL,
+ 0x0fc19dc68b8cd5b5UL, 0x240ca1cc77ac9c65UL,
+ 0x2de92c6f592b0275UL, 0x4a7484aa6ea6e483UL,
+ 0x5cb0a9dcbd41fbd4UL, 0x76f988da831153b5UL,
+ 0x983e5152ee66dfabUL, 0xa831c66d2db43210UL,
+ 0xb00327c898fb213fUL, 0xbf597fc7beef0ee4UL,
+ 0xc6e00bf33da88fc2UL, 0xd5a79147930aa725UL,
+ 0x06ca6351e003826fUL, 0x142929670a0e6e70UL,
+ 0x27b70a8546d22ffcUL, 0x2e1b21385c26c926UL,
+ 0x4d2c6dfc5ac42aedUL, 0x53380d139d95b3dfUL,
+ 0x650a73548baf63deUL, 0x766a0abb3c77b2a8UL,
+ 0x81c2c92e47edaee6UL, 0x92722c851482353bUL,
+ 0xa2bfe8a14cf10364UL, 0xa81a664bbc423001UL,
+ 0xc24b8b70d0f89791UL, 0xc76c51a30654be30UL,
+ 0xd192e819d6ef5218UL, 0xd69906245565a910UL,
+ 0xf40e35855771202aUL, 0x106aa07032bbd1b8UL,
+ 0x19a4c116b8d2d0c8UL, 0x1e376c085141ab53UL,
+ 0x2748774cdf8eeb99UL, 0x34b0bcb5e19b48a8UL,
+ 0x391c0cb3c5c95a63UL, 0x4ed8aa4ae3418acbUL,
+ 0x5b9cca4f7763e373UL, 0x682e6ff3d6b2b8a3UL,
+ 0x748f82ee5defb2fcUL, 0x78a5636f43172f60UL,
+ 0x84c87814a1f0ab72UL, 0x8cc702081a6439ecUL,
+ 0x90befffa23631e28UL, 0xa4506cebde82bde9UL,
+ 0xbef9a3f7b2c67915UL, 0xc67178f2e372532bUL,
+ 0xca273eceea26619cUL, 0xd186b8c721c0c207UL,
+ 0xeada7dd6cde0eb1eUL, 0xf57d4f7fee6ed178UL,
+ 0x06f067aa72176fbaUL, 0x0a637dc5a2c898a6UL,
+ 0x113f9804bef90daeUL, 0x1b710b35131c471bUL,
+ 0x28db77f523047d84UL, 0x32caab7b40c72493UL,
+ 0x3c9ebe0a15c9bebcUL, 0x431d67c49c100d4cUL,
+ 0x4cc5d4becb3e42b6UL, 0x597f299cfc657e2aUL,
+ 0x5fcb6fab3ad6faecUL, 0x6c44198c4a475817UL
+};
+
+/* Initial hash value H for SHA-384: */
+static const isc_uint64_t sha384_initial_hash_value[8] = {
+ 0xcbbb9d5dc1059ed8UL,
+ 0x629a292a367cd507UL,
+ 0x9159015a3070dd17UL,
+ 0x152fecd8f70e5939UL,
+ 0x67332667ffc00b31UL,
+ 0x8eb44a8768581511UL,
+ 0xdb0c2e0d64f98fa7UL,
+ 0x47b5481dbefa4fa4UL
+};
+
+/* Initial hash value H for SHA-512: */
+static const isc_uint64_t sha512_initial_hash_value[8] = {
+ 0x6a09e667f3bcc908U,
+ 0xbb67ae8584caa73bUL,
+ 0x3c6ef372fe94f82bUL,
+ 0xa54ff53a5f1d36f1UL,
+ 0x510e527fade682d1UL,
+ 0x9b05688c2b3e6c1fUL,
+ 0x1f83d9abfb41bd6bUL,
+ 0x5be0cd19137e2179UL
+};
+#else
+/* Hash constant words K for SHA-384 and SHA-512: */
+static const isc_uint64_t K512[80] = {
+ 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
+ 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
+ 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
+ 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
+ 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
+ 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
+ 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
+ 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
+ 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
+ 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
+ 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
+ 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
+ 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
+ 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
+ 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
+ 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
+ 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
+ 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
+ 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
+ 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
+ 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
+ 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
+ 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
+ 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
+ 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
+ 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
+ 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
+ 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
+ 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
+ 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
+ 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
+ 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
+ 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
+ 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
+ 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
+ 0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
+ 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
+ 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
+ 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
+ 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL
+};
+
+/* Initial hash value H for SHA-384: */
+static const isc_uint64_t sha384_initial_hash_value[8] = {
+ 0xcbbb9d5dc1059ed8ULL,
+ 0x629a292a367cd507ULL,
+ 0x9159015a3070dd17ULL,
+ 0x152fecd8f70e5939ULL,
+ 0x67332667ffc00b31ULL,
+ 0x8eb44a8768581511ULL,
+ 0xdb0c2e0d64f98fa7ULL,
+ 0x47b5481dbefa4fa4ULL
+};
+
+/* Initial hash value H for SHA-512: */
+static const isc_uint64_t sha512_initial_hash_value[8] = {
+ 0x6a09e667f3bcc908ULL,
+ 0xbb67ae8584caa73bULL,
+ 0x3c6ef372fe94f82bULL,
+ 0xa54ff53a5f1d36f1ULL,
+ 0x510e527fade682d1ULL,
+ 0x9b05688c2b3e6c1fULL,
+ 0x1f83d9abfb41bd6bULL,
+ 0x5be0cd19137e2179ULL
+};
+#endif
+
+/*
+ * Constant used by SHA256/384/512_End() functions for converting the
+ * digest to a readable hexadecimal character string:
+ */
+static const char *sha2_hex_digits = "0123456789abcdef";
+
+
+
+/*** SHA-224: *********************************************************/
+void
+isc_sha224_init(isc_sha224_t *context) {
+ if (context == (isc_sha256_t *)0) {
+ return;
+ }
+ memcpy(context->state, sha224_initial_hash_value,
+ ISC_SHA256_DIGESTLENGTH);
+ memset(context->buffer, 0, ISC_SHA256_BLOCK_LENGTH);
+ context->bitcount = 0;
+}
+
+void
+isc_sha224_update(isc_sha224_t *context, const isc_uint8_t* data, size_t len) {
+ isc_sha256_update((isc_sha256_t *)context, data, len);
+}
+
+void
+isc_sha224_final(isc_uint8_t digest[], isc_sha224_t *context) {
+ isc_uint8_t sha256_digest[ISC_SHA256_DIGESTLENGTH];
+ isc_sha256_final(sha256_digest, (isc_sha256_t *)context);
+ memcpy(digest, sha256_digest, ISC_SHA224_DIGESTLENGTH);
+ memset(sha256_digest, 0, ISC_SHA256_DIGESTLENGTH);
+}
+
+char *
+isc_sha224_end(isc_sha224_t *context, char buffer[]) {
+ isc_uint8_t digest[ISC_SHA224_DIGESTLENGTH], *d = digest;
+ unsigned int i;
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha224_t *)0);
+
+ if (buffer != (char*)0) {
+ isc_sha224_final(digest, context);
+
+ for (i = 0; i < ISC_SHA224_DIGESTLENGTH; i++) {
+ *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
+ *buffer++ = sha2_hex_digits[*d & 0x0f];
+ d++;
+ }
+ *buffer = (char)0;
+ } else {
+ memset(context, 0, sizeof(context));
+ }
+ memset(digest, 0, ISC_SHA224_DIGESTLENGTH);
+ return buffer;
+}
+
+char*
+isc_sha224_data(const isc_uint8_t *data, size_t len,
+ char digest[ISC_SHA224_DIGESTSTRINGLENGTH])
+{
+ isc_sha224_t context;
+
+ isc_sha224_init(&context);
+ isc_sha224_update(&context, data, len);
+ return (isc_sha224_end(&context, digest));
+}
+
+/*** SHA-256: *********************************************************/
+void
+isc_sha256_init(isc_sha256_t *context) {
+ if (context == (isc_sha256_t *)0) {
+ return;
+ }
+ memcpy(context->state, sha256_initial_hash_value,
+ ISC_SHA256_DIGESTLENGTH);
+ memset(context->buffer, 0, ISC_SHA256_BLOCK_LENGTH);
+ context->bitcount = 0;
+}
+
+#ifdef ISC_SHA2_UNROLL_TRANSFORM
+
+/* Unrolled SHA-256 round macros: */
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+
+#define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) \
+ REVERSE32(*data++, W256[j]); \
+ T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \
+ K256[j] + W256[j]; \
+ (d) += T1; \
+ (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
+ j++
+
+
+#else /* BYTE_ORDER == LITTLE_ENDIAN */
+
+#define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) \
+ T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \
+ K256[j] + (W256[j] = *data++); \
+ (d) += T1; \
+ (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
+ j++
+
+#endif /* BYTE_ORDER == LITTLE_ENDIAN */
+
+#define ROUND256(a,b,c,d,e,f,g,h) \
+ s0 = W256[(j+1)&0x0f]; \
+ s0 = sigma0_256(s0); \
+ s1 = W256[(j+14)&0x0f]; \
+ s1 = sigma1_256(s1); \
+ T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + K256[j] + \
+ (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0); \
+ (d) += T1; \
+ (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
+ j++
+
+void isc_sha256_transform(isc_sha256_t *context, const isc_uint32_t* data) {
+ isc_uint32_t a, b, c, d, e, f, g, h, s0, s1;
+ isc_uint32_t T1, *W256;
+ int j;
+
+ W256 = (isc_uint32_t*)context->buffer;
+
+ /* Initialize registers with the prev. intermediate value */
+ a = context->state[0];
+ b = context->state[1];
+ c = context->state[2];
+ d = context->state[3];
+ e = context->state[4];
+ f = context->state[5];
+ g = context->state[6];
+ h = context->state[7];
+
+ j = 0;
+ do {
+ /* Rounds 0 to 15 (unrolled): */
+ ROUND256_0_TO_15(a,b,c,d,e,f,g,h);
+ ROUND256_0_TO_15(h,a,b,c,d,e,f,g);
+ ROUND256_0_TO_15(g,h,a,b,c,d,e,f);
+ ROUND256_0_TO_15(f,g,h,a,b,c,d,e);
+ ROUND256_0_TO_15(e,f,g,h,a,b,c,d);
+ ROUND256_0_TO_15(d,e,f,g,h,a,b,c);
+ ROUND256_0_TO_15(c,d,e,f,g,h,a,b);
+ ROUND256_0_TO_15(b,c,d,e,f,g,h,a);
+ } while (j < 16);
+
+ /* Now for the remaining rounds to 64: */
+ do {
+ ROUND256(a,b,c,d,e,f,g,h);
+ ROUND256(h,a,b,c,d,e,f,g);
+ ROUND256(g,h,a,b,c,d,e,f);
+ ROUND256(f,g,h,a,b,c,d,e);
+ ROUND256(e,f,g,h,a,b,c,d);
+ ROUND256(d,e,f,g,h,a,b,c);
+ ROUND256(c,d,e,f,g,h,a,b);
+ ROUND256(b,c,d,e,f,g,h,a);
+ } while (j < 64);
+
+ /* Compute the current intermediate hash value */
+ context->state[0] += a;
+ context->state[1] += b;
+ context->state[2] += c;
+ context->state[3] += d;
+ context->state[4] += e;
+ context->state[5] += f;
+ context->state[6] += g;
+ context->state[7] += h;
+
+ /* Clean up */
+ a = b = c = d = e = f = g = h = T1 = 0;
+}
+
+#else /* ISC_SHA2_UNROLL_TRANSFORM */
+
+void
+isc_sha256_transform(isc_sha256_t *context, const isc_uint32_t* data) {
+ isc_uint32_t a, b, c, d, e, f, g, h, s0, s1;
+ isc_uint32_t T1, T2, *W256;
+ int j;
+
+ W256 = (isc_uint32_t*)context->buffer;
+
+ /* Initialize registers with the prev. intermediate value */
+ a = context->state[0];
+ b = context->state[1];
+ c = context->state[2];
+ d = context->state[3];
+ e = context->state[4];
+ f = context->state[5];
+ g = context->state[6];
+ h = context->state[7];
+
+ j = 0;
+ do {
+#if BYTE_ORDER == LITTLE_ENDIAN
+ /* Copy data while converting to host byte order */
+ REVERSE32(*data++,W256[j]);
+ /* Apply the SHA-256 compression function to update a..h */
+ T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + W256[j];
+#else /* BYTE_ORDER == LITTLE_ENDIAN */
+ /* Apply the SHA-256 compression function to update a..h with copy */
+ T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + (W256[j] = *data++);
+#endif /* BYTE_ORDER == LITTLE_ENDIAN */
+ T2 = Sigma0_256(a) + Maj(a, b, c);
+ h = g;
+ g = f;
+ f = e;
+ e = d + T1;
+ d = c;
+ c = b;
+ b = a;
+ a = T1 + T2;
+
+ j++;
+ } while (j < 16);
+
+ do {
+ /* Part of the message block expansion: */
+ s0 = W256[(j+1)&0x0f];
+ s0 = sigma0_256(s0);
+ s1 = W256[(j+14)&0x0f];
+ s1 = sigma1_256(s1);
+
+ /* Apply the SHA-256 compression function to update a..h */
+ T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] +
+ (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0);
+ T2 = Sigma0_256(a) + Maj(a, b, c);
+ h = g;
+ g = f;
+ f = e;
+ e = d + T1;
+ d = c;
+ c = b;
+ b = a;
+ a = T1 + T2;
+
+ j++;
+ } while (j < 64);
+
+ /* Compute the current intermediate hash value */
+ context->state[0] += a;
+ context->state[1] += b;
+ context->state[2] += c;
+ context->state[3] += d;
+ context->state[4] += e;
+ context->state[5] += f;
+ context->state[6] += g;
+ context->state[7] += h;
+
+ /* Clean up */
+ a = b = c = d = e = f = g = h = T1 = T2 = 0;
+}
+
+#endif /* ISC_SHA2_UNROLL_TRANSFORM */
+
+void
+isc_sha256_update(isc_sha256_t *context, const isc_uint8_t *data, size_t len) {
+ unsigned int freespace, usedspace;
+
+ if (len == 0U) {
+ /* Calling with no data is valid - we do nothing */
+ return;
+ }
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha256_t *)0 && data != (isc_uint8_t*)0);
+
+ usedspace = (unsigned int)((context->bitcount >> 3) %
+ ISC_SHA256_BLOCK_LENGTH);
+ if (usedspace > 0) {
+ /* Calculate how much free space is available in the buffer */
+ freespace = ISC_SHA256_BLOCK_LENGTH - usedspace;
+
+ if (len >= freespace) {
+ /* Fill the buffer completely and process it */
+ memcpy(&context->buffer[usedspace], data, freespace);
+ context->bitcount += freespace << 3;
+ len -= freespace;
+ data += freespace;
+ isc_sha256_transform(context,
+ (isc_uint32_t*)context->buffer);
+ } else {
+ /* The buffer is not yet full */
+ memcpy(&context->buffer[usedspace], data, len);
+ context->bitcount += len << 3;
+ /* Clean up: */
+ usedspace = freespace = 0;
+ return;
+ }
+ }
+ while (len >= ISC_SHA256_BLOCK_LENGTH) {
+ /* Process as many complete blocks as we can */
+ memcpy(context->buffer, data, ISC_SHA256_BLOCK_LENGTH);
+ isc_sha256_transform(context, (isc_uint32_t*)context->buffer);
+ context->bitcount += ISC_SHA256_BLOCK_LENGTH << 3;
+ len -= ISC_SHA256_BLOCK_LENGTH;
+ data += ISC_SHA256_BLOCK_LENGTH;
+ }
+ if (len > 0U) {
+ /* There's left-overs, so save 'em */
+ memcpy(context->buffer, data, len);
+ context->bitcount += len << 3;
+ }
+ /* Clean up: */
+ usedspace = freespace = 0;
+}
+
+void
+isc_sha256_final(isc_uint8_t digest[], isc_sha256_t *context) {
+ isc_uint32_t *d = (isc_uint32_t*)digest;
+ unsigned int usedspace;
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha256_t *)0);
+
+ /* If no digest buffer is passed, we don't bother doing this: */
+ if (digest != (isc_uint8_t*)0) {
+ usedspace = (unsigned int)((context->bitcount >> 3) %
+ ISC_SHA256_BLOCK_LENGTH);
+#if BYTE_ORDER == LITTLE_ENDIAN
+ /* Convert FROM host byte order */
+ REVERSE64(context->bitcount,context->bitcount);
+#endif
+ if (usedspace > 0) {
+ /* Begin padding with a 1 bit: */
+ context->buffer[usedspace++] = 0x80;
+
+ if (usedspace <= ISC_SHA256_SHORT_BLOCK_LENGTH) {
+ /* Set-up for the last transform: */
+ memset(&context->buffer[usedspace], 0,
+ ISC_SHA256_SHORT_BLOCK_LENGTH - usedspace);
+ } else {
+ if (usedspace < ISC_SHA256_BLOCK_LENGTH) {
+ memset(&context->buffer[usedspace], 0,
+ ISC_SHA256_BLOCK_LENGTH -
+ usedspace);
+ }
+ /* Do second-to-last transform: */
+ isc_sha256_transform(context,
+ (isc_uint32_t*)context->buffer);
+
+ /* And set-up for the last transform: */
+ memset(context->buffer, 0,
+ ISC_SHA256_SHORT_BLOCK_LENGTH);
+ }
+ } else {
+ /* Set-up for the last transform: */
+ memset(context->buffer, 0, ISC_SHA256_SHORT_BLOCK_LENGTH);
+
+ /* Begin padding with a 1 bit: */
+ *context->buffer = 0x80;
+ }
+ /* Set the bit count: */
+ *(isc_uint64_t*)&context->buffer[ISC_SHA256_SHORT_BLOCK_LENGTH] = context->bitcount;
+
+ /* Final transform: */
+ isc_sha256_transform(context, (isc_uint32_t*)context->buffer);
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+ {
+ /* Convert TO host byte order */
+ int j;
+ for (j = 0; j < 8; j++) {
+ REVERSE32(context->state[j],context->state[j]);
+ *d++ = context->state[j];
+ }
+ }
+#else
+ memcpy(d, context->state, ISC_SHA256_DIGESTLENGTH);
+#endif
+ }
+
+ /* Clean up state data: */
+ memset(context, 0, sizeof(context));
+ usedspace = 0;
+}
+
+char *
+isc_sha256_end(isc_sha256_t *context, char buffer[]) {
+ isc_uint8_t digest[ISC_SHA256_DIGESTLENGTH], *d = digest;
+ unsigned int i;
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha256_t *)0);
+
+ if (buffer != (char*)0) {
+ isc_sha256_final(digest, context);
+
+ for (i = 0; i < ISC_SHA256_DIGESTLENGTH; i++) {
+ *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
+ *buffer++ = sha2_hex_digits[*d & 0x0f];
+ d++;
+ }
+ *buffer = (char)0;
+ } else {
+ memset(context, 0, sizeof(context));
+ }
+ memset(digest, 0, ISC_SHA256_DIGESTLENGTH);
+ return buffer;
+}
+
+char *
+isc_sha256_data(const isc_uint8_t* data, size_t len,
+ char digest[ISC_SHA256_DIGESTSTRINGLENGTH])
+{
+ isc_sha256_t context;
+
+ isc_sha256_init(&context);
+ isc_sha256_update(&context, data, len);
+ return (isc_sha256_end(&context, digest));
+}
+
+
+/*** SHA-512: *********************************************************/
+void
+isc_sha512_init(isc_sha512_t *context) {
+ if (context == (isc_sha512_t *)0) {
+ return;
+ }
+ memcpy(context->state, sha512_initial_hash_value,
+ ISC_SHA512_DIGESTLENGTH);
+ memset(context->buffer, 0, ISC_SHA512_BLOCK_LENGTH);
+ context->bitcount[0] = context->bitcount[1] = 0;
+}
+
+#ifdef ISC_SHA2_UNROLL_TRANSFORM
+
+/* Unrolled SHA-512 round macros: */
+#if BYTE_ORDER == LITTLE_ENDIAN
+
+#define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) \
+ REVERSE64(*data++, W512[j]); \
+ T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \
+ K512[j] + W512[j]; \
+ (d) += T1, \
+ (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)), \
+ j++
+
+
+#else /* BYTE_ORDER == LITTLE_ENDIAN */
+
+#define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) \
+ T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \
+ K512[j] + (W512[j] = *data++); \
+ (d) += T1; \
+ (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \
+ j++
+
+#endif /* BYTE_ORDER == LITTLE_ENDIAN */
+
+#define ROUND512(a,b,c,d,e,f,g,h) \
+ s0 = W512[(j+1)&0x0f]; \
+ s0 = sigma0_512(s0); \
+ s1 = W512[(j+14)&0x0f]; \
+ s1 = sigma1_512(s1); \
+ T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + K512[j] + \
+ (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0); \
+ (d) += T1; \
+ (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \
+ j++
+
+void isc_sha512_transform(isc_sha512_t *context, const isc_uint64_t* data) {
+ isc_uint64_t a, b, c, d, e, f, g, h, s0, s1;
+ isc_uint64_t T1, *W512 = (isc_uint64_t*)context->buffer;
+ int j;
+
+ /* Initialize registers with the prev. intermediate value */
+ a = context->state[0];
+ b = context->state[1];
+ c = context->state[2];
+ d = context->state[3];
+ e = context->state[4];
+ f = context->state[5];
+ g = context->state[6];
+ h = context->state[7];
+
+ j = 0;
+ do {
+ ROUND512_0_TO_15(a,b,c,d,e,f,g,h);
+ ROUND512_0_TO_15(h,a,b,c,d,e,f,g);
+ ROUND512_0_TO_15(g,h,a,b,c,d,e,f);
+ ROUND512_0_TO_15(f,g,h,a,b,c,d,e);
+ ROUND512_0_TO_15(e,f,g,h,a,b,c,d);
+ ROUND512_0_TO_15(d,e,f,g,h,a,b,c);
+ ROUND512_0_TO_15(c,d,e,f,g,h,a,b);
+ ROUND512_0_TO_15(b,c,d,e,f,g,h,a);
+ } while (j < 16);
+
+ /* Now for the remaining rounds up to 79: */
+ do {
+ ROUND512(a,b,c,d,e,f,g,h);
+ ROUND512(h,a,b,c,d,e,f,g);
+ ROUND512(g,h,a,b,c,d,e,f);
+ ROUND512(f,g,h,a,b,c,d,e);
+ ROUND512(e,f,g,h,a,b,c,d);
+ ROUND512(d,e,f,g,h,a,b,c);
+ ROUND512(c,d,e,f,g,h,a,b);
+ ROUND512(b,c,d,e,f,g,h,a);
+ } while (j < 80);
+
+ /* Compute the current intermediate hash value */
+ context->state[0] += a;
+ context->state[1] += b;
+ context->state[2] += c;
+ context->state[3] += d;
+ context->state[4] += e;
+ context->state[5] += f;
+ context->state[6] += g;
+ context->state[7] += h;
+
+ /* Clean up */
+ a = b = c = d = e = f = g = h = T1 = 0;
+}
+
+#else /* ISC_SHA2_UNROLL_TRANSFORM */
+
+void
+isc_sha512_transform(isc_sha512_t *context, const isc_uint64_t* data) {
+ isc_uint64_t a, b, c, d, e, f, g, h, s0, s1;
+ isc_uint64_t T1, T2, *W512 = (isc_uint64_t*)context->buffer;
+ int j;
+
+ /* Initialize registers with the prev. intermediate value */
+ a = context->state[0];
+ b = context->state[1];
+ c = context->state[2];
+ d = context->state[3];
+ e = context->state[4];
+ f = context->state[5];
+ g = context->state[6];
+ h = context->state[7];
+
+ j = 0;
+ do {
+#if BYTE_ORDER == LITTLE_ENDIAN
+ /* Convert TO host byte order */
+ REVERSE64(*data++, W512[j]);
+ /* Apply the SHA-512 compression function to update a..h */
+ T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + W512[j];
+#else /* BYTE_ORDER == LITTLE_ENDIAN */
+ /* Apply the SHA-512 compression function to update a..h with copy */
+ T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + (W512[j] = *data++);
+#endif /* BYTE_ORDER == LITTLE_ENDIAN */
+ T2 = Sigma0_512(a) + Maj(a, b, c);
+ h = g;
+ g = f;
+ f = e;
+ e = d + T1;
+ d = c;
+ c = b;
+ b = a;
+ a = T1 + T2;
+
+ j++;
+ } while (j < 16);
+
+ do {
+ /* Part of the message block expansion: */
+ s0 = W512[(j+1)&0x0f];
+ s0 = sigma0_512(s0);
+ s1 = W512[(j+14)&0x0f];
+ s1 = sigma1_512(s1);
+
+ /* Apply the SHA-512 compression function to update a..h */
+ T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] +
+ (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0);
+ T2 = Sigma0_512(a) + Maj(a, b, c);
+ h = g;
+ g = f;
+ f = e;
+ e = d + T1;
+ d = c;
+ c = b;
+ b = a;
+ a = T1 + T2;
+
+ j++;
+ } while (j < 80);
+
+ /* Compute the current intermediate hash value */
+ context->state[0] += a;
+ context->state[1] += b;
+ context->state[2] += c;
+ context->state[3] += d;
+ context->state[4] += e;
+ context->state[5] += f;
+ context->state[6] += g;
+ context->state[7] += h;
+
+ /* Clean up */
+ a = b = c = d = e = f = g = h = T1 = T2 = 0;
+}
+
+#endif /* ISC_SHA2_UNROLL_TRANSFORM */
+
+void isc_sha512_update(isc_sha512_t *context, const isc_uint8_t *data, size_t len) {
+ unsigned int freespace, usedspace;
+
+ if (len == 0U) {
+ /* Calling with no data is valid - we do nothing */
+ return;
+ }
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha512_t *)0 && data != (isc_uint8_t*)0);
+
+ usedspace = (unsigned int)((context->bitcount[0] >> 3) %
+ ISC_SHA512_BLOCK_LENGTH);
+ if (usedspace > 0) {
+ /* Calculate how much free space is available in the buffer */
+ freespace = ISC_SHA512_BLOCK_LENGTH - usedspace;
+
+ if (len >= freespace) {
+ /* Fill the buffer completely and process it */
+ memcpy(&context->buffer[usedspace], data, freespace);
+ ADDINC128(context->bitcount, freespace << 3);
+ len -= freespace;
+ data += freespace;
+ isc_sha512_transform(context,
+ (isc_uint64_t*)context->buffer);
+ } else {
+ /* The buffer is not yet full */
+ memcpy(&context->buffer[usedspace], data, len);
+ ADDINC128(context->bitcount, len << 3);
+ /* Clean up: */
+ usedspace = freespace = 0;
+ return;
+ }
+ }
+ while (len >= ISC_SHA512_BLOCK_LENGTH) {
+ /* Process as many complete blocks as we can */
+ memcpy(context->buffer, data, ISC_SHA512_BLOCK_LENGTH);
+ isc_sha512_transform(context, (isc_uint64_t*)context->buffer);
+ ADDINC128(context->bitcount, ISC_SHA512_BLOCK_LENGTH << 3);
+ len -= ISC_SHA512_BLOCK_LENGTH;
+ data += ISC_SHA512_BLOCK_LENGTH;
+ }
+ if (len > 0U) {
+ /* There's left-overs, so save 'em */
+ memcpy(context->buffer, data, len);
+ ADDINC128(context->bitcount, len << 3);
+ }
+ /* Clean up: */
+ usedspace = freespace = 0;
+}
+
+void isc_sha512_last(isc_sha512_t *context) {
+ unsigned int usedspace;
+
+ usedspace = (unsigned int)((context->bitcount[0] >> 3) %
+ ISC_SHA512_BLOCK_LENGTH);
+#if BYTE_ORDER == LITTLE_ENDIAN
+ /* Convert FROM host byte order */
+ REVERSE64(context->bitcount[0],context->bitcount[0]);
+ REVERSE64(context->bitcount[1],context->bitcount[1]);
+#endif
+ if (usedspace > 0) {
+ /* Begin padding with a 1 bit: */
+ context->buffer[usedspace++] = 0x80;
+
+ if (usedspace <= ISC_SHA512_SHORT_BLOCK_LENGTH) {
+ /* Set-up for the last transform: */
+ memset(&context->buffer[usedspace], 0,
+ ISC_SHA512_SHORT_BLOCK_LENGTH - usedspace);
+ } else {
+ if (usedspace < ISC_SHA512_BLOCK_LENGTH) {
+ memset(&context->buffer[usedspace], 0,
+ ISC_SHA512_BLOCK_LENGTH - usedspace);
+ }
+ /* Do second-to-last transform: */
+ isc_sha512_transform(context,
+ (isc_uint64_t*)context->buffer);
+
+ /* And set-up for the last transform: */
+ memset(context->buffer, 0, ISC_SHA512_BLOCK_LENGTH - 2);
+ }
+ } else {
+ /* Prepare for final transform: */
+ memset(context->buffer, 0, ISC_SHA512_SHORT_BLOCK_LENGTH);
+
+ /* Begin padding with a 1 bit: */
+ *context->buffer = 0x80;
+ }
+ /* Store the length of input data (in bits): */
+ *(isc_uint64_t*)&context->buffer[ISC_SHA512_SHORT_BLOCK_LENGTH] = context->bitcount[1];
+ *(isc_uint64_t*)&context->buffer[ISC_SHA512_SHORT_BLOCK_LENGTH+8] = context->bitcount[0];
+
+ /* Final transform: */
+ isc_sha512_transform(context, (isc_uint64_t*)context->buffer);
+}
+
+void isc_sha512_final(isc_uint8_t digest[], isc_sha512_t *context) {
+ isc_uint64_t *d = (isc_uint64_t*)digest;
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha512_t *)0);
+
+ /* If no digest buffer is passed, we don't bother doing this: */
+ if (digest != (isc_uint8_t*)0) {
+ isc_sha512_last(context);
+
+ /* Save the hash data for output: */
+#if BYTE_ORDER == LITTLE_ENDIAN
+ {
+ /* Convert TO host byte order */
+ int j;
+ for (j = 0; j < 8; j++) {
+ REVERSE64(context->state[j],context->state[j]);
+ *d++ = context->state[j];
+ }
+ }
+#else
+ memcpy(d, context->state, ISC_SHA512_DIGESTLENGTH);
+#endif
+ }
+
+ /* Zero out state data */
+ memset(context, 0, sizeof(context));
+}
+
+char *
+isc_sha512_end(isc_sha512_t *context, char buffer[]) {
+ isc_uint8_t digest[ISC_SHA512_DIGESTLENGTH], *d = digest;
+ unsigned int i;
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha512_t *)0);
+
+ if (buffer != (char*)0) {
+ isc_sha512_final(digest, context);
+
+ for (i = 0; i < ISC_SHA512_DIGESTLENGTH; i++) {
+ *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
+ *buffer++ = sha2_hex_digits[*d & 0x0f];
+ d++;
+ }
+ *buffer = (char)0;
+ } else {
+ memset(context, 0, sizeof(context));
+ }
+ memset(digest, 0, ISC_SHA512_DIGESTLENGTH);
+ return buffer;
+}
+
+char *
+isc_sha512_data(const isc_uint8_t *data, size_t len,
+ char digest[ISC_SHA512_DIGESTSTRINGLENGTH])
+{
+ isc_sha512_t context;
+
+ isc_sha512_init(&context);
+ isc_sha512_update(&context, data, len);
+ return (isc_sha512_end(&context, digest));
+}
+
+
+/*** SHA-384: *********************************************************/
+void
+isc_sha384_init(isc_sha384_t *context) {
+ if (context == (isc_sha384_t *)0) {
+ return;
+ }
+ memcpy(context->state, sha384_initial_hash_value,
+ ISC_SHA512_DIGESTLENGTH);
+ memset(context->buffer, 0, ISC_SHA384_BLOCK_LENGTH);
+ context->bitcount[0] = context->bitcount[1] = 0;
+}
+
+void
+isc_sha384_update(isc_sha384_t *context, const isc_uint8_t* data, size_t len) {
+ isc_sha512_update((isc_sha512_t *)context, data, len);
+}
+
+void
+isc_sha384_final(isc_uint8_t digest[], isc_sha384_t *context) {
+ isc_uint64_t *d = (isc_uint64_t*)digest;
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha384_t *)0);
+
+ /* If no digest buffer is passed, we don't bother doing this: */
+ if (digest != (isc_uint8_t*)0) {
+ isc_sha512_last((isc_sha512_t *)context);
+
+ /* Save the hash data for output: */
+#if BYTE_ORDER == LITTLE_ENDIAN
+ {
+ /* Convert TO host byte order */
+ int j;
+ for (j = 0; j < 6; j++) {
+ REVERSE64(context->state[j],context->state[j]);
+ *d++ = context->state[j];
+ }
+ }
+#else
+ memcpy(d, context->state, ISC_SHA384_DIGESTLENGTH);
+#endif
+ }
+
+ /* Zero out state data */
+ memset(context, 0, sizeof(context));
+}
+
+char *
+isc_sha384_end(isc_sha384_t *context, char buffer[]) {
+ isc_uint8_t digest[ISC_SHA384_DIGESTLENGTH], *d = digest;
+ unsigned int i;
+
+ /* Sanity check: */
+ REQUIRE(context != (isc_sha384_t *)0);
+
+ if (buffer != (char*)0) {
+ isc_sha384_final(digest, context);
+
+ for (i = 0; i < ISC_SHA384_DIGESTLENGTH; i++) {
+ *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
+ *buffer++ = sha2_hex_digits[*d & 0x0f];
+ d++;
+ }
+ *buffer = (char)0;
+ } else {
+ memset(context, 0, sizeof(context));
+ }
+ memset(digest, 0, ISC_SHA384_DIGESTLENGTH);
+ return buffer;
+}
+
+char*
+isc_sha384_data(const isc_uint8_t *data, size_t len,
+ char digest[ISC_SHA384_DIGESTSTRINGLENGTH])
+{
+ isc_sha384_t context;
+
+ isc_sha384_init(&context);
+ isc_sha384_update(&context, data, len);
+ return (isc_sha384_end(&context, digest));
+}
diff --git a/contrib/bind9/lib/isc/sockaddr.c b/contrib/bind9/lib/isc/sockaddr.c
index a40f0c9..2fd73af 100644
--- a/contrib/bind9/lib/isc/sockaddr.c
+++ b/contrib/bind9/lib/isc/sockaddr.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2006 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2006 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: sockaddr.c,v 1.48.2.1.2.12 2006/03/02 00:37:20 marka Exp $ */
+/* $Id: sockaddr.c,v 1.59.18.9 2006/06/21 01:25:40 marka Exp $ */
+
+/*! \file */
#include <config.h>
@@ -33,6 +35,21 @@
isc_boolean_t
isc_sockaddr_equal(const isc_sockaddr_t *a, const isc_sockaddr_t *b) {
+ return (isc_sockaddr_compare(a, b, ISC_SOCKADDR_CMPADDR|
+ ISC_SOCKADDR_CMPPORT|
+ ISC_SOCKADDR_CMPSCOPE));
+}
+
+isc_boolean_t
+isc_sockaddr_eqaddr(const isc_sockaddr_t *a, const isc_sockaddr_t *b) {
+ return (isc_sockaddr_compare(a, b, ISC_SOCKADDR_CMPADDR|
+ ISC_SOCKADDR_CMPSCOPE));
+}
+
+isc_boolean_t
+isc_sockaddr_compare(const isc_sockaddr_t *a, const isc_sockaddr_t *b,
+ unsigned int flags)
+{
REQUIRE(a != NULL && b != NULL);
if (a->length != b->length)
@@ -47,21 +64,33 @@ isc_sockaddr_equal(const isc_sockaddr_t *a, const isc_sockaddr_t *b) {
return (ISC_FALSE);
switch (a->type.sa.sa_family) {
case AF_INET:
- if (memcmp(&a->type.sin.sin_addr, &b->type.sin.sin_addr,
+ if ((flags & ISC_SOCKADDR_CMPADDR) != 0 &&
+ memcmp(&a->type.sin.sin_addr, &b->type.sin.sin_addr,
sizeof(a->type.sin.sin_addr)) != 0)
return (ISC_FALSE);
- if (a->type.sin.sin_port != b->type.sin.sin_port)
+ if ((flags & ISC_SOCKADDR_CMPPORT) != 0 &&
+ a->type.sin.sin_port != b->type.sin.sin_port)
return (ISC_FALSE);
break;
case AF_INET6:
- if (memcmp(&a->type.sin6.sin6_addr, &b->type.sin6.sin6_addr,
+ if ((flags & ISC_SOCKADDR_CMPADDR) != 0 &&
+ memcmp(&a->type.sin6.sin6_addr, &b->type.sin6.sin6_addr,
sizeof(a->type.sin6.sin6_addr)) != 0)
return (ISC_FALSE);
#ifdef ISC_PLATFORM_HAVESCOPEID
- if (a->type.sin6.sin6_scope_id != b->type.sin6.sin6_scope_id)
+ /*
+ * If ISC_SOCKADDR_CMPSCOPEZERO is set then don't return
+ * ISC_FALSE if one of the scopes in zero.
+ */
+ if ((flags & ISC_SOCKADDR_CMPSCOPE) != 0 &&
+ a->type.sin6.sin6_scope_id != b->type.sin6.sin6_scope_id &&
+ ((flags & ISC_SOCKADDR_CMPSCOPEZERO) == 0 ||
+ (a->type.sin6.sin6_scope_id != 0 &&
+ b->type.sin6.sin6_scope_id != 0)))
return (ISC_FALSE);
#endif
- if (a->type.sin6.sin6_port != b->type.sin6.sin6_port)
+ if ((flags & ISC_SOCKADDR_CMPPORT) != 0 &&
+ a->type.sin6.sin6_port != b->type.sin6.sin6_port)
return (ISC_FALSE);
break;
default:
@@ -72,37 +101,6 @@ isc_sockaddr_equal(const isc_sockaddr_t *a, const isc_sockaddr_t *b) {
}
isc_boolean_t
-isc_sockaddr_eqaddr(const isc_sockaddr_t *a, const isc_sockaddr_t *b) {
- REQUIRE(a != NULL && b != NULL);
-
- if (a->length != b->length)
- return (ISC_FALSE);
-
- if (a->type.sa.sa_family != b->type.sa.sa_family)
- return (ISC_FALSE);
- switch (a->type.sa.sa_family) {
- case AF_INET:
- if (memcmp(&a->type.sin.sin_addr, &b->type.sin.sin_addr,
- sizeof(a->type.sin.sin_addr)) != 0)
- return (ISC_FALSE);
- break;
- case AF_INET6:
- if (memcmp(&a->type.sin6.sin6_addr, &b->type.sin6.sin6_addr,
- sizeof(a->type.sin6.sin6_addr)) != 0)
- return (ISC_FALSE);
-#ifdef ISC_PLATFORM_HAVESCOPEID
- if (a->type.sin6.sin6_scope_id != b->type.sin6.sin6_scope_id)
- return (ISC_FALSE);
-#endif
- break;
- default:
- if (memcmp(&a->type, &b->type, a->length) != 0)
- return (ISC_FALSE);
- }
- return (ISC_TRUE);
-}
-
-isc_boolean_t
isc_sockaddr_eqaddrprefix(const isc_sockaddr_t *a, const isc_sockaddr_t *b,
unsigned int prefixlen)
{
@@ -134,6 +132,23 @@ isc_sockaddr_totext(const isc_sockaddr_t *sockaddr, isc_buffer_t *target) {
case AF_INET6:
snprintf(pbuf, sizeof(pbuf), "%u", ntohs(sockaddr->type.sin6.sin6_port));
break;
+#ifdef ISC_PLAFORM_HAVESYSUNH
+ case AF_UNIX:
+ plen = strlen(sockaddr->type.sunix.sun_path);
+ if (plen >= isc_buffer_availablelength(target))
+ return (ISC_R_NOSPACE);
+
+ isc_buffer_putmem(target, sockaddr->type.sunix.sun_path, plen);
+
+ /*
+ * Null terminate after used region.
+ */
+ isc_buffer_availableregion(target, &avail);
+ INSIST(avail.length >= 1);
+ avail.base[0] = '\0';
+
+ return (ISC_R_SUCCESS);
+#endif
default:
return (ISC_R_FAILURE);
}
@@ -425,8 +440,12 @@ isc_boolean_t
isc_sockaddr_ismulticast(const isc_sockaddr_t *sockaddr) {
isc_netaddr_t netaddr;
- isc_netaddr_fromsockaddr(&netaddr, sockaddr);
- return (isc_netaddr_ismulticast(&netaddr));
+ if (sockaddr->type.sa.sa_family == AF_INET ||
+ sockaddr->type.sa.sa_family == AF_INET6) {
+ isc_netaddr_fromsockaddr(&netaddr, sockaddr);
+ return (isc_netaddr_ismulticast(&netaddr));
+ }
+ return (ISC_FALSE);
}
isc_boolean_t
@@ -461,3 +480,24 @@ isc_sockaddr_islinklocal(const isc_sockaddr_t *sockaddr) {
}
return (ISC_FALSE);
}
+
+isc_result_t
+isc_sockaddr_frompath(isc_sockaddr_t *sockaddr, const char *path) {
+#ifdef ISC_PLATFORM_HAVESYSUNH
+ if (strlen(path) >= sizeof(sockaddr->type.sunix.sun_path))
+ return (ISC_R_NOSPACE);
+ memset(sockaddr, 0, sizeof(*sockaddr));
+ sockaddr->length = sizeof(sockaddr->type.sunix);
+ sockaddr->type.sunix.sun_family = AF_UNIX;
+#ifdef ISC_PLATFORM_HAVESALEN
+ sockaddr->type.sunix.sun_len =
+ (unsigned char)sizeof(sockaddr->type.sunix);
+#endif
+ strcpy(sockaddr->type.sunix.sun_path, path);
+ return (ISC_R_SUCCESS);
+#else
+ UNUSED(sockaddr);
+ UNUSED(path);
+ return (ISC_R_NOTIMPLEMENTED);
+#endif
+}
diff --git a/contrib/bind9/lib/isc/sparc64/include/isc/atomic.h b/contrib/bind9/lib/isc/sparc64/include/isc/atomic.h
new file mode 100644
index 0000000..5c254cf
--- /dev/null
+++ b/contrib/bind9/lib/isc/sparc64/include/isc/atomic.h
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2005 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* $Id: atomic.h,v 1.2.2.2 2005/06/16 22:01:02 jinmei Exp $ */
+
+/*
+ * This code was written based on FreeBSD's kernel source whose copyright
+ * follows:
+ */
+
+/*-
+ * Copyright (c) 1998 Doug Rabson.
+ * Copyright (c) 2001 Jake Burkholder.
+ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * from: FreeBSD: src/sys/i386/include/atomic.h,v 1.20 2001/02/11
+ * $FreeBSD$
+ */
+
+#ifndef ISC_ATOMIC_H
+#define ISC_ATOMIC_H 1
+
+#include <isc/platform.h>
+#include <isc/types.h>
+
+#define ASI_P 0x80 /* Primary Address Space Identifier */
+
+#ifdef ISC_PLATFORM_USEGCCASM
+
+/*
+ * This routine atomically increments the value stored in 'p' by 'val', and
+ * returns the previous value.
+ */
+static inline isc_int32_t
+isc_atomic_xadd(isc_int32_t *p, isc_int32_t val) {
+ isc_int32_t prev, swapped;
+
+ for (prev = *(volatile isc_int32_t *)p; ; prev = swapped) {
+ swapped = prev + val;
+ __asm__ volatile(
+ "casa [%1] %2, %3, %0"
+ : "+r"(swapped)
+ : "r"(p), "n"(ASI_P), "r"(prev));
+ if (swapped == prev)
+ break;
+ }
+
+ return (prev);
+}
+
+/*
+ * This routine atomically stores the value 'val' in 'p'.
+ */
+static inline void
+isc_atomic_store(isc_int32_t *p, isc_int32_t val) {
+ isc_int32_t prev, swapped;
+
+ for (prev = *(volatile isc_int32_t *)p; ; prev = swapped) {
+ swapped = val;
+ __asm__ volatile(
+ "casa [%1] %2, %3, %0"
+ : "+r"(swapped)
+ : "r"(p), "n"(ASI_P), "r"(prev)
+ : "memory");
+ if (swapped == prev)
+ break;
+ }
+}
+
+/*
+ * This routine atomically replaces the value in 'p' with 'val', if the
+ * original value is equal to 'cmpval'. The original value is returned in any
+ * case.
+ */
+static inline isc_int32_t
+isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val) {
+ isc_int32_t temp = val;
+
+ __asm__ volatile(
+ "casa [%1] %2, %3, %0"
+ : "+r"(temp)
+ : "r"(p), "n"(ASI_P), "r"(cmpval));
+
+ return (temp);
+}
+
+#else /* ISC_PLATFORM_USEGCCASM */
+
+#error "unsupported compiler. disable atomic ops by --disable-atomic"
+
+#endif /* ISC_PLATFORM_USEGCCASM */
+
+#endif /* ISC_ATOMIC_H */
diff --git a/contrib/bind9/lib/isc/string.c b/contrib/bind9/lib/isc/string.c
index 2a1e557..c09fa4f 100644
--- a/contrib/bind9/lib/isc/string.c
+++ b/contrib/bind9/lib/isc/string.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2006 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,13 +15,19 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: string.c,v 1.6.164.5 2004/09/16 01:00:58 marka Exp $ */
+/* $Id: string.c,v 1.10.18.7 2006/10/03 23:50:51 marka Exp $ */
+
+/*! \file */
#include <config.h>
#include <ctype.h>
+#include <isc/mem.h>
+#include <isc/print.h>
+#include <isc/region.h>
#include <isc/string.h>
+#include <isc/util.h>
static char digits[] = "0123456789abcdefghijklmnoprstuvwxyz";
@@ -89,6 +95,105 @@ isc_string_touint64(char *source, char **end, int base) {
return (tmp);
}
+isc_result_t
+isc_string_copy(char *target, size_t size, const char *source) {
+ REQUIRE(size > 0U);
+
+ if (strlcpy(target, source, size) >= size) {
+ memset(target, ISC_STRING_MAGIC, size);
+ return (ISC_R_NOSPACE);
+ }
+
+ ENSURE(strlen(target) < size);
+
+ return (ISC_R_SUCCESS);
+}
+
+void
+isc_string_copy_truncate(char *target, size_t size, const char *source) {
+ REQUIRE(size > 0U);
+
+ strlcpy(target, source, size);
+
+ ENSURE(strlen(target) < size);
+}
+
+isc_result_t
+isc_string_append(char *target, size_t size, const char *source) {
+ REQUIRE(size > 0U);
+ REQUIRE(strlen(target) < size);
+
+ if (strlcat(target, source, size) >= size) {
+ memset(target, ISC_STRING_MAGIC, size);
+ return (ISC_R_NOSPACE);
+ }
+
+ ENSURE(strlen(target) < size);
+
+ return (ISC_R_SUCCESS);
+}
+
+void
+isc_string_append_truncate(char *target, size_t size, const char *source) {
+ REQUIRE(size > 0U);
+ REQUIRE(strlen(target) < size);
+
+ strlcat(target, source, size);
+
+ ENSURE(strlen(target) < size);
+}
+
+isc_result_t
+isc_string_printf(char *target, size_t size, const char *format, ...) {
+ va_list args;
+ size_t n;
+
+ REQUIRE(size > 0U);
+
+ va_start(args, format);
+ n = vsnprintf(target, size, format, args);
+ va_end(args);
+
+ if (n >= size) {
+ memset(target, ISC_STRING_MAGIC, size);
+ return (ISC_R_NOSPACE);
+ }
+
+ ENSURE(strlen(target) < size);
+
+ return (ISC_R_SUCCESS);
+}
+
+void
+isc_string_printf_truncate(char *target, size_t size, const char *format, ...) {
+ va_list args;
+ size_t n;
+
+ REQUIRE(size > 0U);
+
+ va_start(args, format);
+ n = vsnprintf(target, size, format, args);
+ va_end(args);
+
+ ENSURE(strlen(target) < size);
+}
+
+char *
+isc_string_regiondup(isc_mem_t *mctx, const isc_region_t *source) {
+ char *target;
+
+ REQUIRE(mctx != NULL);
+ REQUIRE(source != NULL);
+
+ target = (char *) isc_mem_allocate(mctx, source->length + 1);
+ if (target != NULL) {
+ memcpy(source->base, target, source->length);
+ target[source->length] = '\0';
+ }
+
+ return (target);
+}
+
char *
isc_string_separate(char **stringp, const char *delim) {
char *string = *stringp;
diff --git a/contrib/bind9/lib/isc/strtoul.c b/contrib/bind9/lib/isc/strtoul.c
index b3d7e49..5070c08 100644
--- a/contrib/bind9/lib/isc/strtoul.c
+++ b/contrib/bind9/lib/isc/strtoul.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -48,11 +48,12 @@
* SUCH DAMAGE.
*/
+/*! \file */
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)strtoul.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
-/* $Id: strtoul.c,v 1.2.14.3 2004/03/06 08:14:36 marka Exp $ */
+/* $Id: strtoul.c,v 1.3.18.2 2005/04/29 00:16:50 marka Exp $ */
#include <config.h>
@@ -63,7 +64,7 @@ static char sccsid[] = "@(#)strtoul.c 8.1 (Berkeley) 6/4/93";
#include <isc/stdlib.h>
#include <isc/util.h>
-/*
+/*!
* Convert a string to an unsigned long integer.
*
* Ignores `locale' stuff. Assumes that the upper and lower case
diff --git a/contrib/bind9/lib/isc/symtab.c b/contrib/bind9/lib/isc/symtab.c
index 8b2b8c4..716ca88 100644
--- a/contrib/bind9/lib/isc/symtab.c
+++ b/contrib/bind9/lib/isc/symtab.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1996-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: symtab.c,v 1.24.12.3 2004/03/08 09:04:50 marka Exp $ */
+/* $Id: symtab.c,v 1.26.18.2 2005/04/29 00:16:50 marka Exp $ */
+
+/*! \file */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/task.c b/contrib/bind9/lib/isc/task.c
index 9b31523..5c80712 100644
--- a/contrib/bind9/lib/isc/task.c
+++ b/contrib/bind9/lib/isc/task.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2006 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,10 +15,10 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: task.c,v 1.85.2.3.8.5 2004/10/15 00:45:45 marka Exp $ */
+/* $Id: task.c,v 1.91.18.6 2006/01/04 23:50:23 marka Exp $ */
-/*
- * Principal Author: Bob Halley
+/*! \file
+ * \author Principal Author: Bob Halley
*/
/*
@@ -174,6 +174,7 @@ isc_task_create(isc_taskmgr_t *manager, unsigned int quantum,
{
isc_task_t *task;
isc_boolean_t exiting;
+ isc_result_t result;
REQUIRE(VALID_MANAGER(manager));
REQUIRE(taskp != NULL && *taskp == NULL);
@@ -183,13 +184,10 @@ isc_task_create(isc_taskmgr_t *manager, unsigned int quantum,
return (ISC_R_NOMEMORY);
XTRACE("isc_task_create");
task->manager = manager;
- if (isc_mutex_init(&task->lock) != ISC_R_SUCCESS) {
+ result = isc_mutex_init(&task->lock);
+ if (result != ISC_R_SUCCESS) {
isc_mem_put(manager->mctx, task, sizeof(*task));
- UNEXPECTED_ERROR(__FILE__, __LINE__,
- "isc_mutex_init() %s",
- isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
- ISC_MSG_FAILED, "failed"));
- return (ISC_R_UNEXPECTED);
+ return (result);
}
task->state = task_state_idle;
task->references = 1;
@@ -1066,14 +1064,10 @@ isc_taskmgr_create(isc_mem_t *mctx, unsigned int workers,
return (ISC_R_NOMEMORY);
manager->magic = TASK_MANAGER_MAGIC;
manager->mctx = NULL;
- if (isc_mutex_init(&manager->lock) != ISC_R_SUCCESS) {
- UNEXPECTED_ERROR(__FILE__, __LINE__,
- "isc_mutex_init() %s",
- isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
- ISC_MSG_FAILED, "failed"));
- result = ISC_R_UNEXPECTED;
+ result = isc_mutex_init(&manager->lock);
+ if (result != ISC_R_SUCCESS)
goto cleanup_mgr;
- }
+
#ifdef ISC_PLATFORM_USETHREADS
manager->workers = 0;
manager->threads = isc_mem_allocate(mctx,
@@ -1235,6 +1229,8 @@ isc_taskmgr_destroy(isc_taskmgr_t **managerp) {
UNLOCK(&manager->lock);
while (isc__taskmgr_ready())
(void)isc__taskmgr_dispatch();
+ if (!ISC_LIST_EMPTY(manager->tasks))
+ isc_mem_printallactive(stderr);
INSIST(ISC_LIST_EMPTY(manager->tasks));
#endif /* ISC_PLATFORM_USETHREADS */
diff --git a/contrib/bind9/lib/isc/task_p.h b/contrib/bind9/lib/isc/task_p.h
index f842c5b..8ada721 100644
--- a/contrib/bind9/lib/isc/task_p.h
+++ b/contrib/bind9/lib/isc/task_p.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: task_p.h,v 1.6.206.1 2004/03/06 08:14:36 marka Exp $ */
+/* $Id: task_p.h,v 1.7.18.2 2005/04/29 00:16:50 marka Exp $ */
#ifndef ISC_TASK_P_H
#define ISC_TASK_P_H
+/*! \file */
+
isc_boolean_t
isc__taskmgr_ready(void);
diff --git a/contrib/bind9/lib/isc/taskpool.c b/contrib/bind9/lib/isc/taskpool.c
index a3931a9..f1f619d 100644
--- a/contrib/bind9/lib/isc/taskpool.c
+++ b/contrib/bind9/lib/isc/taskpool.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2006 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: taskpool.c,v 1.10.12.5 2006/01/04 23:50:21 marka Exp $ */
+/* $Id: taskpool.c,v 1.12.18.3 2005/11/30 03:44:39 marka Exp $ */
+
+/*! \file */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/timer.c b/contrib/bind9/lib/isc/timer.c
index 6a6acf6..4b96fa5 100644
--- a/contrib/bind9/lib/isc/timer.c
+++ b/contrib/bind9/lib/isc/timer.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2006 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: timer.c,v 1.64.12.13 2006/01/04 23:50:21 marka Exp $ */
+/* $Id: timer.c,v 1.73.18.5 2005/11/30 03:44:39 marka Exp $ */
+
+/*! \file */
#include <config.h>
@@ -57,14 +59,14 @@
#define VALID_TIMER(t) ISC_MAGIC_VALID(t, TIMER_MAGIC)
struct isc_timer {
- /* Not locked. */
+ /*! Not locked. */
unsigned int magic;
isc_timermgr_t * manager;
isc_mutex_t lock;
- /* Locked by timer lock. */
+ /*! Locked by timer lock. */
unsigned int references;
isc_time_t idle;
- /* Locked by manager lock. */
+ /*! Locked by manager lock. */
isc_timertype_t type;
isc_time_t expires;
isc_interval_t interval;
@@ -99,7 +101,7 @@ struct isc_timermgr {
};
#ifndef ISC_PLATFORM_USETHREADS
-/*
+/*!
* If threads are not in use, there can be only one.
*/
static isc_timermgr_t *timermgr = NULL;
@@ -115,7 +117,7 @@ schedule(isc_timer_t *timer, isc_time_t *now, isc_boolean_t signal_ok) {
isc_boolean_t timedwait;
#endif
- /*
+ /*!
* Note: the caller must ensure locking.
*/
@@ -128,7 +130,7 @@ schedule(isc_timer_t *timer, isc_time_t *now, isc_boolean_t signal_ok) {
manager = timer->manager;
#ifdef ISC_PLATFORM_USETHREADS
- /*
+ /*!
* If the manager was timed wait, we may need to signal the
* manager to force a wakeup.
*/
@@ -373,14 +375,11 @@ isc_timer_create(isc_timermgr_t *manager, isc_timertype_t type,
*/
DE_CONST(arg, timer->arg);
timer->index = 0;
- if (isc_mutex_init(&timer->lock) != ISC_R_SUCCESS) {
+ result = isc_mutex_init(&timer->lock);
+ if (result != ISC_R_SUCCESS) {
isc_task_detach(&timer->task);
isc_mem_put(manager->mctx, timer, sizeof(*timer));
- UNEXPECTED_ERROR(__FILE__, __LINE__,
- "isc_mutex_init() %s",
- isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
- ISC_MSG_FAILED, "failed"));
- return (ISC_R_UNEXPECTED);
+ return (result);
}
ISC_LINK_INIT(timer, link);
timer->magic = TIMER_MAGIC;
@@ -583,7 +582,7 @@ dispatch(isc_timermgr_t *manager, isc_time_t *now) {
isc_timer_t *timer;
isc_result_t result;
- /*
+ /*!
* The caller must be holding the manager lock.
*/
@@ -783,14 +782,11 @@ isc_timermgr_create(isc_mem_t *mctx, isc_timermgr_t **managerp) {
isc_mem_put(mctx, manager, sizeof(*manager));
return (ISC_R_NOMEMORY);
}
- if (isc_mutex_init(&manager->lock) != ISC_R_SUCCESS) {
+ result = isc_mutex_init(&manager->lock);
+ if (result != ISC_R_SUCCESS) {
isc_heap_destroy(&manager->heap);
isc_mem_put(mctx, manager, sizeof(*manager));
- UNEXPECTED_ERROR(__FILE__, __LINE__,
- "isc_mutex_init() %s",
- isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
- ISC_MSG_FAILED, "failed"));
- return (ISC_R_UNEXPECTED);
+ return (result);
}
isc_mem_attach(mctx, &manager->mctx);
#ifdef ISC_PLATFORM_USETHREADS
diff --git a/contrib/bind9/lib/isc/timer_p.h b/contrib/bind9/lib/isc/timer_p.h
index ad7a5d0..fcc7b6c 100644
--- a/contrib/bind9/lib/isc/timer_p.h
+++ b/contrib/bind9/lib/isc/timer_p.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: timer_p.h,v 1.4.12.3 2004/03/08 09:04:50 marka Exp $ */
+/* $Id: timer_p.h,v 1.6.18.2 2005/04/29 00:16:51 marka Exp $ */
#ifndef ISC_TIMER_P_H
#define ISC_TIMER_P_H
+/*! \file */
+
isc_result_t
isc__timermgr_nextevent(isc_time_t *when);
diff --git a/contrib/bind9/lib/isc/unix/Makefile.in b/contrib/bind9/lib/isc/unix/Makefile.in
index 49845d4..afb77a6 100644
--- a/contrib/bind9/lib/isc/unix/Makefile.in
+++ b/contrib/bind9/lib/isc/unix/Makefile.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.35.2.1.10.2 2004/06/22 02:48:36 marka Exp $
+# $Id: Makefile.in,v 1.38.18.1 2004/06/22 02:54:06 marka Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/lib/isc/unix/app.c b/contrib/bind9/lib/isc/unix/app.c
index 811d67b..59b1f6c 100644
--- a/contrib/bind9/lib/isc/unix/app.c
+++ b/contrib/bind9/lib/isc/unix/app.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: app.c,v 1.43.2.3.8.5 2004/03/08 02:08:05 marka Exp $ */
+/* $Id: app.c,v 1.50.18.2 2005/04/29 00:17:06 marka Exp $ */
+
+/*! \file */
#include <config.h>
@@ -54,7 +56,7 @@ static isc_eventlist_t on_run;
static isc_mutex_t lock;
static isc_boolean_t shutdown_requested = ISC_FALSE;
static isc_boolean_t running = ISC_FALSE;
-/*
+/*!
* We assume that 'want_shutdown' can be read and written atomically.
*/
static isc_boolean_t want_shutdown = ISC_FALSE;
@@ -69,14 +71,14 @@ static pthread_t blockedthread;
#endif /* ISC_PLATFORM_USETHREADS */
#ifdef HAVE_LINUXTHREADS
-/*
+/*!
* Linux has sigwait(), but it appears to prevent signal handlers from
* running, even if they're not in the set being waited for. This makes
* it impossible to get the default actions for SIGILL, SIGSEGV, etc.
* Instead of messing with it, we just use sigsuspend() instead.
*/
#undef HAVE_SIGWAIT
-/*
+/*!
* We need to remember which thread is the main thread...
*/
static pthread_t main_thread;
@@ -291,7 +293,7 @@ isc_app_onrun(isc_mem_t *mctx, isc_task_t *task, isc_taskaction_t action,
}
#ifndef ISC_PLATFORM_USETHREADS
-/*
+/*!
* Event loop for nonthreaded programs.
*/
static isc_result_t
@@ -371,14 +373,14 @@ evloop() {
* is set by isc_condition_signal().
*/
-/*
- * True iff we are currently executing in the recursive
+/*!
+ * \brief True if we are currently executing in the recursive
* event loop.
*/
static isc_boolean_t in_recursive_evloop = ISC_FALSE;
-/*
- * True iff we are exiting the event loop as the result of
+/*!
+ * \brief True if we are exiting the event loop as the result of
* a call to isc_condition_signal() rather than a shutdown
* or reload.
*/
diff --git a/contrib/bind9/lib/isc/unix/dir.c b/contrib/bind9/lib/isc/unix/dir.c
index 85a1217..b627c88 100644
--- a/contrib/bind9/lib/isc/unix/dir.c
+++ b/contrib/bind9/lib/isc/unix/dir.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,9 +15,10 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dir.c,v 1.18.2.1.2.3 2004/03/08 09:04:55 marka Exp $ */
+/* $Id: dir.c,v 1.20.18.3 2005/09/05 00:18:30 marka Exp $ */
-/* Principal Authors: DCL */
+/*! \file
+ * \author Principal Authors: DCL */
#include <config.h>
@@ -50,18 +51,37 @@ isc_dir_init(isc_dir_t *dir) {
dir->magic = ISC_DIR_MAGIC;
}
-/*
- * Allocate workspace and open directory stream. If either one fails,
+/*!
+ * \brief Allocate workspace and open directory stream. If either one fails,
* NULL will be returned.
*/
isc_result_t
isc_dir_open(isc_dir_t *dir, const char *dirname) {
+ char *p;
isc_result_t result = ISC_R_SUCCESS;
REQUIRE(VALID_DIR(dir));
REQUIRE(dirname != NULL);
/*
+ * Copy directory name. Need to have enough space for the name,
+ * a possible path separator, the wildcard, and the final NUL.
+ */
+ if (strlen(dirname) + 3 > sizeof(dir->dirname))
+ /* XXXDCL ? */
+ return (ISC_R_NOSPACE);
+ strcpy(dir->dirname, dirname);
+
+ /*
+ * Append path separator, if needed, and "*".
+ */
+ p = dir->dirname + strlen(dir->dirname);
+ if (dir->dirname < p && *(p - 1) != '/')
+ *p++ = '/';
+ *p++ = '*';
+ *p++ = '\0';
+
+ /*
* Open stream.
*/
dir->handle = opendir(dirname);
@@ -72,8 +92,10 @@ isc_dir_open(isc_dir_t *dir, const char *dirname) {
return (result);
}
-/*
- * Return previously retrieved file or get next one. Unix's dirent has
+/*!
+ * \brief Return previously retrieved file or get next one.
+
+ * Unix's dirent has
* separate open and read functions, but the Win32 and DOS interfaces open
* the dir stream and reads the first file in one operation.
*/
@@ -107,8 +129,8 @@ isc_dir_read(isc_dir_t *dir) {
return (ISC_R_SUCCESS);
}
-/*
- * Close directory stream.
+/*!
+ * \brief Close directory stream.
*/
void
isc_dir_close(isc_dir_t *dir) {
@@ -118,8 +140,8 @@ isc_dir_close(isc_dir_t *dir) {
dir->handle = NULL;
}
-/*
- * Reposition directory stream at start.
+/*!
+ * \brief Reposition directory stream at start.
*/
isc_result_t
isc_dir_reset(isc_dir_t *dir) {
@@ -132,8 +154,8 @@ isc_dir_reset(isc_dir_t *dir) {
isc_result_t
isc_dir_chdir(const char *dirname) {
- /*
- * Change the current directory to 'dirname'.
+ /*!
+ * \brief Change the current directory to 'dirname'.
*/
REQUIRE(dirname != NULL);
@@ -165,8 +187,8 @@ isc_dir_createunique(char *templet) {
REQUIRE(templet != NULL);
- /*
- * mkdtemp is not portable, so this emulates it.
+ /*!
+ * \brief mkdtemp is not portable, so this emulates it.
*/
pid = getpid();
diff --git a/contrib/bind9/lib/isc/unix/entropy.c b/contrib/bind9/lib/isc/unix/entropy.c
index d52849a..4c0d0d0 100644
--- a/contrib/bind9/lib/isc/unix/entropy.c
+++ b/contrib/bind9/lib/isc/unix/entropy.c
@@ -15,10 +15,11 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: entropy.c,v 1.60.2.3.8.14 2006/03/02 23:29:17 marka Exp $ */
+/* $Id: entropy.c,v 1.71.18.7 2006/12/07 04:53:03 marka Exp $ */
-/*
- * This is the system depenedent part of the ISC entropy API.
+/* \file unix/entropy.c
+ * \brief
+ * This is the system dependent part of the ISC entropy API.
*/
#include <config.h>
@@ -41,7 +42,7 @@
#include "errno2result.h"
-/*
+/*%
* There is only one variable in the entropy data structures that is not
* system independent, but pulling the structure that uses it into this file
* ultimately means pulling several other independent structures here also to
@@ -486,8 +487,6 @@ isc_entropy_createfilesource(isc_entropy_t *ent, const char *fname) {
LOCK(&ent->lock);
- source = NULL;
-
if (stat(fname, &_stat) < 0) {
ret = isc__errno2result(errno);
goto errout;
@@ -589,9 +588,6 @@ isc_entropy_createfilesource(isc_entropy_t *ent, const char *fname) {
(void)close(fd);
errout:
- if (source != NULL)
- isc_mem_put(ent->mctx, source, sizeof(isc_entropysource_t));
-
UNLOCK(&ent->lock);
return (ret);
diff --git a/contrib/bind9/lib/isc/unix/errno2result.c b/contrib/bind9/lib/isc/unix/errno2result.c
index 66a4e91..d4b188f 100644
--- a/contrib/bind9/lib/isc/unix/errno2result.c
+++ b/contrib/bind9/lib/isc/unix/errno2result.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: errno2result.c,v 1.8.2.4.8.1 2004/03/06 08:14:59 marka Exp $ */
+/* $Id: errno2result.c,v 1.13.18.2 2005/04/29 00:17:07 marka Exp $ */
+
+/*! \file */
#include <config.h>
@@ -25,7 +27,7 @@
#include "errno2result.h"
-/*
+/*%
* Convert a POSIX errno value into an isc_result_t. The
* list of supported errno values is not complete; new users
* of this function should add any expected errors that are
diff --git a/contrib/bind9/lib/isc/unix/errno2result.h b/contrib/bind9/lib/isc/unix/errno2result.h
index 9a8d07c..5e36116 100644
--- a/contrib/bind9/lib/isc/unix/errno2result.h
+++ b/contrib/bind9/lib/isc/unix/errno2result.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: errno2result.h,v 1.7.206.1 2004/03/06 08:14:59 marka Exp $ */
+/* $Id: errno2result.h,v 1.8.18.2 2005/04/29 00:17:07 marka Exp $ */
#ifndef UNIX_ERRNO2RESULT_H
#define UNIX_ERRNO2RESULT_H 1
+/*! \file */
+
/* XXXDCL this should be moved to lib/isc/include/isc/errno2result.h. */
#include <errno.h> /* Provides errno. */
diff --git a/contrib/bind9/lib/isc/unix/file.c b/contrib/bind9/lib/isc/unix/file.c
index 7ed6272..e45e0fe 100644
--- a/contrib/bind9/lib/isc/unix/file.c
+++ b/contrib/bind9/lib/isc/unix/file.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000-2002 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -48,7 +48,9 @@
* SUCH DAMAGE.
*/
-/* $Id: file.c,v 1.38.12.8 2004/03/16 05:50:25 marka Exp $ */
+/* $Id: file.c,v 1.47.18.2 2005/04/29 00:17:07 marka Exp $ */
+
+/*! \file */
#include <config.h>
@@ -154,7 +156,7 @@ isc_file_settime(const char *file, isc_time_t *time) {
}
#undef TEMPLATE
-#define TEMPLATE "tmp-XXXXXXXXXX" /* 14 characters. */
+#define TEMPLATE "tmp-XXXXXXXXXX" /*%< 14 characters. */
isc_result_t
isc_file_mktemplate(const char *path, char *buf, size_t buflen) {
diff --git a/contrib/bind9/lib/isc/unix/fsaccess.c b/contrib/bind9/lib/isc/unix/fsaccess.c
index 3745ca2..f3ed60f 100644
--- a/contrib/bind9/lib/isc/unix/fsaccess.c
+++ b/contrib/bind9/lib/isc/unix/fsaccess.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2006 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2006 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: fsaccess.c,v 1.6.206.3 2006/08/25 05:25:50 marka Exp $ */
+/* $Id: fsaccess.c,v 1.7.18.4 2006/08/25 05:25:51 marka Exp $ */
#include <config.h>
@@ -26,7 +26,8 @@
#include "errno2result.h"
-/*
+/*! \file
+ * \brief
* The OS-independent part of the API is in lib/isc.
*/
#include "../fsaccess.c"
diff --git a/contrib/bind9/lib/isc/unix/ifiter_getifaddrs.c b/contrib/bind9/lib/isc/unix/ifiter_getifaddrs.c
index ad6e1e0..7e359aa 100644
--- a/contrib/bind9/lib/isc/unix/ifiter_getifaddrs.c
+++ b/contrib/bind9/lib/isc/unix/ifiter_getifaddrs.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,28 +15,33 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ifiter_getifaddrs.c,v 1.2.68.3 2004/03/06 08:14:59 marka Exp $ */
+/* $Id: ifiter_getifaddrs.c,v 1.4.18.2 2005/04/29 00:17:08 marka Exp $ */
-/*
+/*! \file
+ * \brief
* Obtain the list of network interfaces using the getifaddrs(3) library.
*/
#include <ifaddrs.h>
+/*% Iterator Magic */
#define IFITER_MAGIC ISC_MAGIC('I', 'F', 'I', 'G')
+/*% Valid Iterator */
#define VALID_IFITER(t) ISC_MAGIC_VALID(t, IFITER_MAGIC)
+/*% Iterator structure */
struct isc_interfaceiter {
- unsigned int magic; /* Magic number. */
+ unsigned int magic; /*%< Magic number. */
isc_mem_t *mctx;
- void *buf; /* (unused) */
- unsigned int bufsize; /* (always 0) */
- struct ifaddrs *ifaddrs; /* List of ifaddrs */
- struct ifaddrs *pos; /* Ptr to current ifaddr */
- isc_interface_t current; /* Current interface data. */
- isc_result_t result; /* Last result code. */
+ void *buf; /*%< (unused) */
+ unsigned int bufsize; /*%< (always 0) */
+ struct ifaddrs *ifaddrs; /*%< List of ifaddrs */
+ struct ifaddrs *pos; /*%< Ptr to current ifaddr */
+ isc_interface_t current; /*%< Current interface data. */
+ isc_result_t result; /*%< Last result code. */
};
+
isc_result_t
isc_interfaceiter_create(isc_mem_t *mctx, isc_interfaceiter_t **iterp) {
isc_interfaceiter_t *iter;
diff --git a/contrib/bind9/lib/isc/unix/ifiter_ioctl.c b/contrib/bind9/lib/isc/unix/ifiter_ioctl.c
index 68a1365..5ebcef8 100644
--- a/contrib/bind9/lib/isc/unix/ifiter_ioctl.c
+++ b/contrib/bind9/lib/isc/unix/ifiter_ioctl.c
@@ -15,9 +15,10 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ifiter_ioctl.c,v 1.19.2.5.2.19 2006/02/03 23:51:37 marka Exp $ */
+/* $Id: ifiter_ioctl.c,v 1.44.18.11 2006/02/03 23:51:38 marka Exp $ */
-/*
+/*! \file
+ * \brief
* Obtain the list of network interfaces using the SIOCGLIFCONF ioctl.
* See netintro(4).
*/
@@ -93,7 +94,7 @@ struct isc_interfaceiter {
#endif
-/*
+/*%
* Size of buffer for SIOCGLIFCONF, in bytes. We assume no sane system
* will have more than a megabyte of interface configuration data.
*/
diff --git a/contrib/bind9/lib/isc/unix/ifiter_sysctl.c b/contrib/bind9/lib/isc/unix/ifiter_sysctl.c
index b10a2d2..212a478 100644
--- a/contrib/bind9/lib/isc/unix/ifiter_sysctl.c
+++ b/contrib/bind9/lib/isc/unix/ifiter_sysctl.c
@@ -15,9 +15,10 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ifiter_sysctl.c,v 1.14.12.9 2005/03/17 03:58:33 marka Exp $ */
+/* $Id: ifiter_sysctl.c,v 1.20.18.3 2005/04/27 05:02:35 sra Exp $ */
-/*
+/*! \file
+ * \brief
* Obtain the list of network interfaces using sysctl.
* See TCP/IP Illustrated Volume 2, sections 19.8, 19.14,
* and 19.16.
diff --git a/contrib/bind9/lib/isc/unix/include/Makefile.in b/contrib/bind9/lib/isc/unix/include/Makefile.in
index 5a06022..78eba44 100644
--- a/contrib/bind9/lib/isc/unix/include/Makefile.in
+++ b/contrib/bind9/lib/isc/unix/include/Makefile.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.11.206.1 2004/03/06 08:15:03 marka Exp $
+# $Id: Makefile.in,v 1.12 2004/03/05 05:11:50 marka Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/lib/isc/unix/include/isc/Makefile.in b/contrib/bind9/lib/isc/unix/include/isc/Makefile.in
index 4c5bae2..9599f7c 100644
--- a/contrib/bind9/lib/isc/unix/include/isc/Makefile.in
+++ b/contrib/bind9/lib/isc/unix/include/isc/Makefile.in
@@ -13,7 +13,7 @@
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
-# $Id: Makefile.in,v 1.27.206.1 2004/03/06 08:15:03 marka Exp $
+# $Id: Makefile.in,v 1.28 2004/03/05 05:11:52 marka Exp $
srcdir = @srcdir@
VPATH = @srcdir@
diff --git a/contrib/bind9/lib/isc/unix/include/isc/dir.h b/contrib/bind9/lib/isc/unix/include/isc/dir.h
index 53b51df..cc85706 100644
--- a/contrib/bind9/lib/isc/unix/include/isc/dir.h
+++ b/contrib/bind9/lib/isc/unix/include/isc/dir.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,13 +15,15 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: dir.h,v 1.15.12.3 2004/03/08 09:04:57 marka Exp $ */
+/* $Id: dir.h,v 1.17.18.2 2005/04/29 00:17:09 marka Exp $ */
/* Principal Authors: DCL */
#ifndef ISC_DIR_H
#define ISC_DIR_H 1
+/*! \file */
+
#include <sys/types.h> /* Required on some systems. */
#include <dirent.h>
@@ -31,8 +33,9 @@
#define ISC_DIR_NAMEMAX 256
#define ISC_DIR_PATHMAX 1024
+/*% Directory Entry */
typedef struct isc_direntry {
- /*
+ /*!
* Ideally, this should be NAME_MAX, but AIX does not define it by
* default and dynamically allocating the space based on pathconf()
* complicates things undesirably, as does adding special conditionals
@@ -42,9 +45,10 @@ typedef struct isc_direntry {
unsigned int length;
} isc_direntry_t;
+/*% Directory */
typedef struct isc_dir {
unsigned int magic;
- /*
+ /*!
* As with isc_direntry_t->name, making this "right" for all systems
* is slightly problematic because AIX does not define PATH_MAX.
*/
@@ -78,7 +82,7 @@ isc_dir_chroot(const char *dirname);
isc_result_t
isc_dir_createunique(char *templet);
-/*
+/*!<
* Use a templet (such as from isc_file_mktemplate()) to create a uniquely
* named, empty directory. The templet string is modified in place.
* If result == ISC_R_SUCCESS, it is the name of the directory that was
diff --git a/contrib/bind9/lib/isc/unix/include/isc/int.h b/contrib/bind9/lib/isc/unix/include/isc/int.h
index be36ccb..1e1de7b 100644
--- a/contrib/bind9/lib/isc/unix/include/isc/int.h
+++ b/contrib/bind9/lib/isc/unix/include/isc/int.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: int.h,v 1.11.206.1 2004/03/06 08:15:04 marka Exp $ */
+/* $Id: int.h,v 1.12.18.2 2005/04/29 00:17:09 marka Exp $ */
#ifndef ISC_INT_H
#define ISC_INT_H 1
+/*! \file */
+
typedef char isc_int8_t;
typedef unsigned char isc_uint8_t;
typedef short isc_int16_t;
@@ -37,7 +39,7 @@ typedef unsigned long long isc_uint64_t;
#define ISC_INT16_MAX 32767
#define ISC_UINT16_MAX 65535
-/*
+/*%
* Note that "int" is 32 bits on all currently supported Unix-like operating
* systems, but "long" can be either 32 bits or 64 bits, thus the 32 bit
* constants are not qualified with "L".
diff --git a/contrib/bind9/lib/isc/unix/include/isc/keyboard.h b/contrib/bind9/lib/isc/unix/include/isc/keyboard.h
index 31005b1..4b28cc0 100644
--- a/contrib/bind9/lib/isc/unix/include/isc/keyboard.h
+++ b/contrib/bind9/lib/isc/unix/include/isc/keyboard.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: keyboard.h,v 1.6.206.1 2004/03/06 08:15:04 marka Exp $ */
+/* $Id: keyboard.h,v 1.7.18.2 2005/04/29 00:17:09 marka Exp $ */
#ifndef ISC_KEYBOARD_H
#define ISC_KEYBOARD_H 1
+/*! \file */
+
#include <termios.h>
#include <isc/lang.h>
diff --git a/contrib/bind9/lib/isc/unix/include/isc/net.h b/contrib/bind9/lib/isc/unix/include/isc/net.h
index f1a015f..bdd8c14 100644
--- a/contrib/bind9/lib/isc/unix/include/isc/net.h
+++ b/contrib/bind9/lib/isc/unix/include/isc/net.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: net.h,v 1.31.2.2.10.8 2004/04/29 01:31:23 marka Exp $ */
+/* $Id: net.h,v 1.39.18.4 2005/04/27 05:02:37 sra Exp $ */
#ifndef ISC_NET_H
#define ISC_NET_H 1
@@ -24,19 +24,20 @@
***** Module Info
*****/
-/*
+/*! \file
+ * \brief
* Basic Networking Types
*
* This module is responsible for defining the following basic networking
* types:
*
- * struct in_addr
- * struct in6_addr
- * struct in6_pktinfo
- * struct sockaddr
- * struct sockaddr_in
- * struct sockaddr_in6
- * in_port_t
+ *\li struct in_addr
+ *\li struct in6_addr
+ *\li struct in6_pktinfo
+ *\li struct sockaddr
+ *\li struct sockaddr_in
+ *\li struct sockaddr_in6
+ *\li in_port_t
*
* It ensures that the AF_ and PF_ macros are defined.
*
@@ -44,27 +45,27 @@
*
* It declares inet_aton(), inet_ntop(), and inet_pton().
*
- * It ensures that INADDR_LOOPBACK, INADDR_ANY, IN6ADDR_ANY_INIT,
+ * It ensures that #INADDR_LOOPBACK, #INADDR_ANY, #IN6ADDR_ANY_INIT,
* in6addr_any, and in6addr_loopback are available.
*
* It ensures that IN_MULTICAST() is available to check for multicast
* addresses.
*
* MP:
- * No impact.
+ *\li No impact.
*
* Reliability:
- * No anticipated impact.
+ *\li No anticipated impact.
*
* Resources:
- * N/A.
+ *\li N/A.
*
* Security:
- * No anticipated impact.
+ *\li No anticipated impact.
*
* Standards:
- * BSD Socket API
- * RFC 2553
+ *\li BSD Socket API
+ *\li RFC2553
*/
/***
@@ -94,19 +95,19 @@
#include <isc/types.h>
#ifdef ISC_PLATFORM_HAVEINADDR6
-#define in6_addr in_addr6 /* Required for pre RFC2133 implementations. */
+#define in6_addr in_addr6 /*%< Required for pre RFC2133 implementations. */
#endif
#ifdef ISC_PLATFORM_HAVEIPV6
-/*
+#ifndef IN6ADDR_ANY_INIT
+#ifdef s6_addr
+/*%
* Required for some pre RFC2133 implementations.
* IN6ADDR_ANY_INIT and IN6ADDR_LOOPBACK_INIT were added in
* draft-ietf-ipngwg-bsd-api-04.txt or draft-ietf-ipngwg-bsd-api-05.txt.
* If 's6_addr' is defined then assume that there is a union and three
* levels otherwise assume two levels required.
*/
-#ifndef IN6ADDR_ANY_INIT
-#ifdef s6_addr
#define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }
#else
#define IN6ADDR_ANY_INIT { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } }
@@ -115,6 +116,7 @@
#ifndef IN6ADDR_LOOPBACK_INIT
#ifdef s6_addr
+/*% IPv6 address loopback init */
#define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
#else
#define IN6ADDR_LOOPBACK_INIT { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } }
@@ -122,12 +124,14 @@
#endif
#ifndef IN6_IS_ADDR_V4MAPPED
+/*% Is IPv6 address V4 mapped? */
#define IN6_IS_ADDR_V4MAPPED(x) \
(memcmp((x)->s6_addr, in6addr_any.s6_addr, 10) == 0 && \
(x)->s6_addr[10] == 0xff && (x)->s6_addr[11] == 0xff)
#endif
#ifndef IN6_IS_ADDR_V4COMPAT
+/*% Is IPv6 address V4 compatible? */
#define IN6_IS_ADDR_V4COMPAT(x) \
(memcmp((x)->s6_addr, in6addr_any.s6_addr, 12) == 0 && \
((x)->s6_addr[12] != 0 || (x)->s6_addr[13] != 0 || \
@@ -136,50 +140,58 @@
#endif
#ifndef IN6_IS_ADDR_MULTICAST
+/*% Is IPv6 address multicast? */
#define IN6_IS_ADDR_MULTICAST(a) ((a)->s6_addr[0] == 0xff)
#endif
#ifndef IN6_IS_ADDR_LINKLOCAL
+/*% Is IPv6 address linklocal? */
#define IN6_IS_ADDR_LINKLOCAL(a) \
(((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80))
#endif
#ifndef IN6_IS_ADDR_SITELOCAL
+/*% is IPv6 address sitelocal? */
#define IN6_IS_ADDR_SITELOCAL(a) \
(((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0))
#endif
#ifndef IN6_IS_ADDR_LOOPBACK
+/*% is IPv6 address loopback? */
#define IN6_IS_ADDR_LOOPBACK(x) \
(memcmp((x)->s6_addr, in6addr_loopback.s6_addr, 16) == 0)
#endif
#endif
#ifndef AF_INET6
+/*% IPv6 */
#define AF_INET6 99
#endif
#ifndef PF_INET6
+/*% IPv6 */
#define PF_INET6 AF_INET6
#endif
#ifndef INADDR_LOOPBACK
+/*% inaddr loopback */
#define INADDR_LOOPBACK 0x7f000001UL
#endif
#ifndef ISC_PLATFORM_HAVEIN6PKTINFO
+/*% IPv6 packet info */
struct in6_pktinfo {
- struct in6_addr ipi6_addr; /* src/dst IPv6 address */
- unsigned int ipi6_ifindex; /* send/recv interface index */
+ struct in6_addr ipi6_addr; /*%< src/dst IPv6 address */
+ unsigned int ipi6_ifindex; /*%< send/recv interface index */
};
#endif
-/*
- * Cope with a missing in6addr_any and in6addr_loopback.
- */
#if defined(ISC_PLATFORM_HAVEIPV6) && defined(ISC_PLATFORM_NEEDIN6ADDRANY)
extern const struct in6_addr isc_net_in6addrany;
+/*%
+ * Cope with a missing in6addr_any and in6addr_loopback.
+ */
#define in6addr_any isc_net_in6addrany
#endif
@@ -188,11 +200,12 @@ extern const struct in6_addr isc_net_in6addrloop;
#define in6addr_loopback isc_net_in6addrloop
#endif
-/*
- * Fix UnixWare 7.1.1's broken IN6_IS_ADDR_* definitions.
- */
#ifdef ISC_PLATFORM_FIXIN6ISADDR
#undef IN6_IS_ADDR_GEOGRAPHIC
+/*!
+ * \brief
+ * Fix UnixWare 7.1.1's broken IN6_IS_ADDR_* definitions.
+ */
#define IN6_IS_ADDR_GEOGRAPHIC(a) (((a)->S6_un.S6_l[0] & 0xE0) == 0x80)
#undef IN6_IS_ADDR_IPX
#define IN6_IS_ADDR_IPX(a) (((a)->S6_un.S6_l[0] & 0xFE) == 0x04)
@@ -208,24 +221,26 @@ extern const struct in6_addr isc_net_in6addrloop;
#define IN6_IS_ADDR_SITELOCAL(a) (((a)->S6_un.S6_l[0] & 0xC0FF) == 0xC0FE)
#endif /* ISC_PLATFORM_FIXIN6ISADDR */
-/*
+#ifdef ISC_PLATFORM_NEEDPORTT
+/*%
* Ensure type in_port_t is defined.
*/
-#ifdef ISC_PLATFORM_NEEDPORTT
typedef isc_uint16_t in_port_t;
#endif
-/*
+#ifndef MSG_TRUNC
+/*%
* If this system does not have MSG_TRUNC (as returned from recvmsg())
* ISC_PLATFORM_RECVOVERFLOW will be defined. This will enable the MSG_TRUNC
* faking code in socket.c.
*/
-#ifndef MSG_TRUNC
#define ISC_PLATFORM_RECVOVERFLOW
#endif
+/*% IP address. */
#define ISC__IPADDR(x) ((isc_uint32_t)htonl((isc_uint32_t)(x)))
+/*% Is IP address multicast? */
#define ISC_IPADDR_ISMULTICAST(i) \
(((isc_uint32_t)(i) & ISC__IPADDR(0xf0000000)) \
== ISC__IPADDR(0xe0000000))
@@ -242,40 +257,40 @@ ISC_LANG_BEGINDECLS
isc_result_t
isc_net_probeipv4(void);
-/*
+/*%<
* Check if the system's kernel supports IPv4.
*
* Returns:
*
- * ISC_R_SUCCESS IPv4 is supported.
- * ISC_R_NOTFOUND IPv4 is not supported.
- * ISC_R_DISABLED IPv4 is disabled.
- * ISC_R_UNEXPECTED
+ *\li #ISC_R_SUCCESS IPv4 is supported.
+ *\li #ISC_R_NOTFOUND IPv4 is not supported.
+ *\li #ISC_R_DISABLED IPv4 is disabled.
+ *\li #ISC_R_UNEXPECTED
*/
isc_result_t
isc_net_probeipv6(void);
-/*
+/*%<
* Check if the system's kernel supports IPv6.
*
* Returns:
*
- * ISC_R_SUCCESS IPv6 is supported.
- * ISC_R_NOTFOUND IPv6 is not supported.
- * ISC_R_DISABLED IPv6 is disabled.
- * ISC_R_UNEXPECTED
+ *\li #ISC_R_SUCCESS IPv6 is supported.
+ *\li #ISC_R_NOTFOUND IPv6 is not supported.
+ *\li #ISC_R_DISABLED IPv6 is disabled.
+ *\li #ISC_R_UNEXPECTED
*/
isc_result_t
isc_net_probe_ipv6only(void);
-/*
+/*%<
* Check if the system's kernel supports the IPV6_V6ONLY socket option.
*
* Returns:
*
- * ISC_R_SUCCESS the option is supported for both TCP and UDP.
- * ISC_R_NOTFOUND IPv6 itself or the option is not supported.
- * ISC_R_UNEXPECTED
+ *\li #ISC_R_SUCCESS the option is supported for both TCP and UDP.
+ *\li #ISC_R_NOTFOUND IPv6 itself or the option is not supported.
+ *\li #ISC_R_UNEXPECTED
*/
isc_result_t
@@ -286,9 +301,9 @@ isc_net_probe_ipv6pktinfo(void);
*
* Returns:
*
- * ISC_R_SUCCESS the option is supported.
- * ISC_R_NOTFOUND IPv6 itself or the option is not supported.
- * ISC_R_UNEXPECTED
+ * \li #ISC_R_SUCCESS the option is supported.
+ * \li #ISC_R_NOTFOUND IPv6 itself or the option is not supported.
+ * \li #ISC_R_UNEXPECTED
*/
void
@@ -303,6 +318,12 @@ isc_net_enableipv4(void);
void
isc_net_enableipv6(void);
+isc_result_t
+isc_net_probeunix(void);
+/*
+ * Returns whether UNIX domain sockets are supported.
+ */
+
#ifdef ISC_PLATFORM_NEEDNTOP
const char *
isc_net_ntop(int af, const void *src, char *dst, size_t size);
diff --git a/contrib/bind9/lib/isc/unix/include/isc/netdb.h b/contrib/bind9/lib/isc/unix/include/isc/netdb.h
index beb9137..428f087 100644
--- a/contrib/bind9/lib/isc/unix/include/isc/netdb.h
+++ b/contrib/bind9/lib/isc/unix/include/isc/netdb.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: netdb.h,v 1.6.206.1 2004/03/06 08:15:04 marka Exp $ */
+/* $Id: netdb.h,v 1.7.18.2 2005/04/29 00:17:10 marka Exp $ */
#ifndef ISC_NETDB_H
#define ISC_NETDB_H 1
@@ -24,25 +24,26 @@
***** Module Info
*****/
-/*
+/*! \file
+ * \brief
* Portable netdb.h support.
*
* This module is responsible for defining the get<x>by<y> APIs.
*
* MP:
- * No impact.
+ *\li No impact.
*
* Reliability:
- * No anticipated impact.
+ *\li No anticipated impact.
*
* Resources:
- * N/A.
+ *\li N/A.
*
* Security:
- * No anticipated impact.
+ *\li No anticipated impact.
*
* Standards:
- * BSD API
+ *\li BSD API
*/
/***
diff --git a/contrib/bind9/lib/isc/unix/include/isc/offset.h b/contrib/bind9/lib/isc/unix/include/isc/offset.h
index 0ea1362..15fbad4 100644
--- a/contrib/bind9/lib/isc/unix/include/isc/offset.h
+++ b/contrib/bind9/lib/isc/unix/include/isc/offset.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,12 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: offset.h,v 1.10.206.1 2004/03/06 08:15:04 marka Exp $ */
+/* $Id: offset.h,v 1.11.18.2 2005/04/29 00:17:10 marka Exp $ */
#ifndef ISC_OFFSET_H
#define ISC_OFFSET_H 1
-/*
+/*! \file
+ * \brief
* File offsets are operating-system dependent.
*/
#include <limits.h> /* Required for CHAR_BIT. */
@@ -28,7 +29,7 @@
typedef off_t isc_offset_t;
-/*
+/*%
* POSIX says "Additionally, blkcnt_t and off_t are extended signed integral
* types", so the maximum value is all 1s except for the high bit.
* This definition is more complex than it really needs to be because it was
diff --git a/contrib/bind9/lib/isc/unix/include/isc/stat.h b/contrib/bind9/lib/isc/unix/include/isc/stat.h
index 4304208..d1b2489 100644
--- a/contrib/bind9/lib/isc/unix/include/isc/stat.h
+++ b/contrib/bind9/lib/isc/unix/include/isc/stat.h
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
- * Copyright (C) 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -15,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: stat.h,v 1.1.2.1.4.1 2004/03/06 08:15:05 marka Exp $ */
+/* $Id: stat.h,v 1.2.18.1 2004/08/19 04:42:54 marka Exp $ */
#ifndef ISC_STAT_H
#define ISC_STAT_H 1
diff --git a/contrib/bind9/lib/isc/unix/include/isc/stdtime.h b/contrib/bind9/lib/isc/unix/include/isc/stdtime.h
index 9b855c7..24a91d2 100644
--- a/contrib/bind9/lib/isc/unix/include/isc/stdtime.h
+++ b/contrib/bind9/lib/isc/unix/include/isc/stdtime.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,31 +15,44 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: stdtime.h,v 1.8.206.1 2004/03/06 08:15:05 marka Exp $ */
+/* $Id: stdtime.h,v 1.9.18.3 2005/06/04 06:23:45 jinmei Exp $ */
#ifndef ISC_STDTIME_H
#define ISC_STDTIME_H 1
+/*! \file */
+
#include <isc/lang.h>
#include <isc/int.h>
-/*
+/*%
* It's public information that 'isc_stdtime_t' is an unsigned integral type.
* Applications that want maximum portability should not assume anything
* about its size.
*/
typedef isc_uint32_t isc_stdtime_t;
+/*
+ * isc_stdtime32_t is a 32-bit version of isc_stdtime_t. A variable of this
+ * type should only be used as an opaque integer (e.g.,) to compare two
+ * time values.
+ */
+typedef isc_uint32_t isc_stdtime32_t;
ISC_LANG_BEGINDECLS
-
+/* */
void
isc_stdtime_get(isc_stdtime_t *t);
-/*
+/*%<
* Set 't' to the number of seconds since 00:00:00 UTC, January 1, 1970.
*
* Requires:
*
- * 't' is a valid pointer.
+ *\li 't' is a valid pointer.
+ */
+
+#define isc_stdtime_convert32(t, t32p) (*(t32p) = t)
+/*
+ * Convert the standard time to its 32-bit version.
*/
ISC_LANG_ENDDECLS
diff --git a/contrib/bind9/lib/isc/unix/include/isc/strerror.h b/contrib/bind9/lib/isc/unix/include/isc/strerror.h
index f51fbdc..fb2e8a4 100644
--- a/contrib/bind9/lib/isc/unix/include/isc/strerror.h
+++ b/contrib/bind9/lib/isc/unix/include/isc/strerror.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,20 +15,23 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: strerror.h,v 1.2.12.3 2004/03/08 09:04:57 marka Exp $ */
+/* $Id: strerror.h,v 1.4.18.2 2005/04/29 00:17:10 marka Exp $ */
#ifndef ISC_STRERROR_H
#define ISC_STRERROR_H
+/*! \file */
+
#include <sys/types.h>
#include <isc/lang.h>
ISC_LANG_BEGINDECLS
+/*% String Error Size */
#define ISC_STRERRORSIZE 128
-/*
+/*%
* Provide a thread safe wrapper to strerrror().
*
* Requires:
diff --git a/contrib/bind9/lib/isc/unix/include/isc/syslog.h b/contrib/bind9/lib/isc/unix/include/isc/syslog.h
index 2c0625e..08adca1 100644
--- a/contrib/bind9/lib/isc/unix/include/isc/syslog.h
+++ b/contrib/bind9/lib/isc/unix/include/isc/syslog.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: syslog.h,v 1.2.206.1 2004/03/06 08:15:05 marka Exp $ */
+/* $Id: syslog.h,v 1.3.18.2 2005/04/29 00:17:10 marka Exp $ */
#ifndef ISC_SYSLOG_H
#define ISC_SYSLOG_H 1
+/*! \file */
+
#include <isc/lang.h>
#include <isc/types.h>
@@ -27,17 +29,17 @@ ISC_LANG_BEGINDECLS
isc_result_t
isc_syslog_facilityfromstring(const char *str, int *facilityp);
-/*
+/*%<
* Convert 'str' to the appropriate syslog facility constant.
*
* Requires:
*
- * 'str' is not NULL
- * 'facilityp' is not NULL
+ *\li 'str' is not NULL
+ *\li 'facilityp' is not NULL
*
* Returns:
- * ISC_R_SUCCESS
- * ISC_R_NOTFOUND
+ * \li #ISC_R_SUCCESS
+ * \li #ISC_R_NOTFOUND
*/
ISC_LANG_ENDDECLS
diff --git a/contrib/bind9/lib/isc/unix/include/isc/time.h b/contrib/bind9/lib/isc/unix/include/isc/time.h
index 6021c13..6579439 100644
--- a/contrib/bind9/lib/isc/unix/include/isc/time.h
+++ b/contrib/bind9/lib/isc/unix/include/isc/time.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: time.h,v 1.25.2.1.10.4 2004/03/08 09:04:58 marka Exp $ */
+/* $Id: time.h,v 1.30.18.2 2005/04/29 00:17:10 marka Exp $ */
#ifndef ISC_TIME_H
#define ISC_TIME_H 1
+/*! \file */
+
#include <isc/lang.h>
#include <isc/types.h>
@@ -27,7 +29,8 @@
*** Intervals
***/
-/*
+/*!
+ * \brief
* The contents of this structure are private, and MUST NOT be accessed
* directly by callers.
*
@@ -45,32 +48,32 @@ ISC_LANG_BEGINDECLS
void
isc_interval_set(isc_interval_t *i,
unsigned int seconds, unsigned int nanoseconds);
-/*
+/*%<
* Set 'i' to a value representing an interval of 'seconds' seconds and
* 'nanoseconds' nanoseconds, suitable for use in isc_time_add() and
* isc_time_subtract().
*
* Requires:
*
- * 't' is a valid pointer.
- * nanoseconds < 1000000000.
+ *\li 't' is a valid pointer.
+ *\li nanoseconds < 1000000000.
*/
isc_boolean_t
isc_interval_iszero(const isc_interval_t *i);
-/*
+/*%<
* Returns ISC_TRUE iff. 'i' is the zero interval.
*
* Requires:
*
- * 'i' is a valid pointer.
+ *\li 'i' is a valid pointer.
*/
/***
*** Absolute Times
***/
-/*
+/*%
* The contents of this structure are private, and MUST NOT be accessed
* directly by callers.
*
@@ -86,116 +89,118 @@ extern isc_time_t *isc_time_epoch;
void
isc_time_set(isc_time_t *t, unsigned int seconds, unsigned int nanoseconds);
-/*
+/*%<
* Set 't' to a particular number of seconds + nanoseconds since the epoch.
*
* Notes:
- * This call is equivalent to:
- *
+ *\li This call is equivalent to:
+ *\code
* isc_time_settoepoch(t);
* isc_interval_set(i, seconds, nanoseconds);
* isc_time_add(t, i, t);
- *
+ *\endcode
* Requires:
- * 't' is a valid pointer.
- * nanoseconds < 1000000000.
+ *\li 't' is a valid pointer.
+ *\li nanoseconds < 1000000000.
*/
void
isc_time_settoepoch(isc_time_t *t);
-/*
+/*%<
* Set 't' to the time of the epoch.
*
* Notes:
- * The date of the epoch is platform-dependent.
+ * \li The date of the epoch is platform-dependent.
*
* Requires:
*
- * 't' is a valid pointer.
+ *\li 't' is a valid pointer.
*/
isc_boolean_t
isc_time_isepoch(const isc_time_t *t);
-/*
+/*%<
* Returns ISC_TRUE iff. 't' is the epoch ("time zero").
*
* Requires:
*
- * 't' is a valid pointer.
+ *\li 't' is a valid pointer.
*/
isc_result_t
isc_time_now(isc_time_t *t);
-/*
+/*%<
* Set 't' to the current absolute time.
*
* Requires:
*
- * 't' is a valid pointer.
+ *\li 't' is a valid pointer.
*
* Returns:
*
- * Success
- * Unexpected error
+ *\li Success
+ *\li Unexpected error
* Getting the time from the system failed.
- * Out of range
+ *\li Out of range
* The time from the system is too large to be represented
* in the current definition of isc_time_t.
*/
isc_result_t
isc_time_nowplusinterval(isc_time_t *t, const isc_interval_t *i);
-/*
+/*%<
* Set *t to the current absolute time + i.
*
* Note:
- * This call is equivalent to:
+ *\li This call is equivalent to:
*
+ *\code
* isc_time_now(t);
* isc_time_add(t, i, t);
+ *\endcode
*
* Requires:
*
- * 't' and 'i' are valid pointers.
+ *\li 't' and 'i' are valid pointers.
*
* Returns:
*
- * Success
- * Unexpected error
+ *\li Success
+ *\li Unexpected error
* Getting the time from the system failed.
- * Out of range
+ *\li Out of range
* The interval added to the time from the system is too large to
* be represented in the current definition of isc_time_t.
*/
int
isc_time_compare(const isc_time_t *t1, const isc_time_t *t2);
-/*
+/*%<
* Compare the times referenced by 't1' and 't2'
*
* Requires:
*
- * 't1' and 't2' are valid pointers.
+ *\li 't1' and 't2' are valid pointers.
*
* Returns:
*
- * -1 t1 < t2 (comparing times, not pointers)
- * 0 t1 = t2
- * 1 t1 > t2
+ *\li -1 t1 < t2 (comparing times, not pointers)
+ *\li 0 t1 = t2
+ *\li 1 t1 > t2
*/
isc_result_t
isc_time_add(const isc_time_t *t, const isc_interval_t *i, isc_time_t *result);
-/*
+/*%<
* Add 'i' to 't', storing the result in 'result'.
*
* Requires:
*
- * 't', 'i', and 'result' are valid pointers.
+ *\li 't', 'i', and 'result' are valid pointers.
*
* Returns:
- * Success
- * Out of range
+ * \li Success
+ *\li Out of range
* The interval added to the time is too large to
* be represented in the current definition of isc_time_t.
*/
@@ -203,50 +208,50 @@ isc_time_add(const isc_time_t *t, const isc_interval_t *i, isc_time_t *result);
isc_result_t
isc_time_subtract(const isc_time_t *t, const isc_interval_t *i,
isc_time_t *result);
-/*
+/*%<
* Subtract 'i' from 't', storing the result in 'result'.
*
* Requires:
*
- * 't', 'i', and 'result' are valid pointers.
+ *\li 't', 'i', and 'result' are valid pointers.
*
* Returns:
- * Success
- * Out of range
+ *\li Success
+ *\li Out of range
* The interval is larger than the time since the epoch.
*/
isc_uint64_t
isc_time_microdiff(const isc_time_t *t1, const isc_time_t *t2);
-/*
+/*%<
* Find the difference in microseconds between time t1 and time t2.
* t2 is the subtrahend of t1; ie, difference = t1 - t2.
*
* Requires:
*
- * 't1' and 't2' are valid pointers.
+ *\li 't1' and 't2' are valid pointers.
*
* Returns:
- * The difference of t1 - t2, or 0 if t1 <= t2.
+ *\li The difference of t1 - t2, or 0 if t1 <= t2.
*/
isc_uint32_t
isc_time_seconds(const isc_time_t *t);
-/*
+/*%<
* Return the number of seconds since the epoch stored in a time structure.
*
* Requires:
*
- * 't' is a valid pointer.
+ *\li 't' is a valid pointer.
*/
isc_result_t
isc_time_secondsastimet(const isc_time_t *t, time_t *secondsp);
-/*
+/*%<
* Ensure the number of seconds in an isc_time_t is representable by a time_t.
*
* Notes:
- * The number of seconds stored in an isc_time_t might be larger
+ *\li The number of seconds stored in an isc_time_t might be larger
* than the number of seconds a time_t is able to handle. Since
* time_t is mostly opaque according to the ANSI/ISO standard
* (essentially, all you can be sure of is that it is an arithmetic type,
@@ -256,41 +261,41 @@ isc_time_secondsastimet(const isc_time_t *t, time_t *secondsp);
* time_t from an isc_time_t.
*
* Requires:
- * 't' is a valid pointer.
+ *\li 't' is a valid pointer.
*
* Returns:
- * Success
- * Out of range
+ *\li Success
+ *\li Out of range
*/
isc_uint32_t
isc_time_nanoseconds(const isc_time_t *t);
-/*
+/*%<
* Return the number of nanoseconds stored in a time structure.
*
* Notes:
- * This is the number of nanoseconds in excess of the the number
+ *\li This is the number of nanoseconds in excess of the the number
* of seconds since the epoch; it will always be less than one
* full second.
*
* Requires:
- * 't' is a valid pointer.
+ *\li 't' is a valid pointer.
*
* Ensures:
- * The returned value is less than 1*10^9.
+ *\li The returned value is less than 1*10^9.
*/
void
isc_time_formattimestamp(const isc_time_t *t, char *buf, unsigned int len);
-/*
+/*%<
* Format the time 't' into the buffer 'buf' of length 'len',
* using a format like "30-Aug-2000 04:06:47.997" and the local time zone.
* If the text does not fit in the buffer, the result is indeterminate,
* but is always guaranteed to be null terminated.
*
* Requires:
- * 'len' > 0
- * 'buf' points to an array of at least len chars
+ *\li 'len' > 0
+ * \li 'buf' points to an array of at least len chars
*
*/
diff --git a/contrib/bind9/lib/isc/unix/interfaceiter.c b/contrib/bind9/lib/isc/unix/interfaceiter.c
index 9520bdeb..72ecdd2 100644
--- a/contrib/bind9/lib/isc/unix/interfaceiter.c
+++ b/contrib/bind9/lib/isc/unix/interfaceiter.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: interfaceiter.c,v 1.22.2.1.10.14 2004/08/28 06:25:22 marka Exp $ */
+/* $Id: interfaceiter.c,v 1.35.18.5 2005/04/29 00:17:08 marka Exp $ */
+
+/*! \file */
#include <config.h>
@@ -51,9 +53,9 @@
/* Common utility functions */
-/*
+/*%
* Extract the network address part from a "struct sockaddr".
- *
+ * \brief
* The address family is given explicitly
* instead of using src->sa_family, because the latter does not work
* for copying a network mask obtained by SIOCGIFNETMASK (it does
diff --git a/contrib/bind9/lib/isc/unix/ipv6.c b/contrib/bind9/lib/isc/unix/ipv6.c
index f11262f..3066e0c 100644
--- a/contrib/bind9/lib/isc/unix/ipv6.c
+++ b/contrib/bind9/lib/isc/unix/ipv6.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2006 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2006 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1999-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: ipv6.c,v 1.7.206.3 2006/08/25 05:25:50 marka Exp $ */
+/* $Id: ipv6.c,v 1.8.18.4 2006/08/25 05:25:51 marka Exp $ */
+
+/*! \file */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/unix/keyboard.c b/contrib/bind9/lib/isc/unix/keyboard.c
index 146338a..db56b3c 100644
--- a/contrib/bind9/lib/isc/unix/keyboard.c
+++ b/contrib/bind9/lib/isc/unix/keyboard.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: keyboard.c,v 1.9.12.3 2004/03/08 09:04:56 marka Exp $ */
+/* $Id: keyboard.c,v 1.11 2004/03/05 05:11:46 marka Exp $ */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/unix/net.c b/contrib/bind9/lib/isc/unix/net.c
index e0aeccb..6169c2b 100644
--- a/contrib/bind9/lib/isc/unix/net.c
+++ b/contrib/bind9/lib/isc/unix/net.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: net.c,v 1.22.2.2.10.9 2005/03/17 03:58:33 marka Exp $ */
+/* $Id: net.c,v 1.29.18.4 2005/03/16 01:22:50 marka Exp $ */
#include <config.h>
@@ -43,6 +43,7 @@ static isc_once_t once_ipv6only = ISC_ONCE_INIT;
static isc_once_t once_ipv6pktinfo = ISC_ONCE_INIT;
static isc_result_t ipv4_result = ISC_R_NOTFOUND;
static isc_result_t ipv6_result = ISC_R_NOTFOUND;
+static isc_result_t unix_result = ISC_R_NOTFOUND;
static isc_result_t ipv6only_result = ISC_R_NOTFOUND;
static isc_result_t ipv6pktinfo_result = ISC_R_NOTFOUND;
@@ -137,6 +138,9 @@ initialize_action(void) {
#endif
#endif
#endif
+#ifdef ISC_PLATFORM_HAVESYSUNH
+ unix_result = try_proto(PF_UNIX);
+#endif
}
static void
@@ -156,6 +160,12 @@ isc_net_probeipv6(void) {
return (ipv6_result);
}
+isc_result_t
+isc_net_probeunix(void) {
+ initialize();
+ return (unix_result);
+}
+
#ifdef ISC_PLATFORM_HAVEIPV6
#ifdef WANT_IPV6
static void
diff --git a/contrib/bind9/lib/isc/unix/os.c b/contrib/bind9/lib/isc/unix/os.c
index 4d34d8c..6bbf059 100644
--- a/contrib/bind9/lib/isc/unix/os.c
+++ b/contrib/bind9/lib/isc/unix/os.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: os.c,v 1.11.12.6 2005/10/14 02:13:07 marka Exp $ */
+/* $Id: os.c,v 1.13.18.3 2005/10/14 02:13:08 marka Exp $ */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/unix/resource.c b/contrib/bind9/lib/isc/unix/resource.c
index b6faf32..703ec27 100644
--- a/contrib/bind9/lib/isc/unix/resource.c
+++ b/contrib/bind9/lib/isc/unix/resource.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: resource.c,v 1.11.206.1 2004/03/06 08:15:01 marka Exp $ */
+/* $Id: resource.c,v 1.12 2004/03/05 05:11:46 marka Exp $ */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/unix/socket.c b/contrib/bind9/lib/isc/unix/socket.c
index f95e3c8..6b4c34c 100644
--- a/contrib/bind9/lib/isc/unix/socket.c
+++ b/contrib/bind9/lib/isc/unix/socket.c
@@ -15,13 +15,19 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: socket.c,v 1.207.2.19.2.26 2006/05/19 02:53:36 marka Exp $ */
+/* $Id: socket.c,v 1.237.18.24 2006/06/06 00:56:09 marka Exp $ */
+
+/*! \file */
#include <config.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/socket.h>
+#include <sys/stat.h>
+#ifdef ISC_PLATFORM_HAVESYSUNH
+#include <sys/un.h>
+#endif
#include <sys/time.h>
#include <sys/uio.h>
@@ -57,7 +63,7 @@
#include "socket_p.h"
#endif /* ISC_PLATFORM_USETHREADS */
-/*
+/*%
* Some systems define the socket length argument as an int, some as size_t,
* some as socklen_t. This is here so it can be easily changed if needed.
*/
@@ -65,7 +71,7 @@
#define ISC_SOCKADDR_LEN_T unsigned int
#endif
-/*
+/*%
* Define what the possible "soft" errors can be. These are non-fatal returns
* of various network related functions, like recv() and so on.
*
@@ -80,7 +86,7 @@
#define DLVL(x) ISC_LOGCATEGORY_GENERAL, ISC_LOGMODULE_SOCKET, ISC_LOG_DEBUG(x)
-/*
+/*!<
* DLVL(90) -- Function entry/exit and other tracing.
* DLVL(70) -- Socket "correctness" -- including returning of events, etc.
* DLVL(60) -- Socket data send/receive
@@ -104,7 +110,7 @@ typedef isc_event_t intev_t;
#define SOCKET_MAGIC ISC_MAGIC('I', 'O', 'i', 'o')
#define VALID_SOCKET(t) ISC_MAGIC_VALID(t, SOCKET_MAGIC)
-/*
+/*!
* IPv6 control information. If the socket is an IPv6 socket we want
* to collect the destination address and interface so the client can
* set them on outgoing packets.
@@ -115,7 +121,7 @@ typedef isc_event_t intev_t;
#endif
#endif
-/*
+/*%
* NetBSD and FreeBSD can timestamp packets. XXXMLG Should we have
* a setsockopt() like interface to request timestamps, and if the OS
* doesn't do it for us, call gettimeofday() on every UDP receive?
@@ -126,7 +132,12 @@ typedef isc_event_t intev_t;
#endif
#endif
-/*
+/*%
+ * The size to raise the recieve buffer to (from BIND 8).
+ */
+#define RCVBUFSIZE (32*1024)
+
+/*%
* The number of times a send operation is repeated if the result is EINTR.
*/
#define NRETRIES 10
@@ -238,9 +249,9 @@ static void build_msghdr_recv(isc_socket_t *, isc_socketevent_t *,
#define SELECT_POKE_SHUTDOWN (-1)
#define SELECT_POKE_NOTHING (-2)
#define SELECT_POKE_READ (-3)
-#define SELECT_POKE_ACCEPT (-3) /* Same as _READ */
+#define SELECT_POKE_ACCEPT (-3) /*%< Same as _READ */
#define SELECT_POKE_WRITE (-4)
-#define SELECT_POKE_CONNECT (-4) /* Same as _WRITE */
+#define SELECT_POKE_CONNECT (-4) /*%< Same as _WRITE */
#define SELECT_POKE_CLOSE (-5)
#define SOCK_DEAD(s) ((s)->references == 0)
@@ -870,6 +881,15 @@ set_dev_address(isc_sockaddr_t *address, isc_socket_t *sock,
}
}
+static void
+destroy_socketevent(isc_event_t *event) {
+ isc_socketevent_t *ev = (isc_socketevent_t *)event;
+
+ INSIST(ISC_LIST_EMPTY(ev->bufferlist));
+
+ (ev->destroy)(event);
+}
+
static isc_socketevent_t *
allocate_socketevent(isc_socket_t *sock, isc_eventtype_t eventtype,
isc_taskaction_t action, const void *arg)
@@ -891,6 +911,8 @@ allocate_socketevent(isc_socket_t *sock, isc_eventtype_t eventtype,
ev->n = 0;
ev->offset = 0;
ev->attributes = 0;
+ ev->destroy = ev->ev_destroy;
+ ev->ev_destroy = destroy_socketevent;
return (ev);
}
@@ -1225,7 +1247,7 @@ allocate_socket(isc_socketmgr_t *manager, isc_sockettype_t type,
isc_socket_t **socketp)
{
isc_socket_t *sock;
- isc_result_t ret;
+ isc_result_t result;
ISC_SOCKADDR_LEN_T cmsgbuflen;
sock = isc_mem_get(manager->mctx, sizeof(*sock));
@@ -1233,7 +1255,7 @@ allocate_socket(isc_socketmgr_t *manager, isc_sockettype_t type,
if (sock == NULL)
return (ISC_R_NOMEMORY);
- ret = ISC_R_UNEXPECTED;
+ result = ISC_R_UNEXPECTED;
sock->magic = 0;
sock->references = 0;
@@ -1293,13 +1315,9 @@ allocate_socket(isc_socketmgr_t *manager, isc_sockettype_t type,
/*
* initialize the lock
*/
- if (isc_mutex_init(&sock->lock) != ISC_R_SUCCESS) {
+ result = isc_mutex_init(&sock->lock);
+ if (result != ISC_R_SUCCESS) {
sock->magic = 0;
- UNEXPECTED_ERROR(__FILE__, __LINE__,
- "isc_mutex_init() %s",
- isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
- ISC_MSG_FAILED, "failed"));
- ret = ISC_R_UNEXPECTED;
goto error;
}
@@ -1327,7 +1345,7 @@ allocate_socket(isc_socketmgr_t *manager, isc_sockettype_t type,
sock->sendcmsgbuflen);
isc_mem_put(manager->mctx, sock, sizeof(*sock));
- return (ret);
+ return (result);
}
/*
@@ -1379,19 +1397,23 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
isc_socket_t **socketp)
{
isc_socket_t *sock = NULL;
- isc_result_t ret;
+ isc_result_t result;
#if defined(USE_CMSG) || defined(SO_BSDCOMPAT)
int on = 1;
#endif
+#if defined(SO_RCVBUF)
+ ISC_SOCKADDR_LEN_T optlen;
+ int size;
+#endif
char strbuf[ISC_STRERRORSIZE];
const char *err = "socket";
REQUIRE(VALID_MANAGER(manager));
REQUIRE(socketp != NULL && *socketp == NULL);
- ret = allocate_socket(manager, type, &sock);
- if (ret != ISC_R_SUCCESS)
- return (ret);
+ result = allocate_socket(manager, type, &sock);
+ if (result != ISC_R_SUCCESS)
+ return (result);
sock->pf = pf;
switch (type) {
@@ -1401,6 +1423,9 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
case isc_sockettype_tcp:
sock->fd = socket(pf, SOCK_STREAM, IPPROTO_TCP);
break;
+ case isc_sockettype_unix:
+ sock->fd = socket(pf, SOCK_STREAM, 0);
+ break;
}
#ifdef F_DUPFD
@@ -1468,7 +1493,8 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
}
#ifdef SO_BSDCOMPAT
- if (setsockopt(sock->fd, SOL_SOCKET, SO_BSDCOMPAT,
+ if (type != isc_sockettype_unix &&
+ setsockopt(sock->fd, SOL_SOCKET, SO_BSDCOMPAT,
(void *)&on, sizeof(on)) < 0) {
isc__strerror(errno, strbuf, sizeof(strbuf));
UNEXPECTED_ERROR(__FILE__, __LINE__,
@@ -1481,9 +1507,10 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
}
#endif
-#if defined(USE_CMSG)
+#if defined(USE_CMSG) || defined(SO_RCVBUF)
if (type == isc_sockettype_udp) {
+#if defined(USE_CMSG)
#if defined(SO_TIMESTAMP)
if (setsockopt(sock->fd, SOL_SOCKET, SO_TIMESTAMP,
(void *)&on, sizeof(on)) < 0
@@ -1553,9 +1580,30 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
}
#endif
#endif /* ISC_PLATFORM_HAVEIPV6 */
-
+#endif /* defined(USE_CMSG) */
+
+#if defined(SO_RCVBUF)
+ optlen = sizeof(size);
+ if (getsockopt(sock->fd, SOL_SOCKET, SO_RCVBUF,
+ (void *)&size, &optlen) >= 0 &&
+ size < RCVBUFSIZE) {
+ size = RCVBUFSIZE;
+ if (setsockopt(sock->fd, SOL_SOCKET, SO_RCVBUF,
+ (void *)&size, sizeof(size)) == -1) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ UNEXPECTED_ERROR(__FILE__, __LINE__,
+ "setsockopt(%d, SO_RCVBUF, %d) %s: %s",
+ sock->fd, size,
+ isc_msgcat_get(isc_msgcat,
+ ISC_MSGSET_GENERAL,
+ ISC_MSG_FAILED,
+ "failed"),
+ strbuf);
+ }
+ }
+#endif
}
-#endif /* USE_CMSG */
+#endif /* defined(USE_CMSG) || defined(SO_RCVBUF) */
sock->references = 1;
*socketp = sock;
@@ -2316,6 +2364,7 @@ isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp) {
#ifdef ISC_PLATFORM_USETHREADS
char strbuf[ISC_STRERRORSIZE];
#endif
+ isc_result_t result;
REQUIRE(managerp != NULL && *managerp == NULL);
@@ -2335,13 +2384,10 @@ isc_socketmgr_create(isc_mem_t *mctx, isc_socketmgr_t **managerp) {
manager->mctx = NULL;
memset(manager->fds, 0, sizeof(manager->fds));
ISC_LIST_INIT(manager->socklist);
- if (isc_mutex_init(&manager->lock) != ISC_R_SUCCESS) {
+ result = isc_mutex_init(&manager->lock);
+ if (result != ISC_R_SUCCESS) {
isc_mem_put(mctx, manager, sizeof(*manager));
- UNEXPECTED_ERROR(__FILE__, __LINE__,
- "isc_mutex_init() %s",
- isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
- ISC_MSG_FAILED, "failed"));
- return (ISC_R_UNEXPECTED);
+ return (result);
}
#ifdef ISC_PLATFORM_USETHREADS
if (isc_condition_init(&manager->shutdown_ok) != ISC_R_SUCCESS) {
@@ -2884,6 +2930,190 @@ isc_socket_sendto2(isc_socket_t *sock, isc_region_t *region,
return (socket_send(sock, event, task, address, pktinfo, flags));
}
+void
+isc_socket_cleanunix(isc_sockaddr_t *sockaddr, isc_boolean_t active) {
+#ifdef ISC_PLATFORM_HAVESYSUNH
+ int s;
+ struct stat sb;
+ char strbuf[ISC_STRERRORSIZE];
+
+ if (sockaddr->type.sa.sa_family != AF_UNIX)
+ return;
+
+#ifndef S_ISSOCK
+#if defined(S_IFMT) && defined(S_IFSOCK)
+#define S_ISSOCK(mode) ((mode & S_IFMT)==S_IFSOCK)
+#elif defined(_S_IFMT) && defined(S_IFSOCK)
+#define S_ISSOCK(mode) ((mode & _S_IFMT)==S_IFSOCK)
+#endif
+#endif
+
+#ifndef S_ISFIFO
+#if defined(S_IFMT) && defined(S_IFIFO)
+#define S_ISFIFO(mode) ((mode & S_IFMT)==S_IFIFO)
+#elif defined(_S_IFMT) && defined(S_IFIFO)
+#define S_ISFIFO(mode) ((mode & _S_IFMT)==S_IFIFO)
+#endif
+#endif
+
+#if !defined(S_ISFIFO) && !defined(S_ISSOCK)
+#error You need to define S_ISFIFO and S_ISSOCK as appropriate for your platform. See <sys/stat.h>.
+#endif
+
+#ifndef S_ISFIFO
+#define S_ISFIFO(mode) 0
+#endif
+
+#ifndef S_ISSOCK
+#define S_ISSOCK(mode) 0
+#endif
+
+ if (active) {
+ if (stat(sockaddr->type.sunix.sun_path, &sb) < 0) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
+ ISC_LOGMODULE_SOCKET, ISC_LOG_ERROR,
+ "isc_socket_cleanunix: stat(%s): %s",
+ sockaddr->type.sunix.sun_path, strbuf);
+ return;
+ }
+ if (!(S_ISSOCK(sb.st_mode) || S_ISFIFO(sb.st_mode))) {
+ isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
+ ISC_LOGMODULE_SOCKET, ISC_LOG_ERROR,
+ "isc_socket_cleanunix: %s: not a socket",
+ sockaddr->type.sunix.sun_path);
+ return;
+ }
+ if (unlink(sockaddr->type.sunix.sun_path) < 0) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
+ ISC_LOGMODULE_SOCKET, ISC_LOG_ERROR,
+ "isc_socket_cleanunix: unlink(%s): %s",
+ sockaddr->type.sunix.sun_path, strbuf);
+ }
+ return;
+ }
+
+ s = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (s < 0) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
+ ISC_LOGMODULE_SOCKET, ISC_LOG_WARNING,
+ "isc_socket_cleanunix: socket(%s): %s",
+ sockaddr->type.sunix.sun_path, strbuf);
+ return;
+ }
+
+ if (stat(sockaddr->type.sunix.sun_path, &sb) < 0) {
+ switch (errno) {
+ case ENOENT: /* We exited cleanly last time */
+ break;
+ default:
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
+ ISC_LOGMODULE_SOCKET, ISC_LOG_WARNING,
+ "isc_socket_cleanunix: stat(%s): %s",
+ sockaddr->type.sunix.sun_path, strbuf);
+ break;
+ }
+ goto cleanup;
+ }
+
+ if (!(S_ISSOCK(sb.st_mode) || S_ISFIFO(sb.st_mode))) {
+ isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
+ ISC_LOGMODULE_SOCKET, ISC_LOG_WARNING,
+ "isc_socket_cleanunix: %s: not a socket",
+ sockaddr->type.sunix.sun_path);
+ goto cleanup;
+ }
+
+ if (connect(s, (struct sockaddr *)&sockaddr->type.sunix,
+ sizeof(sockaddr->type.sunix)) < 0) {
+ switch (errno) {
+ case ECONNREFUSED:
+ case ECONNRESET:
+ if (unlink(sockaddr->type.sunix.sun_path) < 0) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
+ ISC_LOGMODULE_SOCKET,
+ ISC_LOG_WARNING,
+ "isc_socket_cleanunix: "
+ "unlink(%s): %s",
+ sockaddr->type.sunix.sun_path,
+ strbuf);
+ }
+ break;
+ default:
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
+ ISC_LOGMODULE_SOCKET, ISC_LOG_WARNING,
+ "isc_socket_cleanunix: connect(%s): %s",
+ sockaddr->type.sunix.sun_path, strbuf);
+ break;
+ }
+ }
+ cleanup:
+ close(s);
+#else
+ UNUSED(sockaddr);
+ UNUSED(active);
+#endif
+}
+
+isc_result_t
+isc_socket_permunix(isc_sockaddr_t *sockaddr, isc_uint32_t perm,
+ isc_uint32_t owner, isc_uint32_t group)
+{
+#ifdef ISC_PLATFORM_HAVESYSUNH
+ isc_result_t result = ISC_R_SUCCESS;
+ char strbuf[ISC_STRERRORSIZE];
+ char path[sizeof(sockaddr->type.sunix.sun_path)];
+#ifdef NEED_SECURE_DIRECTORY
+ char *slash;
+#endif
+
+ REQUIRE(sockaddr->type.sa.sa_family == AF_UNIX);
+ INSIST(strlen(sockaddr->type.sunix.sun_path) < sizeof(path));
+ strcpy(path, sockaddr->type.sunix.sun_path);
+
+#ifdef NEED_SECURE_DIRECTORY
+ slash = strrchr(path, '/');
+ if (slash != NULL) {
+ if (slash != path)
+ *slash = '\0';
+ else
+ strcpy(path, "/");
+ } else
+ strcpy(path, ".");
+#endif
+
+ if (chmod(path, perm) < 0) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
+ ISC_LOGMODULE_SOCKET, ISC_LOG_ERROR,
+ "isc_socket_permunix: chmod(%s, %d): %s",
+ path, perm, strbuf);
+ result = ISC_R_FAILURE;
+ }
+ if (chown(path, owner, group) < 0) {
+ isc__strerror(errno, strbuf, sizeof(strbuf));
+ isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL,
+ ISC_LOGMODULE_SOCKET, ISC_LOG_ERROR,
+ "isc_socket_permunix: chown(%s, %d, %d): %s",
+ path, owner, group,
+ strbuf);
+ result = ISC_R_FAILURE;
+ }
+ return (result);
+#else
+ UNUSED(sockaddr);
+ UNUSED(perm);
+ UNUSED(owner);
+ UNUSED(group);
+ return (ISC_R_NOTIMPLEMENTED);
+#endif
+}
+
isc_result_t
isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr) {
char strbuf[ISC_STRERRORSIZE];
@@ -2900,6 +3130,10 @@ isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr) {
/*
* Only set SO_REUSEADDR when we want a specific port.
*/
+#ifdef AF_UNIX
+ if (sock->pf == AF_UNIX)
+ goto bind_socket;
+#endif
if (isc_sockaddr_getport(sockaddr) != (in_port_t)0 &&
setsockopt(sock->fd, SOL_SOCKET, SO_REUSEADDR, (void *)&on,
sizeof(on)) < 0) {
@@ -2909,6 +3143,9 @@ isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr) {
ISC_MSG_FAILED, "failed"));
/* Press on... */
}
+#ifdef AF_UNIX
+ bind_socket:
+#endif
if (bind(sock->fd, &sockaddr->type.sa, sockaddr->length) < 0) {
UNLOCK(&sock->lock);
switch (errno) {
@@ -2985,7 +3222,8 @@ isc_socket_listen(isc_socket_t *sock, unsigned int backlog) {
REQUIRE(!sock->listener);
REQUIRE(sock->bound);
- REQUIRE(sock->type == isc_sockettype_tcp);
+ REQUIRE(sock->type == isc_sockettype_tcp ||
+ sock->type == isc_sockettype_unix);
if (backlog == 0)
backlog = SOMAXCONN;
@@ -3016,7 +3254,7 @@ isc_socket_accept(isc_socket_t *sock,
isc_socketmgr_t *manager;
isc_task_t *ntask = NULL;
isc_socket_t *nsock;
- isc_result_t ret;
+ isc_result_t result;
isc_boolean_t do_poke = ISC_FALSE;
REQUIRE(VALID_SOCKET(sock));
@@ -3041,11 +3279,11 @@ isc_socket_accept(isc_socket_t *sock,
}
ISC_LINK_INIT(dev, ev_link);
- ret = allocate_socket(manager, sock->type, &nsock);
- if (ret != ISC_R_SUCCESS) {
+ result = allocate_socket(manager, sock->type, &nsock);
+ if (result != ISC_R_SUCCESS) {
isc_event_free(ISC_EVENT_PTR(&dev));
UNLOCK(&sock->lock);
- return (ret);
+ return (result);
}
/*
@@ -3309,7 +3547,7 @@ internal_connect(isc_task_t *me, isc_event_t *ev) {
isc_result_t
isc_socket_getpeername(isc_socket_t *sock, isc_sockaddr_t *addressp) {
- isc_result_t ret;
+ isc_result_t result;
REQUIRE(VALID_SOCKET(sock));
REQUIRE(addressp != NULL);
@@ -3318,20 +3556,20 @@ isc_socket_getpeername(isc_socket_t *sock, isc_sockaddr_t *addressp) {
if (sock->connected) {
*addressp = sock->address;
- ret = ISC_R_SUCCESS;
+ result = ISC_R_SUCCESS;
} else {
- ret = ISC_R_NOTCONNECTED;
+ result = ISC_R_NOTCONNECTED;
}
UNLOCK(&sock->lock);
- return (ret);
+ return (result);
}
isc_result_t
isc_socket_getsockname(isc_socket_t *sock, isc_sockaddr_t *addressp) {
ISC_SOCKADDR_LEN_T len;
- isc_result_t ret;
+ isc_result_t result;
char strbuf[ISC_STRERRORSIZE];
REQUIRE(VALID_SOCKET(sock));
@@ -3340,18 +3578,18 @@ isc_socket_getsockname(isc_socket_t *sock, isc_sockaddr_t *addressp) {
LOCK(&sock->lock);
if (!sock->bound) {
- ret = ISC_R_NOTBOUND;
+ result = ISC_R_NOTBOUND;
goto out;
}
- ret = ISC_R_SUCCESS;
+ result = ISC_R_SUCCESS;
len = sizeof(addressp->type);
if (getsockname(sock->fd, &addressp->type.sa, (void *)&len) < 0) {
isc__strerror(errno, strbuf, sizeof(strbuf));
UNEXPECTED_ERROR(__FILE__, __LINE__, "getsockname: %s",
strbuf);
- ret = ISC_R_UNEXPECTED;
+ result = ISC_R_UNEXPECTED;
goto out;
}
addressp->length = (unsigned int)len;
@@ -3359,7 +3597,7 @@ isc_socket_getsockname(isc_socket_t *sock, isc_sockaddr_t *addressp) {
out:
UNLOCK(&sock->lock);
- return (ret);
+ return (result);
}
/*
diff --git a/contrib/bind9/lib/isc/unix/socket_p.h b/contrib/bind9/lib/isc/unix/socket_p.h
index f430bf2..c260bbc 100644
--- a/contrib/bind9/lib/isc/unix/socket_p.h
+++ b/contrib/bind9/lib/isc/unix/socket_p.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2000, 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,11 +15,13 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: socket_p.h,v 1.6.206.1 2004/03/06 08:15:02 marka Exp $ */
+/* $Id: socket_p.h,v 1.7.18.2 2005/04/29 00:17:08 marka Exp $ */
#ifndef ISC_SOCKET_P_H
#define ISC_SOCKET_P_H
+/*! \file */
+
#ifdef ISC_PLATFORM_NEEDSYSSELECTH
#include <sys/select.h>
#endif
diff --git a/contrib/bind9/lib/isc/unix/stdio.c b/contrib/bind9/lib/isc/unix/stdio.c
index 794164e..64db925 100644
--- a/contrib/bind9/lib/isc/unix/stdio.c
+++ b/contrib/bind9/lib/isc/unix/stdio.c
@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: stdio.c,v 1.5.206.1 2004/03/06 08:15:02 marka Exp $ */
+/* $Id: stdio.c,v 1.6 2004/03/05 05:11:47 marka Exp $ */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/unix/stdtime.c b/contrib/bind9/lib/isc/unix/stdtime.c
index b8d818d..3f240b7 100644
--- a/contrib/bind9/lib/isc/unix/stdtime.c
+++ b/contrib/bind9/lib/isc/unix/stdtime.c
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: stdtime.c,v 1.11.2.1.10.5 2005/06/09 23:54:31 marka Exp $ */
+/* $Id: stdtime.c,v 1.14.18.3 2005/06/08 02:07:57 marka Exp $ */
+
+/*! \file */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/unix/strerror.c b/contrib/bind9/lib/isc/unix/strerror.c
index 863867e..18cc367 100644
--- a/contrib/bind9/lib/isc/unix/strerror.c
+++ b/contrib/bind9/lib/isc/unix/strerror.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: strerror.c,v 1.1.2.1.10.3 2004/03/08 09:04:57 marka Exp $ */
+/* $Id: strerror.c,v 1.4.18.2 2005/04/29 00:17:08 marka Exp $ */
+
+/*! \file */
#include <config.h>
@@ -29,7 +31,7 @@
#include <isc/util.h>
#ifdef HAVE_STRERROR
-/*
+/*%
* We need to do this this way for profiled locks.
*/
static isc_mutex_t isc_strerror_lock;
diff --git a/contrib/bind9/lib/isc/unix/syslog.c b/contrib/bind9/lib/isc/unix/syslog.c
index e531544..cc99339 100644
--- a/contrib/bind9/lib/isc/unix/syslog.c
+++ b/contrib/bind9/lib/isc/unix/syslog.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: syslog.c,v 1.1.12.3 2004/03/08 09:04:57 marka Exp $ */
+/* $Id: syslog.c,v 1.3.18.2 2005/04/29 00:17:09 marka Exp $ */
+
+/*! \file */
#include <config.h>
diff --git a/contrib/bind9/lib/isc/unix/time.c b/contrib/bind9/lib/isc/unix/time.c
index 39c851c..bac24d7 100644
--- a/contrib/bind9/lib/isc/unix/time.c
+++ b/contrib/bind9/lib/isc/unix/time.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001, 2003 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: time.c,v 1.34.2.6.2.4 2004/03/06 08:15:03 marka Exp $ */
+/* $Id: time.c,v 1.47.18.2 2005/04/29 00:17:09 marka Exp $ */
+
+/*! \file */
#include <config.h>
@@ -33,9 +35,9 @@
#include <isc/time.h>
#include <isc/util.h>
-#define NS_PER_S 1000000000 /* Nanoseconds per second. */
-#define NS_PER_US 1000 /* Nanoseconds per microsecond. */
-#define US_PER_S 1000000 /* Microseconds per second. */
+#define NS_PER_S 1000000000 /*%< Nanoseconds per second. */
+#define NS_PER_US 1000 /*%< Nanoseconds per microsecond. */
+#define US_PER_S 1000000 /*%< Microseconds per second. */
/*
* All of the INSIST()s checks of nanoseconds < NS_PER_S are for
@@ -48,7 +50,7 @@
#define ISC_FIX_TV_USEC 1
#endif
-/***
+/*%
*** Intervals
***/
diff --git a/contrib/bind9/lib/isc/version.c b/contrib/bind9/lib/isc/version.c
index d0f270d..6d3b3d2 100644
--- a/contrib/bind9/lib/isc/version.c
+++ b/contrib/bind9/lib/isc/version.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004, 2005 Internet Systems Consortium, Inc. ("ISC")
* Copyright (C) 1998-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
@@ -15,7 +15,9 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: version.c,v 1.9.12.3 2004/03/08 09:04:51 marka Exp $ */
+/* $Id: version.c,v 1.11.18.2 2005/04/29 00:16:51 marka Exp $ */
+
+/*! \file */
#include <isc/version.h>
diff --git a/contrib/bind9/lib/isc/x86_32/include/isc/atomic.h b/contrib/bind9/lib/isc/x86_32/include/isc/atomic.h
new file mode 100644
index 0000000..f3136d9
--- /dev/null
+++ b/contrib/bind9/lib/isc/x86_32/include/isc/atomic.h
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2005 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* $Id: atomic.h,v 1.2.2.3 2005/07/27 04:23:33 marka Exp $ */
+
+#ifndef ISC_ATOMIC_H
+#define ISC_ATOMIC_H 1
+
+#include <isc/platform.h>
+#include <isc/types.h>
+
+#ifdef ISC_PLATFORM_USEGCCASM
+/*
+ * This routine atomically increments the value stored in 'p' by 'val', and
+ * returns the previous value.
+ */
+static inline isc_int32_t
+isc_atomic_xadd(isc_int32_t *p, isc_int32_t val) {
+ isc_int32_t prev = val;
+
+ __asm__ volatile(
+#ifdef ISC_PLATFORM_USETHREADS
+ "lock;"
+#endif
+ "xadd %0, %1"
+ :"=q"(prev)
+ :"m"(*p), "0"(prev)
+ :"memory", "cc");
+
+ return (prev);
+}
+
+/*
+ * This routine atomically stores the value 'val' in 'p'.
+ */
+static inline void
+isc_atomic_store(isc_int32_t *p, isc_int32_t val) {
+ __asm__ volatile(
+#ifdef ISC_PLATFORM_USETHREADS
+ /*
+ * xchg should automatically lock memory, but we add it
+ * explicitly just in case (it at least doesn't harm)
+ */
+ "lock;"
+#endif
+
+ "xchgl %1, %0"
+ :
+ : "r"(val), "m"(*p)
+ : "memory");
+}
+
+/*
+ * This routine atomically replaces the value in 'p' with 'val', if the
+ * original value is equal to 'cmpval'. The original value is returned in any
+ * case.
+ */
+static inline isc_int32_t
+isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val) {
+ __asm__ volatile(
+#ifdef ISC_PLATFORM_USETHREADS
+ "lock;"
+#endif
+ "cmpxchgl %1, %2"
+ : "=a"(cmpval)
+ : "r"(val), "m"(*p), "a"(cmpval)
+ : "memory");
+
+ return (cmpval);
+}
+
+#elif defined(ISC_PLATFORM_USESTDASM)
+/*
+ * The followings are "generic" assembly code which implements the same
+ * functionality in case the gcc extension cannot be used. It should be
+ * better to avoid inlining below, since we directly refer to specific
+ * positions of the stack frame, which would not actually point to the
+ * intended address in the embedded mnemonic.
+ */
+#include <isc/util.h> /* for 'UNUSED' macro */
+
+static isc_int32_t
+isc_atomic_xadd(isc_int32_t *p, isc_int32_t val) {
+ UNUSED(p);
+ UNUSED(val);
+
+ __asm (
+ "movl 8(%ebp), %ecx\n"
+ "movl 12(%ebp), %edx\n"
+#ifdef ISC_PLATFORM_USETHREADS
+ "lock;"
+#endif
+ "xadd %edx, (%ecx)\n"
+
+ /*
+ * set the return value directly in the register so that we
+ * can avoid guessing the correct position in the stack for a
+ * local variable.
+ */
+ "movl %edx, %eax"
+ );
+}
+
+static void
+isc_atomic_store(isc_int32_t *p, isc_int32_t val) {
+ UNUSED(p);
+ UNUSED(val);
+
+ __asm (
+ "movl 8(%ebp), %ecx\n"
+ "movl 12(%ebp), %edx\n"
+#ifdef ISC_PLATFORM_USETHREADS
+ "lock;"
+#endif
+ "xchgl (%ecx), %edx\n"
+ );
+}
+
+static isc_int32_t
+isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val) {
+ UNUSED(p);
+ UNUSED(cmpval);
+ UNUSED(val);
+
+ __asm (
+ "movl 8(%ebp), %ecx\n"
+ "movl 12(%ebp), %eax\n" /* must be %eax for cmpxchgl */
+ "movl 16(%ebp), %edx\n"
+#ifdef ISC_PLATFORM_USETHREADS
+ "lock;"
+#endif
+
+ /*
+ * If (%ecx) == %eax then (%ecx) := %edx.
+ % %eax is set to old (%ecx), which will be the return value.
+ */
+ "cmpxchgl %edx, (%ecx)"
+ );
+}
+#else /* !ISC_PLATFORM_USEGCCASM && !ISC_PLATFORM_USESTDASM */
+
+#error "unsupported compiler. disable atomic ops by --disable-atomic"
+
+#endif
+#endif /* ISC_ATOMIC_H */
diff --git a/contrib/bind9/lib/isc/x86_64/include/isc/atomic.h b/contrib/bind9/lib/isc/x86_64/include/isc/atomic.h
new file mode 100644
index 0000000..0752d8f
--- /dev/null
+++ b/contrib/bind9/lib/isc/x86_64/include/isc/atomic.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2005 Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* $Id: atomic.h,v 1.2.20.1 2005/09/02 13:27:12 marka Exp $ */
+
+#ifndef ISC_ATOMIC_H
+#define ISC_ATOMIC_H 1
+
+#include <isc/platform.h>
+#include <isc/types.h>
+
+#ifdef ISC_PLATFORM_USEGCCASM
+
+/* We share the gcc-version with x86_32 */
+#error "impossible case. check build configuration"
+
+#elif defined(ISC_PLATFORM_USESTDASM)
+/*
+ * The followings are "generic" assembly code which implements the same
+ * functionality in case the gcc extension cannot be used. It should be
+ * better to avoid inlining below, since we directly refer to specific
+ * registers for arguments, which would not actually correspond to the
+ * intended address or value in the embedded mnemonic.
+ */
+#include <isc/util.h> /* for 'UNUSED' macro */
+
+static isc_int32_t
+isc_atomic_xadd(isc_int32_t *p, isc_int32_t val) {
+ UNUSED(p);
+ UNUSED(val);
+
+ __asm (
+ "movq %rdi, %rdx\n"
+ "movl %esi, %eax\n"
+#ifdef ISC_PLATFORM_USETHREADS
+ "lock;"
+#endif
+ "xadd %eax, (%rdx)\n"
+
+ /*
+ * set the return value directly in the register so that we
+ * can avoid guessing the correct position in the stack for a
+ * local variable.
+ */
+ );
+}
+
+static void
+isc_atomic_store(isc_int32_t *p, isc_int32_t val) {
+ UNUSED(p);
+ UNUSED(val);
+
+ __asm (
+ "movq %rdi, %rax\n"
+ "movl %esi, %edx\n"
+#ifdef ISC_PLATFORM_USETHREADS
+ "lock;"
+#endif
+ "xchgl (%rax), %edx\n"
+ );
+}
+
+static isc_int32_t
+isc_atomic_cmpxchg(isc_int32_t *p, isc_int32_t cmpval, isc_int32_t val) {
+ UNUSED(p);
+ UNUSED(cmpval);
+ UNUSED(val);
+
+ __asm (
+ "movl %edx, %ecx\n"
+ "movl %esi, %eax\n"
+ "movq %rdi, %rdx\n"
+
+#ifdef ISC_PLATFORM_USETHREADS
+ "lock;"
+#endif
+ /*
+ * If (%rdi) == %eax then (%rdi) := %edx.
+ % %eax is set to old (%ecx), which will be the return value.
+ */
+ "cmpxchgl %ecx, (%rdx)"
+ );
+}
+
+#else /* !ISC_PLATFORM_USEGCCASM && !ISC_PLATFORM_USESTDASM */
+
+#error "unsupported compiler. disable atomic ops by --disable-atomic"
+
+#endif
+#endif /* ISC_ATOMIC_H */
OpenPOWER on IntegriCloud