Radix cross Linux

The main Radix cross Linux repository contains the build scripts of packages, which have the most complete and common functionality for desktop machines

452 Commits   2 Branches   1 Tag
Index: Makefile
===================================================================
--- Makefile	(nonexistent)
+++ Makefile	(revision 5)
@@ -0,0 +1,56 @@
+
+COMPONENT_TARGETS = $(HARDWARE_NOARCH)
+
+
+include ../../../../build-system/constants.mk
+
+
+url         = $(DOWNLOAD_SERVER)/sources/packages/n/netkit-timed
+
+versions    = 0.17
+pkgname     = netkit-timed
+suffix      = tar.gz
+
+tarballs    = $(addsuffix .$(suffix), $(addprefix $(pkgname)-, $(versions)))
+sha1s       = $(addsuffix .sha1sum, $(tarballs))
+
+patches     = $(CURDIR)/patches/netkit-timed-0.17.patch
+
+.NOTPARALLEL: $(patches)
+
+
+BUILD_TARGETS = $(tarballs) $(sha1s) $(patches)
+
+
+include ../../../../build-system/core.mk
+
+
+.PHONY: download_clean
+
+
+$(tarballs):
+	@echo -e "\n======= Downloading source tarballs =======" ; \
+	 for tarball in $(tarballs) ; do \
+	   echo "$(url)/$$tarball" | xargs -n 1 -P 100 wget $(WGET_OPTIONS) - & \
+	 done ; wait
+
+$(sha1s): $(tarballs)
+	@for sha in $@ ; do \
+	   echo -e "\n======= Downloading '$$sha' signature =======\n" ; \
+	   echo "$(url)/$$sha" | xargs -n 1 -P 100 wget $(WGET_OPTIONS) - & wait %1 ; \
+	   touch $$sha ; \
+	   echo -e "\n======= Check the '$$sha' sha1sum =======\n" ; \
+	   sha1sum --check $$sha ; ret="$$?" ; \
+	   if [ "$$ret" == "1" ]; then \
+	     echo -e "\n======= ERROR: Bad '$$sha' sha1sum =======\n" ; \
+	     exit 1 ; \
+	   fi ; \
+	 done
+
+$(patches): $(sha1s)
+	@echo -e "\n======= Create Patches =======\n" ; \
+	 ( cd create-0.17-patch ; ./create.patch.sh ) ; \
+	 echo -e "\n"
+
+download_clean:
+	@rm -f $(tarballs) $(sha1s) $(patches)
Index: create-0.17-patch/create.patch.sh
===================================================================
--- create-0.17-patch/create.patch.sh	(nonexistent)
+++ create-0.17-patch/create.patch.sh	(revision 5)
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+VERSION=0.17
+
+tar --files-from=file.list -xzvf ../netkit-timed-$VERSION.tar.gz
+mv netkit-timed-$VERSION netkit-timed-$VERSION-orig
+
+cp -rf ./netkit-timed-$VERSION-new ./netkit-timed-$VERSION
+
+diff --unified -Nr  netkit-timed-$VERSION-orig  netkit-timed-$VERSION > netkit-timed-$VERSION.patch
+
+mv netkit-timed-$VERSION.patch ../patches
+
+rm -rf ./netkit-timed-$VERSION
+rm -rf ./netkit-timed-$VERSION-orig

Property changes on: create-0.17-patch/create.patch.sh
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: create-0.17-patch/file.list
===================================================================
--- create-0.17-patch/file.list	(nonexistent)
+++ create-0.17-patch/file.list	(revision 5)
@@ -0,0 +1,7 @@
+netkit-timed-0.17/configure
+netkit-timed-0.17/timed/lib/Makefile
+netkit-timed-0.17/timed/lib/measure.c
+netkit-timed-0.17/timed/timed/globals.h
+netkit-timed-0.17/timed/timed/master.c
+netkit-timed-0.17/timed/timed/readmsg.c
+netkit-timed-0.17/timed/timed/timed.c
Index: create-0.17-patch/netkit-timed-0.17-new/configure
===================================================================
--- create-0.17-patch/netkit-timed-0.17-new/configure	(nonexistent)
+++ create-0.17-patch/netkit-timed-0.17-new/configure	(revision 5)
@@ -0,0 +1,288 @@
+#!/bin/sh
+#
+# This file was generated by confgen version 2.
+# Do not edit.
+#
+
+PREFIX='/usr'
+#EXECPREFIX='$PREFIX'
+INSTALLROOT=''
+BINMODE='755'
+#DAEMONMODE='$BINMODE'
+ROOTMODE='700'
+MANMODE='644'
+
+while [ x$1 != x ]; do case $1 in
+
+	--help)
+	cat <<EOF
+Usage: configure [options]
+    --help                Show this message
+    --with-debug          Enable debugging
+    --prefix=path         Prefix for location of files [/usr]
+    --exec-prefix=path    Location for arch-depedent files [prefix]
+    --installroot=root    Top of filesystem tree to install in [/]
+    --binmode=mode        Mode for binaries [755]
+    --daemonmode=mode     Mode for daemon binaries [same as binmode]
+    --rootmode=mode     Mode for root-only binaries [700]
+    --manmode=mode        Mode for manual pages [644]
+    --with-c-compiler=cc  Program for compiling C source [guessed]
+EOF
+	exit 0;;
+	--verbose) ;;
+	--quiet) ;;
+
+	--subdir) . ../configure.defs;;
+
+	--with-debug|--debug) DEBUG=1;;
+	--prefix=*) PREFIX=`echo $1 | sed 's/^[^=]*=//'` ;;
+	--exec-prefix=*) EXECPREFIX=`echo $1 | sed 's/^[^=]*=//'` ;;
+	--installroot=*) INSTALLROOT=`echo $1 | sed 's/^[^=]*=//'` ;;
+	--binmode=*) BINMODE=`echo $1 | sed 's/^[^=]*=//'` ;;
+	--daemonmode=*) DAEMONMODE=`echo $1 | sed 's/^[^=]*=//'` ;;
+	--rootmode=*) ROOTMODE=`echo $1 | sed 's/^[^=]*=//'` ;;
+	--manmode=*) MANMODE=`echo $1 | sed 's/^[^=]*=//'` ;;
+	--with-c-compiler=*) CC=`echo $1 | sed 's/^[^=]*=//'` ;;
+	*) echo "Unrecognized option: $1"; exit 1;;
+esac 
+shift
+done
+
+if [ x$EXECPREFIX = x ]; then 
+	EXECPREFIX="$PREFIX"
+fi
+
+if [ x$DAEMONMODE = x ]; then 
+	DAEMONMODE="$BINMODE"
+fi
+
+SBINDIR="$EXECPREFIX/sbin"
+MANDIR="$PREFIX/share/man"
+
+echo "Directories: $SBINDIR $MANDIR "
+
+if [ x$INSTALLROOT != x ]; then
+    echo "Installing in chroot tree rooted at $INSTALLROOT"
+fi
+
+##################################################
+
+WARNINGS='-Wall -W -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Winline '
+
+cat << EOF > __conftest.c
+    int main() { int class=0; return class; }
+EOF
+
+if [ x"$CC" = x ]; then
+    echo -n 'Looking for a C compiler... '
+    for TRY in egcs gcc g++ CC c++ cc; do
+       (
+           $TRY __conftest.c -o __conftest || exit 1;
+#           ./__conftest || exit 1;
+       ) >/dev/null 2>&1 || continue;
+       CC=$TRY
+       break;
+    done
+    if [ x"$CC" = x ]; then
+        echo 'failed.'
+        echo 'Cannot find a C compiler. Run configure with --with-c-compiler.'
+        rm -f __conftest*
+        exit
+    fi
+    echo "$CC"
+else
+    echo -n 'Checking if C compiler works... '
+    if (
+          $CC __conftest.c -o __conftest || exit 1
+#          ./__conftest || exit 1
+       ) >/dev/null 2>&1; then
+         echo 'yes'
+     else
+         echo 'no'
+         echo 'Compiler '"$CC"' does not exist or cannot compile C; try another.'
+         rm -f __conftest*
+         exit
+     fi
+fi
+
+echo -n "Checking if $CC accepts gcc warnings... "
+if (
+    $CC $WARNINGS __conftest.c -o __conftest || exit 1
+   ) >/dev/null 2>&1; then
+     echo 'yes'
+     CC_WARNINGS=1
+else
+     echo 'no'
+fi
+
+if [ x$DEBUG = x ]; then
+    echo -n "Checking if $CC accepts -O2... "
+    if (
+         $CC -O2 __conftest.c -o __conftest
+       ) >/dev/null 2>&1; then
+         echo 'yes'
+         CFLAGS="$CFLAGS -O2"
+    else
+         echo 'no'
+         echo -n "Checking if $CC accepts -O... "
+         if (
+              $CC -O __conftest.c -o __conftest
+            ) >/dev/null 2>&1; then
+              echo 'yes'
+              CFLAGS="$CFLAGS -O"
+         else
+              echo 'no'
+         fi
+    fi
+
+else
+    echo -n "Checking if $CC accepts -g... "
+    if (
+         $CC -g __conftest.c -o __conftest
+       ) >/dev/null 2>&1; then
+         echo 'yes'
+         CFLAGS="$CFLAGS -g"
+    else
+         echo 'no'
+    fi
+
+fi
+
+LDFLAGS=$LDFLAGS
+LIBS=$LIBS
+
+rm -f __conftest*
+
+##################################################
+
+echo -n 'Checking for BSD signal semantics... '
+cat <<EOF >__conftest.c
+#include <unistd.h>
+#include <signal.h>
+int count=0;
+void handle(int foo) { count++; }
+int main() {
+    int pid=getpid();
+    signal(SIGINT, handle);
+    kill(pid,SIGINT);
+    kill(pid,SIGINT);
+    kill(pid,SIGINT);
+    if (count!=3) return 1;
+    return 0;
+}
+
+EOF
+if (
+      $CC $CFLAGS  __conftest.c  -o __conftest || exit 1
+#      ./__conftest || exit 1
+   ) >/dev/null 2>&1; then
+    echo 'yes'
+else
+    if (
+          $CC $CFLAGS -D__USE_BSD_SIGNAL __conftest.c  -o __conftest || exit 1
+#          ./__conftest || exit 1
+       ) >/dev/null 2>&1; then
+        echo '-D__USE_BSD_SIGNAL'
+        CFLAGS="$CFLAGS -D__USE_BSD_SIGNAL"
+    else
+        echo 'no'
+        echo 'This package needs BSD signal semantics to run.'
+        rm -f __conftest*
+        exit
+    fi
+fi
+rm -f __conftest*
+
+##################################################
+
+echo -n 'Checking for GNU libc... '
+cat <<EOF >__conftest.c
+#include <stdio.h>
+#if defined(__GLIBC__) && (__GLIBC__ >= 2)
+int tester;
+#endif
+int main() { tester=6; return 0; }
+
+EOF
+if (
+      $CC $CFLAGS  __conftest.c  -o __conftest || exit 1
+   ) >/dev/null 2>&1; then
+    echo 'yes'
+    USE_GLIBC=1
+else
+    echo 'no'
+fi
+rm -f __conftest*
+
+##################################################
+
+echo -n 'Checking for logwtmp... '
+cat <<EOF >__conftest.c
+#ifdef __cplusplus
+extern "C"
+#endif
+void logwtmp(const char *, const char *, const char *);
+int main() { logwtmp(0, 0, 0); }
+
+EOF
+if (
+      $CC $CFLAGS  __conftest.c  -o __conftest || exit 1
+   ) >/dev/null 2>&1; then
+    echo 'yes'
+else
+    if (
+          $CC $CFLAGS  __conftest.c -lutil -o __conftest || exit 1
+       ) >/dev/null 2>&1; then
+        echo '-lutil'
+        LIBS="$LIBS -lutil"
+    else
+        if (
+              $CC $CFLAGS  __conftest.c -lbsd -o __conftest || exit 1
+           ) >/dev/null 2>&1; then
+            echo '-lbsd'
+            LIBBSD="-lbsd"
+        else
+            echo 'no'
+            echo 'This package requires logwtmp.'
+            rm -f __conftest*
+            exit
+        fi
+    fi
+fi
+rm -f __conftest*
+
+##################################################
+
+## libbsd should go last in case it's broken
+if [ "x$LIBBSD" != x ]; then
+    LIBS="$LIBS $LIBBSD"
+fi
+
+echo 'Generating MCONFIG...'
+(
+    echo -n '# Generated by configure (confgen version 2) on '
+    date
+    echo '#'
+    echo
+
+    echo "SBINDIR=$SBINDIR"
+    echo "MANDIR=$MANDIR"
+    echo "BINMODE=$BINMODE"
+    echo "DAEMONMODE=$DAEMONMODE"
+    echo "ROOTMODE=$ROOTMODE"
+    echo "MANMODE=$MANMODE"
+    echo "PREFIX=$PREFIX"
+    echo "EXECPREFIX=$EXECPREFIX"
+    echo "INSTALLROOT=$INSTALLROOT"
+    echo "CC=$CC"
+    if [ x$CC_WARNINGS != x ]; then
+        CFLAGS="$CFLAGS $WARNINGS"
+    fi
+
+    echo "CFLAGS=$CFLAGS" | sed 's/= */=/'
+    echo "LDFLAGS=$LDFLAGS" | sed 's/= */=/'
+    echo "LIBS=$LIBS" | sed 's/= */=/'
+
+    echo "USE_GLIBC=$USE_GLIBC"
+) > MCONFIG
+

Property changes on: create-0.17-patch/netkit-timed-0.17-new/configure
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: create-0.17-patch/netkit-timed-0.17-new/timed/lib/Makefile
===================================================================
--- create-0.17-patch/netkit-timed-0.17-new/timed/lib/Makefile	(nonexistent)
+++ create-0.17-patch/netkit-timed-0.17-new/timed/lib/Makefile	(revision 5)
@@ -0,0 +1,15 @@
+all: libtimed.a
+
+include ../../MCONFIG
+include ../../MRULES
+
+CFLAGS += -I../timed
+OBJS = byteorder.o measure.o cksum.o
+
+libtimed.a: $(OBJS)
+	$(AR) -cruv $@ $^
+
+install: ;
+clean:
+	rm -f *.o *.a
+
Index: create-0.17-patch/netkit-timed-0.17-new/timed/lib/measure.c
===================================================================
--- create-0.17-patch/netkit-timed-0.17-new/timed/lib/measure.c	(nonexistent)
+++ create-0.17-patch/netkit-timed-0.17-new/timed/lib/measure.c	(revision 5)
@@ -0,0 +1,383 @@
+/*-
+ * Copyright (c) 1985, 1993 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * From: @(#)measure.c	5.1 (Berkeley) 5/11/93
+ */
+char measure_rcsid[] =
+  "$Id: measure.c,v 1.8 1997/05/19 09:41:37 dholland Exp $";
+
+#ifdef sgi
+#ident "$Revision: 1.8 $"
+#endif
+
+#include "globals.h"
+#include <netinet/ip.h>
+#include <netinet/ip_icmp.h>
+
+#if defined(__GLIBC__) && (__GLIBC__ >= 2)
+#define icmphdr icmp
+#endif
+
+#define MSEC_DAY	(SECDAY*1000)
+
+#define PACKET_IN	1024
+
+#define MSGS		5		/* timestamps to average */
+#define TRIALS		10		/* max # of timestamps sent */
+
+extern int sock_raw;
+
+int measure_delta;
+
+extern int in_cksum(u_short*, int);
+
+static u_short seqno = 0;
+
+/*
+ * Measures the differences between machines' clocks using
+ * ICMP timestamp messages.
+ */
+int					/* status val defined in globals.h */
+measure(u_long maxmsec,			/* wait this many msec at most */
+	u_long wmsec,			/* msec to wait for an answer */
+	char *hname,
+	struct sockaddr_in *xaddr,
+	int doprint)			/* print complaints on stderr */
+{
+	socklen_t length;
+	int measure_status;
+	int rcvcount, trials = 0;
+	int cc, count;
+	fd_set ready;
+	long sendtime, recvtime, histime1, histime2;
+	long idelta, odelta, total;
+	long min_idelta, min_odelta;
+	struct timeval tdone, tcur, ttrans, twait, tout;
+	u_char packet[PACKET_IN], opacket[64];
+	register struct icmphdr *icp = (struct icmphdr *) packet;
+	register struct icmphdr *oicp = (struct icmphdr *) opacket;
+#ifndef icmp_data
+	time_t *icp_time = (time_t *)(icp + 1);
+	time_t *oicp_time = (time_t *)(oicp + 1);
+#else
+	time_t *icp_time = (time_t *)icp->icmp_data;
+	time_t *oicp_time = (time_t *)oicp->icmp_data;
+#endif
+	struct iphdr *ip = (struct iphdr *) packet;
+	struct sockaddr_in fixed_addr = *xaddr;
+	fixed_addr.sin_port = 0;
+
+#ifdef __linux__
+#define ICPSIZE ((int)(sizeof(struct icmphdr)+3*sizeof(time_t)))
+#else
+#define ICPSIZE ((int)(sizeof(struct icmphdr)))
+#endif
+
+	min_idelta = min_odelta = 0x7fffffff;
+	measure_status = HOSTDOWN;
+	measure_delta = HOSTDOWN;
+	errno = 0;
+
+	/* open raw socket used to measure time differences */
+	if (sock_raw < 0) {
+		sock_raw = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
+		if (sock_raw < 0)  {
+			syslog(LOG_ERR, "opening raw socket: %m");
+			goto quit;
+		}
+	}
+	    
+
+	/*
+	 * empty the icmp input queue
+	 */
+	FD_ZERO(&ready);
+	for (;;) {
+		tout.tv_sec = tout.tv_usec = 0;
+		FD_SET(sock_raw, &ready);
+		if (select(sock_raw+1, &ready, 0,0, &tout)) {
+			length = (socklen_t)sizeof(struct sockaddr_in);
+			cc = recvfrom(sock_raw, (char *)packet, PACKET_IN, 0,
+				      0,&length);
+			if (cc < 0)
+				goto quit;
+			continue;
+		}
+		break;
+	}
+
+	/*
+	 * Choose the smallest transmission time in each of the two
+	 * directions. Use these two latter quantities to compute the delta
+	 * between the two clocks.
+	 */
+
+#if !defined(__GLIBC__) || (__GLIBC__ < 2)
+#define icmp_type	type
+#define icmp_code	code
+#define icmp_id		un.echo.id
+#define icmp_seq	un.echo.sequence
+#define icmp_cksum	checksum
+#define ICMP_TSTAMP	ICMP_TIMESTAMP
+#define ICMP_TSTAMPREPLY	ICMP_TIMESTAMPREPLY
+#endif
+
+	oicp->icmp_type = ICMP_TSTAMP;
+	oicp->icmp_code = 0;
+	oicp->icmp_id = getpid();
+	oicp_time[1] = 0;
+	oicp_time[2] = 0;
+	oicp->icmp_seq = seqno;
+
+	FD_ZERO(&ready);
+
+#ifdef sgi
+	sginap(1);			/* start at a clock tick */
+#endif /* sgi */
+
+	(void)gettimeofday(&tdone, 0);
+	mstotvround(&tout, maxmsec);
+	timevaladd(&tdone, &tout);		/* when we give up */
+
+	mstotvround(&twait, wmsec);
+
+	rcvcount = 0;
+	trials = 0;
+	while (rcvcount < MSGS) {
+		(void)gettimeofday(&tcur, 0);
+
+		/*
+		 * keep sending until we have sent the max
+		 */
+		if (trials < TRIALS) {
+			trials++;
+			oicp_time[0] = htonl(((tcur.tv_sec % SECDAY) * 1000
+					      + tcur.tv_usec / 1000));
+			oicp->icmp_cksum = 0;
+			oicp->icmp_cksum = in_cksum((u_short*)oicp,
+						    ICPSIZE);
+
+			count = sendto(sock_raw, opacket, ICPSIZE, 0,
+				       (struct sockaddr*)&fixed_addr,
+				       sizeof(struct sockaddr));
+			if (count < 0) {
+				if (measure_status == HOSTDOWN)
+					measure_status = UNREACHABLE;
+				goto quit;
+			}
+			++oicp->icmp_seq;
+
+			ttrans = tcur;
+			timevaladd(&ttrans, &twait);
+		} else {
+			ttrans = tdone;
+		}
+
+		while (rcvcount < trials) {
+			timevalsub(&tout, &ttrans, &tcur);
+			if (tout.tv_sec < 0)
+				tout.tv_sec = 0;
+
+			FD_SET(sock_raw, &ready);
+			count = select(sock_raw+1, &ready, (fd_set *)0,
+				       (fd_set *)0, &tout);
+			(void)gettimeofday(&tcur, (struct timezone *)0);
+			if (count <= 0)
+				break;
+
+			length = (socklen_t)sizeof(struct sockaddr_in);
+			cc = recvfrom(sock_raw, (char *)packet, PACKET_IN, 0,
+				      0,&length);
+			if (cc < 0)
+				goto quit;
+
+			/* 
+			 * got something.  See if it is ours
+			 */
+			icp = (struct icmphdr *)(packet + (ip->ihl << 2));
+			if (cc < ICPSIZE
+			    || icp->icmp_type != ICMP_TSTAMPREPLY
+			    || icp->icmp_id != oicp->icmp_id
+			    || icp->icmp_seq < seqno
+			    || icp->icmp_seq >= oicp->icmp_seq)
+				continue;
+
+			/* Reset this because icp just changed... */
+			icp_time = (time_t *)(icp + 1);
+
+			sendtime = ntohl(icp_time[0]);
+			recvtime = ((tcur.tv_sec % SECDAY) * 1000 +
+				    tcur.tv_usec / 1000);
+
+			total = recvtime-sendtime;
+			if (total < 0)	/* do not hassle midnight */
+				continue;
+
+			rcvcount++;
+			histime1 = ntohl(icp_time[1]);
+			histime2 = ntohl(icp_time[2]);
+			/*
+			 * a host using a time format different from
+			 * msec. since midnight UT (as per RFC792) should
+			 * set the high order bit of the 32-bit time
+			 * value it transmits.
+			 */
+			if ((histime1 & 0x80000000) != 0) {
+				measure_status = NONSTDTIME;
+				goto quit;
+			}
+			measure_status = GOOD;
+
+			idelta = recvtime-histime2;
+			odelta = histime1-sendtime;
+
+			/* do not be confused by midnight */
+			if (idelta < -MSEC_DAY/2) idelta += MSEC_DAY;
+			else if (idelta > MSEC_DAY/2) idelta -= MSEC_DAY;
+
+			if (odelta < -MSEC_DAY/2) odelta += MSEC_DAY;
+			else if (odelta > MSEC_DAY/2) odelta -= MSEC_DAY;
+
+			/* save the quantization error so that we can get a
+			 * measurement finer than our system clock.
+			 */
+			if (total < MIN_ROUND) {
+				measure_delta = (odelta - idelta)/2;
+				goto quit;
+			}
+
+			if (idelta < min_idelta)
+				min_idelta = idelta;
+			if (odelta < min_odelta)
+				min_odelta = odelta;
+
+			measure_delta = (min_odelta - min_idelta)/2;
+		}
+
+		if (tcur.tv_sec > tdone.tv_sec
+		    || (tcur.tv_sec == tdone.tv_sec
+			&& tcur.tv_usec >= tdone.tv_usec))
+			break;
+	}
+
+quit:
+	seqno += TRIALS;		/* allocate our sequence numbers */
+
+	/*
+	 * If no answer is received for TRIALS consecutive times,
+	 * the machine is assumed to be down
+	 */
+	if (measure_status == GOOD) {
+		if (trace) {
+			fprintf(fd,
+				"measured delta %4d, %d trials to %-15s %s\n",
+			   	measure_delta, trials,
+				inet_ntoa(fixed_addr.sin_addr), hname);
+		}
+	} else if (doprint) {
+		if (errno != 0)
+			fprintf(stderr, "measure %s: %s\n", hname,
+				strerror(errno));
+	} else {
+		if (errno != 0) {
+			syslog(LOG_ERR, "measure %s: %m", hname);
+		} else {
+			syslog(LOG_ERR, "measure: %s did not respond", hname);
+		}
+		if (trace) {
+			fprintf(fd,
+				"measure: %s failed after %d trials\n",
+				hname, trials);
+			(void)fflush(fd);
+		}
+	}
+
+	return(measure_status);
+}
+
+
+
+
+
+/*
+ * round a number of milliseconds into a struct timeval
+ */
+void
+mstotvround(struct timeval *res, long x)
+{
+#ifndef sgi
+	if (x < 0)
+		x = -((-x + 3)/5);
+	else
+		x = (x+3)/5;
+	x *= 5;
+#endif /* sgi */
+	res->tv_sec = x/1000;
+	res->tv_usec = (x-res->tv_sec*1000)*1000;
+	if (res->tv_usec < 0) {
+		res->tv_usec += 1000000;
+		res->tv_sec--;
+	}
+}
+
+void
+timevaladd(struct timeval *tv1, struct timeval *tv2)
+{
+	tv1->tv_sec += tv2->tv_sec;
+	tv1->tv_usec += tv2->tv_usec;
+	if (tv1->tv_usec >= 1000000) {
+		tv1->tv_sec++;
+		tv1->tv_usec -= 1000000;
+	}
+	if (tv1->tv_usec < 0) {
+		tv1->tv_sec--;
+		tv1->tv_usec += 1000000;
+	}
+}
+
+void
+timevalsub(struct timeval *res, struct timeval *tv1, struct timeval *tv2)
+{
+	res->tv_sec = tv1->tv_sec - tv2->tv_sec;
+	res->tv_usec = tv1->tv_usec - tv2->tv_usec;
+	if (res->tv_usec >= 1000000) {
+		res->tv_sec++;
+		res->tv_usec -= 1000000;
+	}
+	if (res->tv_usec < 0) {
+		res->tv_sec--;
+		res->tv_usec += 1000000;
+	}
+}
+
Index: create-0.17-patch/netkit-timed-0.17-new/timed/lib
===================================================================
--- create-0.17-patch/netkit-timed-0.17-new/timed/lib	(nonexistent)
+++ create-0.17-patch/netkit-timed-0.17-new/timed/lib	(revision 5)

Property changes on: create-0.17-patch/netkit-timed-0.17-new/timed/lib
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,73 ##
+
+# install dir
+dist
+
+# Target build dirs
+.a1x-newlib
+.a2x-newlib
+.at91sam7s-newlib
+
+.build-machine
+
+.a1x-glibc
+.a2x-glibc
+.h3-glibc
+.h5-glibc
+.i586-glibc
+.i686-glibc
+.imx6-glibc
+.jz47xx-glibc
+.makefile
+.am335x-glibc
+.omap543x-glibc
+.p5600-glibc
+.power8-glibc
+.power8le-glibc
+.power9-glibc
+.power9le-glibc
+.m1000-glibc
+.riscv64-glibc
+.rk328x-glibc
+.rk33xx-glibc
+.rk339x-glibc
+.s8xx-glibc
+.s9xx-glibc
+.x86_64-glibc
+
+# Hidden files (each file)
+.makefile
+.dist
+.rootfs
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+.requires
+.requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Descriptions
+*.dsc
+*.txt
+
+# Default linux config files
+*.defconfig
+
+# backup copies
+*~
Index: create-0.17-patch/netkit-timed-0.17-new/timed/timed/globals.h
===================================================================
--- create-0.17-patch/netkit-timed-0.17-new/timed/timed/globals.h	(nonexistent)
+++ create-0.17-patch/netkit-timed-0.17-new/timed/timed/globals.h	(revision 5)
@@ -0,0 +1,197 @@
+/*-
+ * Copyright (c) 1985 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *	@(#)globals.h	5.1 (Berkeley) 5/11/93
+ */
+
+#ifdef sgi
+#ident "$Revision: 1.5 $"
+#endif
+
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <syslog.h>
+#include <syslog.h>
+#include <unistd.h>
+#include <time.h>
+
+#include <protocols/timed.h>
+#ifdef sgi
+#include <bstring.h>
+#include <sys/clock.h>
+/* use the constant HZ instead of the function CLK_TCK */
+#undef CLK_TCK
+#define CLK_TCK HZ
+#else
+#define	SECHR	(60*60)
+#define	SECDAY	(24*SECHR)
+#endif /* sgi */
+
+extern int sock;
+
+/* Best expected round trip for a measurement.
+ * This is essentially the number of milliseconds per CPU tick (CLK_TCK?).
+ * All delays shorter than this are usually reported as 0.
+ */
+#define MIN_ROUND ((1000-1)/CLOCKS_PER_SEC)
+
+
+#define SAMPLEINTVL	240		/* synch() freq for master in sec */
+
+/* 
+ * max adjtime() correction in sec 
+ */
+#ifdef __linux__
+/* Apparently linux's adjtime corrects kind of slowly. */
+#define	MAXADJ		10
+#else
+#define	MAXADJ		20
+#endif
+
+#define MAX_TRIM	3000000		/* max drift in nsec/sec, 0.3% */
+#define BIG_ADJ		(MAX_TRIM/1000*SAMPLEINTVL*2)	/* max good adj */
+
+#define MINTOUT		360		/* election delays, 6-15 minutes */
+#define MAXTOUT		900
+
+#define BAD_STATUS	(-1)
+#define GOOD		1
+#define UNREACHABLE	2
+#define NONSTDTIME	3
+#define HOSTDOWN	0x7fffffff
+
+#define OFF		0
+#define ON		1
+
+#define MAX_HOPCNT	10		/* max value for tsp_hpcnt */
+
+#define LOSTHOST	3		/* forget after this many failures */
+
+#define VALID_RANGE (MAXADJ*1000)	/* good times in milliseconds */
+#define GOOD_RANGE (MIN_ROUND*2)
+#define VGOOD_RANGE (MIN_ROUND-1)
+
+
+/*
+ * Global and per-network states.
+ */
+#define NOMASTER	0		/* no good master */
+#define SLAVE		1
+#define MASTER		2
+#define IGNORE		4
+#define ALL		(SLAVE|MASTER|IGNORE)
+#define SUBMASTER	(SLAVE|MASTER)
+
+#define NHOSTS		1013		/* max of hosts controlled by timed
+					 * This must be a prime number.
+					 */
+struct hosttbl {
+	struct	hosttbl *h_bak;		/* hash chain */
+	struct	hosttbl *h_fwd;
+	struct  hosttbl *l_bak;		/* "sequential" list */
+	struct  hosttbl *l_fwd;
+	struct	netinfo *ntp;
+	struct	sockaddr_in addr;
+	char	name[MAXHOSTNAMELEN+1];
+	u_char	head;			/* 1=head of hash chain */
+	u_char	good;			/* 0=trusted host, for averaging */
+	u_char	noanswer;		/* count of failures to answer */
+	u_char	need_set;		/* need a SETTIME */
+	u_short seq;
+	long	delta;
+};
+
+/* closed hash table with internal chaining */
+extern struct hosttbl hosttbl[NHOSTS+1];
+#define self hosttbl[0]
+#define hostname (self.name)
+
+
+struct netinfo {
+	struct	netinfo *next;
+	struct	in_addr net;
+	u_long	mask;
+	struct	in_addr my_addr;
+	struct	sockaddr_in dest_addr;	/* broadcast addr or point-point */
+	long	status;
+	struct timeval slvwait;		/* delay before sending our time */
+	int	quit_count;		/* recent QUITs */
+};
+
+#include "timed-extern.h"
+
+#define tvtomsround(tv) ((tv).tv_sec*1000 + ((tv).tv_usec + 500)/1000)
+
+extern struct netinfo *nettab;
+extern int status;
+extern int trace;
+extern int sock;
+extern struct sockaddr_in from;
+extern struct timeval from_when;	/* when the last msg arrived */
+extern u_short sequence;		/* TSP message sequence number */
+extern struct netinfo *fromnet, *slavenet;
+extern FILE *fd;
+extern long delay1, delay2;
+extern int nslavenets;			/* nets were I could be a slave */
+extern int nmasternets;			/* nets were I could be a master */
+extern int nignorednets;		/* ignored nets */
+extern int nnets;			/* nets I am connected to */
+
+
+#define trace_msg(msg)		{if (trace) fprintf(fd, msg);}
+
+#define trace_sendto_err(addr) {					\
+	int st_errno = errno;						\
+	syslog(LOG_ERR, "%s %d: sendto %s: %m",				\
+		__FILE__, __LINE__, inet_ntoa(addr));			\
+	if (trace)							\
+		fprintf(fd, "%s %d: sendto %s: %d", __FILE__, __LINE__,	\
+			inet_ntoa(addr), st_errno);			\
+}
+
+
+# define max(a,b) 	(a<b ? b : a)
+# define min(a,b) 	(a>b ? b : a)
+#if 0
+# define abs(x)		(x>=0 ? x : -(x))
+#endif
Index: create-0.17-patch/netkit-timed-0.17-new/timed/timed/master.c
===================================================================
--- create-0.17-patch/netkit-timed-0.17-new/timed/timed/master.c	(nonexistent)
+++ create-0.17-patch/netkit-timed-0.17-new/timed/timed/master.c	(revision 5)
@@ -0,0 +1,921 @@
+/*-
+ * Copyright (c) 1985, 1993 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * From: @(#)master.c	5.1 (Berkeley) 5/11/93
+ */
+char master_rcsid[] =
+  "$Id: master.c,v 1.7 1999/11/25 04:48:41 netbug Exp $";
+
+#ifdef sgi
+#ident "$Revision: 1.7 $"
+#endif
+
+#include "globals.h"
+#ifndef __alpha__
+	#include <sys/file.h>
+	#include <sys/types.h>
+#endif
+#include <sys/times.h>
+#include <setjmp.h>
+#ifdef sgi
+#include <sys/schedctl.h>
+#include <utmpx.h>	/* includes utmp.h */
+#else
+#include <utmp.h>
+#endif /* sgi */
+
+#include "pathnames.h"
+
+#ifdef __linux__
+/* from libbsd.a */
+void logwtmp(const char *, const char *, const char *);
+#endif
+
+extern int measure_delta;
+extern sigjmp_buf jmpenv;
+extern int Mflag;
+extern int justquit;
+
+static int dictate;
+static int slvcount;			/* slaves listening to our clock */
+
+static void mchgdate(struct tsp*);
+
+#ifdef sgi
+extern	void	getutmpx(const struct utmp *, struct utmpx *);
+extern	void	logwtmp(struct timeval*, struct timeval*);
+#endif /* sgi */
+
+
+/*
+ * The main function of `master' is to periodically compute the differences
+ * (deltas) between its clock and the clocks of the slaves, to compute the
+ * network average delta, and to send to the slaves the differences between
+ * their individual deltas and the network delta.
+ * While waiting, it receives messages from the slaves (i.e. requests for
+ * master's name, remote requests to set the network time, ...), and
+ * takes the appropriate action.
+ */
+void master(void)
+{
+	struct hosttbl *htp;
+	time_t pollingtime;
+#define POLLRATE 4
+	int polls;
+	struct timeval wait, ntime;
+	time_t tmpt;
+	struct tsp *msg, *answer, to;
+	char newdate[32];
+	struct sockaddr_in taddr;
+	char tname[MAXHOSTNAMELEN];
+	struct netinfo *ntp;
+	int i;
+
+	syslog(LOG_NOTICE, "This machine is master");
+	if (trace)
+		fprintf(fd, "This machine is master\n");
+	for (ntp = nettab; ntp != NULL; ntp = ntp->next) {
+		if (ntp->status == MASTER)
+			masterup(ntp);
+	}
+	(void)gettimeofday(&ntime, 0);
+	pollingtime = ntime.tv_sec+3;
+	if (justquit)
+		polls = 0;
+	else
+		polls = POLLRATE-1;
+
+/* Process all outstanding messages before spending the long time necessary
+ *	to update all timers.
+ */
+loop:
+	(void)gettimeofday(&ntime, 0);
+	wait.tv_sec = pollingtime - ntime.tv_sec;
+	if (wait.tv_sec < 0)
+		wait.tv_sec = 0;
+	wait.tv_usec = 0;
+	msg = readmsg(TSP_ANY, ANYADDR, &wait, 0);
+	if (!msg) {
+		(void)gettimeofday(&ntime, 0);
+		if (ntime.tv_sec >= pollingtime) {
+			pollingtime = ntime.tv_sec + SAMPLEINTVL;
+			get_goodgroup(0);
+
+/* If a bogus master told us to quit, we can have decided to ignore a
+ * network.  Therefore, periodically try to take over everything.
+ */
+			polls = (polls + 1) % POLLRATE;
+			if (0 == polls && nignorednets > 0) {
+				trace_msg("Looking for nets to re-master\n");
+				for (ntp = nettab; ntp; ntp = ntp->next) {
+					if (ntp->status == IGNORE
+					    || ntp->status == NOMASTER) {
+						lookformaster(ntp);
+						if (ntp->status == MASTER) {
+							masterup(ntp);
+							polls = POLLRATE-1;
+						}
+					}
+					if (ntp->status == MASTER
+					    && --ntp->quit_count < 0)
+						ntp->quit_count = 0;
+				}
+				if (polls != 0)
+					setstatus();
+			}
+
+			synch(0L);
+
+			for (ntp = nettab; ntp != NULL; ntp = ntp->next) {
+				to.tsp_type = TSP_LOOP;
+				to.tsp_vers = TSPVERSION;
+				to.tsp_seq = sequence++;
+				to.tsp_hopcnt = MAX_HOPCNT;
+				(void)strcpy(to.tsp_name, hostname);
+				bytenetorder(&to);
+				if (sendto(sock, (char *)&to,
+					   sizeof(struct tsp), 0,
+					   (struct sockaddr*)&ntp->dest_addr,
+					   sizeof(ntp->dest_addr)) < 0) {
+				   trace_sendto_err(ntp->dest_addr.sin_addr);
+				}
+			}
+		}
+
+
+	} else {
+		switch (msg->tsp_type) {
+
+		case TSP_MASTERREQ:
+			break;
+
+		case TSP_SLAVEUP:
+			newslave(msg);
+			break;
+
+		case TSP_SETDATE:
+			/*
+			 * XXX check to see it is from ourself
+			 */
+#ifdef sgi
+			(void)cftime(newdate, "%D %T", &msg->tsp_time.tv_sec);
+#else
+			tmpt = msg->tsp_time.tv_sec;
+			(void)strcpy(newdate, ctime(&tmpt));
+#endif /* sgi */
+			if (!good_host_name(msg->tsp_name)) {
+				syslog(LOG_NOTICE,
+				       "attempted date change by %s to %s",
+				       msg->tsp_name, newdate);
+				spreadtime();
+				break;
+			}
+
+			mchgdate(msg);
+			(void)gettimeofday(&ntime, 0);
+			pollingtime = ntime.tv_sec + SAMPLEINTVL;
+			break;
+
+		case TSP_SETDATEREQ:
+			if (!fromnet || fromnet->status != MASTER)
+				break;
+#ifdef sgi
+			(void)cftime(newdate, "%D %T", &msg->tsp_time.tv_sec);
+#else
+			tmpt = msg->tsp_time.tv_sec;
+			(void)strcpy(newdate, ctime(&tmpt));
+#endif /* sgi */
+			htp = findhost(msg->tsp_name);
+			if (htp == 0) {
+				syslog(LOG_ERR,
+				       "attempted SET DATEREQ by uncontrolled %s to %s",
+				       msg->tsp_name, newdate);
+				break;
+			}
+			if (htp->seq == msg->tsp_seq)
+				break;
+			htp->seq = msg->tsp_seq;
+			if (!htp->good) {
+				syslog(LOG_NOTICE,
+				"attempted SET DATEREQ by untrusted %s to %s",
+				       msg->tsp_name, newdate);
+				spreadtime();
+				break;
+			}
+
+			mchgdate(msg);
+			(void)gettimeofday(&ntime, 0);
+			pollingtime = ntime.tv_sec + SAMPLEINTVL;
+			break;
+
+		case TSP_MSITE:
+			xmit(TSP_ACK, msg->tsp_seq, &from);
+			break;
+
+		case TSP_MSITEREQ:
+			break;
+
+		case TSP_TRACEON:
+			traceon();
+			break;
+
+		case TSP_TRACEOFF:
+			traceoff("Tracing ended at %s\n");
+			break;
+
+		case TSP_ELECTION:
+			if (!fromnet)
+				break;
+			if (fromnet->status == MASTER) {
+				pollingtime = 0;
+				(void)addmach(msg->tsp_name, &from,fromnet);
+			}
+			taddr = from;
+			(void)strcpy(tname, msg->tsp_name);
+			to.tsp_type = TSP_QUIT;
+			(void)strcpy(to.tsp_name, hostname);
+			answer = acksend(&to, &taddr, tname,
+					 TSP_ACK, 0, 1);
+			if (answer == NULL) {
+				syslog(LOG_ERR, "election error by %s",
+				       tname);
+			}
+			break;
+
+		case TSP_CONFLICT:
+			/*
+			 * After a network partition, there can be
+			 * more than one master: the first slave to
+			 * come up will notify here the situation.
+			 */
+			if (!fromnet || fromnet->status != MASTER)
+				break;
+			(void)strcpy(to.tsp_name, hostname);
+
+			/* The other master often gets into the same state,
+			 * with boring results if we stay at it forever.
+			 */
+			ntp = fromnet;	/* (acksend() can leave fromnet=0 */
+			for (i = 0; i < 3; i++) {
+				to.tsp_type = TSP_RESOLVE;
+				(void)strcpy(to.tsp_name, hostname);
+				answer = acksend(&to, &ntp->dest_addr,
+						 ANYADDR, TSP_MASTERACK,
+						 ntp, 0);
+				if (!answer)
+					break;
+				htp = addmach(answer->tsp_name,&from,ntp);
+				to.tsp_type = TSP_QUIT;
+				msg = acksend(&to, &htp->addr, htp->name,
+					      TSP_ACK, 0, htp->noanswer);
+				if (msg == NULL) {
+					syslog(LOG_ERR,
+				    "no response from %s to CONFLICT-QUIT",
+					       htp->name);
+				}
+			}
+			masterup(ntp);
+			pollingtime = 0;
+			break;
+
+		case TSP_RESOLVE:
+			if (!fromnet || fromnet->status != MASTER)
+				break;
+			/*
+			 * do not want to call synch() while waiting
+			 * to be killed!
+			 */
+			(void)gettimeofday(&ntime, (struct timezone *)0);
+			pollingtime = ntime.tv_sec + SAMPLEINTVL;
+			break;
+
+		case TSP_QUIT:
+			doquit(msg);		/* become a slave */
+			break;
+
+		case TSP_LOOP:
+			if (!fromnet || fromnet->status != MASTER
+			    || !strcmp(msg->tsp_name, hostname))
+				break;
+			/*
+			 * We should not have received this from a net
+			 * we are master on.  There must be two masters.
+			 */
+			htp = addmach(msg->tsp_name, &from,fromnet);
+			to.tsp_type = TSP_QUIT;
+			(void)strcpy(to.tsp_name, hostname);
+			answer = acksend(&to, &htp->addr, htp->name,
+					 TSP_ACK, 0, 1);
+			if (!answer) {
+				syslog(LOG_WARNING,
+				"loop breakage: no reply from %s=%s to QUIT",
+				    htp->name, inet_ntoa(htp->addr.sin_addr));
+				(void)remmach(htp);
+			}
+
+		case TSP_TEST:
+			if (trace) {
+				fprintf(fd,
+		"\tnets = %d, masters = %d, slaves = %d, ignored = %d\n",
+		nnets, nmasternets, nslavenets, nignorednets);
+				setstatus();
+			}
+			pollingtime = 0;
+			polls = POLLRATE-1;
+			break;
+
+		default:
+			if (trace) {
+				fprintf(fd, "garbage message: ");
+				print(msg, &from);
+			}
+			break;
+		}
+	}
+	goto loop;
+}
+
+
+/*
+ * change the system date on the master
+ */
+static void
+mchgdate(struct tsp *msg)
+{
+	char tname[MAXHOSTNAMELEN];
+	char olddate[32];
+	struct timeval otime, ntime;
+
+	(void)strcpy(tname, msg->tsp_name);
+
+	xmit(TSP_DATEACK, msg->tsp_seq, &from);
+
+	(void)strcpy(olddate, date());
+
+	/* adjust time for residence on the queue */
+	(void)gettimeofday(&otime, 0);
+	adj_msg_time(msg,&otime);
+
+	timevalsub(&ntime, &msg->tsp_time, &otime);
+	if (ntime.tv_sec < MAXADJ && ntime.tv_sec > -MAXADJ) {
+		/*
+		 * do not change the clock if we can adjust it
+		 */
+		dictate = 3;
+		synch(tvtomsround(ntime));
+	} else {
+#ifdef sgi
+		if (0 > settimeofday(&msg->tsp_time, 0)) {
+			syslog(LOG_ERR, "settimeofday(): %m");
+		}
+		logwtmp(&otime, &msg->tsp_time);
+#else
+		logwtmp("|", "date", "");
+		(void)settimeofday(&msg->tsp_time, 0);
+		logwtmp("}", "date", "");
+#endif /* sgi */
+		spreadtime();
+	}
+
+	syslog(LOG_NOTICE, "date changed by %s from %s",
+	       tname, olddate);
+}
+
+
+/*
+ * synchronize all of the slaves
+ */
+void
+synch(long mydelta)
+{
+	struct hosttbl *htp;
+	int measure_status;
+	struct timeval check, stop, wait;
+#ifdef sgi
+	int pri;
+#endif /* sgi */
+
+	if (slvcount > 0) {
+		if (trace)
+			fprintf(fd, "measurements starting at %s\n", date());
+		(void)gettimeofday(&check, 0);
+#ifdef sgi
+		/* run fast to get good time */
+		pri = schedctl(NDPRI,0,NDPHIMIN);
+		if (pri < 0)
+			syslog(LOG_ERR, "schedctl(): %m");
+#endif /* sgi */
+		for (htp = self.l_fwd; htp != &self; htp = htp->l_fwd) {
+			if (htp->noanswer != 0) {
+				measure_status = measure(500, 100,
+							 htp->name,
+							 &htp->addr,0);
+			} else {
+				measure_status = measure(3000, 100,
+							 htp->name,
+							 &htp->addr,0);
+			}
+			if (measure_status != GOOD) {
+				/* The slave did not respond.  We have
+				 * just wasted lots of time on it.
+				 */
+				htp->delta = HOSTDOWN;
+				if (++htp->noanswer >= LOSTHOST) {
+					if (trace) {
+						fprintf(fd,
+					"purging %s for not answering ICMP\n",
+							htp->name);
+						(void)fflush(fd);
+					}
+					htp = remmach(htp);
+				}
+			} else {
+				htp->delta = measure_delta;
+			}
+			(void)gettimeofday(&stop, 0);
+			timevalsub(&stop, &stop, &check);
+			if (stop.tv_sec >= 1) {
+				if (trace)
+					(void)fflush(fd);
+				/*
+				 * ack messages periodically
+				 */
+				wait.tv_sec = 0;
+				wait.tv_usec = 0;
+				if (0 != readmsg(TSP_TRACEON,ANYADDR,
+						 &wait,0))
+					traceon();
+				(void)gettimeofday(&check, 0);
+			}
+		}
+#ifdef sgi
+		if (pri >= 0)
+			(void)schedctl(NDPRI,0,pri);
+#endif /* sgi */
+		if (trace)
+			fprintf(fd, "measurements finished at %s\n", date());
+	}
+	if (!(status & SLAVE)) {
+		if (!dictate) {
+			mydelta = networkdelta();
+		} else {
+			dictate--;
+		}
+	}
+	if (trace && (mydelta != 0 || (status & SLAVE)))
+		fprintf(fd,"local correction of %ld ms.\n", mydelta);
+	correct(mydelta);
+}
+
+/*
+ * sends the time to each slave after the master
+ * has received the command to set the network time
+ */
+void spreadtime(void)
+{
+	struct hosttbl *htp;
+	struct tsp to;
+	struct tsp *answer;
+
+/* Do not listen to the consensus after forcing the time.  This is because
+ *	the consensus takes a while to reach the time we are dictating.
+ */
+	dictate = 2;
+	for (htp = self.l_fwd; htp != &self; htp = htp->l_fwd) {
+		to.tsp_type = TSP_SETTIME;
+		(void)strcpy(to.tsp_name, hostname);
+		(void)gettimeofday(&to.tsp_time, 0);
+		answer = acksend(&to, &htp->addr, htp->name,
+				 TSP_ACK, 0, htp->noanswer);
+		if (answer == 0) {
+			/* We client does not respond, then we have
+			 * just wasted lots of time on it.
+			 */
+			syslog(LOG_WARNING,
+			       "no reply to SETTIME from %s", htp->name);
+			if (++htp->noanswer >= LOSTHOST) {
+				if (trace) {
+					fprintf(fd,
+					     "purging %s for not answering",
+						htp->name);
+					(void)fflush(fd);
+				}
+				htp = remmach(htp);
+			}
+		}
+	}
+}
+
+
+void
+prthp(clock_t delta)
+{
+	static time_t next_time;
+	time_t this_time;
+	struct tms tm;
+	struct hosttbl *htp;
+	int length, l;
+	int i;
+
+	if (!fd)			/* quit if tracing already off */
+		return;
+
+	this_time = times(&tm);
+	if (this_time + delta < next_time)
+		return;
+	next_time = this_time + CLOCKS_PER_SEC;
+
+	fprintf(fd, "host table: %d entries at %s\n", slvcount, date());
+	htp = self.l_fwd;
+	length = 1;
+	for (i = 1; i <= slvcount; i++, htp = htp->l_fwd) {
+		l = strlen(htp->name) + 1;
+		if (length+l >= 80) {
+			fprintf(fd, "\n");
+			length = 0;
+		}
+		length += l;
+		fprintf(fd, " %s", htp->name);
+	}
+	fprintf(fd, "\n");
+}
+
+
+static struct hosttbl *newhost_hash;
+static struct hosttbl *lasthfree = &hosttbl[0];
+
+
+struct hosttbl *			/* answer or 0 */
+findhost(char *name)
+{
+	int i, j;
+	struct hosttbl *htp;
+	char *p;
+
+	j= 0;
+	for (p = name, i = 0; i < 8 && *p != '\0'; i++, p++)
+		j = (j << 2) ^ *p;
+	newhost_hash = &hosttbl[j % NHOSTS];
+
+	htp = newhost_hash;
+	if (htp->name[0] == '\0')
+		return(0);
+	do {
+		if (!strcmp(name, htp->name))
+			return(htp);
+		htp = htp->h_fwd;
+	} while (htp != newhost_hash);
+	return(0);
+}
+
+/*
+ * add a host to the list of controlled machines if not already there
+ */
+struct hosttbl *
+addmach(char *name, struct sockaddr_in *addr, struct netinfo *ntp)
+{
+	struct hosttbl *ret, *p, *b, *f;
+
+	ret = findhost(name);
+	if (ret == 0) {
+		if (slvcount >= NHOSTS) {
+			if (trace) {
+				fprintf(fd, "no more slots in host table\n");
+				prthp(CLOCKS_PER_SEC);
+			}
+			syslog(LOG_ERR, "no more slots in host table");
+			Mflag = 0;
+			siglongjmp(jmpenv, 2); /* give up and be a slave */
+		}
+
+		/* if our home hash slot is occupied, find a free entry
+		 * in the hash table
+		 */
+		if (newhost_hash->name[0] != '\0') {
+			do {
+				ret = lasthfree;
+				if (++lasthfree > &hosttbl[NHOSTS])
+					lasthfree = &hosttbl[1];
+			} while (ret->name[0] != '\0');
+
+			if (!newhost_hash->head) {
+				/* Move an interloper using our home.  Use
+				 * scratch pointers in case the new head is
+				 * pointing to itself.
+				 */
+				f = newhost_hash->h_fwd;
+				b = newhost_hash->h_bak;
+				f->h_bak = ret;
+				b->h_fwd = ret;
+				f = newhost_hash->l_fwd;
+				b = newhost_hash->l_bak;
+				f->l_bak = ret;
+				b->l_fwd = ret;
+				bcopy(newhost_hash,ret,sizeof(*ret));
+				ret = newhost_hash;
+				ret->head = 1;
+				ret->h_fwd = ret;
+				ret->h_bak = ret;
+			} else {
+				/* link to an existing chain in our home
+				 */
+				ret->head = 0;
+				p = newhost_hash->h_bak;
+				ret->h_fwd = newhost_hash;
+				ret->h_bak = p;
+				p->h_fwd = ret;
+				newhost_hash->h_bak = ret;
+			}
+		} else {
+			ret = newhost_hash;
+			ret->head = 1;
+			ret->h_fwd = ret;
+			ret->h_bak = ret;
+		}
+		ret->addr = *addr;
+		ret->ntp = ntp;
+		(void)strncpy(ret->name, name, sizeof(ret->name));
+		ret->name[sizeof(ret->name)-1] = 0;
+		ret->good = good_host_name(name);
+		ret->l_fwd = &self;
+		ret->l_bak = self.l_bak;
+		self.l_bak->l_fwd = ret;
+		self.l_bak = ret;
+		slvcount++;
+
+		ret->noanswer = 0;
+		ret->need_set = 1;
+
+	} else {
+		ret->noanswer = (ret->noanswer != 0);
+	}
+
+	/* need to clear sequence number anyhow */
+	ret->seq = 0;
+	return(ret);
+}
+
+/*
+ * remove the machine with the given index in the host table.
+ */
+struct hosttbl *
+remmach(struct hosttbl *htp)
+{
+	struct hosttbl *lprv, *hnxt, *f, *b;
+
+	if (trace)
+		fprintf(fd, "remove %s\n", htp->name);
+
+	/* get out of the lists */
+	htp->l_fwd->l_bak = lprv = htp->l_bak;
+	htp->l_bak->l_fwd = htp->l_fwd;
+	htp->h_fwd->h_bak = htp->h_bak;
+	htp->h_bak->h_fwd = hnxt = htp->h_fwd;
+
+	/* If we are in the home slot, pull up the chain */
+	if (htp->head && hnxt != htp) {
+		if (lprv == hnxt)
+			lprv = htp;
+
+		/* Use scratch pointers in case the new head is pointing to
+		 * itself.
+		 */
+		f = hnxt->h_fwd;
+		b = hnxt->h_bak;
+		f->h_bak = htp;
+		b->h_fwd = htp;
+		f = hnxt->l_fwd;
+		b = hnxt->l_bak;
+		f->l_bak = htp;
+		b->l_fwd = htp;
+		hnxt->head = 1;
+		bcopy(hnxt, htp, sizeof(*htp));
+		lasthfree = hnxt;
+	} else {
+		lasthfree = htp;
+	}
+
+	lasthfree->name[0] = '\0';
+	lasthfree->h_fwd = 0;
+	lasthfree->l_fwd = 0;
+	slvcount--;
+
+	return lprv;
+}
+
+
+/*
+ * Remove all the machines from the host table that exist on the given
+ * network.  This is called when a master transitions to a slave on a
+ * given network.
+ */
+void
+rmnetmachs(struct netinfo *ntp)
+{
+	struct hosttbl *htp;
+
+	if (trace)
+		prthp(CLOCKS_PER_SEC);
+	for (htp = self.l_fwd; htp != &self; htp = htp->l_fwd) {
+		if (ntp == htp->ntp)
+			htp = remmach(htp);
+	}
+	if (trace)
+		prthp(CLOCKS_PER_SEC);
+}
+
+
+void
+masterup(struct netinfo *net)
+{
+	xmit(TSP_MASTERUP, 0, &net->dest_addr);
+
+	/*
+	 * Do not tell new slaves our time for a while.  This ensures
+	 * we do not tell them to start using our time, before we have
+	 * found a good master.
+	 */
+	(void)gettimeofday(&net->slvwait, 0);
+}
+
+void
+newslave(struct tsp *msg)
+{
+	struct hosttbl *htp;
+	struct tsp *answer, to;
+	struct timeval now;
+
+	if (!fromnet || fromnet->status != MASTER)
+		return;
+
+	htp = addmach(msg->tsp_name, &from,fromnet);
+	htp->seq = msg->tsp_seq;
+	if (trace)
+		prthp(0);
+
+	/*
+	 * If we are stable, send our time to the slave.
+	 * Do not go crazy if the date has been changed.
+	 */
+	(void)gettimeofday(&now, 0);
+	if (now.tv_sec >= fromnet->slvwait.tv_sec+3
+	    || now.tv_sec < fromnet->slvwait.tv_sec) {
+		to.tsp_type = TSP_SETTIME;
+		(void)strcpy(to.tsp_name, hostname);
+		(void)gettimeofday(&to.tsp_time, 0);
+		answer = acksend(&to, &htp->addr,
+				 htp->name, TSP_ACK,
+				 0, htp->noanswer);
+		if (answer) {
+			htp->need_set = 0;
+		} else {
+			syslog(LOG_WARNING,
+			       "no reply to initial SETTIME from %s",
+			       htp->name);
+			htp->noanswer = LOSTHOST;
+		}
+	}
+}
+
+
+/*
+ * react to a TSP_QUIT:
+ */
+void
+doquit(struct tsp *msg)
+{
+	if (fromnet->status == MASTER) {
+		if (!good_host_name(msg->tsp_name)) {
+			if (fromnet->quit_count <= 0) {
+				syslog(LOG_NOTICE,"untrusted %s told us QUIT",
+				       msg->tsp_name);
+				suppress(&from, msg->tsp_name, fromnet);
+				fromnet->quit_count = 1;
+				return;
+			}
+			syslog(LOG_NOTICE, "untrusted %s told us QUIT twice",
+			       msg->tsp_name);
+			fromnet->quit_count = 2;
+			fromnet->status = NOMASTER;
+		} else {
+			fromnet->status = SLAVE;
+		}
+		rmnetmachs(fromnet);
+		siglongjmp(jmpenv, 2);		/* give up and be a slave */
+
+	} else {
+		if (!good_host_name(msg->tsp_name)) {
+			syslog(LOG_NOTICE, "untrusted %s told us QUIT",
+			       msg->tsp_name);
+			fromnet->quit_count = 2;
+		}
+	}
+}
+
+void
+traceon(void)
+{
+	if (!fd) {
+		fd = fopen(_PATH_TIMEDLOG, "w");
+		if (!fd) {
+			trace = 0;
+			return;
+		}
+		fprintf(fd,"Tracing started at %s\n", date());
+	}
+	trace = 1;
+	get_goodgroup(1);
+	setstatus();
+	prthp(CLOCKS_PER_SEC);
+}
+
+
+void
+traceoff(const char *msg)
+{
+	get_goodgroup(1);
+	setstatus();
+	prthp(CLOCKS_PER_SEC);
+	if (trace) {
+		fprintf(fd, msg, date());
+		(void)fclose(fd);
+		fd = 0;
+	}
+#ifdef GPROF
+	moncontrol(0);
+	_mcleanup();
+	moncontrol(1);
+#endif
+	trace = OFF;
+}
+
+
+#ifdef sgi
+void
+logwtmp(struct timeval *otime, struct timeval *ntime)
+{
+	static struct utmp wtmp[2] = {
+		{"","",OTIME_MSG,0,OLD_TIME,0,0,0},
+		{"","",NTIME_MSG,0,NEW_TIME,0,0,0}
+	};
+	static char *wtmpfile = WTMP_FILE;
+	static struct utmpx wtmpx[2];
+	int f;
+
+	wtmp[0].ut_time = otime->tv_sec + (otime->tv_usec + 500000) / 1000000;
+	wtmp[1].ut_time = ntime->tv_sec + (ntime->tv_usec + 500000) / 1000000;
+	if (wtmp[0].ut_time == wtmp[1].ut_time)
+		return;
+
+	setutent();
+	(void)pututline(&wtmp[0]);
+	(void)pututline(&wtmp[1]);
+	endutent();
+	if ((f = open(wtmpfile, O_WRONLY|O_APPEND)) >= 0) {
+		(void)write(f, (char *)wtmp, sizeof(wtmp));
+		(void)close(f);
+	}
+
+        /*
+         * convert the wtmp entries into utmpx format in wtmpx[0..1]
+         * and append to /var/adm/wtmpx to keep wtmp and wtmpx in sync.
+         */
+	getutmpx(&wtmp[0], &wtmpx[0]);
+	getutmpx(&wtmp[1], &wtmpx[1]);
+	if ((f = open(WTMPX_FILE, O_WRONLY|O_APPEND)) >= 0) {
+		(void)write(f, (char *)wtmpx, sizeof(wtmpx));
+		(void)close(f);
+	} 
+}
+#endif /* sgi */
Index: create-0.17-patch/netkit-timed-0.17-new/timed/timed/readmsg.c
===================================================================
--- create-0.17-patch/netkit-timed-0.17-new/timed/timed/readmsg.c	(nonexistent)
+++ create-0.17-patch/netkit-timed-0.17-new/timed/timed/readmsg.c	(revision 5)
@@ -0,0 +1,484 @@
+/*-
+ * Copyright (c) 1985, 1993 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * From: @(#)readmsg.c	5.1 (Berkeley) 5/11/93
+ */
+char readmsg_rcsid[] =
+  "$Id: readmsg.c,v 1.7 1999/11/25 04:48:41 netbug Exp $";
+
+#ifdef sgi
+#ident "$Revision: 1.7 $"
+#endif
+
+#include "globals.h"
+
+extern char *tsptype[];
+
+/*
+ * LOOKAT checks if the message is of the requested type and comes from
+ * the right machine, returning 1 in case of affirmative answer
+ */
+#define LOOKAT(msg, mtype, mfrom, netp, froms) \
+	(((mtype) == TSP_ANY || (mtype) == (msg).tsp_type) &&		\
+	 ((mfrom) == 0 || !strcmp((mfrom), (msg).tsp_name)) &&		\
+	 ((netp) == 0 || 						\
+	  ((netp)->mask & (froms).sin_addr.s_addr) == (netp)->net.s_addr))
+
+static struct timeval rtime, rwait, rtout;
+struct tsp msgin;
+static struct tsplist {
+	struct tsp info;
+	struct timeval when;
+	struct sockaddr_in addr;
+	struct tsplist *p;
+} msgslist;
+struct sockaddr_in from;
+struct netinfo *fromnet;
+struct timeval from_when;
+
+/*
+ * `readmsg' returns message `type' sent by `machfrom' if it finds it
+ * either in the receive queue, or in a linked list of previously received
+ * messages that it maintains.
+ * Otherwise it waits to see if the appropriate message arrives within
+ * `intvl' seconds. If not, it returns NULL.
+ */
+
+struct tsp *
+readmsg(int type, char *machfrom, struct timeval *intvl,
+	struct netinfo *netfrom)
+{
+	int length;
+	socklen_t fromlen;
+	fd_set ready;
+	static struct tsplist *head = &msgslist;
+	static struct tsplist *tail = &msgslist;
+	static int msgcnt = 0;
+	struct tsplist *prev;
+	register struct netinfo *ntp;
+	register struct tsplist *ptr;
+
+	if (trace) {
+		fprintf(fd, "readmsg: looking for %s from %s, %s\n",
+			tsptype[type], machfrom == NULL ? "ANY" : machfrom,
+			netfrom == NULL ? "ANYNET" : inet_ntoa(netfrom->net));
+		if (head->p != 0) {
+			length = 1;
+			for (ptr = head->p; ptr != 0; ptr = ptr->p) {
+				/* do not repeat the hundreds of messages */
+				if (++length > 3) {
+					if (ptr == tail) {
+						fprintf(fd,"\t ...%d skipped\n",
+							length);
+					} else {
+						continue;
+					}
+				}
+				fprintf(fd, length > 1 ? "\t" : "queue:\t");
+				print(&ptr->info, &ptr->addr);
+			}
+		}
+	}
+
+	ptr = head->p;
+	prev = head;
+
+	/*
+	 * Look for the requested message scanning through the
+	 * linked list. If found, return it and free the space
+	 */
+
+	while (ptr != NULL) {
+		if (LOOKAT(ptr->info, type, machfrom, netfrom, ptr->addr)) {
+again:
+			msgin = ptr->info;
+			from = ptr->addr;
+			from_when = ptr->when;
+			prev->p = ptr->p;
+			if (ptr == tail)
+				tail = prev;
+			free((char *)ptr);
+			fromnet = NULL;
+			if (netfrom == NULL)
+			    for (ntp = nettab; ntp != NULL; ntp = ntp->next) {
+				    if ((ntp->mask & from.sin_addr.s_addr) ==
+					ntp->net.s_addr) {
+					    fromnet = ntp;
+					    break;
+				    }
+			    }
+			else
+			    fromnet = netfrom;
+			if (trace) {
+				fprintf(fd, "readmsg: found ");
+				print(&msgin, &from);
+			}
+
+/* The protocol can get far behind.  When it does, it gets
+ *	hopelessly confused.  So delete duplicate messages.
+ */
+			for (ptr = prev; (ptr = ptr->p) != NULL; prev = ptr) {
+				if (ptr->addr.sin_addr.s_addr
+					== from.sin_addr.s_addr
+				    && ptr->info.tsp_type == msgin.tsp_type) {
+					if (trace)
+						fprintf(fd, "\tdup ");
+					goto again;
+				}
+			}
+			msgcnt--;
+			return(&msgin);
+		} else {
+			prev = ptr;
+			ptr = ptr->p;
+		}
+	}
+
+	/*
+	 * If the message was not in the linked list, it may still be
+	 * coming from the network. Set the timer and wait
+	 * on a select to read the next incoming message: if it is the
+	 * right one, return it, otherwise insert it in the linked list.
+	 */
+
+	(void)gettimeofday(&rtout, 0);
+	timevaladd(&rtout, intvl);
+	FD_ZERO(&ready);
+	for (;;) {
+		(void)gettimeofday(&rtime, 0);
+		timevalsub(&rwait, &rtout, &rtime);
+		if (rwait.tv_sec < 0)
+			rwait.tv_sec = rwait.tv_usec = 0;
+		else if (rwait.tv_sec == 0
+			 && rwait.tv_usec < 1000000/CLOCKS_PER_SEC)
+			rwait.tv_usec = 1000000/CLOCKS_PER_SEC;
+
+		if (trace) {
+			fprintf(fd, "readmsg: wait %d.%6d at %s\n",
+				(int)rwait.tv_sec, (int)rwait.tv_usec, date());
+			/* Notice a full disk, as we flush trace info.
+			 * It is better to flush periodically than at
+			 * every line because the tracing consists of bursts
+			 * of many lines.  Without care, tracing slows
+			 * down the code enough to break the protocol.
+			 */
+			if (rwait.tv_sec != 0
+			    && EOF == fflush(fd))
+				traceoff("Tracing ended for cause at %s\n");
+		}
+
+		FD_SET(sock, &ready);
+		if (!select(sock+1, &ready, (fd_set *)0, (fd_set *)0,
+			   &rwait)) {
+			if (rwait.tv_sec == 0 && rwait.tv_usec == 0)
+				return(0);
+			continue;
+		}
+		fromlen = sizeof(from);
+		if (recvfrom(sock, (char *)&msgin, sizeof(struct tsp), 0,
+			     (struct sockaddr*)&from, &fromlen) < 0) {
+			syslog(LOG_ERR, "recvfrom: %m");
+			exit(1);
+		}
+		(void)gettimeofday(&from_when, (struct timezone *)0);
+		bytehostorder(&msgin);
+
+		if (msgin.tsp_vers > TSPVERSION) {
+			if (trace) {
+			    fprintf(fd,"readmsg: version mismatch\n");
+			    /* should do a dump of the packet */
+			}
+			continue;
+		}
+
+		fromnet = NULL;
+		for (ntp = nettab; ntp != NULL; ntp = ntp->next)
+			if ((ntp->mask & from.sin_addr.s_addr) ==
+			    ntp->net.s_addr) {
+				fromnet = ntp;
+				break;
+			}
+
+		/*
+		 * drop packets from nets we are ignoring permanently
+		 */
+		if (fromnet == NULL) {
+			/*
+			 * The following messages may originate on
+			 * this host with an ignored network address
+			 */
+			if (msgin.tsp_type != TSP_TRACEON &&
+			    msgin.tsp_type != TSP_SETDATE &&
+			    msgin.tsp_type != TSP_MSITE &&
+			    msgin.tsp_type != TSP_TEST &&
+			    msgin.tsp_type != TSP_TRACEOFF) {
+				if (trace) {
+				    fprintf(fd,"readmsg: discard null net ");
+				    print(&msgin, &from);
+				}
+				continue;
+			}
+		}
+
+		/*
+		 * Throw away messages coming from this machine,
+		 * unless they are of some particular type.
+		 * This gets rid of broadcast messages and reduces
+		 * master processing time.
+		 */
+		if (!strcmp(msgin.tsp_name, hostname)
+		    && msgin.tsp_type != TSP_SETDATE
+		    && msgin.tsp_type != TSP_TEST
+		    && msgin.tsp_type != TSP_MSITE
+		    && msgin.tsp_type != TSP_TRACEON
+		    && msgin.tsp_type != TSP_TRACEOFF
+		    && msgin.tsp_type != TSP_LOOP) {
+			if (trace) {
+				fprintf(fd, "readmsg: discard own ");
+				print(&msgin, &from);
+			}
+			continue;
+		}
+
+		/*
+		 * Send acknowledgements here; this is faster and
+		 * avoids deadlocks that would occur if acks were
+		 * sent from a higher level routine.  Different
+		 * acknowledgements are necessary, depending on
+		 * status.
+		 */
+		if (fromnet == NULL)	/* do not de-reference 0 */
+			ignoreack();
+		else if (fromnet->status == MASTER)
+			masterack();
+		else if (fromnet->status == SLAVE)
+			slaveack();
+		else
+			ignoreack();
+
+		if (LOOKAT(msgin, type, machfrom, netfrom, from)) {
+			if (trace) {
+				fprintf(fd, "readmsg: ");
+				print(&msgin, &from);
+			}
+			return(&msgin);
+		} else if (++msgcnt > NHOSTS*3) {
+
+/* The protocol gets hopelessly confused if it gets too far
+*	behind.  However, it seems able to recover from all cases of lost
+*	packets.  Therefore, if we are swamped, throw everything away.
+*/
+			if (trace)
+				fprintf(fd,
+					"readmsg: discarding %d msgs\n",
+					msgcnt);
+			msgcnt = 0;
+			while ((ptr=head->p) != NULL) {
+				head->p = ptr->p;
+				free((char *)ptr);
+			}
+			tail = head;
+		} else {
+			tail->p = (struct tsplist *)
+				    malloc(sizeof(struct tsplist));
+			tail = tail->p;
+			tail->p = NULL;
+			tail->info = msgin;
+			tail->addr = from;
+			/* timestamp msgs so SETTIMEs are correct */
+			tail->when = from_when;
+		}
+	}
+}
+
+/*
+ * Send the necessary acknowledgements:
+ * only the type ACK is to be sent by a slave
+ */
+void slaveack(void)
+{
+	switch(msgin.tsp_type) {
+
+	case TSP_ADJTIME:
+	case TSP_SETTIME:
+	case TSP_ACCEPT:
+	case TSP_REFUSE:
+	case TSP_TRACEON:
+	case TSP_TRACEOFF:
+	case TSP_QUIT:
+		if (trace) {
+			fprintf(fd, "Slaveack: ");
+			print(&msgin, &from);
+		}
+		xmit(TSP_ACK,msgin.tsp_seq, &from);
+		break;
+
+	default:
+		if (trace) {
+			fprintf(fd, "Slaveack: no ack: ");
+			print(&msgin, &from);
+		}
+		break;
+	}
+}
+
+/*
+ * Certain packets may arrive from this machine on ignored networks.
+ * These packets should be acknowledged.
+ */
+void ignoreack(void)
+{
+	switch(msgin.tsp_type) {
+
+	case TSP_TRACEON:
+	case TSP_TRACEOFF:
+	case TSP_QUIT:
+		if (trace) {
+			fprintf(fd, "Ignoreack: ");
+			print(&msgin, &from);
+		}
+		xmit(TSP_ACK,msgin.tsp_seq, &from);
+		break;
+
+	default:
+		if (trace) {
+			fprintf(fd, "Ignoreack: no ack: ");
+			print(&msgin, &from);
+		}
+		break;
+	}
+}
+
+/*
+ * `masterack' sends the necessary acknowledgments
+ * to the messages received by a master
+ */
+void masterack(void)
+{
+	struct tsp resp;
+
+	resp = msgin;
+	resp.tsp_vers = TSPVERSION;
+	(void)strcpy(resp.tsp_name, hostname);
+
+	switch(msgin.tsp_type) {
+
+	case TSP_QUIT:
+	case TSP_TRACEON:
+	case TSP_TRACEOFF:
+	case TSP_MSITEREQ:
+		if (trace) {
+			fprintf(fd, "Masterack: ");
+			print(&msgin, &from);
+		}
+		xmit(TSP_ACK,msgin.tsp_seq, &from);
+		break;
+
+	case TSP_RESOLVE:
+	case TSP_MASTERREQ:
+		if (trace) {
+			fprintf(fd, "Masterack: ");
+			print(&msgin, &from);
+		}
+		xmit(TSP_MASTERACK,msgin.tsp_seq, &from);
+		break;
+
+	default:
+		if (trace) {
+			fprintf(fd,"Masterack: no ack: ");
+			print(&msgin, &from);
+		}
+		break;
+	}
+}
+
+/*
+ * Print a TSP message
+ */
+void print(struct tsp *msg, struct sockaddr_in *addr)
+{
+	char tm[26];
+	time_t msgtime;
+	switch (msg->tsp_type) {
+
+	case TSP_LOOP:
+		fprintf(fd, "%s %d %-6u #%d %-15s %s\n",
+			tsptype[msg->tsp_type],
+			msg->tsp_vers,
+			msg->tsp_seq,
+			msg->tsp_hopcnt,
+			inet_ntoa(addr->sin_addr),
+			msg->tsp_name);
+		break;
+
+	case TSP_SETTIME:
+	case TSP_SETDATE:
+	case TSP_SETDATEREQ:
+#ifdef sgi
+		(void)cftime(tm, "%D %T", &msg->tsp_time.tv_sec);
+#else
+		msgtime = msg->tsp_time.tv_sec;
+		strncpy(tm, ctime(&msgtime)+3+1, sizeof(tm));
+		tm[15] = '\0';		/* ugh */
+#endif /* sgi */
+		fprintf(fd, "%s %d %-6u %s %-15s %s\n",
+			tsptype[msg->tsp_type],
+			msg->tsp_vers,
+			msg->tsp_seq,
+			tm,
+			inet_ntoa(addr->sin_addr),
+			msg->tsp_name);
+		break;
+
+	case TSP_ADJTIME:
+		fprintf(fd, "%s %d %-6u (%lld,%lld) %-15s %s   \n",
+			tsptype[msg->tsp_type],
+			msg->tsp_vers,
+			msg->tsp_seq,
+			(long long)msg->tsp_time.tv_sec,
+			(long long)msg->tsp_time.tv_usec,
+			inet_ntoa(addr->sin_addr),
+			msg->tsp_name);
+		break;
+
+	default:
+		fprintf(fd, "%s %d %-6u %-15s %s\n",
+			tsptype[msg->tsp_type],
+			msg->tsp_vers,
+			msg->tsp_seq,
+			inet_ntoa(addr->sin_addr),
+			msg->tsp_name);
+		break;
+	}
+}
Index: create-0.17-patch/netkit-timed-0.17-new/timed/timed/timed.c
===================================================================
--- create-0.17-patch/netkit-timed-0.17-new/timed/timed/timed.c	(nonexistent)
+++ create-0.17-patch/netkit-timed-0.17-new/timed/timed/timed.c	(revision 5)
@@ -0,0 +1,986 @@
+/*-
+ * Copyright (c) 1985, 1993 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+char copyright[] =
+ "@(#) Copyright (c) 1985, 1993 The Regents of the University of California.\n"
+ "All rights reserved.\n";
+
+/*
+ * From: @(#)timed.c	5.1 (Berkeley) 5/11/93
+ */
+char timed_rcsid[] = 
+  "$Id: timed.c,v 1.11 1999/12/12 18:05:07 dholland Exp $";
+
+#ifdef sgi
+#ident "$Revision: 1.11 $"
+#endif /* sgi */
+
+#define TSPTYPES
+#include "globals.h"
+#include <net/if.h>
+
+#if 0
+	#include <sys/file.h>
+	#include <sys/types.h>
+#endif
+
+#include <sys/ioctl.h>
+#include <setjmp.h>
+#include <math.h>
+#include <sys/times.h>
+#include <time.h>
+#ifdef sgi
+#include <unistd.h>
+#include <sys/syssgi.h>
+#include <sys/schedctl.h>
+#endif /* sgi */
+
+#include "../../version.h"
+
+#ifdef __linux__
+/* from libbsd.a */
+int daemon(int, int);
+#endif
+
+
+int trace = 0;
+int sock, sock_raw = -1;
+int status = 0;
+u_short sequence;			/* sequence number */
+long delay1;
+long delay2;
+
+int nslavenets;				/* nets were I could be a slave */
+int nmasternets;			/* nets were I could be a master */
+int nignorednets;			/* ignored nets */
+int nnets;				/* nets I am connected to */
+
+FILE *fd;				/* trace file FD */
+
+sigjmp_buf jmpenv;
+
+struct netinfo *nettab = 0;
+struct netinfo *slavenet;
+int Mflag;
+int justquit = 0;
+int debug;
+
+static struct nets {
+	char	*name;
+	unsigned long net;
+	struct nets *next;
+} *nets = 0;
+
+struct hosttbl hosttbl[NHOSTS+1];	/* known hosts */
+
+static struct goodhost {		/* hosts that we trust */
+	char	name[MAXHOSTNAMELEN+1];
+	struct goodhost *next;
+	char	perm;
+} *goodhosts;
+
+static char *goodgroup;			/* net group of trusted hosts */
+static void checkignorednets(void);
+static void pickslavenet(struct netinfo *);
+static void add_good_host(char*,char);
+
+#ifdef sgi
+char *timetrim_fn;
+char *timetrim_wpat = "long timetrim = %ld;\ndouble tot_adj = %.0f;\ndouble tot_ticks = %.0f;\n/* timed version 2 */\n";
+char *timetrim_rpat = "long timetrim = %ld;\ndouble tot_adj = %lf;\ndouble tot_ticks = %lf;";
+long timetrim;
+double tot_adj, hr_adj;			/* totals in nsec */
+double tot_ticks, hr_ticks;
+
+int bufspace = 60*1024;
+#endif
+
+
+/*
+ * The timedaemons synchronize the clocks of hosts in a local area network.
+ * One daemon runs as master, all the others as slaves. The master
+ * performs the task of computing clock differences and sends correction
+ * values to the slaves.
+ * Slaves start an election to choose a new master when the latter disappears
+ * because of a machine crash, network partition, or when killed.
+ * A resolution protocol is used to kill all but one of the masters
+ * that happen to exist in segments of a partitioned network when the
+ * network partition is fixed.
+ *
+ * Authors: Riccardo Gusella & Stefano Zatti
+ *
+ * overhauled at Silicon Graphics
+ */
+int
+main(int argc, char **argv)
+{
+	int on;
+	int ret;
+	int nflag, iflag;
+	struct timeval ntime;
+	struct servent *srvp;
+	char buf[BUFSIZ], *cp, *cplim;
+	struct ifconf ifc;
+	struct ifreq ifreq, ifreqf, *ifr;
+	register struct netinfo *ntp;
+	struct netinfo *ntip;
+	struct netinfo *savefromnet;
+	struct netent *nentp;
+	struct nets *nt;
+	struct sockaddr_in server;
+	u_short port;
+	int c;
+#ifdef sgi
+	FILE *timetrim_st;
+#endif
+
+#define	IN_MSG "timed: -i and -n make no sense together\n"
+#ifdef sgi
+	struct tms tms;
+#define USAGE "timed: [-dtM] [-i net|-n net] [-F host1 host2 ...] [-G netgp] [-P trimfile]\n"
+#else
+#ifdef HAVENIS
+#define USAGE "timed: [-dtM] [-i net|-n net] [-F host1 host2 ...] [-G netgp]\n"
+#else
+#define USAGE "timed: [-dtM] [-i net|-n net] [-F host1 host2 ...]\n"
+#endif /* HAVENIS */
+#endif /* sgi */
+
+	ntip = NULL;
+
+	on = 1;
+	nflag = OFF;
+	iflag = OFF;
+
+#ifdef sgi
+	if (0 > syssgi(SGI_GETTIMETRIM, &timetrim)) {
+		perror("timed: syssgi(GETTIMETRIM)");
+		timetrim = 0;
+	}
+	tot_ticks = hr_ticks = times(&tms);
+#endif /* sgi */
+
+	opterr = 0;
+	while ((c = getopt(argc, argv, "Mtdn:i:F:G:P:")) != EOF) {
+		switch (c) {
+		case 'M':
+			Mflag = 1;
+			break;
+
+		case 't':
+			trace = 1;
+			break;
+
+		case 'n':
+			if (iflag) {
+				fprintf(stderr, IN_MSG);
+				exit(1);
+			} else {
+				nflag = ON;
+				addnetname(optarg);
+			}
+			break;
+
+		case 'i':
+			if (nflag) {
+				fprintf(stderr, IN_MSG);
+				exit(1);
+			} else {
+				iflag = ON;
+				addnetname(optarg);
+			}
+			break;
+
+		case 'F':
+			add_good_host(optarg,1);
+			while (optind < argc && argv[optind][0] != '-')
+				add_good_host(argv[optind++], 1);
+			break;
+
+		case 'd':
+			debug = 1;
+			break;
+		case 'G':
+			if (goodgroup != 0) {
+				fprintf(stderr,"timed: only one net group\n");
+				exit(1);
+			}
+			goodgroup = optarg;
+			break;
+#ifdef sgi
+		case 'P':
+			timetrim_fn = optarg;
+			break;
+#endif /* sgi */
+
+		default:
+			fprintf(stderr, USAGE);
+			exit(1);
+			break;
+		}
+	}
+	if (optind < argc) {
+		fprintf(stderr, USAGE);
+		exit(1);
+	}
+
+#ifdef sgi
+	if (timetrim_fn == 0) {
+		;
+	} else if (0 == (timetrim_st = fopen(timetrim_fn, "r+"))) {
+		if (errno != ENOENT) {
+			(void)fprintf(stderr,"timed: ");
+			perror(timetrim_fn);
+			timetrim_fn = 0;
+		}
+	} else {
+		int i;
+		long trim;
+		double adj, ticks;
+
+		i = fscanf(timetrim_st, timetrim_rpat,
+			   &trim, &adj, &ticks);
+		if (i < 1
+		    || trim > MAX_TRIM
+		    || trim < -MAX_TRIM
+		    || i == 2
+		    || (i == 3
+			&& trim != rint(adj*CLOCKS_PER_SEC/ticks))) {
+			if (trace && i != EOF)
+				(void)fprintf(stderr,
+		    "timed: unrecognized contents in %s\n",
+					      timetrim_fn);
+		} else {
+			if (0 > syssgi(SGI_SETTIMETRIM,
+				       trim)) {
+			 perror("timed: syssgi(SETTIMETRIM)");
+			} else {
+				timetrim = trim;
+			}
+			if (i == 3)
+				tot_ticks -= ticks;
+		}
+		(void)fclose(timetrim_st);
+	}
+#endif /* sgi */
+
+	/* If we care about which machine is the master, then we must
+	 *	be willing to be a master
+	 */
+	if (0 != goodgroup || 0 != goodhosts)
+		Mflag = 1;
+
+	if (gethostname(hostname, sizeof(hostname) - 1) < 0) {
+		perror("gethostname");
+		exit(1);
+	}
+	self.l_bak = &self;
+	self.l_fwd = &self;
+	self.h_bak = &self;
+	self.h_fwd = &self;
+	self.head = 1;
+	self.good = 1;
+
+	if (goodhosts != 0)		/* trust ourself */
+		add_good_host(hostname,1);
+
+	srvp = getservbyname("timed", "udp");
+	if (srvp == 0) {
+		fprintf(stderr, "unknown service 'timed/udp'\n");
+		exit(1);
+	}
+	port = srvp->s_port;
+	memset(&server, 0, sizeof(server));
+	server.sin_port = srvp->s_port;
+	server.sin_family = AF_INET;
+	server.sin_addr.s_addr = INADDR_ANY;
+	sock = socket(AF_INET, SOCK_DGRAM, 0);
+	if (sock < 0) {
+		perror("socket");
+		exit(1);
+	}
+	if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&on,
+							sizeof(on)) < 0) {
+		perror("setsockopt");
+		exit(1);
+	}
+	if (bind(sock, (struct sockaddr*)&server, sizeof(server))) {
+		if (errno == EADDRINUSE)
+			fprintf(stderr,"timed: time daemon already running\n");
+		else
+			perror("bind");
+		exit(1);
+	}
+#ifdef sgi
+	/*
+	 * handle many slaves with our buffer
+	 */
+	if (0 > setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char*)&bufspace,
+			 sizeof(bufspace))) {
+		perror("setsockopt");
+		exit(1);
+	}
+#endif /* sgi */
+
+	/* choose a unique seed for random number generation */
+	(void)gettimeofday(&ntime, 0);
+	srandom(ntime.tv_sec + ntime.tv_usec);
+
+	sequence = random();     /* initial seq number */
+
+#ifndef sgi
+	/* rounds kernel variable time to multiple of 5 ms. */
+	ntime.tv_sec = 0;
+	ntime.tv_usec = -((ntime.tv_usec/1000) % 5) * 1000;
+	(void)adjtime(&ntime, (struct timeval *)0);
+#endif /* sgi */
+
+	for (nt = nets; nt; nt = nt->next) {
+		nentp = getnetbyname(nt->name);
+		if (nentp == 0) {
+			nt->net = inet_network(nt->name);
+			if (nt->net != INADDR_NONE)
+				nentp = getnetbyaddr(nt->net, AF_INET);
+		}
+		if (nentp != 0) {
+			nt->net = nentp->n_net;
+		} else if (nt->net == INADDR_NONE) {
+			fprintf(stderr, "timed: unknown net %s\n", nt->name);
+			exit(1);
+		} else if (nt->net == INADDR_ANY) {
+			fprintf(stderr, "timed: bad net %s\n", nt->name);
+			exit(1);
+		} else {
+			fprintf(stderr,
+				"timed: warning: %s unknown in /etc/networks\n",
+				nt->name);
+		}
+
+		/* WTF? */
+		/*
+		if (0 == (nt->net & 0xff000000))
+		    nt->net <<= 8;
+		if (0 == (nt->net & 0xff000000))
+		    nt->net <<= 8;
+		if (0 == (nt->net & 0xff000000))
+		    nt->net <<= 8;
+		*/
+		nt->net = htonl(nt->net);
+
+	}
+	ifc.ifc_len = sizeof(buf);
+	ifc.ifc_buf = buf;
+	if (ioctl(sock, SIOCGIFCONF, (char *)&ifc) < 0) {
+		perror("timed: get interface configuration");
+		exit(1);
+	}
+	ntp = NULL;
+#ifdef sgi
+#define size(p)	(sizeof(*ifr) - sizeof(ifr->ifr_name))  /* XXX hack. kludge */
+#else
+#define size(p)	max((p).sa_len, sizeof(p))
+#endif
+	cplim = buf + ifc.ifc_len; /*skip over if's with big ifr_addr's */
+
+/*	for (cp = buf; cp < cplim;
+		cp += sizeof (ifr->ifr_name) + sizeof(ifr->ifr_addr)) { */
+
+	for (cp = buf; cp < cplim; cp += sizeof(struct ifreq)) {
+		ifr = (struct ifreq *)cp;
+		if (ifr->ifr_addr.sa_family != AF_INET)
+			continue;
+		if (!ntp)
+			ntp = (struct netinfo*)malloc(sizeof(struct netinfo));
+		bzero(ntp,sizeof(*ntp));
+		ntp->my_addr=((struct sockaddr_in *)&ifr->ifr_addr)->sin_addr;
+		ntp->status = NOMASTER;
+		ifreq = *ifr;
+		ifreqf = *ifr;
+
+		if (ioctl(sock, SIOCGIFFLAGS, (char *)&ifreqf) < 0) {
+			perror("get interface flags");
+			continue;
+		}
+		if ((ifreqf.ifr_flags & IFF_UP) == 0)
+			continue;
+		if ((ifreqf.ifr_flags & IFF_BROADCAST) == 0 &&
+		    (ifreqf.ifr_flags & IFF_POINTOPOINT) == 0) {
+			continue;
+		}
+
+
+		if (ioctl(sock, SIOCGIFNETMASK, (char *)&ifreq) < 0) {
+			perror("get netmask");
+			continue;
+		}
+		ntp->mask = ((struct sockaddr_in *)
+			&ifreq.ifr_addr)->sin_addr.s_addr;
+
+		if (ifreqf.ifr_flags & IFF_BROADCAST) {
+			if (ioctl(sock, SIOCGIFBRDADDR, (char *)&ifreq) < 0) {
+				perror("get broadaddr");
+				continue;
+			}
+			ntp->dest_addr = *(struct sockaddr_in *)&ifreq.ifr_broadaddr;
+			/* What if the broadcast address is all ones?
+			 * So we cannot just mask ntp->dest_addr.  */
+			ntp->net = ntp->my_addr;
+			ntp->net.s_addr &= ntp->mask;
+		} else {
+			if (ioctl(sock, SIOCGIFDSTADDR,
+						(char *)&ifreq) < 0) {
+				perror("get destaddr");
+				continue;
+			}
+			ntp->dest_addr = *(struct sockaddr_in *)&ifreq.ifr_dstaddr;
+			ntp->net = ntp->dest_addr.sin_addr;
+		}
+
+		ntp->dest_addr.sin_port = port;
+
+		for (nt = nets; nt; nt = nt->next) {
+			if (ntp->net.s_addr == nt->net)
+				break;
+		}
+		if ((nflag && !nt) || (iflag && nt))
+			continue;
+
+		ntp->next = NULL;
+		if (nettab == NULL) {
+			nettab = ntp;
+		} else {
+			ntip->next = ntp;
+		}
+		ntip = ntp;
+		ntp = NULL;
+	}
+	if (ntp)
+		(void) free((char *)ntp);
+	if (nettab == NULL) {
+		fprintf(stderr, "timed: no network usable\n");
+		exit(1);
+	}
+
+
+#ifdef sgi
+	(void)schedctl(RENICE,0,10);	   /* run fast to get good time */
+
+	/* ticks to delay before responding to a broadcast */
+	delay1 = casual(0, CLK_TCK/10);
+#else
+
+	/* microseconds to delay before responding to a broadcast */
+	delay1 = casual(1, 100*1000);
+#endif /* sgi */
+
+	/* election timer delay in secs. */
+	delay2 = casual(MINTOUT, MAXTOUT);
+
+
+#ifdef sgi
+	(void)_daemonize(debug ? _DF_NOFORK|_DF_NOCHDIR : 0, sock, -1, -1);
+#else
+	if (!debug)
+		daemon(debug, 0);
+#endif /* sgi */
+
+	if (trace)
+		traceon();
+	openlog("timed", LOG_CONS|LOG_PID, LOG_DAEMON);
+
+	/*
+	 * keep returning here
+	 */
+	ret = sigsetjmp(jmpenv, 1);
+	savefromnet = fromnet;
+	setstatus();
+
+	if (Mflag) {
+		switch (ret) {
+
+		case 0:
+			checkignorednets();
+			pickslavenet(0);
+			break;
+		case 1:
+			/* Just lost our master */
+			if (slavenet != 0)
+				slavenet->status = election(slavenet);
+			if (!slavenet || slavenet->status == MASTER) {
+				checkignorednets();
+				pickslavenet(0);
+			} else {
+				makeslave(slavenet);	/* prune extras */
+			}
+			break;
+
+		case 2:
+			/* Just been told to quit */
+			justquit = 1;
+			pickslavenet(savefromnet);
+			break;
+		}
+
+		setstatus();
+		if (!(status & MASTER) && sock_raw != -1) {
+			/* sock_raw is not being used now */
+			(void)close(sock_raw);
+			sock_raw = -1;
+		}
+
+		if (status == MASTER)
+			master();
+		else
+			slave();
+
+	} else {
+		if (sock_raw != -1) {
+			(void)close(sock_raw);
+			sock_raw = -1;
+		}
+
+		if (ret) {
+			/* we just lost our master or were told to quit */
+			justquit = 1;
+		}
+		for (ntp = nettab; ntp != NULL; ntp = ntp->next) {
+			if (ntp->status == MASTER) {
+				rmnetmachs(ntp);
+			}
+			ntp->status = NOMASTER;
+		}
+		checkignorednets();
+		pickslavenet(0);
+		setstatus();
+
+		slave();
+	}
+	/* NOTREACHED */
+	return 0;
+}
+
+
+/* suppress an upstart, untrustworthy, self-appointed master
+ */
+void
+suppress(struct sockaddr_in *addr,
+         char *name,
+	 struct netinfo *net)
+{
+	struct sockaddr_in tgt;
+	char tname[MAXHOSTNAMELEN];
+	struct tsp msg;
+	static struct timeval wait;
+
+	if (trace)
+		fprintf(fd, "suppress: %s\n", name);
+	tgt = *addr;
+	(void)strcpy(tname, name);
+
+	while (0 != readmsg(TSP_ANY, ANYADDR, &wait, net)) {
+		if (trace)
+			fprintf(fd, "suppress:\tdiscarded packet from %s\n",
+				    name);
+	}
+
+	syslog(LOG_NOTICE, "suppressing false master %s", tname);
+	msg.tsp_type = TSP_QUIT;
+	(void)strcpy(msg.tsp_name, hostname);
+	(void)acksend(&msg, &tgt, tname, TSP_ACK, 0, 1);
+}
+
+void
+lookformaster(struct netinfo *ntp)
+{
+	struct tsp resp, conflict, *answer;
+	struct timeval ntime;
+	char mastername[MAXHOSTNAMELEN];
+	struct sockaddr_in masteraddr;
+
+	get_goodgroup(0);
+	ntp->status = SLAVE;
+
+	/* look for master */
+	resp.tsp_type = TSP_MASTERREQ;
+	(void)strcpy(resp.tsp_name, hostname);
+	answer = acksend(&resp, &ntp->dest_addr, ANYADDR,
+			 TSP_MASTERACK, ntp, 0);
+	if (answer != 0 && !good_host_name(answer->tsp_name)) {
+		suppress(&from, answer->tsp_name, ntp);
+		ntp->status = NOMASTER;
+		answer = 0;
+	}
+	if (answer == 0) {
+		/*
+		 * Various conditions can cause conflict: races between
+		 * two just started timedaemons when no master is
+		 * present, or timedaemons started during an election.
+		 * A conservative approach is taken.  Give up and became a
+		 * slave, postponing election of a master until first
+		 * timer expires.
+		 */
+		ntime.tv_sec = ntime.tv_usec = 0;
+		answer = readmsg(TSP_MASTERREQ, ANYADDR, &ntime, ntp);
+		if (answer != 0) {
+			if (!good_host_name(answer->tsp_name)) {
+				suppress(&from, answer->tsp_name, ntp);
+				ntp->status = NOMASTER;
+			}
+			return;
+		}
+
+		ntime.tv_sec = ntime.tv_usec = 0;
+		answer = readmsg(TSP_MASTERUP, ANYADDR, &ntime, ntp);
+		if (answer != 0) {
+			if (!good_host_name(answer->tsp_name)) {
+				suppress(&from, answer->tsp_name, ntp);
+				ntp->status = NOMASTER;
+			}
+			return;
+		}
+
+		ntime.tv_sec = ntime.tv_usec = 0;
+		answer = readmsg(TSP_ELECTION, ANYADDR, &ntime, ntp);
+		if (answer != 0) {
+			if (!good_host_name(answer->tsp_name)) {
+				suppress(&from, answer->tsp_name, ntp);
+				ntp->status = NOMASTER;
+			}
+			return;
+		}
+
+		if (Mflag)
+			ntp->status = MASTER;
+		else
+			ntp->status = NOMASTER;
+		return;
+	}
+
+	ntp->status = SLAVE;
+	(void)strcpy(mastername, answer->tsp_name);
+	masteraddr = from;
+
+	/*
+	 * If network has been partitioned, there might be other
+	 * masters; tell the one we have just acknowledged that
+	 * it has to gain control over the others.
+	 */
+	ntime.tv_sec = 0;
+	ntime.tv_usec = 300000;
+	answer = readmsg(TSP_MASTERACK, ANYADDR, &ntime, ntp);
+	/*
+	 * checking also not to send CONFLICT to ack'ed master
+	 * due to duplicated MASTERACKs
+	 */
+	if (answer != NULL &&
+	    strcmp(answer->tsp_name, mastername) != 0) {
+		conflict.tsp_type = TSP_CONFLICT;
+		(void)strcpy(conflict.tsp_name, hostname);
+		if (!acksend(&conflict, &masteraddr, mastername,
+			     TSP_ACK, 0, 0)) {
+			syslog(LOG_ERR,
+			       "error on sending TSP_CONFLICT");
+		}
+	}
+}
+
+/*
+ * based on the current network configuration, set the status, and count
+ * networks;
+ */
+void setstatus(void)
+{
+	struct netinfo *ntp;
+
+	status = 0;
+	nmasternets = nslavenets = nnets = nignorednets = 0;
+	if (trace)
+		fprintf(fd, "Net status:\n");
+	for (ntp = nettab; ntp != NULL; ntp = ntp->next) {
+		switch ((int)ntp->status) {
+		case MASTER:
+			nmasternets++;
+			break;
+		case SLAVE:
+			nslavenets++;
+			break;
+		case NOMASTER:
+		case IGNORE:
+			nignorednets++;
+			break;
+		}
+		if (trace) {
+			fprintf(fd, "\t%-16s", inet_ntoa(ntp->net));
+			switch ((int)ntp->status) {
+			case NOMASTER:
+				fprintf(fd, "NOMASTER\n");
+				break;
+			case MASTER:
+				fprintf(fd, "MASTER\n");
+				break;
+			case SLAVE:
+				fprintf(fd, "SLAVE\n");
+				break;
+			case IGNORE:
+				fprintf(fd, "IGNORE\n");
+				break;
+			default:
+				fprintf(fd, "invalid state %d\n",
+					(int)ntp->status);
+				break;
+			}
+		}
+		nnets++;
+		status |= ntp->status;
+	}
+	status &= ~IGNORE;
+	if (trace)
+		fprintf(fd,
+			"\tnets=%d masters=%d slaves=%d ignored=%d delay2=%ld\n",
+			nnets, nmasternets, nslavenets, nignorednets, delay2);
+}
+
+void
+makeslave(struct netinfo *net)
+{
+	register struct netinfo *ntp;
+
+	for (ntp = nettab; ntp != NULL; ntp = ntp->next) {
+		if (ntp->status == SLAVE && ntp != net)
+			ntp->status = IGNORE;
+	}
+	slavenet = net;
+}
+
+/*
+ * Try to become master over ignored nets..
+ */
+static void
+checkignorednets(void)
+{
+	register struct netinfo *ntp;
+
+	for (ntp = nettab; ntp != NULL; ntp = ntp->next) {
+		if (!Mflag && ntp->status == SLAVE)
+			break;
+
+		if (ntp->status == IGNORE || ntp->status == NOMASTER) {
+			lookformaster(ntp);
+			if (!Mflag && ntp->status == SLAVE)
+				break;
+		}
+	}
+}
+
+/*
+ * choose a good network on which to be a slave
+ *	The ignored networks must have already been checked.
+ *	Take a hint about for a good network.
+ */
+static void
+pickslavenet(struct netinfo *ntp)
+{
+	if (slavenet != 0 && slavenet->status == SLAVE) {
+		makeslave(slavenet);		/* prune extras */
+		return;
+	}
+
+	if (ntp == 0 || ntp->status != SLAVE) {
+		for (ntp = nettab; ntp != 0; ntp = ntp->next) {
+			if (ntp->status == SLAVE)
+				break;
+		}
+	}
+	makeslave(ntp);
+}
+
+/*
+ * returns a random number in the range [inf, sup]
+ */
+long
+casual(long inf, long sup)
+{
+	double value;
+
+	value = ((double)(random() & 0x7fffffff)) / (0x7fffffff*1.0);
+	return(inf + (sup - inf)*value);
+}
+
+char *date(void)
+{
+#ifdef sgi
+	struct	timeval tv;
+	static char tm[32];
+
+	(void)gettimeofday(&tv, (struct timezone *)0);
+	(void)cftime(tm, "%D %T", &tv.tv_sec);
+	return (tm);
+#else
+/*	struct	timeval tv; */
+	time_t tm;
+	time(&tm);
+	return (ctime(&tm));
+#endif /* sgi */
+}
+
+void
+addnetname(char *name)
+{
+	register struct nets **netlist = &nets;
+
+	while (*netlist)
+		netlist = &((*netlist)->next);
+	*netlist = (struct nets *)malloc(sizeof **netlist);
+	if (*netlist == 0) {
+		fprintf(stderr,"malloc failed\n");
+		exit(1);
+	}
+	bzero((char *)*netlist, sizeof(**netlist));
+	(*netlist)->name = name;
+}
+
+/* note a host as trustworthy */
+static void
+add_good_host(char* name,
+	      char perm)		/* 1=not part of the netgroup */
+{
+	register struct goodhost *ghp;
+	register struct hostent *hentp;
+
+	ghp = (struct goodhost*)malloc(sizeof(*ghp));
+	if (!ghp) {
+		syslog(LOG_ERR, "malloc failed");
+		exit(1);
+	}
+
+	bzero((char*)ghp, sizeof(*ghp));
+	(void)strncpy(&ghp->name[0], name, sizeof(ghp->name));
+	ghp->next = goodhosts;
+	ghp->perm = perm;
+	goodhosts = ghp;
+
+	hentp = gethostbyname(name);
+	if (0 == hentp && perm)
+		(void)fprintf(stderr, "unknown host %s\n", name);
+}
+
+
+/* update our image of the net-group of trustworthy hosts
+ */
+void
+get_goodgroup(int force)
+{
+# define NG_DELAY (30*60*HZ)	/* 30 minutes */
+	static unsigned long last_update = -NG_DELAY;
+	unsigned long new_update;
+/*	struct hosttbl *htp; */
+	struct goodhost *ghp, **ghpp;
+/*	char *mach, *usr, *dom; */
+	struct tms tm;
+
+
+	/* if no netgroup, then we are finished */
+	if (goodgroup == 0 || !Mflag)
+		return;
+
+	/* Do not chatter with the netgroup master too often.
+	 */
+	new_update = times(&tm);
+	if (new_update < last_update + NG_DELAY
+	    && !force)
+		return;
+	last_update = new_update;
+
+	/* forget the old temporary entries */
+	ghpp = &goodhosts;
+	while (0 != (ghp = *ghpp)) {
+		if (!ghp->perm) {
+			*ghpp = ghp->next;
+			free((char*)ghp);
+		} else {
+			ghpp = &ghp->next;
+		}
+	}
+
+#ifdef HAVENIS
+	/* quit now if we are not one of the trusted masters
+	 */
+	if (!innetgr(goodgroup, &hostname[0], 0,0)) {
+		if (trace)
+			(void)fprintf(fd, "get_goodgroup: %s not in %s\n",
+				      &hostname[0], goodgroup);
+		return;
+	}
+	if (trace)
+		(void)fprintf(fd, "get_goodgroup: %s in %s\n",
+				  &hostname[0], goodgroup);
+
+	/* mark the entire netgroup as trusted */
+	(void)setnetgrent(goodgroup);
+	while (getnetgrent(&mach,&usr,&dom)) {
+		if (0 != mach)
+			add_good_host(mach,0);
+	}
+	(void)endnetgrent();
+
+	/* update list of slaves */
+	for (htp = self.l_fwd; htp != &self; htp = htp->l_fwd) {
+		htp->good = good_host_name(&htp->name[0]);
+	}
+#endif /* HAVENIS */
+}
+
+/* see if a machine is trustworthy
+ * 1=trust hp to change our date 
+ */
+ 
+int good_host_name(char *name)
+{
+	register struct goodhost *ghp = goodhosts;
+	register char c;
+
+	if (!ghp || !Mflag)		/* trust everyone if no one named */
+		return 1;
+
+	c = *name;
+	do {
+		if (c == ghp->name[0]
+		    && !strcasecmp(name, ghp->name))
+			return 1;	/* found him, so say so */
+	} while (0 != (ghp = ghp->next));
+
+	if (!strcasecmp(name,hostname))	/* trust ourself */
+		return 1;
+
+	return 0;			/* did not find him */
+}
Index: create-0.17-patch/netkit-timed-0.17-new/timed/timed
===================================================================
--- create-0.17-patch/netkit-timed-0.17-new/timed/timed	(nonexistent)
+++ create-0.17-patch/netkit-timed-0.17-new/timed/timed	(revision 5)

Property changes on: create-0.17-patch/netkit-timed-0.17-new/timed/timed
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,73 ##
+
+# install dir
+dist
+
+# Target build dirs
+.a1x-newlib
+.a2x-newlib
+.at91sam7s-newlib
+
+.build-machine
+
+.a1x-glibc
+.a2x-glibc
+.h3-glibc
+.h5-glibc
+.i586-glibc
+.i686-glibc
+.imx6-glibc
+.jz47xx-glibc
+.makefile
+.am335x-glibc
+.omap543x-glibc
+.p5600-glibc
+.power8-glibc
+.power8le-glibc
+.power9-glibc
+.power9le-glibc
+.m1000-glibc
+.riscv64-glibc
+.rk328x-glibc
+.rk33xx-glibc
+.rk339x-glibc
+.s8xx-glibc
+.s9xx-glibc
+.x86_64-glibc
+
+# Hidden files (each file)
+.makefile
+.dist
+.rootfs
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+.requires
+.requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Descriptions
+*.dsc
+*.txt
+
+# Default linux config files
+*.defconfig
+
+# backup copies
+*~
Index: create-0.17-patch/netkit-timed-0.17-new/timed
===================================================================
--- create-0.17-patch/netkit-timed-0.17-new/timed	(nonexistent)
+++ create-0.17-patch/netkit-timed-0.17-new/timed	(revision 5)

Property changes on: create-0.17-patch/netkit-timed-0.17-new/timed
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,73 ##
+
+# install dir
+dist
+
+# Target build dirs
+.a1x-newlib
+.a2x-newlib
+.at91sam7s-newlib
+
+.build-machine
+
+.a1x-glibc
+.a2x-glibc
+.h3-glibc
+.h5-glibc
+.i586-glibc
+.i686-glibc
+.imx6-glibc
+.jz47xx-glibc
+.makefile
+.am335x-glibc
+.omap543x-glibc
+.p5600-glibc
+.power8-glibc
+.power8le-glibc
+.power9-glibc
+.power9le-glibc
+.m1000-glibc
+.riscv64-glibc
+.rk328x-glibc
+.rk33xx-glibc
+.rk339x-glibc
+.s8xx-glibc
+.s9xx-glibc
+.x86_64-glibc
+
+# Hidden files (each file)
+.makefile
+.dist
+.rootfs
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+.requires
+.requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Descriptions
+*.dsc
+*.txt
+
+# Default linux config files
+*.defconfig
+
+# backup copies
+*~
Index: create-0.17-patch/netkit-timed-0.17-new
===================================================================
--- create-0.17-patch/netkit-timed-0.17-new	(nonexistent)
+++ create-0.17-patch/netkit-timed-0.17-new	(revision 5)

Property changes on: create-0.17-patch/netkit-timed-0.17-new
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,73 ##
+
+# install dir
+dist
+
+# Target build dirs
+.a1x-newlib
+.a2x-newlib
+.at91sam7s-newlib
+
+.build-machine
+
+.a1x-glibc
+.a2x-glibc
+.h3-glibc
+.h5-glibc
+.i586-glibc
+.i686-glibc
+.imx6-glibc
+.jz47xx-glibc
+.makefile
+.am335x-glibc
+.omap543x-glibc
+.p5600-glibc
+.power8-glibc
+.power8le-glibc
+.power9-glibc
+.power9le-glibc
+.m1000-glibc
+.riscv64-glibc
+.rk328x-glibc
+.rk33xx-glibc
+.rk339x-glibc
+.s8xx-glibc
+.s9xx-glibc
+.x86_64-glibc
+
+# Hidden files (each file)
+.makefile
+.dist
+.rootfs
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+.requires
+.requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Descriptions
+*.dsc
+*.txt
+
+# Default linux config files
+*.defconfig
+
+# backup copies
+*~
Index: create-0.17-patch
===================================================================
--- create-0.17-patch	(nonexistent)
+++ create-0.17-patch	(revision 5)

Property changes on: create-0.17-patch
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,73 ##
+
+# install dir
+dist
+
+# Target build dirs
+.a1x-newlib
+.a2x-newlib
+.at91sam7s-newlib
+
+.build-machine
+
+.a1x-glibc
+.a2x-glibc
+.h3-glibc
+.h5-glibc
+.i586-glibc
+.i686-glibc
+.imx6-glibc
+.jz47xx-glibc
+.makefile
+.am335x-glibc
+.omap543x-glibc
+.p5600-glibc
+.power8-glibc
+.power8le-glibc
+.power9-glibc
+.power9le-glibc
+.m1000-glibc
+.riscv64-glibc
+.rk328x-glibc
+.rk33xx-glibc
+.rk339x-glibc
+.s8xx-glibc
+.s9xx-glibc
+.x86_64-glibc
+
+# Hidden files (each file)
+.makefile
+.dist
+.rootfs
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+.requires
+.requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Descriptions
+*.dsc
+*.txt
+
+# Default linux config files
+*.defconfig
+
+# backup copies
+*~
Index: patches/README
===================================================================
--- patches/README	(nonexistent)
+++ patches/README	(revision 5)
@@ -0,0 +1,6 @@
+
+/* begin *
+
+   TODO: Leave some comment here.
+
+ * end */
Index: patches
===================================================================
--- patches	(nonexistent)
+++ patches	(revision 5)

Property changes on: patches
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,73 ##
+
+# install dir
+dist
+
+# Target build dirs
+.a1x-newlib
+.a2x-newlib
+.at91sam7s-newlib
+
+.build-machine
+
+.a1x-glibc
+.a2x-glibc
+.h3-glibc
+.h5-glibc
+.i586-glibc
+.i686-glibc
+.imx6-glibc
+.jz47xx-glibc
+.makefile
+.am335x-glibc
+.omap543x-glibc
+.p5600-glibc
+.power8-glibc
+.power8le-glibc
+.power9-glibc
+.power9le-glibc
+.m1000-glibc
+.riscv64-glibc
+.rk328x-glibc
+.rk33xx-glibc
+.rk339x-glibc
+.s8xx-glibc
+.s9xx-glibc
+.x86_64-glibc
+
+# Hidden files (each file)
+.makefile
+.dist
+.rootfs
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+.requires
+.requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Descriptions
+*.dsc
+*.txt
+
+# Default linux config files
+*.defconfig
+
+# backup copies
+*~
Index: .
===================================================================
--- .	(nonexistent)
+++ .	(revision 5)

Property changes on: .
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,73 ##
+
+# install dir
+dist
+
+# Target build dirs
+.a1x-newlib
+.a2x-newlib
+.at91sam7s-newlib
+
+.build-machine
+
+.a1x-glibc
+.a2x-glibc
+.h3-glibc
+.h5-glibc
+.i586-glibc
+.i686-glibc
+.imx6-glibc
+.jz47xx-glibc
+.makefile
+.am335x-glibc
+.omap543x-glibc
+.p5600-glibc
+.power8-glibc
+.power8le-glibc
+.power9-glibc
+.power9le-glibc
+.m1000-glibc
+.riscv64-glibc
+.rk328x-glibc
+.rk33xx-glibc
+.rk339x-glibc
+.s8xx-glibc
+.s9xx-glibc
+.x86_64-glibc
+
+# Hidden files (each file)
+.makefile
+.dist
+.rootfs
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+.requires
+.requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Descriptions
+*.dsc
+*.txt
+
+# Default linux config files
+*.defconfig
+
+# backup copies
+*~