diff -urN gale-0.91a/INSTALL gale-0.91b/INSTALL --- gale-0.91a/INSTALL Wed Oct 20 00:05:57 1999 +++ gale-0.91b/INSTALL Wed Jan 12 16:20:48 2000 @@ -14,8 +14,7 @@ * RSAREF Get the RSAREF library. You can retrieve the source from - http://gale.org/dist/rsaref20.tar.Z if you live in the US or Canada. - If you don't, you might try using a workalike such as RSAEURO. + http://gale.org/dist/rsaref20.tar.Z. Unpack the rsaref20.tar.Z file in the "gale/rsaref" directory. The configuration and build process will automatically detect its presence, diff -urN gale-0.91a/Makefile.am gale-0.91b/Makefile.am --- gale-0.91a/Makefile.am Sun Dec 26 21:29:31 1999 +++ gale-0.91b/Makefile.am Sun Jan 30 21:07:09 2000 @@ -1,9 +1,7 @@ ## Process this file with automake to generate Makefile.in AUTOMAKE_OPTIONS = foreign 1.2 -noinst_SCRIPTS = common.sh config.sh domain.sh bin_SCRIPTS = gale-config gale-install -EXTRA_DIST = common.sh config.sh domain.sh if BUILD_GZGW gzgw_dir = gzgw diff -urN gale-0.91a/Makefile.in gale-0.91b/Makefile.in --- gale-0.91a/Makefile.in Sun Dec 26 22:17:23 1999 +++ gale-0.91b/Makefile.in Sun Jan 30 21:54:45 2000 @@ -80,9 +80,7 @@ ZEPHYR_LIBS = @ZEPHYR_LIBS@ AUTOMAKE_OPTIONS = foreign 1.2 -noinst_SCRIPTS = common.sh config.sh domain.sh bin_SCRIPTS = gale-config gale-install -EXTRA_DIST = common.sh config.sh domain.sh @BUILD_GZGW_TRUE@gzgw_dir = gzgw @BUILD_GZGW_FALSE@gzgw_dir = @BUILD_RSAREF_TRUE@rsaref_dir = rsaref @@ -96,7 +94,7 @@ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ./include/gale/config.h CONFIG_CLEAN_FILES = gale-config gale-install -SCRIPTS = $(bin_SCRIPTS) $(noinst_SCRIPTS) +SCRIPTS = $(bin_SCRIPTS) DIST_COMMON = ./stamp-h.in COPYING INSTALL Makefile.am Makefile.in \ acconfig.h aclocal.m4 config.guess config.h.in config.sub configure \ diff -urN gale-0.91a/common.sh gale-0.91b/common.sh --- gale-0.91a/common.sh Sun Jun 21 14:35:28 1998 +++ gale-0.91b/common.sh Wed Dec 31 16:00:00 1969 @@ -1,42 +0,0 @@ -run() { - echo "$*" - "$@" || exit 1 -} - -qgrep() { - grep "$@" > /dev/null -} - -testkey() { - gkinfo -x "$1" 2>/dev/null | qgrep "^Trusted public key: <$1>" -} - -testkey_stdin() { - gkinfo -x 2>/dev/null | qgrep "^Trusted public key: <$1>" -} - -if [ -n "$GALE_SYS_DIR" ]; then - SYS_DIR="$GALE_SYS_DIR" -elif [ -n "$sysconfdir" ]; then - SYS_DIR="$sysconfdir/gale" -else - echo "Error: neither of \$GALE_SYS_DIR or \$sysconfdir defined." - echo "\"make install\" calls this script; don't run it directly." - exit 1 -fi - -CONF="$SYS_DIR/conf" -umask 022 -PATH="$bindir:$sbindir:$PATH:/usr/ucb" -export PATH - -if [ -f "$CONF" ]; then - exec 3<"$CONF" - - while read var value <&3 ; do - [ -z "$var" -o "x$var" = "x#" ] && continue - eval "CONF_$var=\"$value\"" - done - - exec 3<&- -fi diff -urN gale-0.91a/config.sh gale-0.91b/config.sh --- gale-0.91a/config.sh Sat Jun 5 19:19:48 1999 +++ gale-0.91b/config.sh Wed Dec 31 16:00:00 1969 @@ -1,152 +0,0 @@ -. "$srcdir/common.sh" - -run mkdir -p "$SYS_DIR" -if [ ! -d "$SYS_DIR" ]; then - echo "Error: Invalid or unauthorized SYS_DIR: \"$SYS_DIR\"." - exit 1 -fi - -run mkdir -p "$SYS_DIR/auth/trusted" -run mkdir -p "$SYS_DIR/auth/private" -run mkdir -p "$SYS_DIR/auth/local" -run mkdir -p "$SYS_DIR/auth/cache" -run chmod 1777 "$SYS_DIR/auth/local" -run chmod 777 "$SYS_DIR/auth/cache" - -[ -n "$CONF_GALE_USER" ] && GALE_USER="$CONF_GALE_USER" -[ -n "$CONF_GALE_DOMAIN" ] && GALE_DOMAIN="$CONF_GALE_DOMAIN" -[ -n "$CONF_GALE_SERVER" ] && GALE_SERVER="$CONF_GALE_SERVER" - -if [ -z "$GALE_USER" ]; then -cat << EOM - -Hi. You need to denote a user to own the Gale domain secret key. You must -trust this user with Gale authentication for your domain; the "gksign" program -will run as this user. I recommend using a special "gale" user; if you don't -have administrative priveleges here, you'll probably have to use your own -account. I do not recommend the use of "root". - -No harm done if you stop this script now to set up such a user. - -EOM - - /bin/echo "Enter the Gale username: \c" - read GALE_USER - if [ -z "$GALE_USER" ]; then - echo "Error: Invalid username or no home dir: \"$GALE_USER\"." - exit 1 - fi -else - echo "Using \"$GALE_USER\" as the Gale owner." -fi - -run chown $GALE_USER "$sbindir/gksign" -run chmod 4755 "$sbindir/gksign" -if [ "x$bindir" != "x$sbindir" ]; then - run ln -s "$sbindir/gksign" "$bindir/gksign.tmp.$$" - run mv "$bindir/gksign.tmp.$$" "$bindir/gksign" -fi - -run cp "$srcdir/kutils/ROOT" "$SYS_DIR/auth/trusted" - -if [ -z "$GALE_DOMAIN" ] ; then -cat << EOM - -You need to choose a name for your authentication domain. The extent of the -domain need not correspond to any given physical or logical setup. The domain -name is often a DNS domain (by convention). If you run Gale in the context of -a larger organization, they may have a domain set up; ask your administrators. - -Note that you will need permission from your parent domain; if you choose -"foo.bar.com", you will need to contact the owners of "bar.com". - -We recommend that new users choose an unoccupied name in the free, first-come, -first-served dork.gale.org domain by visiting . -This will streamline the registration process to get you up and running as -quickly as possible with a minimum of human intervention. - -You can always change this later (with a bit of hassle). - -EOM - - /bin/echo "Enter the Gale domain: \c" - read GALE_DOMAIN - case "$GALE_DOMAIN" in - *" "*) echo "Error: Invalid domain specification." ; exit 1 ;; - *""*) echo "Error: Invalid domain specification." ; exit 1 ;; - *""*) echo "Error: Invalid domain specification." ; exit 1 ;; - "") echo "Error: No domain specified." ; exit 1 ;; - esac -else - echo "Using \"$GALE_DOMAIN\" as the Gale domain." -fi - -if [ -z "$GALE_SERVER" ] ; then -cat << EOM - -You need to designate a machine as a Gale server. This machine (not -necessarily under your control, or part of this installation) will need to -run the Gale server "galed"; it will relay messages between Gale clients. -It may well be this machine. Please supply a comma-separated list of one -or more fully-qualified host names, with no spaces. - -EOM - - /bin/echo "Enter the Gale server hostname: \c" - read GALE_SERVER - case "$GALE_SERVER" in - *" "*) echo "Error: Invalid server specification." ; exit 1 ;; - *""*) echo "Error: Invalid server specification." ; exit 1 ;; - *""*) echo "Error: Invalid server specification." ; exit 1 ;; - "") echo "Error: No server specified." ; exit 1 ;; - esac -else - echo "Using \"$GALE_SERVER\" as the Gale server(s)." -fi - -if [ ! -f "$CONF" ]; then -cat > "$CONF" <> "$CONF" <> "$CONF" << EOM - -# The authentication domain to use. (Mandatory) -GALE_DOMAIN $GALE_DOMAIN -EOM - -[ -n "$CONF_GALE_SERVER" ] || cat >> "$CONF" << EOM - -# The hostname(s) of server(s) clients should talk to. (Mandatory) -# Feel free to list several, separated by commas; clients will choose -# the server quickest to respond. -GALE_SERVER $GALE_SERVER -EOM - -testkey "$GALE_DOMAIN" || cat << EOM - -*** You lack a signed key for your domain, "$GALE_DOMAIN". -Become user "$GALE_USER" and make the "domain" target here to create -a new domain; contact your domain administrator if you wish to become -part of an existing domain. -EOM - -echo "" diff -urN gale-0.91a/configure gale-0.91b/configure --- gale-0.91a/configure Sun Dec 26 22:07:15 1999 +++ gale-0.91b/configure Sun Jan 30 21:03:11 2000 @@ -705,7 +705,7 @@ PACKAGE=gale -VERSION=0.91a +VERSION=0.91b if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } diff -urN gale-0.91a/configure.in gale-0.91b/configure.in --- gale-0.91a/configure.in Sun Dec 26 22:06:35 1999 +++ gale-0.91b/configure.in Sun Jan 30 21:03:08 2000 @@ -2,7 +2,7 @@ AC_PREREQ(2.13) AC_INIT(INSTALL) -AM_INIT_AUTOMAKE(gale,0.91a) +AM_INIT_AUTOMAKE(gale,0.91b) AM_CONFIG_HEADER(include/gale/config.h:config.h.in) AC_CANONICAL_HOST AM_PROG_LIBTOOL diff -urN gale-0.91a/domain.sh gale-0.91b/domain.sh --- gale-0.91a/domain.sh Sat Jun 5 19:19:48 1999 +++ gale-0.91b/domain.sh Wed Dec 31 16:00:00 1969 @@ -1,174 +0,0 @@ -. $srcdir/common.sh - -if [ -z "$HOME" ]; then - cd - HOME="`pwd`" - echo "Warning: \$HOME not set, assuming \"$HOME\"." -fi - -GALE="$HOME/.gale" -mkdir -p "$GALE" -if [ ! -w "$GALE" ]; then - echo "Error: Cannot create \"$GALE\"." - exit 1 -fi - -if [ -z "$CONF_GALE_USER" ]; then - echo "Error: GALE_USER not configured." - echo "Make sure you've completed the \"make install\" process." - exit 1 -fi - -USER="`whoami`" -if [ "x$CONF_GALE_USER" != "x$USER" ]; then -cat </dev/null | qgrep "public key: <$CONF_GALE_DOMAIN>" ; then - echo "Good, it looks like your key..." - else - echo "Error: \"$skey\" not for \"$CONF_GALE_DOMAIN\"." - echo "Here's what it looks like to me:" - gkinfo < "$skey" - exit 1 - fi - - if testkey_stdin "$CONF_GALE_DOMAIN" < "$skey" ; then - echo "And it looks properly signed. Hooray for you!" - else - echo "Error: \"$skey\" is not fully signed." - echo "Here's what it looks like to me:" - gkinfo < "$skey" - exit 1 - fi - - if cp "$skey" "$SYS_DIR/auth/local/$CONF_GALE_DOMAIN" ; then - echo "Signed key successfully installed." - else - echo "Error: copying \"$skey\" to \"$SYS_DIR/auth/local/$CONF_GALE_DOMAIN\"." - exit 1 - fi - -cat << EOM - -The domain should be properly configured now. Assuming users can access a -version of "gksign" setuid to "$CONF_GALE_USER" (this user), they should be -able to start running clients and generating IDs for themselves. - -The installation process is complete! - -EOM - - exit 0 -fi - -cat << EOM - -Greetings. We need to make a key for "$CONF_GALE_DOMAIN". -Please enter a description to go along with the key; for example, -caltech.edu has the description "California Institute of Technology". - -EOM - -/bin/echo "Enter the description: \c" -read descr - -echo "We will generate the key now. Have patience." -gkgen -u "$unsigned" "$CONF_GALE_DOMAIN" "$descr" || exit 1 - -case "$CONF_GALE_DOMAIN" in -*.dork.gale.org) -cat << EOM - -*** Ah, a dork key. Good! -Visit . -Follow the directions; send the file "$unsigned" for -signing. Save the resulting signed key file to disk someplace. When you -have the signed key available, re-run this process, and we will move on to -the next step. - -EOM -;; -*) -cat << EOM - -*** What you must do: Take the file "$unsigned", -which contains the public part of the newly-generated key pair. Send it to -the owner of the "$signer" domain through appropriate means. -Take care to preseve the file's binary data; you may need to uuencode it. - -Assuming they trust you with your subdomain, they should pass the key through -"gksign" as a filter, returning the signed output to you. When you have this -signed key file available, re-run this process, and we will move on to the -next step. - -EOM -;; -esac diff -urN gale-0.91a/gc/Makefile.am gale-0.91b/gc/Makefile.am --- gale-0.91a/gc/Makefile.am Sat Oct 9 12:05:36 1999 +++ gale-0.91b/gc/Makefile.am Sun Jan 30 21:43:57 2000 @@ -15,4 +15,4 @@ $(MAKE) -f Makefile.gc clean srcdir="${srcdir}" CC="${CC}" dist-hook: - $(RM) $(distdir)/README + $(RM) $(distdir)/README $(distdir)/gc.h diff -urN gale-0.91a/gc/Makefile.in gale-0.91b/gc/Makefile.in --- gale-0.91a/gc/Makefile.in Sun Dec 26 22:17:26 1999 +++ gale-0.91b/gc/Makefile.in Sun Jan 30 21:54:47 2000 @@ -411,7 +411,7 @@ $(MAKE) -f Makefile.gc clean srcdir="${srcdir}" CC="${CC}" dist-hook: - $(RM) $(distdir)/README + $(RM) $(distdir)/README $(distdir)/gc.h # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff -urN gale-0.91a/gc/gc.h gale-0.91b/gc/gc.h --- gale-0.91a/gc/gc.h Sun Oct 10 11:13:03 1999 +++ gale-0.91b/gc/gc.h Wed Dec 31 16:00:00 1969 @@ -1,754 +0,0 @@ -/* - * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers - * Copyright (c) 1991-1995 by Xerox Corporation. All rights reserved. - * Copyright 1996 by Silicon Graphics. All rights reserved. - * - * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED - * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. - * - * Permission is hereby granted to use or copy this program - * for any purpose, provided the above notices are retained on all copies. - * Permission to modify the code and to distribute modified code is granted, - * provided the above notices are retained, and a notice that the code was - * modified is included with the above copyright notice. - */ - -/* - * Note that this defines a large number of tuning hooks, which can - * safely be ignored in nearly all cases. For normal use it suffices - * to call only GC_MALLOC and perhaps GC_REALLOC. - * For better performance, also look at GC_MALLOC_ATOMIC, and - * GC_enable_incremental. If you need an action to be performed - * immediately before an object is collected, look at GC_register_finalizer. - * If you are using Solaris threads, look at the end of this file. - * Everything else is best ignored unless you encounter performance - * problems. - */ - -#ifndef _GC_H - -# define _GC_H -# define __GC -# include - -#if defined(__CYGWIN32__) && defined(GC_USE_DLL) -#include "libgc_globals.h" -#endif - -#if defined(_MSC_VER) && defined(_DLL) -# ifdef GC_BUILD -# define GC_API __declspec(dllexport) -# else -# define GC_API __declspec(dllimport) -# endif -#endif - -#if defined(__WATCOMC__) && defined(GC_DLL) -# ifdef GC_BUILD -# define GC_API extern __declspec(dllexport) -# else -# define GC_API extern __declspec(dllimport) -# endif -#endif - -#ifndef GC_API -#define GC_API extern -#endif - -# if defined(__STDC__) || defined(__cplusplus) -# define GC_PROTO(args) args - typedef void * GC_PTR; -# else -# define GC_PROTO(args) () - typedef char * GC_PTR; -# endif - -# ifdef __cplusplus - extern "C" { -# endif - - -/* Define word and signed_word to be unsigned and signed types of the */ -/* size as char * or void *. There seems to be no way to do this */ -/* even semi-portably. The following is probably no better/worse */ -/* than almost anything else. */ -/* The ANSI standard suggests that size_t and ptr_diff_t might be */ -/* better choices. But those appear to have incorrect definitions */ -/* on may systems. Notably "typedef int size_t" seems to be both */ -/* frequent and WRONG. */ -typedef unsigned long GC_word; -typedef long GC_signed_word; - -/* Public read-only variables */ - -GC_API GC_word GC_gc_no;/* Counter incremented per collection. */ - /* Includes empty GCs at startup. */ - - -/* Public R/W variables */ - -GC_API GC_PTR (*GC_oom_fn) GC_PROTO((size_t bytes_requested)); - /* When there is insufficient memory to satisfy */ - /* an allocation request, we return */ - /* (*GC_oom_fn)(). By default this just */ - /* returns 0. */ - /* If it returns, it must return 0 or a valid */ - /* pointer to a previously allocated heap */ - /* object. */ - -GC_API int GC_find_leak; - /* Do not actually garbage collect, but simply */ - /* report inaccessible memory that was not */ - /* deallocated with GC_free. Initial value */ - /* is determined by FIND_LEAK macro. */ - -GC_API int GC_quiet; /* Disable statistics output. Only matters if */ - /* collector has been compiled with statistics */ - /* enabled. This involves a performance cost, */ - /* and is thus not the default. */ - -GC_API int GC_finalize_on_demand; - /* If nonzero, finalizers will only be run in */ - /* response to an eplit GC_invoke_finalizers */ - /* call. The default is determined by whether */ - /* the FINALIZE_ON_DEMAND macro is defined */ - /* when the collector is built. */ - -GC_API int GC_java_finalization; - /* Mark objects reachable from finalizable */ - /* objects in a separate postpass. This makes */ - /* it a bit safer to use non-topologically- */ - /* ordered finalization. Default value is */ - /* determined by JAVA_FINALIZATION macro. */ - -GC_API int GC_dont_gc; /* Dont collect unless explicitly requested, e.g. */ - /* because it's not safe. */ - -GC_API int GC_dont_expand; - /* Dont expand heap unless explicitly requested */ - /* or forced to. */ - -GC_API int GC_full_freq; /* Number of partial collections between */ - /* full collections. Matters only if */ - /* GC_incremental is set. */ - -GC_API GC_word GC_non_gc_bytes; - /* Bytes not considered candidates for collection. */ - /* Used only to control scheduling of collections. */ - -GC_API GC_word GC_free_space_divisor; - /* We try to make sure that we allocate at */ - /* least N/GC_free_space_divisor bytes between */ - /* collections, where N is the heap size plus */ - /* a rough estimate of the root set size. */ - /* Initially, GC_free_space_divisor = 4. */ - /* Increasing its value will use less space */ - /* but more collection time. Decreasing it */ - /* will appreciably decrease collection time */ - /* at the expense of space. */ - /* GC_free_space_divisor = 1 will effectively */ - /* disable collections. */ - -GC_API GC_word GC_max_retries; - /* The maximum number of GCs attempted before */ - /* reporting out of memory after heap */ - /* expansion fails. Initially 0. */ - - -GC_API char *GC_stackbottom; /* Cool end of user stack. */ - /* May be set in the client prior to */ - /* calling any GC_ routines. This */ - /* avoids some overhead, and */ - /* potentially some signals that can */ - /* confuse debuggers. Otherwise the */ - /* collector attempts to set it */ - /* automatically. */ - /* For multithreaded code, this is the */ - /* cold end of the stack for the */ - /* primordial thread. */ - -/* Public procedures */ -/* - * general purpose allocation routines, with roughly malloc calling conv. - * The atomic versions promise that no relevant pointers are contained - * in the object. The nonatomic versions guarantee that the new object - * is cleared. GC_malloc_stubborn promises that no changes to the object - * will occur after GC_end_stubborn_change has been called on the - * result of GC_malloc_stubborn. GC_malloc_uncollectable allocates an object - * that is scanned for pointers to collectable objects, but is not itself - * collectable. GC_malloc_uncollectable and GC_free called on the resulting - * object implicitly update GC_non_gc_bytes appropriately. - */ -GC_API GC_PTR GC_malloc GC_PROTO((size_t size_in_bytes)); -GC_API GC_PTR GC_malloc_atomic GC_PROTO((size_t size_in_bytes)); -GC_API GC_PTR GC_malloc_uncollectable GC_PROTO((size_t size_in_bytes)); -GC_API GC_PTR GC_malloc_stubborn GC_PROTO((size_t size_in_bytes)); - -/* The following is only defined if the library has been suitably */ -/* compiled: */ -GC_API GC_PTR GC_malloc_atomic_uncollectable GC_PROTO((size_t size_in_bytes)); - -/* Explicitly deallocate an object. Dangerous if used incorrectly. */ -/* Requires a pointer to the base of an object. */ -/* If the argument is stubborn, it should not be changeable when freed. */ -/* An object should not be enable for finalization when it is */ -/* explicitly deallocated. */ -/* GC_free(0) is a no-op, as required by ANSI C for free. */ -GC_API void GC_free GC_PROTO((GC_PTR object_addr)); - -/* - * Stubborn objects may be changed only if the collector is explicitly informed. - * The collector is implicitly informed of coming change when such - * an object is first allocated. The following routines inform the - * collector that an object will no longer be changed, or that it will - * once again be changed. Only nonNIL pointer stores into the object - * are considered to be changes. The argument to GC_end_stubborn_change - * must be exacly the value returned by GC_malloc_stubborn or passed to - * GC_change_stubborn. (In the second case it may be an interior pointer - * within 512 bytes of the beginning of the objects.) - * There is a performance penalty for allowing more than - * one stubborn object to be changed at once, but it is acceptable to - * do so. The same applies to dropping stubborn objects that are still - * changeable. - */ -GC_API void GC_change_stubborn GC_PROTO((GC_PTR)); -GC_API void GC_end_stubborn_change GC_PROTO((GC_PTR)); - -/* Return a pointer to the base (lowest address) of an object given */ -/* a pointer to a location within the object. */ -/* Return 0 if displaced_pointer doesn't point to within a valid */ -/* object. */ -GC_API GC_PTR GC_base GC_PROTO((GC_PTR displaced_pointer)); - -/* Given a pointer to the base of an object, return its size in bytes. */ -/* The returned size may be slightly larger than what was originally */ -/* requested. */ -GC_API size_t GC_size GC_PROTO((GC_PTR object_addr)); - -/* For compatibility with C library. This is occasionally faster than */ -/* a malloc followed by a bcopy. But if you rely on that, either here */ -/* or with the standard C library, your code is broken. In my */ -/* opinion, it shouldn't have been invented, but now we're stuck. -HB */ -/* The resulting object has the same kind as the original. */ -/* If the argument is stubborn, the result will have changes enabled. */ -/* It is an error to have changes enabled for the original object. */ -/* Follows ANSI comventions for NULL old_object. */ -GC_API GC_PTR GC_realloc - GC_PROTO((GC_PTR old_object, size_t new_size_in_bytes)); - -/* Explicitly increase the heap size. */ -/* Returns 0 on failure, 1 on success. */ -GC_API int GC_expand_hp GC_PROTO((size_t number_of_bytes)); - -/* Limit the heap size to n bytes. Useful when you're debugging, */ -/* especially on systems that don't handle running out of memory well. */ -/* n == 0 ==> unbounded. This is the default. */ -GC_API void GC_set_max_heap_size GC_PROTO((GC_word n)); - -/* Inform the collector that a certain section of statically allocated */ -/* memory contains no pointers to garbage collected memory. Thus it */ -/* need not be scanned. This is sometimes important if the application */ -/* maps large read/write files into the address space, which could be */ -/* mistaken for dynamic library data segments on some systems. */ -GC_API void GC_exclude_static_roots GC_PROTO((GC_PTR start, GC_PTR finish)); - -/* Clear the set of root segments. Wizards only. */ -GC_API void GC_clear_roots GC_PROTO((void)); - -/* Add a root segment. Wizards only. */ -GC_API void GC_add_roots GC_PROTO((char * low_address, - char * high_address_plus_1)); - -/* Add a displacement to the set of those considered valid by the */ -/* collector. GC_register_displacement(n) means that if p was returned */ -/* by GC_malloc, then (char *)p + n will be considered to be a valid */ -/* pointer to n. N must be small and less than the size of p. */ -/* (All pointers to the interior of objects from the stack are */ -/* considered valid in any case. This applies to heap objects and */ -/* static data.) */ -/* Preferably, this should be called before any other GC procedures. */ -/* Calling it later adds to the probability of excess memory */ -/* retention. */ -/* This is a no-op if the collector was compiled with recognition of */ -/* arbitrary interior pointers enabled, which is now the default. */ -GC_API void GC_register_displacement GC_PROTO((GC_word n)); - -/* The following version should be used if any debugging allocation is */ -/* being done. */ -GC_API void GC_debug_register_displacement GC_PROTO((GC_word n)); - -/* Explicitly trigger a full, world-stop collection. */ -GC_API void GC_gcollect GC_PROTO((void)); - -/* Trigger a full world-stopped collection. Abort the collection if */ -/* and when stop_func returns a nonzero value. Stop_func will be */ -/* called frequently, and should be reasonably fast. This works even */ -/* if virtual dirty bits, and hence incremental collection is not */ -/* available for this architecture. Collections can be aborted faster */ -/* than normal pause times for incremental collection. However, */ -/* aborted collections do no useful work; the next collection needs */ -/* to start from the beginning. */ -/* Return 0 if the collection was aborted, 1 if it succeeded. */ -typedef int (* GC_stop_func) GC_PROTO((void)); -GC_API int GC_try_to_collect GC_PROTO((GC_stop_func stop_func)); - -/* Return the number of bytes in the heap. Excludes collector private */ -/* data structures. Includes empty blocks and fragmentation loss. */ -/* Includes some pages that were allocated but never written. */ -GC_API size_t GC_get_heap_size GC_PROTO((void)); - -/* Return the number of bytes allocated since the last collection. */ -GC_API size_t GC_get_bytes_since_gc GC_PROTO((void)); - -/* Enable incremental/generational collection. */ -/* Not advisable unless dirty bits are */ -/* available or most heap objects are */ -/* pointerfree(atomic) or immutable. */ -/* Don't use in leak finding mode. */ -/* Ignored if GC_dont_gc is true. */ -GC_API void GC_enable_incremental GC_PROTO((void)); - -/* Perform some garbage collection work, if appropriate. */ -/* Return 0 if there is no more work to be done. */ -/* Typically performs an amount of work corresponding roughly */ -/* to marking from one page. May do more work if further */ -/* progress requires it, e.g. if incremental collection is */ -/* disabled. It is reasonable to call this in a wait loop */ -/* until it returns 0. */ -GC_API int GC_collect_a_little GC_PROTO((void)); - -/* Allocate an object of size lb bytes. The client guarantees that */ -/* as long as the object is live, it will be referenced by a pointer */ -/* that points to somewhere within the first 256 bytes of the object. */ -/* (This should normally be declared volatile to prevent the compiler */ -/* from invalidating this assertion.) This routine is only useful */ -/* if a large array is being allocated. It reduces the chance of */ -/* accidentally retaining such an array as a result of scanning an */ -/* integer that happens to be an address inside the array. (Actually, */ -/* it reduces the chance of the allocator not finding space for such */ -/* an array, since it will try hard to avoid introducing such a false */ -/* reference.) On a SunOS 4.X or MS Windows system this is recommended */ -/* for arrays likely to be larger than 100K or so. For other systems, */ -/* or if the collector is not configured to recognize all interior */ -/* pointers, the threshold is normally much higher. */ -GC_API GC_PTR GC_malloc_ignore_off_page GC_PROTO((size_t lb)); -GC_API GC_PTR GC_malloc_atomic_ignore_off_page GC_PROTO((size_t lb)); - -#if defined(__sgi) && !defined(__GNUC__) && _COMPILER_VERSION >= 720 -# define GC_ADD_CALLER -# define GC_RETURN_ADDR (GC_word)__return_address -#endif - -#ifdef GC_ADD_CALLER -# define GC_EXTRAS GC_RETURN_ADDR, __FILE__, __LINE__ -# define GC_EXTRA_PARAMS GC_word ra, char * descr_string, int descr_int -#else -# define GC_EXTRAS __FILE__, __LINE__ -# define GC_EXTRA_PARAMS char * descr_string, int descr_int -#endif - -/* Debugging (annotated) allocation. GC_gcollect will check */ -/* objects allocated in this way for overwrites, etc. */ -GC_API GC_PTR GC_debug_malloc - GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS)); -GC_API GC_PTR GC_debug_malloc_atomic - GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS)); -GC_API GC_PTR GC_debug_malloc_uncollectable - GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS)); -GC_API GC_PTR GC_debug_malloc_stubborn - GC_PROTO((size_t size_in_bytes, GC_EXTRA_PARAMS)); -GC_API void GC_debug_free GC_PROTO((GC_PTR object_addr)); -GC_API GC_PTR GC_debug_realloc - GC_PROTO((GC_PTR old_object, size_t new_size_in_bytes, - GC_EXTRA_PARAMS)); - -GC_API void GC_debug_change_stubborn GC_PROTO((GC_PTR)); -GC_API void GC_debug_end_stubborn_change GC_PROTO((GC_PTR)); -# ifdef GC_DEBUG -# define GC_MALLOC(sz) GC_debug_malloc(sz, GC_EXTRAS) -# define GC_MALLOC_ATOMIC(sz) GC_debug_malloc_atomic(sz, GC_EXTRAS) -# define GC_MALLOC_UNCOLLECTABLE(sz) GC_debug_malloc_uncollectable(sz, \ - GC_EXTRAS) -# define GC_REALLOC(old, sz) GC_debug_realloc(old, sz, GC_EXTRAS) -# define GC_FREE(p) GC_debug_free(p) -# define GC_REGISTER_FINALIZER(p, f, d, of, od) \ - GC_debug_register_finalizer(p, f, d, of, od) -# define GC_REGISTER_FINALIZER_IGNORE_SELF(p, f, d, of, od) \ - GC_debug_register_finalizer_ignore_self(p, f, d, of, od) -# define GC_MALLOC_STUBBORN(sz) GC_debug_malloc_stubborn(sz, GC_EXTRAS); -# define GC_CHANGE_STUBBORN(p) GC_debug_change_stubborn(p) -# define GC_END_STUBBORN_CHANGE(p) GC_debug_end_stubborn_change(p) -# define GC_GENERAL_REGISTER_DISAPPEARING_LINK(link, obj) \ - GC_general_register_disappearing_link(link, GC_base(obj)) -# define GC_REGISTER_DISPLACEMENT(n) GC_debug_register_displacement(n) -# else -# define GC_MALLOC(sz) GC_malloc(sz) -# define GC_MALLOC_ATOMIC(sz) GC_malloc_atomic(sz) -# define GC_MALLOC_UNCOLLECTABLE(sz) GC_malloc_uncollectable(sz) -# define GC_REALLOC(old, sz) GC_realloc(old, sz) -# define GC_FREE(p) GC_free(p) -# define GC_REGISTER_FINALIZER(p, f, d, of, od) \ - GC_register_finalizer(p, f, d, of, od) -# define GC_REGISTER_FINALIZER_IGNORE_SELF(p, f, d, of, od) \ - GC_register_finalizer_ignore_self(p, f, d, of, od) -# define GC_MALLOC_STUBBORN(sz) GC_malloc_stubborn(sz) -# define GC_CHANGE_STUBBORN(p) GC_change_stubborn(p) -# define GC_END_STUBBORN_CHANGE(p) GC_end_stubborn_change(p) -# define GC_GENERAL_REGISTER_DISAPPEARING_LINK(link, obj) \ - GC_general_register_disappearing_link(link, obj) -# define GC_REGISTER_DISPLACEMENT(n) GC_register_displacement(n) -# endif -/* The following are included because they are often convenient, and */ -/* reduce the chance for a misspecifed size argument. But calls may */ -/* expand to something syntactically incorrect if t is a complicated */ -/* type expression. */ -# define GC_NEW(t) (t *)GC_MALLOC(sizeof (t)) -# define GC_NEW_ATOMIC(t) (t *)GC_MALLOC_ATOMIC(sizeof (t)) -# define GC_NEW_STUBBORN(t) (t *)GC_MALLOC_STUBBORN(sizeof (t)) -# define GC_NEW_UNCOLLECTABLE(t) (t *)GC_MALLOC_UNCOLLECTABLE(sizeof (t)) - -/* Finalization. Some of these primitives are grossly unsafe. */ -/* The idea is to make them both cheap, and sufficient to build */ -/* a safer layer, closer to PCedar finalization. */ -/* The interface represents my conclusions from a long discussion */ -/* with Alan Demers, Dan Greene, Carl Hauser, Barry Hayes, */ -/* Christian Jacobi, and Russ Atkinson. It's not perfect, and */ -/* probably nobody else agrees with it. Hans-J. Boehm 3/13/92 */ -typedef void (*GC_finalization_proc) - GC_PROTO((GC_PTR obj, GC_PTR client_data)); - -GC_API void GC_register_finalizer - GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, - GC_finalization_proc *ofn, GC_PTR *ocd)); -GC_API void GC_debug_register_finalizer - GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, - GC_finalization_proc *ofn, GC_PTR *ocd)); - /* When obj is no longer accessible, invoke */ - /* (*fn)(obj, cd). If a and b are inaccessible, and */ - /* a points to b (after disappearing links have been */ - /* made to disappear), then only a will be */ - /* finalized. (If this does not create any new */ - /* pointers to b, then b will be finalized after the */ - /* next collection.) Any finalizable object that */ - /* is reachable from itself by following one or more */ - /* pointers will not be finalized (or collected). */ - /* Thus cycles involving finalizable objects should */ - /* be avoided, or broken by disappearing links. */ - /* All but the last finalizer registered for an object */ - /* is ignored. */ - /* Finalization may be removed by passing 0 as fn. */ - /* Finalizers are implicitly unregistered just before */ - /* they are invoked. */ - /* The old finalizer and client data are stored in */ - /* *ofn and *ocd. */ - /* Fn is never invoked on an accessible object, */ - /* provided hidden pointers are converted to real */ - /* pointers only if the allocation lock is held, and */ - /* such conversions are not performed by finalization */ - /* routines. */ - /* If GC_register_finalizer is aborted as a result of */ - /* a signal, the object may be left with no */ - /* finalization, even if neither the old nor new */ - /* finalizer were NULL. */ - /* Obj should be the nonNULL starting address of an */ - /* object allocated by GC_malloc or friends. */ - /* Note that any garbage collectable object referenced */ - /* by cd will be considered accessible until the */ - /* finalizer is invoked. */ - -/* Another versions of the above follow. It ignores */ -/* self-cycles, i.e. pointers from a finalizable object to */ -/* itself. There is a stylistic argument that this is wrong, */ -/* but it's unavoidable for C++, since the compiler may */ -/* silently introduce these. It's also benign in that specific */ -/* case. */ -GC_API void GC_register_finalizer_ignore_self - GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, - GC_finalization_proc *ofn, GC_PTR *ocd)); -GC_API void GC_debug_register_finalizer_ignore_self - GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd, - GC_finalization_proc *ofn, GC_PTR *ocd)); - -/* The following routine may be used to break cycles between */ -/* finalizable objects, thus causing cyclic finalizable */ -/* objects to be finalized in the correct order. Standard */ -/* use involves calling GC_register_disappearing_link(&p), */ -/* where p is a pointer that is not followed by finalization */ -/* code, and should not be considered in determining */ -/* finalization order. */ -GC_API int GC_register_disappearing_link GC_PROTO((GC_PTR * /* link */)); - /* Link should point to a field of a heap allocated */ - /* object obj. *link will be cleared when obj is */ - /* found to be inaccessible. This happens BEFORE any */ - /* finalization code is invoked, and BEFORE any */ - /* decisions about finalization order are made. */ - /* This is useful in telling the finalizer that */ - /* some pointers are not essential for proper */ - /* finalization. This may avoid finalization cycles. */ - /* Note that obj may be resurrected by another */ - /* finalizer, and thus the clearing of *link may */ - /* be visible to non-finalization code. */ - /* There's an argument that an arbitrary action should */ - /* be allowed here, instead of just clearing a pointer. */ - /* But this causes problems if that action alters, or */ - /* examines connectivity. */ - /* Returns 1 if link was already registered, 0 */ - /* otherwise. */ - /* Only exists for backward compatibility. See below: */ - -GC_API int GC_general_register_disappearing_link - GC_PROTO((GC_PTR * /* link */, GC_PTR obj)); - /* A slight generalization of the above. *link is */ - /* cleared when obj first becomes inaccessible. This */ - /* can be used to implement weak pointers easily and */ - /* safely. Typically link will point to a location */ - /* holding a disguised pointer to obj. (A pointer */ - /* inside an "atomic" object is effectively */ - /* disguised.) In this way soft */ - /* pointers are broken before any object */ - /* reachable from them are finalized. Each link */ - /* May be registered only once, i.e. with one obj */ - /* value. This was added after a long email discussion */ - /* with John Ellis. */ - /* Obj must be a pointer to the first word of an object */ - /* we allocated. It is unsafe to explicitly deallocate */ - /* the object containing link. Explicitly deallocating */ - /* obj may or may not cause link to eventually be */ - /* cleared. */ -GC_API int GC_unregister_disappearing_link GC_PROTO((GC_PTR * /* link */)); - /* Returns 0 if link was not actually registered. */ - /* Undoes a registration by either of the above two */ - /* routines. */ - -/* Auxiliary fns to make finalization work correctly with displaced */ -/* pointers introduced by the debugging allocators. */ -GC_API GC_PTR GC_make_closure GC_PROTO((GC_finalization_proc fn, GC_PTR data)); -GC_API void GC_debug_invoke_finalizer GC_PROTO((GC_PTR obj, GC_PTR data)); - -GC_API int GC_invoke_finalizers GC_PROTO((void)); - /* Run finalizers for all objects that are ready to */ - /* be finalized. Return the number of finalizers */ - /* that were run. Normally this is also called */ - /* implicitly during some allocations. If */ - /* GC-finalize_on_demand is nonzero, it must be called */ - /* explicitly. */ - -/* GC_set_warn_proc can be used to redirect or filter warning messages. */ -/* p may not be a NULL pointer. */ -typedef void (*GC_warn_proc) GC_PROTO((char *msg, GC_word arg)); -GC_API GC_warn_proc GC_set_warn_proc GC_PROTO((GC_warn_proc p)); - /* Returns old warning procedure. */ - -/* The following is intended to be used by a higher level */ -/* (e.g. cedar-like) finalization facility. It is expected */ -/* that finalization code will arrange for hidden pointers to */ -/* disappear. Otherwise objects can be accessed after they */ -/* have been collected. */ -/* Note that putting pointers in atomic objects or in */ -/* nonpointer slots of "typed" objects is equivalent to */ -/* disguising them in this way, and may have other advantages. */ -# if defined(I_HIDE_POINTERS) || defined(GC_I_HIDE_POINTERS) - typedef GC_word GC_hidden_pointer; -# define HIDE_POINTER(p) (~(GC_hidden_pointer)(p)) -# define REVEAL_POINTER(p) ((GC_PTR)(HIDE_POINTER(p))) - /* Converting a hidden pointer to a real pointer requires verifying */ - /* that the object still exists. This involves acquiring the */ - /* allocator lock to avoid a race with the collector. */ -# endif /* I_HIDE_POINTERS */ - -typedef GC_PTR (*GC_fn_type) GC_PROTO((GC_PTR client_data)); -GC_API GC_PTR GC_call_with_alloc_lock - GC_PROTO((GC_fn_type fn, GC_PTR client_data)); - -/* Check that p and q point to the same object. */ -/* Fail conspicuously if they don't. */ -/* Returns the first argument. */ -/* Succeeds if neither p nor q points to the heap. */ -/* May succeed if both p and q point to between heap objects. */ -GC_API GC_PTR GC_same_obj GC_PROTO((GC_PTR p, GC_PTR q)); - -/* Checked pointer pre- and post- increment operations. Note that */ -/* the second argument is in units of bytes, not multiples of the */ -/* object size. This should either be invoked from a macro, or the */ -/* call should be automatically generated. */ -GC_API GC_PTR GC_pre_incr GC_PROTO((GC_PTR *p, size_t how_much)); -GC_API GC_PTR GC_post_incr GC_PROTO((GC_PTR *p, size_t how_much)); - -/* Check that p is visible */ -/* to the collector as a possibly pointer containing location. */ -/* If it isn't fail conspicuously. */ -/* Returns the argument in all cases. May erroneously succeed */ -/* in hard cases. (This is intended for debugging use with */ -/* untyped allocations. The idea is that it should be possible, though */ -/* slow, to add such a call to all indirect pointer stores.) */ -/* Currently useless for multithreaded worlds. */ -GC_API GC_PTR GC_is_visible GC_PROTO((GC_PTR p)); - -/* Check that if p is a pointer to a heap page, then it points to */ -/* a valid displacement within a heap object. */ -/* Fail conspicuously if this property does not hold. */ -/* Uninteresting with ALL_INTERIOR_POINTERS. */ -/* Always returns its argument. */ -GC_API GC_PTR GC_is_valid_displacement GC_PROTO((GC_PTR p)); - -/* Safer, but slow, pointer addition. Probably useful mainly with */ -/* a preprocessor. Useful only for heap pointers. */ -#ifdef GC_DEBUG -# define GC_PTR_ADD3(x, n, type_of_result) \ - ((type_of_result)GC_same_obj((x)+(n), (x))) -# define GC_PRE_INCR3(x, n, type_of_result) \ - ((type_of_result)GC_pre_incr(&(x), (n)*sizeof(*x)) -# define GC_POST_INCR2(x, type_of_result) \ - ((type_of_result)GC_post_incr(&(x), sizeof(*x)) -# ifdef __GNUC__ -# define GC_PTR_ADD(x, n) \ - GC_PTR_ADD3(x, n, typeof(x)) -# define GC_PRE_INCR(x, n) \ - GC_PRE_INCR3(x, n, typeof(x)) -# define GC_POST_INCR(x, n) \ - GC_POST_INCR3(x, typeof(x)) -# else - /* We can't do this right without typeof, which ANSI */ - /* decided was not sufficiently useful. Repeatedly */ - /* mentioning the arguments seems too dangerous to be */ - /* useful. So does not casting the result. */ -# define GC_PTR_ADD(x, n) ((x)+(n)) -# endif -#else /* !GC_DEBUG */ -# define GC_PTR_ADD3(x, n, type_of_result) ((x)+(n)) -# define GC_PTR_ADD(x, n) ((x)+(n)) -# define GC_PRE_INCR3(x, n, type_of_result) ((x) += (n)) -# define GC_PRE_INCR(x, n) ((x) += (n)) -# define GC_POST_INCR2(x, n, type_of_result) ((x)++) -# define GC_POST_INCR(x, n) ((x)++) -#endif - -/* Safer assignment of a pointer to a nonstack location. */ -#ifdef GC_DEBUG -# ifdef __STDC__ -# define GC_PTR_STORE(p, q) \ - (*(void **)GC_is_visible(p) = GC_is_valid_displacement(q)) -# else -# define GC_PTR_STORE(p, q) \ - (*(char **)GC_is_visible(p) = GC_is_valid_displacement(q)) -# endif -#else /* !GC_DEBUG */ -# define GC_PTR_STORE(p, q) *((p) = (q)) -#endif - -/* Fynctions called to report pointer checking errors */ -GC_API void (*GC_same_obj_print_proc) GC_PROTO((GC_PTR p, GC_PTR q)); - -GC_API void (*GC_is_valid_displacement_print_proc) - GC_PROTO((GC_PTR p)); - -GC_API void (*GC_is_visible_print_proc) - GC_PROTO((GC_PTR p)); - -#if defined(_SOLARIS_PTHREADS) && !defined(SOLARIS_THREADS) -# define SOLARIS_THREADS -#endif - -#ifdef SOLARIS_THREADS -/* We need to intercept calls to many of the threads primitives, so */ -/* that we can locate thread stacks and stop the world. */ -/* Note also that the collector cannot see thread specific data. */ -/* Thread specific data should generally consist of pointers to */ -/* uncollectable objects, which are deallocated using the destructor */ -/* facility in thr_keycreate. */ -# include -# include - int GC_thr_create(void *stack_base, size_t stack_size, - void *(*start_routine)(void *), void *arg, long flags, - thread_t *new_thread); - int GC_thr_join(thread_t wait_for, thread_t *departed, void **status); - int GC_thr_suspend(thread_t target_thread); - int GC_thr_continue(thread_t target_thread); - void * GC_dlopen(const char *path, int mode); - -# ifdef _SOLARIS_PTHREADS -# include - extern int GC_pthread_create(pthread_t *new_thread, - const pthread_attr_t *attr, - void * (*thread_execp)(void *), void *arg); - extern int GC_pthread_join(pthread_t wait_for, void **status); - -# undef thread_t - -# define pthread_join GC_pthread_join -# define pthread_create GC_pthread_create -#endif - -# define thr_create GC_thr_create -# define thr_join GC_thr_join -# define thr_suspend GC_thr_suspend -# define thr_continue GC_thr_continue -# define dlopen GC_dlopen - -# endif /* SOLARIS_THREADS */ - - -#if defined(IRIX_THREADS) || defined(LINUX_THREADS) -/* We treat these similarly. */ -# include -# include - - int GC_pthread_create(pthread_t *new_thread, - const pthread_attr_t *attr, - void *(*start_routine)(void *), void *arg); - int GC_pthread_sigmask(int how, const sigset_t *set, sigset_t *oset); - int GC_pthread_join(pthread_t thread, void **retval); - -# define pthread_create GC_pthread_create -# define pthread_sigmask GC_pthread_sigmask -# define pthread_join GC_pthread_join - -#endif /* IRIX_THREADS || LINUX_THREADS */ - -# if defined(PCR) || defined(SOLARIS_THREADS) || defined(WIN32_THREADS) || \ - defined(IRIX_THREADS) || defined(LINUX_THREADS) || \ - defined(IRIX_JDK_THREADS) - /* Any flavor of threads except SRC_M3. */ -/* This returns a list of objects, linked through their first */ -/* word. Its use can greatly reduce lock contention problems, since */ -/* the allocation lock can be acquired and released many fewer times. */ -/* lb must be large enough to hold the pointer field. */ -GC_PTR GC_malloc_many(size_t lb); -#define GC_NEXT(p) (*(GC_PTR *)(p)) /* Retrieve the next element */ - /* in returned list. */ -extern void GC_thr_init(); /* Needed for Solaris/X86 */ - -#endif /* THREADS && !SRC_M3 */ - -/* - * If you are planning on putting - * the collector in a SunOS 5 dynamic library, you need to call GC_INIT() - * from the statically loaded program section. - * This circumvents a Solaris 2.X (X<=4) linker bug. - */ -#if defined(sparc) || defined(__sparc) -# define GC_INIT() { extern end, etext; \ - GC_noop(&end, &etext); } -#else -# if defined(__CYGWIN32__) && defined(GC_USE_DLL) - /* - * Similarly gnu-win32 DLLs need explicit initialization - */ -# define GC_INIT() { GC_add_roots(DATASTART, DATAEND); } -# else -# define GC_INIT() -# endif -#endif - -#if (defined(_MSDOS) || defined(_MSC_VER)) && (_M_IX86 >= 300) \ - || defined(_WIN32) - /* win32S may not free all resources on process exit. */ - /* This explicitly deallocates the heap. */ - GC_API void GC_win32_free_heap (); -#endif - -#ifdef __cplusplus - } /* end of extern "C" */ -#endif - -#endif /* _GC_H */ diff -urN gale-0.91a/gdomain/gdomain.c gale-0.91b/gdomain/gdomain.c --- gale-0.91a/gdomain/gdomain.c Sun Dec 26 19:32:06 1999 +++ gale-0.91b/gdomain/gdomain.c Sun Jan 30 20:57:37 2000 @@ -43,23 +43,17 @@ void request(struct gale_link *link,struct auth_id *id) { struct gale_message *reply; + gale_check_mem(); reply = auth_id_public(id) ? success(id) : failure(id); auth_sign(&reply->data,domain,AUTH_SIGN_SELF); if (reply) link_put(link,reply); } -int prefix(struct gale_text x,struct gale_text prefix) { - return !gale_text_compare(gale_text_left(x,prefix.l),prefix); -} - -int suffix(struct gale_text x,struct gale_text suffix) { - return !gale_text_compare(gale_text_right(x,suffix.l),suffix); -} - void *on_message(struct gale_link *link,struct gale_message *msg,void *data) { struct auth_id *encrypted = NULL,*signature = NULL; - struct gale_text user = null_text; struct gale_fragment frag; + + gale_check_mem(); encrypted = auth_decrypt(&msg->data); if (!msg) return OOP_CONTINUE; diff -urN gale-0.91a/gsub/gsub.c gale-0.91b/gsub/gsub.c --- gale-0.91a/gsub/gsub.c Sun Dec 19 22:27:49 1999 +++ gale-0.91b/gsub/gsub.c Mon Jan 17 22:54:54 2000 @@ -528,7 +528,7 @@ /* Various flags. */ int opt,do_fork = 0,do_kill = 0; struct gale_text rclib = null_text; - struct gale_text other = null_text; + struct gale_text others,other = null_text; /* Subscription list. */ struct gale_text serv = null_text; @@ -566,7 +566,8 @@ add_subs(&serv,gale_var(G_("GALE_GSUB"))); /* Other IDs to listen to. */ - while (gale_text_token(gale_var(G_("GALE_OTHERS")),',',&other)) + others = gale_var(G_("GALE_OTHERS")); + while (gale_text_token(others,',',&other)) if (0 != other.l) add_other(&serv,other); /* Parse command line arguments. */ diff -urN gale-0.91a/include/gale/misc.h gale-0.91b/include/gale/misc.h --- gale-0.91a/include/gale/misc.h Sat Dec 25 13:52:44 1999 +++ gale-0.91b/include/gale/misc.h Sun Jan 30 20:55:04 2000 @@ -68,6 +68,7 @@ void *gale_malloc_safe(size_t size); /* memory will not be collected */ void gale_free(void *); void gale_finalizer(void *,void (*)(void *,void *),void *); +void gale_check_mem(void); struct gale_ptr; struct gale_ptr *gale_make_weak(void *); @@ -169,6 +170,9 @@ struct gale_group,struct gale_text name,enum gale_fragment_type, struct gale_fragment *); +struct gale_text gale_print_fragment(struct gale_fragment); +struct gale_text gale_print_group(struct gale_group,int indent); + /* -- data interchange conversion ------------------------------------------ */ int gale_unpack_copy(struct gale_data *,void *,size_t); @@ -273,6 +277,7 @@ /* Debugging printf. Will only output if gale_debug > level. */ void gale_dprintf(int level,const char *fmt,...); void gale_diprintf(int level,int indent,const char *fmt,...); +void gale_dmessage(int level,struct gale_message *msg); /* -- useful things for servers -------------------------------------------- */ diff -urN gale-0.91a/kutils/gkinfo.c gale-0.91b/kutils/gkinfo.c --- gale-0.91a/kutils/gkinfo.c Sun Dec 26 17:17:15 1999 +++ gale-0.91b/kutils/gkinfo.c Sun Jan 30 20:41:45 2000 @@ -5,13 +5,19 @@ #include "gale/all.h" +/* For MD5: */ +#include "global.h" +#include "rsaref.h" + #include #include #include #include #include -int iflag = 0; +int do_name_only = 0; +int do_verbose = 0; +int is_found = 0; const byte m_gale[] = { 0x68, 0x13 }; const byte m_pub[] = { 0x00, 0x00 }; @@ -20,87 +26,79 @@ const byte m_priv2[] = { 0x00, 0x03 }; const byte m_sign[] = { 0x01, 0x00 }; -void pub_info(struct auth_id *id) { +const byte m_gale3[] = { 'G', 'A', 'L', 'E' }; +const byte m_pub3[] = { 0x00, 0x01 }; + +const char *do_indent(int indent) { + char *str; + gale_create_array(str,1 + indent); + str[indent] = '\0'; + while (indent--) str[indent] = ' '; + return str; +} + +void do_info(struct gale_group grp,const struct inode *i,int indent) { + if (0 != i->name.l) + printf("%sStored in \"%s\"\n",do_indent(indent), + gale_text_to_local(i->name)); + + printf("%s",gale_text_to_local(gale_print_group(grp,2))); +} + +void pub_info(struct auth_id *id,int indent) { struct gale_fragment frag; printf("<%s>",gale_text_to_local(id->name)); if (gale_group_lookup(id->pub_data,G_("key.owner"),frag_text,&frag)) printf(" (%s)",gale_text_to_local(frag.value.text)); - if (gale_group_lookup(id->pub_data,G_("rsa.bits"),frag_number,&frag)) - printf(", %d bits",frag.value.number); if (id->pub_trusted) printf(" [trusted]"); printf("\n"); - if (gale_group_lookup(id->pub_data,G_("key.redirect"),frag_text,&frag)) - printf("Redirector to: <%s>\n", - gale_text_to_local(frag.value.text)); -} -void pub_date(struct gale_time time) { - struct timeval tv; - time_t sec; - char buf[30]; - gale_time_to(&tv,time); - sec = tv.tv_sec; - strftime(buf,sizeof(buf),"%Y-%m-%d %H:%M",localtime(&sec)); - printf("%s",buf); -} + if (do_verbose) do_info(id->pub_data,&id->pub_inode,indent += 2); -void pub_key(struct auth_id *id) { - int indent = 0; + if (gale_group_lookup(id->pub_data,G_("key.redirect"),frag_text,&frag)) + printf("%sRedirector to <%s>\n", + do_indent(indent),gale_text_to_local(frag.value.text)); - if (iflag) { - printf("%s\n",gale_text_to_local(id->name)); + if (do_verbose) { + putchar('\n'); return; } + if (NULL == id->pub_signer) return; + printf("%sSigned: ",do_indent(indent += 2)); + pub_info(id->pub_signer,indent); +} + +void pub_key(struct auth_id *id) { + is_found = 1; + if (do_name_only) return; + if (_ga_trust_pub(id)) printf("Trusted"); else printf("UNTRUSTED"); - printf(" public key: "); pub_info(id); - while (NULL != id->pub_signer) { - struct gale_fragment frag; - int i; - indent += 2; - for (i = 0; i < indent; ++i) printf(" "); - printf("Signed"); - if (gale_group_lookup(id->pub_data,G_("key.signed"), - frag_time,&frag) - && gale_time_compare(gale_time_zero(),frag.value.time) < 0) { - printf(" ("); - pub_date(frag.value.time); - if (gale_group_lookup(id->pub_data,G_("key.expires"), - frag_time,&frag) - && gale_time_compare(frag.value.time, - gale_time_forever()) < 0) { - printf(" - "); - pub_date(frag.value.time); - } - printf(")"); - } - id = id->pub_signer; - printf(": "); pub_info(id); - } + printf(" public key: "); pub_info(id,0); } void priv_key(struct auth_id *id) { - struct gale_fragment frag; - if (iflag) { - printf("%s\n",gale_text_to_local(id->name)); - return; + is_found = 1; + if (do_name_only) return; + + printf("Private key: <%s>\n",gale_text_to_local(id->name)); + if (do_verbose) { + do_info(id->priv_data,&id->priv_inode,2); + putchar('\n'); } - printf("Private key: <%s>",gale_text_to_local(id->name)); - if (gale_group_lookup(id->priv_data,G_("rsa.bits"),frag_number,&frag)) - printf(", %d bits",frag.value.number); - printf("\n"); } void usage(void) { fprintf(stderr, "%s\n" - "usage: gkinfo [-hix] (id | < keyfile)\n" + "usage: gkinfo [-hvix] (id | < keyfile)\n" "flags: -h Display this message\n" " -i Output key ID only\n" + " -v Verbose output\n" " -x Disable remote key retrieval\n" ,GALE_BANNER); exit(1); @@ -113,9 +111,10 @@ gale_init("gkinfo",argc,argv); - while ((arg = getopt(argc,argv,"ixdD")) != EOF) switch (arg) { - case 'i': iflag = 1; break; + while ((arg = getopt(argc,argv,"ixvdD")) != EOF) switch (arg) { + case 'i': do_name_only = 1; break; case 'x': disable_gale_akd(); break; + case 'v': do_verbose = 1; break; case 'd': ++gale_global->debug_level; break; case 'D': gale_global->debug_level += 5; break; case 'h': @@ -123,46 +122,55 @@ } if (optind + 1 == argc) { - int found = 0; init_auth_id(&id,gale_text_from_local(argv[optind],-1)); - if (iflag) { - found = auth_id_private(id) || auth_id_public(id); - printf("%s\n",gale_text_to_local(auth_id_name(id))); - } else { - if (auth_id_private(id)) { - found = 1; - priv_key(id); - } - if (auth_id_public(id)) { - found = 1; - pub_key(id); - } - } - if (!found) gale_alert(GALE_ERROR,"could not find key",0); + if (auth_id_private(id)) priv_key(id); + if (auth_id_public(id)) pub_key(id); } else { + struct gale_data test; + if (optind != argc) usage(); if (isatty(0)) usage(); if (!_ga_load(0,&key)) gale_alert(GALE_ERROR,"could not read file",errno); - if (key.l < 4 || memcmp(key.p,m_gale,sizeof(m_gale))) - gale_alert(GALE_ERROR,"unrecognized file format",0); - - if (!memcmp(key.p + sizeof(m_gale),m_pub,sizeof(m_pub)) - || !memcmp(key.p + sizeof(m_gale),m_pub2,sizeof(m_pub2))) { - struct inode inode = _ga_init_inode(); - _ga_import_pub(&id,key,&inode,IMPORT_NORMAL); - if (!id) gale_alert(GALE_ERROR,"public key invalid",0); - pub_key(id); - } else - if (!memcmp(key.p + sizeof(m_gale),m_priv,sizeof(m_pub)) - || !memcmp(key.p + sizeof(m_gale),m_priv2,sizeof(m_priv2))) { - _ga_import_priv(&id,key,NULL); - if (!id) gale_alert(GALE_ERROR,"private key invalid",0); - priv_key(id); + test = key; + if (gale_unpack_compare(&test,m_gale,sizeof(m_gale))) { + if (gale_unpack_compare(&test,m_pub,sizeof(m_pub)) + || gale_unpack_compare(&test,m_pub2,sizeof(m_pub2))) { + struct inode inode = _ga_init_inode(); + _ga_import_pub(&id,key,&inode,IMPORT_NORMAL); + if (NULL == id) + gale_alert(GALE_ERROR, + "public key invalid",0); + pub_key(id); + } else + if (gale_unpack_compare(&test,m_priv,sizeof(m_priv)) + || gale_unpack_compare(&test,m_priv2,sizeof(m_priv2))){ + _ga_import_priv(&id,key,NULL); + if (NULL == id) + gale_alert(GALE_ERROR, + "private key invalid",0); + priv_key(id); + } else + gale_alert(GALE_ERROR,"invalid key",0); + } else if (gale_unpack_compare(&test,m_gale3,sizeof(m_gale3))) { + if (gale_unpack_compare(&test,m_pub3,sizeof(m_pub3))) { + struct inode inode = _ga_init_inode(); + _ga_import_pub(&id,key,&inode,IMPORT_NORMAL); + if (NULL == id) + gale_alert(GALE_ERROR, + "new public key invalid",0); + pub_key(id); + } else + gale_alert(GALE_ERROR,"invalid key",0); } else - gale_alert(GALE_ERROR,"unknown file data",0); + gale_alert(GALE_ERROR,"unknown file format",0); } + + if (!is_found) + gale_alert(GALE_ERROR,"could not find key",0); + else if (do_name_only) + printf("%s\n",gale_text_to_local(auth_id_name(id))); return 0; } diff -urN gale-0.91a/lib/Makefile.am gale-0.91b/lib/Makefile.am --- gale-0.91a/lib/Makefile.am Sun Dec 26 22:07:10 1999 +++ gale-0.91b/lib/Makefile.am Sun Jan 30 21:02:21 2000 @@ -3,12 +3,12 @@ lib_LTLIBRARIES = libgale.la # version:revision:age -# current as of 0.91 -libgale_la_LDFLAGS = -version-info 7:1:0 +# current as of 0.91b +libgale_la_LDFLAGS = -version-info 8:0:1 libgale_la_SOURCES = \ authgrp.c client.c connect.c find.c id.c init.c global.c \ - input.c kill.c libgale.c link.c message.c output.c \ + input.c kill.c libgale.c link.c message.c output.c debug.c \ standard.c cache.c \ crypt.c customs.c file.c gen.c \ keyid.c findkey.c privkey.c pubkey.c random.c sign.c \ diff -urN gale-0.91a/lib/Makefile.in gale-0.91b/lib/Makefile.in --- gale-0.91a/lib/Makefile.in Sun Dec 26 22:17:32 1999 +++ gale-0.91b/lib/Makefile.in Sun Jan 30 21:54:50 2000 @@ -82,10 +82,10 @@ lib_LTLIBRARIES = libgale.la # version:revision:age -# current as of 0.91 -libgale_la_LDFLAGS = -version-info 7:1:0 +# current as of 0.91b +libgale_la_LDFLAGS = -version-info 8:0:1 -libgale_la_SOURCES = authgrp.c client.c connect.c find.c id.c init.c global.c input.c kill.c libgale.c link.c message.c output.c standard.c cache.c crypt.c customs.c file.c gen.c keyid.c findkey.c privkey.c pubkey.c random.c sign.c dir.c error.c errpuff.c exec.c alloc.c server.c text.c time.c pack.c term.c fragment.c var.c weaktree.c +libgale_la_SOURCES = authgrp.c client.c connect.c find.c id.c init.c global.c input.c kill.c libgale.c link.c message.c output.c debug.c standard.c cache.c crypt.c customs.c file.c gen.c keyid.c findkey.c privkey.c pubkey.c random.c sign.c dir.c error.c errpuff.c exec.c alloc.c server.c text.c time.c pack.c term.c fragment.c var.c weaktree.c noinst_HEADERS = buffer.h common.h file.h id.h key.h pack.h random.h sign.h @@ -103,10 +103,10 @@ libgale_la_LIBADD = libgale_la_OBJECTS = authgrp.lo client.lo connect.lo find.lo id.lo \ init.lo global.lo input.lo kill.lo libgale.lo link.lo message.lo \ -output.lo standard.lo cache.lo crypt.lo customs.lo file.lo gen.lo \ -keyid.lo findkey.lo privkey.lo pubkey.lo random.lo sign.lo dir.lo \ -error.lo errpuff.lo exec.lo alloc.lo server.lo text.lo time.lo pack.lo \ -term.lo fragment.lo var.lo weaktree.lo +output.lo debug.lo standard.lo cache.lo crypt.lo customs.lo file.lo \ +gen.lo keyid.lo findkey.lo privkey.lo pubkey.lo random.lo sign.lo \ +dir.lo error.lo errpuff.lo exec.lo alloc.lo server.lo text.lo time.lo \ +pack.lo term.lo fragment.lo var.lo weaktree.lo CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @@ -284,6 +284,10 @@ ../include/gale/misc.h ../include/gale/core.h ../liboop/oop.h \ ../include/gale/auth.h ../include/gale/client.h key.h file.h \ id.h sign.h +debug.lo debug.o : debug.c ../include/gale/misc.h \ + ../include/gale/types.h ../include/gale/compat.h \ + ../include/gale/config.h ../include/gale/core.h ../liboop/oop.h \ + ../include/gale/globals.h ../include/gale/auth.h dir.lo dir.o : dir.c ../include/gale/all.h ../include/gale/globals.h \ ../include/gale/types.h ../include/gale/compat.h \ ../include/gale/config.h ../include/gale/misc.h \ diff -urN gale-0.91a/lib/alloc.c gale-0.91b/lib/alloc.c --- gale-0.91a/lib/alloc.c Fri Jul 23 23:17:45 1999 +++ gale-0.91b/lib/alloc.c Sun Jan 30 20:54:47 2000 @@ -18,6 +18,7 @@ void *gale_malloc_safe(size_t len) { return GC_malloc_uncollectable(len); } void gale_free(void *ptr) { GC_free(ptr); } void *gale_realloc(void *s,size_t len) { return GC_realloc(s,len); } +void gale_check_mem(void) { GC_gcollect(); } void gale_finalizer(void *obj,void (*f)(void *,void *),void *data) { GC_register_finalizer(obj,f,data,0,0); @@ -42,6 +43,7 @@ void *gale_malloc_safe(size_t len) { return malloc(len); } void gale_free(void *ptr) { free(ptr); } void *gale_realloc(void *s,size_t len) { return realloc(s,len); } +void gale_check_mem(void) { } void gale_finalizer(void *obj,void (*f)(void *,void *),void *data) { } diff -urN gale-0.91a/lib/debug.c gale-0.91b/lib/debug.c --- gale-0.91a/lib/debug.c Wed Dec 31 16:00:00 1969 +++ gale-0.91b/lib/debug.c Sun Jan 30 20:46:49 2000 @@ -0,0 +1,38 @@ +#include "gale/misc.h" +#include "gale/core.h" +#include "gale/globals.h" + +#include + +static void debug(int level,int idelta,const char *fmt,va_list ap) { + static int indent = 0; + int i; + if (idelta < 0) indent += idelta; + for (i = 0; i < indent; ++i) fputc(' ',stderr); + vfprintf(stderr,fmt,ap); + fflush(stderr); + if (idelta > 0) indent += idelta; +} + +void gale_dprintf(int level,const char *fmt,...) { + va_list ap; + if (level >= gale_global->debug_level) return; + va_start(ap,fmt); + debug(level,0,fmt,ap); + va_end(ap); +} + +void gale_diprintf(int level,int indent,const char *fmt,...) { + va_list ap; + if (level >= gale_global->debug_level) return; + va_start(ap,fmt); + debug(level,indent,fmt,ap); + va_end(ap); +} + +void gale_dmessage(int level,struct gale_message *msg) { + if (level >= gale_global->debug_level) return; + gale_dprintf(level," category is %s\n",gale_text_to_local(msg->cat)); + gale_dprintf(level,"%s", + gale_text_to_local(gale_print_group(msg->data,2))); +} diff -urN gale-0.91a/lib/fragment.c gale-0.91b/lib/fragment.c --- gale-0.91a/lib/fragment.c Sat Dec 25 21:02:59 1999 +++ gale-0.91b/lib/fragment.c Sun Jan 30 21:53:04 2000 @@ -1,6 +1,9 @@ #include #include "gale/misc.h" +#include "global.h" +#include "rsaref.h" + #define fragment_text 0 #define fragment_data 1 #define fragment_time 2 @@ -292,4 +295,86 @@ } return size; +} + +struct gale_text gale_print_fragment(struct gale_fragment frag) { + struct gale_time t; + struct gale_text r = null_text; + switch (frag.type) { + case frag_text: + return gale_text_concat(3,G_("\""),frag.value.text,G_("\"")); + + case frag_time: + t = frag.value.time; + if (0 == gale_time_compare(gale_time_zero(),t)) + return G_("(long ago)"); + else if (0 == gale_time_compare(gale_time_forever(),t)) + return G_("(never)"); + else + { + struct timeval tv; + time_t sec; + char buf[30]; + gale_time_to(&tv,t); + sec = tv.tv_sec; + strftime(buf,sizeof(buf),"%Y-%m-%d %H:%M", + localtime(&sec)); + return gale_text_from_latin1(buf,-1); + } + + case frag_number: + return gale_text_from_number(frag.value.number,10,0); + + case frag_data: + if (20 >= frag.value.data.l) + { + int i; + for (i = 0; i < frag.value.data.l; ++i) + r = gale_text_concat(3,r, + i ? G_(" ") : G_("["), + gale_text_from_number(frag.value.data.p[i],16,2)); + r = gale_text_concat(2,t,G_("]")); + } + else + { + int i; + u8 hash[16]; + MD5_CTX ctx; + MD5Init(&ctx); + MD5Update(&ctx,frag.value.data.p,frag.value.data.l); + MD5Final(hash,&ctx); + for (i = 0; i < 16; ++i) + r = gale_text_concat(3,r, + i ? G_(" ") : G_("{"), + gale_text_from_number(hash[i],16,2)); + r = gale_text_concat(2,r,G_("}")); + } + return r; + + case frag_group: + return G_("(nested group)"); + + default: + return G_("(unknown type)"); + } +} + +struct gale_text gale_print_group(struct gale_group grp,int indent) { + struct gale_text i,t = null_text; + wch *ch; + gale_create_array(ch,indent); + i.p = ch; + i.l = indent; + while (indent--) ch[indent] = ' '; + + while (!gale_group_null(grp)) + { + struct gale_fragment frag = gale_group_first(grp); + t = gale_text_concat(6, + t,i,frag.name,G_(": "), + gale_print_fragment(frag), + G_("\n")); + grp = gale_group_rest(grp); + } + return t; } diff -urN gale-0.91a/lib/link.c gale-0.91b/lib/link.c --- gale-0.91a/lib/link.c Thu Sep 30 16:10:03 1999 +++ gale-0.91b/lib/link.c Sun Jan 30 20:12:06 2000 @@ -108,6 +108,7 @@ m = link->msg; gale_free(link); gale_dprintf(7,"<- dequeueing message [%p]\n",m); + gale_dmessage(19,m); } return m; } @@ -807,6 +808,7 @@ ++l->queue_num; l->queue_mem += message_size(m); gale_dprintf(7,"-> enqueueing message [%p]\n",m); + gale_dmessage(19,m); activate(l); } diff -urN gale-0.91a/lib/pubkey.c gale-0.91b/lib/pubkey.c --- gale-0.91a/lib/pubkey.c Sun Dec 26 17:11:54 1999 +++ gale-0.91b/lib/pubkey.c Sun Jan 30 21:50:47 2000 @@ -27,7 +27,7 @@ magic: 0x4741 0x4C45 0x0001 id: counted Unicode -- possibly truncated here: EXPORT_STUB -- - data: fragment group + data: fragment group (no zero!) */ static const byte magic[] = { 0x68, 0x13, 0x00, 0x00 }; @@ -89,6 +89,7 @@ return 1; } +#if 0 static int pack_fragment(struct gale_data *data,struct gale_group group, struct gale_text name,enum gale_fragment_type type) { @@ -106,6 +107,7 @@ } return 1; } +#endif void _ga_import_pub(struct auth_id **id,struct gale_data key, struct inode *source,int trust) { @@ -205,7 +207,7 @@ } else valid = _ga_trust_pub(try); - if (valid && !_ga_pub_older(try->pub_data,data)) goto ignore; + if (valid && !trust && !_ga_pub_older(try->pub_data,data)) goto ignore; if (2 >= version && 0 != key.l) { struct gale_data blob = save; @@ -220,11 +222,11 @@ if (NULL != sig.id && gale_text_compare(sig.id->name,_ga_signer(try->name))) { - _ga_warn_id(G_("key \"%\" cannot certify \"%\""),sig.id,key); + _ga_warn_id(G_("key \"%\" cannot certify \"%\""),sig.id,try); _ga_init_sig(&sig); } - if (valid && !_ga_trust_pub(sig.id)) goto ignore; + if (valid && !trust && !_ga_trust_pub(sig.id)) goto ignore; /* OK... now install the key. */ if (!gale_group_null(try->pub_data) @@ -257,7 +259,7 @@ ignore: if (_ga_pub_equal(try->pub_data,data)) goto success; - _ga_warn_id(G_("\"%\": ignoring obsolete public key"),key); + _ga_warn_id(G_("\"%\": ignoring obsolete public key"),try); return; success: diff -urN gale-0.91a/lib/server.c gale-0.91b/lib/server.c --- gale-0.91a/lib/server.c Mon Aug 9 19:05:17 1999 +++ gale-0.91b/lib/server.c Sun Jan 30 20:12:41 2000 @@ -16,33 +16,6 @@ struct gale_cleanup *next; }; -static void debug(int level,int idelta,const char *fmt,va_list ap) { - static int indent = 0; - int i; - if (idelta < 0) indent += idelta; - if (level < gale_global->debug_level) { - for (i = 0; i < indent; ++i) fputc(' ',stderr); - vfprintf(stderr,fmt,ap); - fflush(stderr); - } - if (idelta > 0) indent += idelta; -} - -void gale_dprintf(int level,const char *fmt,...) { - va_list ap; - va_start(ap,fmt); - debug(level,0,fmt,ap); - va_end(ap); -} - -void gale_diprintf(int level,int indent,const char *fmt,...) { - va_list ap; - if (level >= gale_global->debug_level) return; - va_start(ap,fmt); - debug(level,indent,fmt,ap); - va_end(ap); -} - static void *on_ignore(oop_source *source,int sig,void *data) { return OOP_CONTINUE; } diff -urN gale-0.91a/lib/sign.c gale-0.91b/lib/sign.c --- gale-0.91a/lib/sign.c Sun Dec 26 11:16:50 1999 +++ gale-0.91b/lib/sign.c Sun Jan 30 20:59:06 2000 @@ -59,8 +59,6 @@ _ga_pack_u32(data,sig->sig.l); _ga_pack_copy(data,sig->sig.p,sig->sig.l); _ga_pack_copy(data,key.p,key.l); - - gale_free(key.p); } void _ga_init_sig(struct signature *sig) { diff -urN gale-0.91a/lib/text.c gale-0.91b/lib/text.c --- gale-0.91a/lib/text.c Sun Dec 26 13:20:19 1999 +++ gale-0.91b/lib/text.c Mon Jan 17 23:39:06 2000 @@ -71,7 +71,8 @@ } if (token->p < string.p || token->p > string.p + string.l) { - /* Invalid (typically NULL) token => start iteration. */ + /* null_text token => start iteration. */ + assert(NULL == token->p && 0 == token->l); token->p = string.p - 1; token->l = 0; } else if (token->p + token->l >= string.p + string.l) { diff -urN gale-0.91a/liboop/COPYING gale-0.91b/liboop/COPYING --- gale-0.91a/liboop/COPYING Sat Aug 14 18:32:15 1999 +++ gale-0.91b/liboop/COPYING Thu Jan 27 20:59:46 2000 @@ -1,9 +1,3 @@ - Most of liboop is covered under the Lesser GPL (below). - -** However, the contents of the "foreign" directory may have their own -** license agreements. See foreign/README for details. - -------------------------------------------------------------------------------- GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 diff -urN gale-0.91a/liboop/Makefile.am gale-0.91b/liboop/Makefile.am --- gale-0.91a/liboop/Makefile.am Sun Sep 12 23:22:52 1999 +++ gale-0.91b/liboop/Makefile.am Sun Jan 30 21:26:53 2000 @@ -8,7 +8,7 @@ AUTOMAKE_OPTIONS = foreign 1.2 lib_LTLIBRARIES = liboop.la liboop-adns.la liboop-glib.la liboop-www.la -INCLUDES = $(GLIB_INCLUDES) $(WWW_INCLUDES) -I$(top_srcdir)/foreign +INCLUDES = $(GLIB_INCLUDES) $(WWW_INCLUDES) # versions updated as of 0.4 @@ -30,10 +30,6 @@ test_oop_SOURCES = test-oop.c test_oop_LDADD = $(ADNS_LIBS) $(GLIB_LIBS) $(WWW_LIBS) liboop.la - -dist-hook: - mkdir $(distdir)/foreign - cp -p $(srcdir)/foreign/README $(srcdir)/foreign/*.h $(distdir)/foreign release: dist gzip -dc $(PACKAGE)-$(VERSION).tar.gz | bzip2 -9 \ diff -urN gale-0.91a/liboop/Makefile.in gale-0.91b/liboop/Makefile.in --- gale-0.91a/liboop/Makefile.in Sun Dec 26 22:17:25 1999 +++ gale-0.91b/liboop/Makefile.in Sun Jan 30 21:54:46 2000 @@ -87,7 +87,7 @@ AUTOMAKE_OPTIONS = foreign 1.2 lib_LTLIBRARIES = liboop.la liboop-adns.la liboop-glib.la liboop-www.la -INCLUDES = $(GLIB_INCLUDES) $(WWW_INCLUDES) -I$(top_srcdir)/foreign +INCLUDES = $(GLIB_INCLUDES) $(WWW_INCLUDES) # versions updated as of 0.4 @@ -349,15 +349,13 @@ || cp -p $$d/$$file $(distdir)/$$file || :; \ fi; \ done - $(MAKE) $(AM_MAKEFLAGS) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-hook -adns.lo adns.o : adns.c oop.h foreign/adns.h oop-adns.h +adns.lo adns.o : adns.c oop.h oop-adns.h alloc.lo alloc.o : alloc.c oop.h -glib.lo glib.o : glib.c foreign/glib.h oop-glib.h oop.h +glib.lo glib.o : glib.c oop-glib.h oop.h select.lo select.o : select.c oop.h signal.lo signal.o : signal.c oop.h sys.lo sys.o : sys.c oop.h -test-oop.o: test-oop.c oop.h foreign/glib.h oop-glib.h foreign/adns.h \ - oop-adns.h oop-www.h +test-oop.o: test-oop.c oop.h oop-glib.h oop-adns.h oop-www.h www.lo www.o : www.c oop.h oop-www.h info-am: @@ -442,10 +440,6 @@ mostlyclean-generic distclean-generic clean-generic \ maintainer-clean-generic clean mostlyclean distclean maintainer-clean - -dist-hook: - mkdir $(distdir)/foreign - cp -p $(srcdir)/foreign/README $(srcdir)/foreign/*.h $(distdir)/foreign release: dist gzip -dc $(PACKAGE)-$(VERSION).tar.gz | bzip2 -9 \ diff -urN gale-0.91a/liboop/adns.c gale-0.91b/liboop/adns.c --- gale-0.91a/liboop/adns.c Sun Aug 15 15:19:54 1999 +++ gale-0.91b/liboop/adns.c Sun Jan 30 21:27:26 2000 @@ -4,6 +4,8 @@ terms of the GNU Lesser General Public License, version 2.1 or later. See the file COPYING for details. */ +#ifdef HAVE_ADNS + #include "oop.h" #include "adns.h" #include "oop-adns.h" @@ -141,3 +143,5 @@ adns_afterselect(a->state,num,rfd,wfd,&xfd,&now); return on_process(a->source,OOP_TIME_NOW,a); } + +#endif diff -urN gale-0.91a/liboop/configure gale-0.91b/liboop/configure --- gale-0.91a/liboop/configure Mon Oct 11 19:55:31 1999 +++ gale-0.91b/liboop/configure Sun Jan 30 21:27:47 2000 @@ -701,7 +701,7 @@ PACKAGE=liboop -VERSION=0.4 +VERSION=0.5 if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } diff -urN gale-0.91a/liboop/configure.in gale-0.91b/liboop/configure.in --- gale-0.91a/liboop/configure.in Mon Oct 11 19:53:45 1999 +++ gale-0.91b/liboop/configure.in Sun Jan 30 21:26:40 2000 @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(INSTALL) -AM_INIT_AUTOMAKE(liboop,0.4) +AM_INIT_AUTOMAKE(liboop,0.5) AC_CANONICAL_HOST dnl Use libtool for shared libraries diff -urN gale-0.91a/liboop/foreign/HTEvent.h gale-0.91b/liboop/foreign/HTEvent.h --- gale-0.91a/liboop/foreign/HTEvent.h Sat Oct 9 12:05:39 1999 +++ gale-0.91b/liboop/foreign/HTEvent.h Wed Dec 31 16:00:00 1969 @@ -1,246 +0,0 @@ -/* - - W3C Sample Code Library libwww Event Class - - -! - The Event Class -! -*/ - -/* -** (c) COPYRIGHT MIT 1995. -** Please first read the full copyright statement in the file COPYRIGH. -*/ - -/* - -The Event Class defines any event manager to be used by libwww for handling -events. An event is not strictly defined as it is highly platform -dependent and hence out of scope for the Library. If you are using the libwww -pseudo threads on Unix then an event is when the select() system -call returns a notification on a socket descriptor, but it may as well -be an asynchronous event from the windows manager etc. If your application -is not using anything but traditional blocking sockets then you do not need -an event manager at all. In that case, libwww will block on any socket or -system call until the process can proceed. - -The libwww interface to an event manager is very simple as it consists of -registering a socket descriptor, the location in the -program, and the current state when an operation (for example -read) would block. When the event manager at a later point in -time gets a notification that the socket has become ready, it can then call -libwww with the state saved from the registration and libwww can continue. -Second, libwww must be able to unregister a socket when it is not -anymore in a state where it can block. Only in case the application -wishes to use non-blocking sockets it should register methods for -handling the registration process as described below. - -Note: The library core does not define any event manager -- it is considered part of the application. The library comes with a -default event manager which can be initiated -using the function HTEventInit() in HTInit -module - -This module is implemented by HTEvent.c, and it is -a part of the W3C Sample Code Library. -*/ - -#ifndef HTEVENT_H -#define HTEVENT_H -#include "wwwsys.h" -#ifdef IN_EVENT -typedef struct _HTTimer HTTimer; -#endif - -typedef enum _HTPriority { - HT_PRIORITY_INV = -1, - HT_PRIORITY_OFF = 0, - HT_PRIORITY_MIN = 1, - HT_PRIORITY_MAX = 20 -} HTPriority; - -#define HTEVENT_INDEX 0x10 -typedef enum { -#ifdef WWW_WIN_ASYNC - HTEvent_READ = (0x001 | 0 << HTEVENT_INDEX), - HTEvent_WRITE = (0x002 | 1 << HTEVENT_INDEX), - HTEvent_OOB = (0x004 | 2 << HTEVENT_INDEX), - HTEvent_ACCEPT = (0x008 | 3 << HTEVENT_INDEX), - HTEvent_CONNECT = (0x010 | 4 << HTEVENT_INDEX), - HTEvent_CLOSE = (0x020 | 5 << HTEVENT_INDEX), - HTEvent_TYPES = 6, /* winsock has seperate events for all of these */ -#define HTEVENT_TYPES 6 /* use in constructing the fake event below */ -#else /* WWW_WIN_ASYNC */ - HTEvent_READ = (0x001 | 0 << HTEVENT_INDEX), - HTEvent_ACCEPT = (0x002 | 0 << HTEVENT_INDEX), - HTEvent_CLOSE = (0x004 | 0 << HTEVENT_INDEX), - HTEvent_WRITE = (0x008 | 1 << HTEVENT_INDEX), - HTEvent_CONNECT = (0x010 | 1 << HTEVENT_INDEX), - HTEvent_OOB = (0x020 | 2 << HTEVENT_INDEX), - HTEvent_TYPES = 3, /* only READ, WRITE, and OOB are real types */ -#define HTEVENT_TYPES 3 /* use in constructing the fake event below */ -#endif /* !WWW_WIN_ASYNC */ - /* - ** fake events - these don't correspond to event manager events, but they - ** are usefull for communicating with the protocol modules - */ - HTEvent_TIMEOUT = (0x040 | HTEVENT_TYPES << HTEVENT_INDEX), - HTEvent_BEGIN = (0x000 | HTEVENT_TYPES << HTEVENT_INDEX), - HTEvent_END = (0x080 | HTEVENT_TYPES << HTEVENT_INDEX), - HTEvent_FLUSH = (0x100 | HTEVENT_TYPES << HTEVENT_INDEX), - HTEvent_RESET = (0x200 | HTEVENT_TYPES << HTEVENT_INDEX), - HTEvent_ALL = 0xFFFF -} HTEventType; - -#define HTEvent_BITS(type) (type & 0xFFFF) -#define HTEvent_INDEX(type) (type >> HTEVENT_INDEX) - -#define HT_EVENT_INITIALIZER \ - {HTEvent_READ, "HTEvent_READ"}, \ - {HTEvent_ACCEPT, "HTEvent_ACCEPT"}, \ - {HTEvent_CLOSE, "HTEvent_CLOSE"}, \ - {HTEvent_WRITE, "HTEvent_WRITE"}, \ - {HTEvent_CONNECT, "HTEvent_CONNECT"}, \ - {HTEvent_OOB, "HTEvent_OOB"}, \ - {HTEvent_TIMEOUT, "HTEvent_TIMEOUT"}, \ - {HTEvent_BEGIN, "HTEvent_BEGIN"}, \ - {HTEvent_END, "HTEvent_END"}, \ - {HTEvent_FLUSH, "HTEvent_FLUSH"}, \ - {HTEvent_RESET, "HTEvent_RESET"} - -extern char * HTEvent_type2str(HTEventType type); - -/* -. - Event Handlers -. - -A location is a function that can be registered by the event manager -and called at a later point in time in order to continue an operation. All -locations must be of type  HTEventCallback as defined here: -*/ - -typedef int HTEventCallback (SOCKET, void *, HTEventType); -typedef struct _HTEvent HTEvent; - -/* Avoid circular include for HTReq->HTNet->HTHost: HTEvent blah */ -#include "HTReq.h" - -/* - -There are many default event handlers provided with the Library. For example, -all the protocol modules such as the HTTP client module -are implemented as event handlers. In stead of using blocking sockets, this -allows a protocol module to register itself when performing an operation -that would block. When the sockets becomes ready the handler is called with -th socket in question, the request object, and the socket operation   -. - Registering and Unregistering Events -. - -As mentioned above, the only interface libwww requires from an event manager -is a method to register an event when an operation would block and -unregister it when the operation has completed The library registers -and unregisters events by calling the following two functions: -*/ - -extern int HTEvent_register (SOCKET, HTEventType, HTEvent *); -extern int HTEvent_unregister (SOCKET, HTEventType); - -/* - -The register function contains information about which socket we are waiting -on to get ready and which operation we are waiting for (read, write, etc.), -the request object containing the current request, the event handler that -we want to be called when the socket becomes reasy, and finally the priority -by which we want the thread to be processed by the event manager. Likewise, -libwww can unregister a operation on a socket which means that libwww is -no longer waiting for this actiion to become ready. -. - Registering an Event Manager -. - -Libwww core does not contain any event manager as it depends on whether you -want to use pseudo threads no threads, or real threads. Instead, libwww comes -with a default implementation that you may register, -but you may as well implement and register your own. The register and unregister -functions above actually does nothing than looking for a registered event -manager and then passes the call on to that. You register your own event -manager by using the methods below: -*/ - -typedef int HTEvent_registerCallback(SOCKET, HTEventType, HTEvent *); -typedef int HTEvent_unregisterCallback(SOCKET, HTEventType); - -extern void HTEvent_setRegisterCallback(HTEvent_registerCallback *); -extern void HTEvent_setUnregisterCallback(HTEvent_unregisterCallback *); - -/* -( - Has Register and Unregister Callbacks been setup? -) - -Replies YES if both an HTEvent_setRegisterCallback and -HTEvent_setUnregisterCallback have been called with non NULL callbacks. -*/ - -extern BOOL HTEvent_isCallbacksRegistered(void); - -/* -. - Create and Delete Events -. -*/ - -extern HTEvent * HTEvent_new (HTEventCallback * cbf, void * context, - HTPriority pritority, int timeoutInMillis); -extern BOOL HTEvent_delete (HTEvent * event); - -/* -( - Event Timeouts, Priorities, Callbacks, and Contexts -) - -Normally, these are set when creating the event. -*/ - -extern BOOL HTEvent_setParam(HTEvent * event, void * param); -extern BOOL HTEvent_setPriority(HTEvent * event, HTPriority priority); -extern BOOL HTEvent_setTimeout(HTEvent * event, int timeoutInMillis); -extern BOOL HTEvent_setCallback(HTEvent * event, HTEventCallback * cbf); - -/* -. - The Raw Event Type -. - -Don't use this directly, use the methods above instead. -*/ - -struct _HTEvent { - HTPriority priority; /* Priority of this request (event) */ - int millis; /* Timeout in ms for this event */ -#ifdef IN_EVENT - HTTimer * timer; -#endif - HTEventCallback * cbf; /* Protocol state machine */ - void * param; /* HTEvent_register parameter */ - HTRequest * request; -}; - -/* - -You can register the event manager provided together with libwww by using -the HTEventInit() in the HTInit module -*/ - -#endif /* HTEVENT_H */ - -/* - - - - @(#) $Id: HTEvent.h,v 1.1 1999/10/09 19:05:39 egnor Exp $ - -*/ diff -urN gale-0.91a/liboop/foreign/HTMemory.h gale-0.91b/liboop/foreign/HTMemory.h --- gale-0.91a/liboop/foreign/HTMemory.h Sat Oct 9 12:37:59 1999 +++ gale-0.91b/liboop/foreign/HTMemory.h Wed Dec 31 16:00:00 1969 @@ -1,169 +0,0 @@ -/* - - - W3C Sample Code Library libwww Dynamic Memory Handlers - - -! - Dynamic Memory Handlers -! -*/ - -/* -** (c) COPYRIGHT MIT 1995. -** Please first read the full copyright statement in the file COPYRIGH. -*/ - -/* - -This module defines any memory handler to be used by libwww for allocating -and de-allocating dynamic memory. As dynamic memory may be a scarce resource, -it is required that an application can handle memory exhaustion gracefully. -This module provides an interface that covers the following situations: - - - o - Handling of allocation, reallocation and de-allocation - of dynamic memory - o - Recovering from temporary lack of available memory - o - Panic handling in case a new allocation fails - - -Note: The Library core provides a default set of memory handlers -for allocating and de-allocating dynamic memory. In order to maintain a -reasonable performance, they are not registered dynamically but assigned -using C style macros. Hence, it is not possible to swap memory handler -at run time but this was considered to be a reasonable trade-off. - -This module is implemented by HTMemory.c, and it -is a part of the W3C Sample Code -Library. -*/ - -#ifndef HTMEMORY_H -#define HTMEMORY_H - -#include "HTUtils.h" - -/* -. - Allocation, Reallocation and De-allocation -. - -The Library provides a default set of methods for handling dynamic memory. -They are very basic and essentially identical to the C style -malloc, calloc, realloc, and -free: -*/ -extern void* HTMemory_malloc(size_t size); -extern void* HTMemory_calloc(size_t count, size_t size); -extern void* HTMemory_realloc(void * ptr, size_t size); -extern void HTMemory_free(void* ptr); - -/* -( - Memory Macros -) - -The methods above are not referred directly in the Library. Instead we use -a set of C style macros. If you don't wany any memory management beyond normal -malloc and alloc then you can just use that instead of the HTMemory_* function. -You can of course also provide your own methods as well. -*/ - -#define HT_MALLOC(size) HTMemory_malloc((size)) -#define HT_CALLOC(count, size) HTMemory_calloc((count), (size)) -#define HT_REALLOC(ptr, size) HTMemory_realloc((ptr), (size)) -#define HT_FREE(pointer) {HTMemory_free((pointer));((pointer))=NULL;} - -/* -. - Memory Freer Functions -. - -The dynamic memory freer functions are typically functions that are capable -of freeing large chunks of memory. In case a new allocation fails, the allocation -method looks for any registered freer functions to call. There can be multiple -freer functions and after each call, the allocation method tries again to -allocate the desired amount of dynamic memory. The freer functions are called -in reverse order meaning that the last one registered gets -called first. That way, it is easy to add temporary freer functions -which then are guaranteed to be called first if a methods fails. -( - Add a Freer Function -) - -You can add a freer function by using the following method. The Library may -itself register a set of free functions during initialization. If the application -does not register any freer functions then the Library looks how it can free -internal memory. The freer function is passed the total number of -bytes requested by the allocation. -*/ -typedef void HTMemoryCallback(size_t size); - -extern BOOL HTMemoryCall_add (HTMemoryCallback * cbf); - -/* -( - Delete a Freer Function -) - -Freer functions can be deleted at any time in which case they are not called -anymore. -*/ - -extern BOOL HTMemoryCall_delete (HTMemoryCallback * cbf); -extern BOOL HTMemoryCall_deleteAll (void); - -/* -. - Panic Handling -. - -If the freer functions are not capable of de-allocation enough memory then -the application must have an organized way of closing down. This is done -using the panic handler. In the libwww, each allocation is tested and -HT_OUTOFMEM is called if a NULL was returned. -HT_OUTOFMEM is a macro which by default calls -HTMemory_outofmem() but of course can point to any method. The -default handler calls an exit function defined by the application in a call -to HTMemory_setExit(). If the application has not defined -an exit function, HTMemory_outofmem() prints an error message -and calls exit(1). -*/ - -typedef void HTMemory_exitCallback(char *name, char *file, unsigned long line); - -extern void HTMemory_setExit(HTMemory_exitCallback * pExit); -extern HTMemory_exitCallback * HTMemory_exit(void); - -/* -( - Call the Exit Handler -) - -If an allocation fails then this function is called. If the application has -registered its own panic handler then this is called directly from this function. -Otherwise, the default behavior is to write a small message to stderr and -then exit. -*/ - -#define outofmem(file, name) HT_OUTOFMEM(name) -#define HT_OUTOFMEM(name) HTMemory_outofmem((name), __FILE__, __LINE__) - -extern void HTMemory_outofmem(char * name, char * file, unsigned long line); - -/* -*/ - -#endif /* HTMEMORY_H */ - -/* - - - - @(#) $Id: HTMemory.h,v 1.1 1999/10/09 19:37:59 egnor Exp $ - -*/ diff -urN gale-0.91a/liboop/foreign/HTReq.h gale-0.91b/liboop/foreign/HTReq.h --- gale-0.91a/liboop/foreign/HTReq.h Sat Sep 4 14:37:50 1999 +++ gale-0.91b/liboop/foreign/HTReq.h Wed Dec 31 16:00:00 1969 @@ -1,8 +0,0 @@ -/* HTReq.h spoof -- exists only to make HTEvent.h work */ - -#ifndef HTREQ_H_SPOOF -#define HTREQ_H_SPOOF - -typedef struct HTRequest_spoof HTRequest; - -#endif diff -urN gale-0.91a/liboop/foreign/HTUtils.h gale-0.91b/liboop/foreign/HTUtils.h --- gale-0.91a/liboop/foreign/HTUtils.h Sat Oct 9 12:37:59 1999 +++ gale-0.91b/liboop/foreign/HTUtils.h Wed Dec 31 16:00:00 1969 @@ -1,409 +0,0 @@ -/* - - W3C Sample Code Library libwww Debug Information and General Purpose - Macros - - -! - Debug Information and General Purpose Macros -! -*/ - -/* -** (c) COPYRIGHT MIT 1995. -** Please first read the full copyright statement in the file COPYRIGH. -*/ - -/* - -This module is a part of the W3C Sample -Code Library. See also the system dependent file -sysdep module for system specific information. -*/ - -#ifndef HTUTILS_H -#define HTUTILS_H - -/* -. - Destination for User Print Messages -. - -You can send print messages to the user to various destinations -depending on the type of your application. By default, on Unix the -messages are sent to stdout using -fprintf. If we are on MSWindows and have a windows -applications then register a HTPrintCallback -function. This is done with HTPrint_setCallback. It tells -HTPrint to call a HTPrintCallback. If -HTDEBUG -is not defined then don't do any of the above. -*/ - -typedef int HTPrintCallback(const char * fmt, va_list pArgs); -extern void HTPrint_setCallback(HTPrintCallback * pCall); -extern HTPrintCallback * HTPrint_getCallback(void); - -extern int HTPrint(const char * fmt, ...); - -/* -. - Debug Message Control -. - -This is the global flag for setting the WWWTRACE options. -The verbose mode is no longer a simple boolean but a bit field so that it -is possible to see parts of the output messages. -*/ - -#if defined(NODEBUG) || defined(NDEBUG) || defined(_NDEBUG) -#undef HTDEBUG -#else -#ifndef HTDEBUG -#define HTDEBUG 1 -#endif /* HTDEBUG */ -#endif - -/* -( - C Preprocessor defines -) - -Make sure that the following macros are defined -*/ - -#ifndef __FILE__ -#define __FILE__ "" -#endif - -#ifndef __LINE__ -#define __LINE__ 0L -#endif - -/* -( - Definition of the Global Trace Flag -) - -The global trace flag variable is available everywhere. -*/ - -#ifdef HTDEBUG -#ifdef WWW_WIN_DLL -extern int * WWW_TraceFlag; /* In DLLs, we need the indirection */ -#define WWWTRACE (*WWW_TraceFlag) -#else -extern unsigned int WWW_TraceFlag; /* Global flag for all W3 trace */ -#define WWWTRACE (WWW_TraceFlag) -#endif /* WWW_WIN_DLL */ -#else -#define WWWTRACE 0 -#endif /* HTDEBUG */ - -/* -( - Select which Trace Messages to show -) - -Libwww has a huge set of trace messages and it is therefor a good idea to -be able to select which ones to see for any particular trace. An easy way -to set this is using the funtion -HTSetTraceMessageMask. The WWWTRACE -define outputs messages if verbose mode is active according to the following -rules: -*/ - -typedef enum _HTTraceFlags { - SHOW_UTIL_TRACE = 0x1, - SHOW_APP_TRACE = 0x2, - SHOW_CACHE_TRACE = 0x4, - SHOW_SGML_TRACE = 0x8, - SHOW_BIND_TRACE = 0x10, - SHOW_THREAD_TRACE = 0x20, - SHOW_STREAM_TRACE = 0x40, - SHOW_PROTOCOL_TRACE = 0x80, - SHOW_MEM_TRACE = 0x100, - SHOW_URI_TRACE = 0x200, - SHOW_AUTH_TRACE = 0x400, - SHOW_ANCHOR_TRACE = 0x800, - SHOW_PICS_TRACE = 0x1000, - SHOW_CORE_TRACE = 0x2000, - SHOW_MUX_TRACE = 0x4000, - SHOW_SQL_TRACE = 0x8000, - SHOW_XML_TRACE = 0x10000, - SHOW_ALL_TRACE = 0xFFFFFFFF -} HTTraceFlags; - -/* - -The flags are made so that they can serve as a group flag for correlated -trace messages, e.g. showing messages for SGML and HTML at the same time. -*/ - -#define UTIL_TRACE (WWWTRACE & SHOW_UTIL_TRACE) -#define APP_TRACE (WWWTRACE & SHOW_APP_TRACE) -#define CACHE_TRACE (WWWTRACE & SHOW_CACHE_TRACE) -#define SGML_TRACE (WWWTRACE & SHOW_SGML_TRACE) -#define BIND_TRACE (WWWTRACE & SHOW_BIND_TRACE) -#define THD_TRACE (WWWTRACE & SHOW_THREAD_TRACE) -#define STREAM_TRACE (WWWTRACE & SHOW_STREAM_TRACE) -#define PROT_TRACE (WWWTRACE & SHOW_PROTOCOL_TRACE) -#define MEM_TRACE (WWWTRACE & SHOW_MEM_TRACE) -#define URI_TRACE (WWWTRACE & SHOW_URI_TRACE) -#define AUTH_TRACE (WWWTRACE & SHOW_AUTH_TRACE) -#define ANCH_TRACE (WWWTRACE & SHOW_ANCHOR_TRACE) -#define PICS_TRACE (WWWTRACE & SHOW_PICS_TRACE) -#define CORE_TRACE (WWWTRACE & SHOW_CORE_TRACE) -#define MUX_TRACE (WWWTRACE & SHOW_MUX_TRACE) -#define SQL_TRACE (WWWTRACE & SHOW_SQL_TRACE) -#define XML_TRACE (WWWTRACE & SHOW_XML_TRACE) -#define ALL_TRACE (WWWTRACE & SHOW_ALL_TRACE) - -/* -( - Destination for Trace Messages -) - -You can send trace messages to various destinations depending on the type -of your application. By default, on Unix the messages are sent to -stderr using fprintf. If we are on MSWindows and -have a windows applications then register a HTTraceCallback -function. This is done with HTTrace_setCallback. It tells -HTTrace to call a HTTraceCallback. If -HTDEBUG is not defined then don't do any of the above. -*/ - -typedef int HTTraceCallback(const char * fmt, va_list pArgs); -extern void HTTrace_setCallback(HTTraceCallback * pCall); -extern HTTraceCallback * HTTrace_getCallback(void); - -/* - -The HTTRACE macro uses "_" as parameter separater -instead of ",". This enables us to use a single macro instead -of a macro for each number of arguments which we consider a more elegant -and flexible solution. The implication is, however, that we can't have variables -that start or end with an "_" if they are to be used in a trace -message. -*/ - -#ifdef HTDEBUG -#undef _ -#define _ , -#define HTTRACE(TYPE, FMT) \ - do { if (TYPE) HTTrace(FMT); } while (0); -extern int HTTrace(const char * fmt, ...); -#else -#define HTTRACE(TYPE, FMT) /* empty */ -#endif /* HTDEBUG */ - -/* -( - Data Trace Logging -) - -A similar mechanism exists for logging data, except that is adds a data and -length argument to the trace call. Again, you can register your own callbacks -if need be. -*/ - -typedef int HTTraceDataCallback(char * data, size_t len, char * fmt, va_list pArgs); -extern void HTTraceData_setCallback(HTTraceDataCallback * pCall); -extern HTTraceDataCallback * HTTraceData_getCallback(void); - -/* - -Again we use the same macro expansion mechanism as for HTTrace -*/ - -#ifdef HTDEBUG -#define HTTRACEDATA(DATA, LEN, FMT) HTTraceData((DATA), (LEN), FMT) -extern int HTTraceData(char * data, size_t len, char * fmt, ...); -#else -#define HTTRACEDATA(DATA, LEN, FMT) /* empty */ -#endif /* HTDEBUG */ - -/* -( - Debug Breaks -) - -Call this function and the program halts. We use the same macro expansion -mechanism as for HTTrace -*/ - -extern void HTDebugBreak(char * file, unsigned long line, const char * fmt, ...); - -#ifdef HTDEBUG -#define HTDEBUGBREAK(FMT) HTDebugBreak(__FILE__, __LINE__, FMT) -#else -#define HTDEBUGBREAK(FMT) /* empty */ -#endif /* HTDEBUG */ - -/* -. - Macros for Function Declarations -. - -These function prefixes are used by scripts and other tools and helps figuring -out which functions are exported and which are not. See also the -libwww style guide. -*/ - -#define PUBLIC /* Accessible outside this module */ -#define PRIVATE static /* Accessible only within this module */ - -/* -. - Often used Interger Macros -. -( - Min and Max functions -) -*/ - -#ifndef HTMIN -#define HTMIN(a,b) ((a) <= (b) ? (a) : (b)) -#define HTMAX(a,b) ((a) >= (b) ? (a) : (b)) -#endif - -/* -( - Double abs function -) -*/ - -#ifndef HTDABS -#define HTDABS(a) ((a) < 0.0 ? (-(a)) : (a)) -#endif - -/* - - -. - Return Codes for Protocol Modules and Streams -. - -Theese are the codes returned from the protocol modules, and the stream modules. -Success are (>=0) and failure are (<0) -*/ - -#define HT_OK 0 /* Generic success */ -#define HT_ALL 1 /* Used by Net Manager */ - -#define HT_CONTINUE 100 /* Continue an operation */ -#define HT_UPGRADE 101 /* Switching protocols */ - -#define HT_LOADED 200 /* Everything's OK */ -#define HT_CREATED 201 /* New object is created */ -#define HT_ACCEPTED 202 /* Accepted */ -#define HT_NO_DATA 204 /* OK but no data was loaded */ -#define HT_RESET_CONTENT 205 /* Reset content */ -#define HT_PARTIAL_CONTENT 206 /* Partial Content */ - -#define HT_MULTIPLE_CHOICES 300 /* Multiple choices */ -#define HT_PERM_REDIRECT 301 /* Permanent redirection */ -#define HT_FOUND 302 /* Found */ -#define HT_SEE_OTHER 303 /* See other */ -#define HT_NOT_MODIFIED 304 /* Not Modified */ -#define HT_USE_PROXY 305 /* Use Proxy */ -#define HT_PROXY_REDIRECT 306 /* Proxy Redirect */ -#define HT_TEMP_REDIRECT 307 /* Temporary redirect */ - -#define HT_IGNORE 900 /* Ignore this in the Net manager */ -#define HT_CLOSED 901 /* The socket was closed */ -#define HT_PENDING 902 /* Wait for connection */ -#define HT_RELOAD 903 /* If we must reload the document */ - -#define HT_ERROR -1 /* Generic failure */ - -#define HT_NO_ACCESS -401 /* Unauthorized */ -#define HT_FORBIDDEN -403 /* Access forbidden */ -#define HT_NOT_FOUND -404 /* Not found */ -#define HT_NOT_ACCEPTABLE -406 /* Not Acceptable */ -#define HT_NO_PROXY_ACCESS -407 /* Proxy Authentication Failed */ -#define HT_CONFLICT -409 /* Conflict */ -#define HT_LENGTH_REQUIRED -411 /* Length required */ -#define HT_PRECONDITION_FAILED -412 /* Precondition failed */ -#define HT_TOO_BIG -413 /* Request entity too large */ -#define HT_URI_TOO_BIG -414 /* Request-URI too long */ -#define HT_UNSUPPORTED -415 /* Unsupported */ -#define HT_BAD_RANGE -416 /* Request Range not satisfiable */ -#define HT_EXPECTATION_FAILED -417 /* Expectation Failed */ -#define HT_REAUTH -418 /* Reauthentication required */ -#define HT_PROXY_REAUTH -419 /* Proxy Reauthentication required */ - -#define HT_RETRY -503 /* If service isn't available */ -#define HT_BAD_VERSION -505 /* Bad protocol version */ - -#define HT_INTERNAL -900 /* Weird -- should never happen. */ -#define HT_WOULD_BLOCK -901 /* If we are in a select */ -#define HT_INTERRUPTED -902 /* Note the negative value! */ -#define HT_PAUSE -903 /* If we want to pause a stream */ -#define HT_RECOVER_PIPE -904 /* Recover pipe line */ -#define HT_TIMEOUT -905 /* Connection timeout */ -#define HT_NO_HOST -906 /* Can't locate host */ - -/* -. - Upper- and Lowercase macros -. - -The problem here is that toupper(x) is not defined officially unless isupper(x) -is. These macros are CERTAINLY needed on #if defined(pyr) || define(mips) -or BDSI platforms. For safefy, we make them mandatory. -*/ - -#ifndef TOLOWER -#define TOLOWER(c) tolower((int) (c)) -#define TOUPPER(c) toupper((int) (c)) -#endif - -/* -. - Max and Min values for Integers and Floating Point -. -*/ - -#ifdef FLT_EPSILON /* The ANSI C way define */ -#define HT_EPSILON FLT_EPSILON -#else -#define HT_EPSILON 0.00000001 -#endif - -/* -. - The local equivalents of CR and LF -. - -We can check for these after net ascii text has been converted to the local -representation. Similarly, we include them in strings to be sent as net ascii -after translation. -*/ - -#define LF FROMASCII('\012') /* ASCII line feed LOCAL EQUIVALENT */ -#define CR FROMASCII('\015') /* Will be converted to ^M for transmission */ - -/* -. - Library Dynamic Memory Magement -. - -The Library has it's own dynamic memory API which is declared in -memory management module. -*/ - -#include "HTMemory.h" - -/* -*/ - -#endif /* HT_UTILS.h */ - -/* - - - - @(#) $Id: HTUtils.h,v 1.1 1999/10/09 19:37:59 egnor Exp $ - -*/ diff -urN gale-0.91a/liboop/foreign/README gale-0.91b/liboop/foreign/README --- gale-0.91a/liboop/foreign/README Sun Sep 5 15:07:49 1999 +++ gale-0.91b/liboop/foreign/README Wed Dec 31 16:00:00 1969 @@ -1,56 +0,0 @@ -This directory contains public header files for those foreign components for -which liboop includes "adapters". By including them here, we can build the -adapters without requiring the presence of the foreign components in question. - -An adapter will still not function without the code it adapts, of course, but -at least this way we eliminate pesky build ordering issues. - -Many of these have specific licensing terms and agreements: - -adns.h - - adns is Ian Jackson's asynchronous DNS access package. - - - While adns is licensed under the GPL, Ian has graciously consented to the - distribution of its public header file (adns.h) under the LGPL: - - I hereby relicence adns.h - and only adns.h - to you (and all third - parties) under the GNU Library General Public Licence. This - statement applies to all versions of adns.h I have released so far, - and to any files adns.h with similar contents and function I might - release during the remainder of this calendar year (1999). - -HTEvent.h -HTMemory.h -HTUtils.h - - These header files are extracted from libwww. - Libwww is a general-purpose Web API written in C. - - - Libwww code is subject to this copyright: - - Copyright © 1995-1998 World Wide Web Consortium, (Massachusetts Institute - of Technology, Institut National de Recherche en Informatique et en - Automatique, Keio University). All Rights Reserved. This program is - distributed under the W3C's Software Intellectual Property License. This - program is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - FOR A PARTICULAR PURPOSE. - - See W3C License http://www.w3.org/Consortium/Legal/ for more details. - - Copyright © 1995 CERN. "This product includes computer software created and - made available by CERN. This acknowledgment shall be mentioned in full in - any product which includes the CERN computer software included herein or - parts thereof." - -glib.h - - This is the public header file for GLIB, a "library of useful routines - for C programming" used heavily by the popular GTK+ widget set. - - - GLIB is licensed under the GNU Library GPL, version 2. The copyright - is held by Peter Mattis, Spencer Kimball and Josh MacDonald. diff -urN gale-0.91a/liboop/foreign/adns.h gale-0.91b/liboop/foreign/adns.h --- gale-0.91a/liboop/foreign/adns.h Thu Oct 28 23:59:19 1999 +++ gale-0.91b/liboop/foreign/adns.h Wed Dec 31 16:00:00 1969 @@ -1,815 +0,0 @@ -/* - * adns.h - * - adns user-visible API (single-threaded, without any locking) - */ -/* - * - * This file is - * Copyright (C) 1997-1999 Ian Jackson - * - * It is part of adns, which is - * Copyright (C) 1997-1999 Ian Jackson - * Copyright (C) 1999 Tony Finch - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * - * For the benefit of certain LGPL'd `omnibus' software which provides - * a uniform interface to various things including adns, I make the - * following additional licence. I do this because the GPL would - * otherwise force either the omnibus software to be GPL'd or for the - * adns-using part to be distributed separately. - * - * So, you may also redistribute and/or modify adns.h (but only the - * public header file adns.h and not any other part of adns) under the - * terms of the GNU Library General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at - * your option) any later version. - * - * Note that adns itself is GPL'd. Authors of adns-using applications - * with GPL-incompatible licences, and people who distribute adns with - * applications where the whole distribution is not GPL'd, are still - * likely to be in violation of the GPL. Anyone who wants to do this - * should contact Ian Jackson. Please note that to avoid encouraging - * people to infringe the GPL as it applies the body of adns, I think - * that if you take advantage of the special exception to redistribute - * just adns.h under the LGPL, you should retain this paragraph in its - * place in the appropriate copyright statements. - * - * - * You should have received a copy of the GNU General Public License, - * or the GNU Library General Public License, as appropriate, along - * with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * - * $Id: adns.h,v 1.3 1999/10/29 06:59:19 egnor Exp $ - */ - -#ifndef ADNS_H_INCLUDED -#define ADNS_H_INCLUDED -#ifdef __cplusplus -extern "C" { /* I really dislike this - iwj. */ -#endif - -#include - -#include -#include -#include -#include -#include - -/* All struct in_addr anywhere in adns are in NETWORK byte order. */ - -typedef struct adns__state *adns_state; -typedef struct adns__query *adns_query; - -typedef enum { - adns_if_noenv= 0x0001, /* do not look at environment */ - adns_if_noerrprint= 0x0002, /* never print output to stderr (_debug overrides) */ - adns_if_noserverwarn= 0x0004, /* do not warn to stderr about duff nameservers etc */ - adns_if_debug= 0x0008, /* enable all output to stderr plus debug msgs */ - adns_if_noautosys= 0x0010, /* do not make syscalls at every opportunity */ - adns_if_eintr= 0x0020, /* allow _wait and _synchronous to return EINTR */ - adns_if_nosigpipe= 0x0040, /* applic has SIGPIPE set to SIG_IGN, do not protect */ - adns_if_checkc_entex= 0x0100, /* do consistency checks on entry/exit to adns funcs */ - adns_if_checkc_freq= 0x0300 /* do consistency checks very frequently (slow!) */ -} adns_initflags; - -typedef enum { - adns_qf_search= 0x00000001, /* use the searchlist */ - adns_qf_usevc= 0x00000002, /* use a virtual circuit (TCP connection) */ - adns_qf_owner= 0x00000004, /* fill in the owner field in the answer */ - adns_qf_quoteok_query= 0x00000010, /* allow quote-requiring chars in query domain */ - adns_qf_quoteok_cname= 0x00000000, /* allow ... in CNAME we go via - now default */ - adns_qf_quoteok_anshost= 0x00000040, /* allow ... in things supposed to be hostnames */ - adns_qf_quotefail_cname= 0x00000080, /* refuse if quote-req chars in CNAME we go via */ - adns_qf_cname_loose= 0x00000100, /* allow refs to CNAMEs - without, get _s_cname */ - adns_qf_cname_forbid= 0x00000200, /* don't follow CNAMEs, instead give _s_cname */ - adns__qf_internalmask= 0x0ff00000 -} adns_queryflags; - -typedef enum { - adns__rrt_typemask= 0x0ffff, - adns__qtf_deref= 0x10000, /* dereference domains and perhaps produce extra data */ - adns__qtf_mail822= 0x20000, /* make mailboxes be in RFC822 rcpt field format */ - - adns_r_none= 0, - - adns_r_a= 1, - - adns_r_ns_raw= 2, - adns_r_ns= adns_r_ns_raw|adns__qtf_deref, - - adns_r_cname= 5, - - adns_r_soa_raw= 6, - adns_r_soa= adns_r_soa_raw|adns__qtf_mail822, - - adns_r_ptr_raw= 12, - adns_r_ptr= adns_r_ptr_raw|adns__qtf_deref, - - adns_r_hinfo= 13, - - adns_r_mx_raw= 15, - adns_r_mx= adns_r_mx_raw|adns__qtf_deref, - - adns_r_txt= 16, - - adns_r_rp_raw= 17, - adns_r_rp= adns_r_rp_raw|adns__qtf_mail822, - - adns_r_addr= adns_r_a|adns__qtf_deref - -} adns_rrtype; - -/* - * In queries without qf_quoteok_*, all domains must have standard - * legal syntax, or you get adns_s_querydomainvalid (if the query - * domain contains bad characters) or adns_s_answerdomaininvalid (if - * the answer contains bad characters). - * - * In queries _with_ qf_quoteok_*, domains in the query or response - * may contain any characters, quoted according to RFC1035 5.1. On - * input to adns, the char* is a pointer to the interior of a " - * delimited string, except that " may appear in it, and on output, - * the char* is a pointer to a string which would be legal either - * inside or outside " delimiters, and any characters not usually - * legal in domain names will be quoted as \X (if the character is - * 33-126 except \ and ") or \DDD. - * - * If the query goes via a CNAME then the canonical name (ie, the - * thing that the CNAME record refers to) is usually allowed to - * contain any characters, which will be quoted as above. With - * adns_qf_quotefail_cname you get adns_s_answerdomaininvalid when - * this happens. (This is a change from version 0.4 and earlier, in - * which failing the query was the default, and you had to say - * adns_qf_quoteok_cname to avoid this; that flag is now deprecated.) - * - * In version 0.4 and earlier, asking for _raw records containing - * mailboxes without specifying _qf_quoteok_anshost was silly. This - * is no longer the case. In this version only parts of responses - * that are actually supposed to be hostnames will be refused by - * default if quote-requiring characters are found. - */ - -/* - * If you ask for an RR which contains domains which are actually - * encoded mailboxes, and don't ask for the _raw version, then adns - * returns the mailbox formatted suitably for an RFC822 recipient - * header field. The particular format used is that if the mailbox - * requires quoting according to the rules in RFC822 then the - * local-part is quoted in double quotes, which end at the next - * unescaped double quote. (\ is the escape char, and is doubled, and - * is used to escape only \ and ".) Otherwise the local-part is - * presented as-is. In any case this is followed by an @ and the - * domain. The domain will not contain any characters not legal in - * hostnames. adns will protect the application from local parts - * containing control characters - these appear to be legal according - * to RFC822 but are clearly a bad idea. - * - * If you ask for the domain with _raw then _no_ checking is done - * (even on the host part, regardless of adns_qf_quoteok_anshost), and - * you just get the domain name in master file format. - * - * If no mailbox is supplied the returned string will be `.' in either - * caswe. - */ - -typedef enum { - adns_s_ok, - - /* locally induced errors */ - adns_s_nomemory, - adns_s_unknownrrtype, - adns_s_systemfail, - - adns_s_max_localfail= 29, - - /* remotely induced errors, detected locally */ - adns_s_timeout, - adns_s_allservfail, - adns_s_norecurse, - adns_s_invalidresponse, - adns_s_unknownformat, - - adns_s_max_remotefail= 59, - - /* remotely induced errors, reported by remote server to us */ - adns_s_rcodeservfail, - adns_s_rcodeformaterror, - adns_s_rcodenotimplemented, - adns_s_rcoderefused, - adns_s_rcodeunknown, - - adns_s_max_tempfail= 99, - - /* remote configuration errors */ - adns_s_inconsistent, /* PTR gives domain whose A does not exist and match */ - adns_s_prohibitedcname, /* CNAME found where eg A expected (not if _qf_loosecname) */ - adns_s_answerdomaininvalid, - adns_s_answerdomaintoolong, - adns_s_invaliddata, - - adns_s_max_misconfig= 199, - - /* permanent problems with the query */ - adns_s_querydomainwrong, - adns_s_querydomaininvalid, - adns_s_querydomaintoolong, - - adns_s_max_misquery= 299, - - /* permanent errors */ - adns_s_nxdomain, - adns_s_nodata, - - adns_s_max_permfail= 499 - -} adns_status; - -typedef struct { - int len; - union { - struct sockaddr sa; - struct sockaddr_in inet; - } addr; -} adns_rr_addr; - -typedef struct { - char *host; - adns_status astatus; - int naddrs; /* temp fail => -1, perm fail => 0, s_ok => >0 */ - adns_rr_addr *addrs; -} adns_rr_hostaddr; - -typedef struct { - char *(array[2]); -} adns_rr_strpair; - -typedef struct { - int i; - adns_rr_hostaddr ha; -} adns_rr_inthostaddr; - -typedef struct { - /* Used both for mx_raw, in which case i is the preference and str the domain, - * and for txt, in which case each entry has i for the `text' length, - * and str for the data (which will have had an extra nul appended - * so that if it was plain text it is now a null-terminated string). - */ - int i; - char *str; -} adns_rr_intstr; - -typedef struct { - adns_rr_intstr array[2]; -} adns_rr_intstrpair; - -typedef struct { - char *mname, *rname; - unsigned long serial, refresh, retry, expire, minimum; -} adns_rr_soa; - -typedef struct { - adns_status status; - char *cname; /* always NULL if query was for CNAME records */ - char *owner; /* only set if requested in query flags */ - adns_rrtype type; /* guaranteed to be same as in query */ - time_t expires; /* expiry time, defined only if _s_ok, nxdomain or nodata. NOT TTL! */ - int nrrs, rrsz; /* nrrs is 0 if an error occurs */ - union { - void *untyped; - unsigned char *bytes; - char *(*str); /* ns_raw, cname, ptr, ptr_raw */ - adns_rr_intstr *(*manyistr); /* txt (list of strings ends with i=-1, str=0) */ - adns_rr_addr *addr; /* addr */ - struct in_addr *inaddr; /* a */ - adns_rr_hostaddr *hostaddr; /* ns */ - adns_rr_intstrpair *intstrpair; /* hinfo */ - adns_rr_strpair *strpair; /* rp, rp_raw */ - adns_rr_inthostaddr *inthostaddr; /* mx */ - adns_rr_intstr *intstr; /* mx_raw */ - adns_rr_soa *soa; /* soa, soa_raw */ - } rrs; -} adns_answer; - -/* Memory management: - * adns_state and adns_query are actually pointers to malloc'd state; - * On submission questions are copied, including the owner domain; - * Answers are malloc'd as a single piece of memory; pointers in the - * answer struct point into further memory in the answer. - * query_io: - * Must always be non-null pointer; - * If *query_io is 0 to start with then any query may be returned; - * If *query_io is !0 adns_query then only that query may be returned. - * If the call is successful, *query_io, *answer_r, and *context_r - * will all be set. - * Errors: - * Return values are 0 or an errno value. - * - * For _init, _init_strcfg, _submit and _synchronous, system errors - * (eg, failure to create sockets, malloc failure, etc.) return errno - * values. - * - * For _wait and _check failures are reported in the answer - * structure, and only 0, ESRCH or (for _check) EAGAIN is - * returned: if no (appropriate) requests are done adns_check returns - * EAGAIN; if no (appropriate) requests are outstanding both - * adns_query and adns_wait return ESRCH. - * - * Additionally, _wait can return EINTR if you set adns_if_eintr. - * - * All other errors (nameserver failure, timed out connections, &c) - * are returned in the status field of the answer. After a - * successful _wait or _check, if status is nonzero then nrrs will be - * 0, otherwise it will be >0. type will always be the type - * requested. - */ - -int adns_init(adns_state *newstate_r, int flags /*adns_initflags*/, - FILE *diagfile /*0=>stderr*/); - -int adns_init_strcfg(adns_state *newstate_r, int flags /*adns_initflags*/, - FILE *diagfile /*0=>discard*/, const char *configtext); - -/* Configuration: - * adns_init reads /etc/resolv.conf, which is expected to be (broadly - * speaking) in the format expected by libresolv. adns_init_strcfg - * is instead passed a string which is interpreted as if it were the - * contents of resolv.conf. In general, configuration which is set - * later overrides any that is set earlier. - * - * Standard directives understood in resolv.conf: - * - * nameserver
- * Must be followed by the IP address of a nameserver. Several - * nameservers may be specified, and they will be tried in the order - * found. There is a compiled in limit, currently 5, on the number - * of nameservers. (libresolv supports only 3 nameservers.) - * - * search ... - * Specifies the search list for queries which specify - * adns_qf_search. This is a list of domains to append to the query - * domain. The query domain will be tried as-is either before all - * of these or after them, depending on the ndots option setting - * (see below). - * - * domain - * This is present only for backward compatibility with obsolete - * versions of libresolv. It should not be used, and is interpreted - * by adns as if it were `search' - note that this is subtly - * different to libresolv's interpretation of this directive. - * - * sortlist / ... - * Should be followed by a sequence of IP-address and netmask pairs, - * separated by spaces. They may be specified as - * eg. 172.30.206.0/24 or 172.30.206.0/255.255.255.0. Currently up - * to 15 pairs may be specified (but note that libresolv only - * supports up to 10). - * - * options - * Should followed by one or more options, separated by spaces. - * Each option consists of an option name, followed by optionally - * a colon and a value. Options are listed below. - * - * Non-standard directives understood in resolv.conf: - * - * clearnameservers - * Clears the list of nameservers, so that further nameserver lines - * start again from the beginning. - * - * include - * The specified file will be read. - * - * Additionally, adns will ignore lines in resolv.conf which start with a #. - * - * Standard options understood: - * - * debug - * Enables debugging output from the resolver, which will be written - * to stderr. - * - * ndots: - * Affects whether queries with adns_qf_search will be tried first - * without adding domains from the searchlist, or whether the bare - * query domain will be tried last. Queries which contain at least - * dots will be tried bare first. The default is 1. - * - * Non-standard options understood: - * - * adns_checkc:none - * adns_checkc:entex - * adns_checkc:freq - * Changes the consistency checking frequency; this overrides the - * setting of adns_if_check_entex, adns_if_check_freq, or neither, - * in the flags passed to adns_init. - * - * There are a number of environment variables which can modify the - * behaviour of adns. They take effect only if adns_init is used, and - * the caller of adns_init can disable them using adns_if_noenv. In - * each case there is both a FOO and an ADNS_FOO; the latter is - * interpreted later so that it can override the former. Unless - * otherwise stated, environment variables are interpreted after - * resolv.conf is read, in the order they are listed here. - * - * RES_CONF, ADNS_RES_CONF - * A filename, whose contets are in the format of resolv.conf. - * - * RES_CONF_TEXT, ADNS_RES_CONF_TEXT - * A string in the format of resolv.conf. - * - * RES_OPTIONS, ADNS_RES_OPTIONS - * These are parsed as if they appeared in the `options' line of a - * resolv.conf. In addition to being parsed at this point in the - * sequence, they are also parsed at the very beginning before - * resolv.conf or any other environment variables are read, so that - * any debug option can affect the processing of the configuration. - * - * LOCALDOMAIN, ADNS_LOCALDOMAIN - * These are interpreted as if their contents appeared in a `search' - * line in resolv.conf. - */ - -int adns_synchronous(adns_state ads, - const char *owner, - adns_rrtype type, - int flags /*adns_queryflags*/, - adns_answer **answer_r); - -/* NB: if you set adns_if_noautosys then _submit and _check do not - * make any system calls; you must use some of the asynch-io event - * processing functions to actually get things to happen. - */ - -int adns_submit(adns_state ads, - const char *owner, - adns_rrtype type, - int flags /*adns_queryflags*/, - void *context, - adns_query *query_r); - -/* The owner should be quoted in master file format. */ - -int adns_check(adns_state ads, - adns_query *query_io, - adns_answer **answer_r, - void **context_r); - -int adns_wait(adns_state ads, - adns_query *query_io, - adns_answer **answer_r, - void **context_r); - -/* same as adns_wait but uses poll(2) internally */ -int adns_wait_poll(adns_state ads, - adns_query *query_io, - adns_answer **answer_r, - void **context_r); - -void adns_cancel(adns_query query); - -/* The adns_query you get back from _submit is valid (ie, can be - * legitimately passed into adns functions) until it is returned by - * adns_check or adns_wait, or passed to adns_cancel. After that it - * must not be used. You can rely on it not being reused until the - * first adns_submit or _transact call using the same adns_state after - * it became invalid, so you may compare it for equality with other - * query handles until you next call _query or _transact. - * - * _submit and _synchronous return ENOSYS if they don't understand the - * query type. - */ - -int adns_submit_reverse(adns_state ads, - const struct sockaddr *addr, - adns_rrtype type, - int flags /*adns_queryflags*/, - void *context, - adns_query *query_r); -/* type must be _r_ptr or _r_ptr_raw. _qf_search is ignored. - * addr->sa_family must be AF_INET or you get ENOSYS. - */ - -void adns_finish(adns_state ads); -/* You may call this even if you have queries outstanding; - * they will be cancelled. - */ - - -void adns_forallqueries_begin(adns_state ads); -adns_query adns_forallqueries_next(adns_state ads, void **context_r); -/* Iterator functions, which you can use to loop over the outstanding - * (submitted but not yet successfuly checked/waited) queries. - * - * You can only have one iteration going at once. You may call _begin - * at any time; after that, an iteration will be in progress. You may - * only call _next when an iteration is in progress - anything else - * may coredump. The iteration remains in progress until _next - * returns 0, indicating that all the queries have been walked over, - * or ANY other adns function is called with the same adns_state (or a - * query in the same adns_state). There is no need to explicitly - * finish an iteration. - * - * context_r may be 0. *context_r may not be set when _next returns 0. - */ - -void adns_checkconsistency(adns_state ads, adns_query qu); -/* Checks the consistency of adns's internal data structures. - * If any error is found, the program will abort(). - * You may pass 0 for qu; if you pass non-null then additional checks - * are done to make sure that qu is a valid query. - */ - -/* - * Example expected/legal calling sequence for submit/check/wait: - * adns_init - * adns_submit 1 - * adns_submit 2 - * adns_submit 3 - * adns_wait 1 - * adns_check 3 -> EAGAIN - * adns_wait 2 - * adns_wait 3 - * .... - * adns_finish - */ - -/* - * Entrypoints for generic asynch io: - * (these entrypoints are not very useful except in combination with * - * some of the other I/O model calls which can tell you which fds to - * be interested in): - * - * Note that any adns call may cause adns to open and close fds, so - * you must call beforeselect or beforepoll again just before - * blocking, or you may not have an up-to-date list of it's fds. - */ - -int adns_processany(adns_state ads); -/* Gives adns flow-of-control for a bit. This will never block, and - * can be used with any threading/asynch-io model. If some error - * occurred which might cause an event loop to spin then the errno - * value is returned. - */ - -int adns_processreadable(adns_state ads, int fd, const struct timeval *now); -int adns_processwriteable(adns_state ads, int fd, const struct timeval *now); -int adns_processexceptional(adns_state ads, int fd, const struct timeval *now); -/* Gives adns flow-of-control so that it can process incoming data - * from, or send outgoing data via, fd. Very like _processany. If it - * returns zero then fd will no longer be readable or writeable - * (unless of course more data has arrived since). adns will _only_ - * use that fd and only in the manner specified, regardless of whether - * adns_if_noautosys was specified. - * - * adns_processexceptional should be called when select(2) reports an - * exceptional condition, or poll(2) reports POLLPRI. - * - * It is fine to call _processreabable or _processwriteable when the - * fd is not ready, or with an fd that doesn't belong to adns; it will - * then just return 0. - * - * If some error occurred which might prevent an event loop to spin - * then the errno value is returned. - */ - -void adns_processtimeouts(adns_state ads, const struct timeval *now); -/* Gives adns flow-of-control so that it can process any timeouts - * which might have happened. Very like _processreadable/writeable. - * - * now may be 0; if it isn't, *now must be the current time, recently - * obtained from gettimeofday. - */ - -void adns_firsttimeout(adns_state ads, - struct timeval **tv_mod, struct timeval *tv_buf, - struct timeval now); -/* Asks adns when it would first like the opportunity to time - * something out. now must be the current time, from gettimeofday. - * - * If tv_mod points to 0 then tv_buf must be non-null, and - * _firsttimeout will fill in *tv_buf with the time until the first - * timeout, and make *tv_mod point to tv_buf. If adns doesn't have - * anything that might need timing out it will leave *tv_mod as 0. - * - * If *tv_mod is not 0 then tv_buf is not used. adns will update - * *tv_mod if it has any earlier timeout, and leave it alone if it - * doesn't. - * - * This call will not actually do any I/O, or change the fds that adns - * is using. It always succeeds and never blocks. - */ - -void adns_globalsystemfailure(adns_state ads); -/* If serious problem(s) happen which globally affect your ability to - * interact properly with adns, or adns's ability to function - * properly, you or adns can call this function. - * - * All currently outstanding queries will be made to fail with - * adns_s_systemfail, and adns will close any stream sockets it has - * open. - * - * This is used by adns, for example, if gettimeofday() fails. - * Without this the program's event loop might start to spin ! - * - * This call will never block. - */ - -/* - * Entrypoints for select-loop based asynch io: - */ - -void adns_beforeselect(adns_state ads, int *maxfd, fd_set *readfds, - fd_set *writefds, fd_set *exceptfds, - struct timeval **tv_mod, struct timeval *tv_buf, - const struct timeval *now); -/* Find out file descriptors adns is interested in, and when it would - * like the opportunity to time something out. If you do not plan to - * block then tv_mod may be 0. Otherwise, tv_mod and tv_buf are as - * for adns_firsttimeout. readfds, writefds, exceptfds and maxfd_io may - * not be 0. - * - * If *now is not 0 then this will never actually do any I/O, or - * change the fds that adns is using or the timeouts it wants. In any - * case it won't block. - */ - -void adns_afterselect(adns_state ads, int maxfd, const fd_set *readfds, - const fd_set *writefds, const fd_set *exceptfds, - const struct timeval *now); -/* Gives adns flow-of-control for a bit; intended for use after - * select. This is just a fancy way of calling adns_processreadable/ - * writeable/timeouts as appropriate, as if select had returned the - * data being passed. Always succeeds. - */ - -/* - * Example calling sequence: - * - * adns_init _noautosys - * loop { - * adns_beforeselect - * select - * adns_afterselect - * ... - * adns_submit / adns_check - * ... - * } - */ - -/* - * Entrypoints for poll-loop based asynch io: - */ - -struct pollfd; -/* In case your system doesn't have it or you forgot to include - * , to stop the following declarations from causing - * problems. If your system doesn't have poll then the following - * entrypoints will not be defined in libadns. Sorry ! - */ - -int adns_beforepoll(adns_state ads, struct pollfd *fds, int *nfds_io, int *timeout_io, - const struct timeval *now); -/* Finds out which fd's adns is interested in, and when it would like - * to be able to time things out. This is in a form suitable for use - * with poll(2). - * - * On entry, usually fds should point to at least *nfds_io structs. - * adns will fill up to that many structs will information for poll, - * and record in *nfds_io how many structs it filled. If it wants to - * listen for more structs then *nfds_io will be set to the number - * required and _beforepoll will return ERANGE. - * - * You may call _beforepoll with fds==0 and *nfds_io 0, in which case - * adns will fill in the number of fds that it might be interested in - * in *nfds_io, and always return either 0 (if it is not interested in - * any fds) or ERANGE (if it is). - * - * NOTE that (unless now is 0) adns may acquire additional fds - * from one call to the next, so you must put adns_beforepoll in a - * loop, rather than assuming that the second call (with the buffer - * size requested by the first) will not return ERANGE. - * - * adns only ever sets POLLIN, POLLOUT and POLLPRI in its pollfd - * structs,