[hamradio-commits] [aprx] 03/11: New upstream version 2.9.0
Dave Hibberd
hibby-guest at moszumanska.debian.org
Sun Jan 22 02:13:41 UTC 2017
This is an automated email from the git hooks/post-receive script.
hibby-guest pushed a commit to branch master
in repository aprx.
commit 8d74c7ea68ed33a6ad22666c79dbc06efc3ecab4
Author: Hibby <d at vehibberd.com>
Date: Sun Jan 22 00:04:46 2017 +0000
New upstream version 2.9.0
---
.gitignore | 27 +
ChangeLog | 18 +
INSTALL | 25 +-
Makefile | 226 --
Makefile.in | 24 +-
README | 2 +-
ROADMAP | 26 +-
SVNVERSION | 1 -
TODO | 30 +-
VER | 1 -
VERSION | 2 +-
agwpesocket.c | 2 +-
aprsis.c | 82 +-
aprx-stat.c | 2 +-
aprx.c | 61 +-
aprx.conf.in | 21 +
aprx.h | 10 +-
aprxpolls.c | 2 +-
ax25.c | 2 +-
beacon.c | 14 +-
build-stamp | 0
cellmalloc.c | 2 +-
cellmalloc.h | 2 +-
config.c | 5 +-
configure | 3 -
configure-stamp | 0
configure.in | 2 -
crc.c | 2 +-
debian/aprx.init | 179 +-
debian/aprx.postinst.debhelper | 15 -
debian/aprx.postrm.debhelper | 5 -
debian/aprx.prerm.debhelper | 9 -
debian/aprx.substvars | 1 -
debian/aprx/DEBIAN/conffiles | 5 -
debian/aprx/DEBIAN/control | 19 -
debian/aprx/DEBIAN/md5sums | 13 -
debian/aprx/DEBIAN/postinst | 17 -
debian/aprx/DEBIAN/postrm | 7 -
debian/aprx/DEBIAN/prerm | 11 -
debian/aprx/etc/apparmor.d/sbin.aprx | 17 -
debian/aprx/etc/default/aprx | 10 -
debian/aprx/etc/init.d/aprx | 155 -
debian/aprx/etc/logrotate.d/aprx | 8 -
debian/aprx/usr/sbin/aprx | Bin 454267 -> 0 bytes
debian/aprx/usr/sbin/aprx-stat | Bin 29954 -> 0 bytes
debian/aprx/usr/share/doc/aprx/LICENSE | 27 -
debian/aprx/usr/share/doc/aprx/PROTOCOLS.gz | Bin 3521 -> 0 bytes
debian/aprx/usr/share/doc/aprx/README | 86 -
debian/aprx/usr/share/doc/aprx/ROADMAP | 26 -
debian/aprx/usr/share/doc/aprx/TODO.gz | Bin 2186 -> 0 bytes
.../aprx/usr/share/doc/aprx/aprx-complex.conf.gz | Bin 7003 -> 0 bytes
debian/aprx/usr/share/doc/aprx/aprx-manual.pdf.gz | Bin 465580 -> 0 bytes
debian/aprx/usr/share/doc/aprx/aprx.conf.gz | Bin 5375 -> 0 bytes
debian/aprx/usr/share/doc/aprx/copyright | 1 -
debian/aprx/usr/share/man/man8/aprx-stat.8.gz | Bin 2507 -> 0 bytes
debian/aprx/usr/share/man/man8/aprx.8.gz | Bin 15564 -> 0 bytes
debian/changelog | 12 -
debian/changelog.release | 12 +
debian/control | 2 +-
debian/files | 1 -
digipeater.c | 3367 ++++++++++----------
doc/aprx-manual-pics.odp | Bin 12644 -> 16153 bytes
doc/aprx-manual.odt | Bin 197896 -> 229402 bytes
doc/aprx-manual.pdf | Bin 438348 -> 490936 bytes
dprsgw.c | 34 +-
dupecheck.c | 5 +-
erlang.c | 4 +-
filter.c | 11 +-
filter.c.2.06-to-head.diff | 585 ----
firmware/6pac2.zip | Bin 0 -> 2823 bytes
firmware/README | 8 +
firmware/smack.zip | Bin 0 -> 2563 bytes
historydb.c | 5 +-
historydb.h | 2 +-
hlog.c | 34 +-
hlog.h | 10 +
igate.c | 82 +-
interface.c | 218 +-
keyhash.c | 2 +-
keyhash.h | 2 +-
kiss.c | 361 ++-
netax25.c | 3 +-
netresolver.c | 3 +-
parse_aprs.c | 14 +-
pbuf.c | 2 +-
pbuf.h | 10 +
aprx.spec => rpm/aprx.spec.in | 4 +-
svnversion | 3 -
svnversion-test.sh | 36 -
telemetry.c | 3 +-
timercmp.c | 2 +-
tt.5383 | 3101 ------------------
ttyreader.c | 4 +-
valgrind.c | 2 +-
windows/MemoryStatus.cpp | 131 +
windows/windows-services-in-c-example-4154.zip | Bin 0 -> 1253 bytes
96 files changed, 2602 insertions(+), 6678 deletions(-)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..81200dd
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,27 @@
+
+Makefile
+aprx-complex.conf
+aprx.conf
+config.h
+config.log
+config.status
+aprx
+aprx-stat
+aprx-stat.8
+aprx.8
+
+build-stamp
+configure-stamp
+debian/aprx.debhelper.log
+debian/aprx.logrotate
+debian/aprx.postinst.debhelper
+debian/aprx.postrm.debhelper
+debian/aprx.prerm.debhelper
+debian/aprx.substvars
+debian/changelog
+debian/files
+
+
+*.o
+*.d
+
diff --git a/ChangeLog b/ChangeLog
index 1affd13..94fb5c7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2014-08-29 Matti Aarnio - OH2MQK - KP20NG <oh2mqk at sral.fi>
+
+ * beacon.c:
+ Demote some nuisance logging to "-dd" level.
+
+2014-03-31 Matti Aarnio - OH2MQK - KP20NG <oh2mqk at sral.fi>
+
+ * aprx.h, interface.c, igate.c, dprsgw.c:
+ Deliver all APRS-IS supplied tokens to the interface 3rd-party
+ receiver
+
+ * beacon.c:
+ Limit read amount of 256 bytes, excess is rejected and usually
+ also the beaconing is skipped.
+
+ * aprx.c, aprx.h, igate.c:
+ Moved rflog() from igate.c to aprx.c.
+
2014-03-24 Matti Aarnio - OH2MQK - KP20NG <oh2mqk at sral.fi>
* interface.c:
diff --git a/INSTALL b/INSTALL
index baba939..b5cdc2d 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,9 +1,9 @@
- INSTALL of APRX 2.08
+ INSTALL of APRX 2
-Pre-made binary package building system exists for Debian and
-Redhat/Fedora systems. See details at the end of this file.
+Instructions for how to build Debian apt packages are provided
+at the end of this file
A rough-cut version of the installation instructions
@@ -35,11 +35,11 @@ A rough-cut version of the installation instructions
5) Edit the configuration file to match your system:
- # emacs /etc/aprx.conf
+ # $EDITOR /etc/aprx.conf
See the aprx(8) man-page for more info (man 8 aprx)
- 6) Program startup scripts ("init-scripts") exist for
+ 6) Program startup scripts ("init-scripts") exist for a
couple system environments, others may need manual
adapting.
@@ -48,13 +48,10 @@ A rough-cut version of the installation instructions
For Debian users wanting to compile themselves instead of using
precompiled binaries:
- $ make make-deb
+ # aptitude install git build-essential debhelper libssl-dev
+ $ git clone https://github.com/PhirePhly/aprx.git
+ $ cd aprx
+ $ ./configure
+ $ make make-deb
+ # dpkg -i ../aprx_....deb
- # dpkg -i aprx_2.07-....deb
-
-
-For RedHat/Fedora users:
-
- $ make make-rpm
-
- # rpm -Uvh aprx-2.07.svn###-1.i386.rpm
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 1d358ea..0000000
--- a/Makefile
+++ /dev/null
@@ -1,226 +0,0 @@
-#
-# APRX -- 2nd generation receive-only APRS-i-gate with
-# minimal requirement of esoteric facilities or
-# libraries of any kind beyond UNIX system libc.
-#
-# Note: This makefile uses features from GNU make
-
-# -------------------------------------------------------------------- #
-
-# target paths
-VARRUN= /var/run # directory for aprx.state and pid-file
-VARLOG= /var/log/aprx # directory for direct logfiles
-CFGFILE= /etc/aprx.conf # default configuration file
-SBINDIR= /usr/sbin # installation path for programs
-MANDIR= /usr/share/man # installation path for manual pages
-
-# -------------------------------------------------------------------- #
-
-srcdir = .
-
-
-
-PROF= # used by 'make profile'
-
-# Compiler and flags
-CC= gcc
-CFLAGS= -Wall -g -O2 -pthread
-
-# Linker and flags
-LD= gcc
-LDFLAGS= -Wall -g -O2 -z noexecstack $(PROF)
-datarootdir= ${prefix}/share
-
-INSTALL= $(srcdir)/install-sh
-INSTALL_PROGRAM=$(INSTALL) -m 755
-INSTALL_DATA= $(INSTALL) -m 644
-
-# -------------------------------------------------------------------- #
-# no user serviceable parts below
-# -------------------------------------------------------------------- #
-
-# strip extra whitespace from paths
-VARRUN:=$(strip $(VARRUN))
-VARLOG:=$(strip $(VARLOG))
-CFGFILE:=$(strip $(CFGFILE))
-SBINDIR:=$(strip $(SBINDIR))
-MANDIR:=$(strip $(MANDIR))
-
-# generate version strings
-
-VERSION = 2.08
-SVNVERSION = $(shell cat SVNVERSION)
-versionupdate := $(shell if [ "$(PKG_REV)-$(PKG_RELEASE)" != "-" ]; then echo "$(PKG_REV)-$(PKG_RELEASE)" > SVNVERSION; fi)
-
-# VERSION:=$(shell cat VERSION)
-# SVNVERSION_CMD:=$(shell which svnversion)
-# SVNVERSION:=$(shell if ${SVNVERSION_CMD} > /dev/null 2>&1 \&\& test -x ${SVNVERSION_CMD} -a \( -d .svn -o -d ../.svn -o -d ../../.svn \) ; then ${SVNVERSION_CMD} | tee SVNVERSION ; else cat SVNVERSION; fi)
-
-DATE:=$(shell date +"%Y %B %d")
-RFCDATE:=$(shell date +"%a, %d %b %Y %H:%M:%S %z")
-
-DEFS= -DAPRXVERSION="\"2.08r$(SVNVERSION)\"" \
- -DVARRUN="\"$(VARRUN)\"" -DVARLOG="\"$(VARLOG)\"" \
- -DCFGFILE="\"$(CFGFILE)\""
-
-# program names
-PROGAPRX= aprx
-PROGSTAT= $(PROGAPRX)-stat
-
-LIBS= -lrt -lutil -lm -pthread -lrt
-OBJSAPRX= aprx.o ttyreader.o ax25.o aprsis.o beacon.o config.o \
- netax25.o erlang.o aprxpolls.o telemetry.o igate.o \
- cellmalloc.o historydb.o keyhash.o parse_aprs.o \
- dupecheck.o kiss.o interface.o pbuf.o digipeater.o \
- valgrind.o filter.o dprsgw.o crc.o agwpesocket.o \
- netresolver.o timercmp.o #ssl.o
-
-OBJSSTAT= erlang.o aprx-stat.o aprxpolls.o valgrind.o timercmp.o
-
-# man page sources, will be installed as $(PROGAPRX).8 / $(PROGSTAT).8
-MANAPRX := aprx.8
-MANSTAT := aprx-stat.8
-
-OBJS= $(OBJSAPRX) $(OBJSSTAT)
-MAN= $(MANAPRX) $(MANSTAT)
-
-# -------------------------------------------------------------------- #
-
-.PHONY: all
-all: $(PROGAPRX) $(PROGSTAT) man aprx.conf aprx-complex.conf
-
-valgrind:
- @echo "Did you do 'make clean' before 'make valgrind' ?"
- make all CFLAGS="${CFLAGS} -D_FOR_VALGRIND_"
-
-profile:
- @echo "Did you do 'make clean' before 'make profile' ?"
- make all PROF="-pg"
-
-
-$(PROGAPRX): $(OBJSAPRX) VERSION Makefile
- $(LD) $(LDFLAGS) -o $@ $(OBJSAPRX) $(LIBS)
-
-$(PROGSTAT): $(OBJSSTAT) VERSION Makefile
- $(LD) $(LDFLAGS) -o $@ $(OBJSSTAT) $(LIBS)
-
-.PHONY: man
-man: $(MAN)
-
-.PHONY: doc html pdf
-doc: html pdf
-pdf: $(MAN:=.pdf)
-html: $(MAN:=.html)
-
-# -------------------------------------------------------------------- #
-
-.PHONY: install install-deb
-install: all
- $(INSTALL_PROGRAM) $(PROGAPRX) $(DESTDIR)$(SBINDIR)/$(PROGAPRX)
- $(INSTALL_PROGRAM) $(PROGSTAT) $(DESTDIR)$(SBINDIR)/$(PROGSTAT)
- $(INSTALL_DATA) $(MANAPRX) $(DESTDIR)$(MANDIR)/man8/$(PROGAPRX).8
- $(INSTALL_DATA) $(MANSTAT) $(DESTDIR)$(MANDIR)/man8/$(PROGSTAT).8
- if [ ! -f $(DESTDIR)$(CFGFILE) ] ; then \
- $(INSTALL_DATA) aprx.conf $(DESTDIR)$(CFGFILE) ; \
- else true ; fi
-
-.PHONY: clean
-clean:
- rm -f $(PROGAPRX) $(PROGSTAT)
- rm -f $(MAN) $(MAN:=.html) $(MAN:=.ps) $(MAN:=.pdf) \
- rm -f aprx.conf logrotate.aprx
- rm -f *~ *.o *.d
-
-.PHONY: distclean
-distclean: clean
- rm -f config.log config.status config.h
- rm -rf autom4te.cache *.log* doc/.~*#
-
-# -------------------------------------------------------------------- #
-
-%.o: %.c VERSION Makefile
- $(CC) $(CFLAGS) $(PROF) $(DEFS) -c $<
- @$(CC) -MM $(CFLAGS) $(PROF) $(DEFS) $< > $(@:.o=.d)
-
-$(MAN:=.html): %.html : %
- sh man-to-html.sh $< > $@
-
-$(MAN:=.ps): %.ps : %
- groff -man $< > $@
-
-$(MAN:=.pdf): %.pdf : %.ps
- ps2pdf $<
-
-logrotate.aprx $(MAN) aprx-complex.conf aprx.conf: % : %.in VERSION Makefile
- perl -ne "s{\@DATEVERSION\@}{$(VERSION) - $(DATE)}g; \
- s{\@VARRUN\@}{$(VARRUN)}g; \
- s{\@VARLOG\@}{$(VARLOG)}g; \
- s{\@CFGFILE\@}{$(CFGFILE)}g; \
- print;" \
- < $< > $@
-
-# -------------------------------------------------------------------- #
-
-#
-# Following is for the original author only...
-#
-
-DISTVERSION:=aprx-$(VERSION).svn$(SVNVERSION)
-DISTTARGET:=../$(DISTVERSION)
-RPMVERSION:=$(shell echo "${DISTVERSION}" | sed -e 's/aprx-//')
-.PHONY: dist svnversion-test
-
-svnversion-test:
- # Special for the source maintainer only..
- @sh svnversion-test.sh $(SVNVERSION)
-
-dist: svnversion-test
- if [ ! -d $(DISTTARGET) ] ; then \
- mkdir $(DISTTARGET) ; \
- fi
- tar cf - --exclude-backups --exclude-vcs --exclude=windows --exclude=*.log* --exclude=*.conf . | (cd $(DISTTARGET) ; tar xf -)
- echo "$(DISTVERSION)" > $(DISTTARGET)/VERSION
- perl -ne "\$$ver = '$(DISTVERSION)'; \
- \$$ver =~ tr/0-9.//cd; \
- \$$ver .= '-1'; \
- s{\@VERSION\@}{\$$ver}g; \
- s{\@RFCDATE\@}{$(RFCDATE)}g; \
- print;" \
- < $(DISTTARGET)/debian/changelog.release \
- > $(DISTTARGET)/debian/changelog
- rm -f $(DISTTARGET)/debian/changelog.release
- rm -f $(DISTTARGET)/aprx.spec
- perl -ne "s{\@VERSION\@}{$(RPMVERSION)}g; \
- s{\@DATE0\@}{$(DATE0)}g; \
- print;" \
- < $(DISTTARGET)/rpm/aprx.spec.in \
- > $(DISTTARGET)/aprx.spec
- rm -f $(DISTTARGET)/rpm/aprx.spec.in
- make -C $(DISTTARGET) distclean
- cd .. && \
- tar czvf $(DISTVERSION).tar.gz $(DISTVERSION)
-
-# -------------------------------------------------------------------- #
-
-.PHONY: make-deb make-rpm
-
-make-deb:
- if [ -f debian/changelog.release ] ; then \
- perl -ne "\$$ver = '$(DISTVERSION)'; \
- \$$ver =~ tr/0-9.//cd; \
- \$$ver .= '-1'; \
- s{\@VERSION\@}{\$$ver}g; \
- s{\@RFCDATE\@}{$(RFCDATE)}g; \
- print;" \
- < debian/changelog.release \
- > debian/changelog ; \
- fi
- dpkg-buildpackage -b -us -uc -rfakeroot
-
-make-rpm: # actually just a reminder of how to do it..
- rpmbuild --target i386 -ta ../$(DISTVERSION).tar.gz
-
-# -------------------------------------------------------------------- #
-
-# include object depencies if available
--include $(OBJS:.o=.d)
diff --git a/Makefile.in b/Makefile.in
index aa33e84..7592c06 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -48,18 +48,12 @@ MANDIR:=$(strip $(MANDIR))
# generate version strings
-VERSION = @VERSION_STRING@
-SVNVERSION = $(shell cat SVNVERSION)
-versionupdate := $(shell if [ "$(PKG_REV)-$(PKG_RELEASE)" != "-" ]; then echo "$(PKG_REV)-$(PKG_RELEASE)" > SVNVERSION; fi)
-
-# VERSION:=$(shell cat VERSION)
-# SVNVERSION_CMD:=$(shell which svnversion)
-# SVNVERSION:=$(shell if ${SVNVERSION_CMD} > /dev/null 2>&1 \&\& test -x ${SVNVERSION_CMD} -a \( -d .svn -o -d ../.svn -o -d ../../.svn \) ; then ${SVNVERSION_CMD} | tee SVNVERSION ; else cat SVNVERSION; fi)
+VERSION = $(shell echo @VERSION_STRING@ | cut -b 2-)
DATE:=$(shell date +"%Y %B %d")
RFCDATE:=$(shell date +"%a, %d %b %Y %H:%M:%S %z")
-DEFS= -DAPRXVERSION="\"@VERSION_STRING at r$(SVNVERSION)\"" \
+DEFS= -DAPRXVERSION="\"$(VERSION)\"" \
-DVARRUN="\"$(VARRUN)\"" -DVARLOG="\"$(VARLOG)\"" \
-DCFGFILE="\"$(CFGFILE)\""
@@ -165,16 +159,12 @@ logrotate.aprx $(MAN) aprx-complex.conf aprx.conf: % : %.in VERSION Makefile
# Following is for the original author only...
#
-DISTVERSION:=aprx-$(VERSION).svn$(SVNVERSION)
+DISTVERSION:=aprx-$(VERSION)
DISTTARGET:=../$(DISTVERSION)
RPMVERSION:=$(shell echo "${DISTVERSION}" | sed -e 's/aprx-//')
-.PHONY: dist svnversion-test
-
-svnversion-test:
- # Special for the source maintainer only..
- @sh svnversion-test.sh $(SVNVERSION)
+.PHONY: dist
-dist: svnversion-test
+dist:
if [ ! -d $(DISTTARGET) ] ; then \
mkdir $(DISTTARGET) ; \
fi
@@ -206,9 +196,7 @@ dist: svnversion-test
make-deb:
if [ -f debian/changelog.release ] ; then \
- perl -ne "\$$ver = '$(DISTVERSION)'; \
- \$$ver =~ tr/0-9.//cd; \
- \$$ver .= '-1'; \
+ perl -ne "\$$ver = '$(VERSION)'; \
s{\@VERSION\@}{\$$ver}g; \
s{\@RFCDATE\@}{$(RFCDATE)}g; \
print;" \
diff --git a/README b/README
index 8c130bc..c632f66 100644
--- a/README
+++ b/README
@@ -1,5 +1,5 @@
- APRX v2.08
+ APRX v2.9
A multitalented APRS / DPRS / APRSIS "i-gate" with following properties:
diff --git a/ROADMAP b/ROADMAP
index 95f70c4..1e133aa 100644
--- a/ROADMAP
+++ b/ROADMAP
@@ -1,26 +1,10 @@
- Aprx Roadmap and Future Directions
+ APRX ROADMAP
-Version 1
- - APRS Rx-only iGate - Complete, working
- - channel activity monitoring and telemetry - Complete, working
+v2.9.x - Stable release with only bug-fixes
+ Pretty much everyone should be using this version
-Version 2
- - Digipeater - Working
- - Analyze and detect station distance - Working
- - Radio beacons - Working
- - Bidirection (Rx/Tx) APRS iGate - Working
- - DPRS->APRS GW - Working
+v2.10.x - Development branch for new feature experimentation
+ Version for developers who'd like to help test new features for Aprx
-Version 2+
-
- - Port to ucLinux - Planned (pthread OK)
-
- - Port to Windows
-
- - Automated coverage statistics analyzer, and
- reporting it via digi node identity beacons.
- "ALOHA circles"
-
- - Automated coverage plotting
diff --git a/SVNVERSION b/SVNVERSION
deleted file mode 100644
index 651c401..0000000
--- a/SVNVERSION
+++ /dev/null
@@ -1 +0,0 @@
-593
diff --git a/TODO b/TODO
index 81f5824..4557a15 100644
--- a/TODO
+++ b/TODO
@@ -1,13 +1,33 @@
- APRX 2.08
+ APRX 2.09
- TODO / Wishlist
+ BUGS / TODO / Wishlist
-- "[Aprx] Re: WIDE2-2/NOGATE - trace not working?"
+- Digipeater working wrong:
+ oz1ekd> oh2mqk - it seems like KG4PID is right, aprx does not digipeat as it should, mine set to "non viscous" and "not direct-only" live log at: http://stave.dk/aprx
+
+ From: kg4pid at yahoo.com
+ Subject: Re: RF beacons vs TCPIP* (was: 2.08 r593 Not digipeating correctly)
+
+ As far as I know all the digi's in this area insert their calsign in the
+ packet. I do see some beacons being digied and igated by other stations
+ just not as many as I think I should. You maybe right about receiving my
+ own beacon after a digipeat as I have seen that happen before. It would be
+ nice if it was marked somehow and what digi heard me. They look just like
+ the telemetry packets that I know are sent direct. Max
+
+ 20140417070330,KG4PID-14>APRX28,TCPIP*,qAC,FIRENET1:T#014,23.6,4.3,101.0,0.0,17.0,00000000
+ 20140417070351,KG4PID-14>APRX28,TCPIP*,qAC,FIRENET1:>Digi/Igate kg4pid at yahoo dot com
+ 20140417071955,KG4PID-14>APRX28,WIDE2-2,qAR,N4XWC:!3417.45N/08742.32W#PHG7250 Bear Creek, Al
+
+
+
+- Add to RF-log all packets dropped due to bad bits; use HEX dump,
+ and type tag 'D'. Use type tag 'd' with text dump when APRS-IS
+ dropped the frame for one reason or other (network timeouts mostly)
- "[Aprx] Re: Bi-Directional Cross-band Digipeater"
Probably heard sources accounting bucket initializing as zero,
- which was fixed recently.
-
+ which was fixed recently. (2.07ish)
- SSL mode to talk to APRS-IS. (Aprsc speaks SSL very efficiently.)
diff --git a/VER b/VER
deleted file mode 100644
index 135b797..0000000
--- a/VER
+++ /dev/null
@@ -1 +0,0 @@
-542
diff --git a/VERSION b/VERSION
index 35e5e7b..f367ae3 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-aprx-2.08.svn593
+v2.9.0
diff --git a/agwpesocket.c b/agwpesocket.c
index 86955f3..7cb7f44 100644
--- a/agwpesocket.c
+++ b/agwpesocket.c
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
diff --git a/aprsis.c b/aprsis.c
index 85d3706..b943969 100644
--- a/aprsis.c
+++ b/aprsis.c
@@ -18,6 +18,7 @@
#include <netdb.h>
#include <netinet/in.h>
#include <signal.h>
+#include <arpa/inet.h>
#ifdef HAVE_NETINET_SCTP_H
#include <netinet/sctp.h>
@@ -254,8 +255,8 @@ static int aprsis_queue_(struct aprsis *A, const char * const addr, const char q
// APRS-IS communicator
static void aprsis_reconnect(struct aprsis *A)
{
- struct addrinfo req, *ai, *a, *ap[21];
- int i, n;
+ struct addrinfo req, *ai, *a;
+ int i;
char *s;
char aprsislogincmd[3000];
const char *errstr;
@@ -265,8 +266,8 @@ static void aprsis_reconnect(struct aprsis *A)
aprsis_close(A, "reconnect");
- if (!A->H) {
- A->H = AISh[0];
+ if (A->H == NULL) {
+ A->H = AISh[AIShindex=0];
} else {
++AIShindex;
if (AIShindex >= AIShcount)
@@ -286,11 +287,7 @@ static void aprsis_reconnect(struct aprsis *A)
req.ai_socktype = SOCK_STREAM;
req.ai_protocol = IPPROTO_TCP;
req.ai_flags = 0;
-#if 1
- req.ai_family = AF_UNSPEC; /* IPv4 and IPv6 are both OK */
-#else
- req.ai_family = AF_INET; /* IPv4 only */
-#endif
+ req.ai_family = AF_UNSPEC;
ai = NULL;
@@ -313,27 +310,7 @@ static void aprsis_reconnect(struct aprsis *A)
return;
}
- /* Count the addresses */
- memset(ap, 0, sizeof(ap));
- for (n = 0, a = ai; a; a = a->ai_next, ++n) {
- if (n < 20)
- ap[n] = a;
- else
- break;
- }
- ap[n] = NULL;
-
- if (n > 1) { /* more than one ? choose one at random as the first address,
- then go through the address list in new sequence. */
- n = rand() % n;
- if (n > 0) {
- a = ap[n];
- ap[n] = ap[0];
- ap[0] = a;
- }
- }
-
- for (n = 0; (a = ap[n]) && A->server_socket < 0; ++n) {
+ for (a = ai; (a != NULL) && (A->server_socket < 0); a = a->ai_next) {
errstr = "socket formation failed";
@@ -342,14 +319,34 @@ static void aprsis_reconnect(struct aprsis *A)
a->ai_protocol);
errcode = errno;
- if (A->server_socket < 0)
+ if (A->server_socket < 0) {
+ if (debug) printf("aprsis failed to open socket.\n");
continue;
+ }
+
+ if(debug) {
+ char addrstr[INET6_ADDRSTRLEN];
+ void *sin_ptr = NULL;
+ switch (a->ai_family) {
+ case AF_INET:
+ sin_ptr = &((struct sockaddr_in *) a->ai_addr)->sin_addr;
+ break;
+ case AF_INET6:
+ sin_ptr = &((struct sockaddr_in6 *) a->ai_addr)->sin6_addr;
+ break;
+ }
+ inet_ntop (a->ai_family, sin_ptr, addrstr, INET6_ADDRSTRLEN);
+
+ printf("aprsis connection attempt IPv%d address: %s\n",
+ (a->ai_family == PF_INET6) ? 6 : 4, addrstr);
+ }
errstr = "connection failed";
i = connect(A->server_socket, a->ai_addr, a->ai_addrlen);
errcode = errno;
if (i < 0) {
+ if (debug) printf("aprsis connection failed.\n");
/* If connection fails, try next possible address */
close(A->server_socket);
A->server_socket = -1;
@@ -509,17 +506,18 @@ static void aprsis_readup(void)
buf[i] = 0; /* String Termination NUL byte */
memcpy(&head, buf, sizeof(head));
- if (head.then + 10 < tick.tv_sec)
- return; /* Too old, discard */
addr = buf + sizeof(head);
-
gwcall = addr + head.addrlen + 1;
-
text = gwcall + head.gwlen + 1;
-
textlen = head.textlen;
- if (textlen <= 2)
+
+ if (head.then + 10 < tick.tv_sec) {
+ return; /* Too old, discard */
+ // rflog();
+ }
+ if (textlen <= 2) {
return; // BAD!
+ }
if ((text + textlen) > (buf + i)) {
return; // BAD!
}
@@ -758,7 +756,6 @@ static void aprsis_main(void)
/* The main loop */
while (!die_now) {
struct pollfd *pfd;
- int i;
timetick();
@@ -768,6 +765,7 @@ static void aprsis_main(void)
#if !(defined(HAVE_PTHREAD_CREATE) && defined(ENABLE_PTHREAD))
// Parent-pid makes no sense in threaded setup
+ int i;
i = getppid();
if (i != ppid)
break; /* die now, my parent is gone.. */
@@ -786,7 +784,7 @@ static void aprsis_main(void)
pfd->revents = 0;
}
- i = aprsis_prepoll_(&app);
+ aprsis_prepoll_(&app);
// Prepolls are done
time_reset = 0;
@@ -795,7 +793,7 @@ static void aprsis_main(void)
tv_timeradd_seconds( &app.next_timeout, &tick, 1 ); // Just to be on safe side..
}
- i = poll(app.polls, app.pollcount, aprxpolls_millis(&app));
+ poll(app.polls, app.pollcount, aprxpolls_millis(&app));
timetick();
@@ -806,7 +804,7 @@ static void aprsis_main(void)
the channel reports EOF, we exit there and then. */
aprsis_readup();
}
- i = aprsis_postpoll_(&app);
+ aprsis_postpoll_(&app);
}
aprxpolls_free(&app); // valgrind..
/* Got "DIE NOW" signal... */
@@ -1271,7 +1269,7 @@ int aprsis_config(struct configfile *cf)
}
AISh = realloc(AISh, sizeof(AISh[0]) * (AIShcount + 1));
- AISh[AIShcount] = AIH;
+ AISh[AIShcount++] = AIH;
}
return has_fault;
}
diff --git a/aprx-stat.c b/aprx-stat.c
index 0773813..7ee75a3 100644
--- a/aprx-stat.c
+++ b/aprx-stat.c
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
diff --git a/aprx.c b/aprx.c
index 7e1bc7d..508166d 100644
--- a/aprx.c
+++ b/aprx.c
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
@@ -34,8 +34,7 @@ float myloc_lon;
const char *myloc_latstr;
const char *myloc_lonstr;
-const char *tocall = "APRX28";
-const uint8_t tocall25[7] = {'A'<<1,'P'<<1,'R'<<1,'X'<<1,'2'<<1,'8'<<1,0x60};
+const char *tocall = "APRX29";
#ifndef CFGFILE
#define CFGFILE "/etc/aprx.conf"
@@ -54,6 +53,7 @@ static void sig_handler(int sig)
{
die_now = 1;
signal(sig, sig_handler);
+ aprxlog("aprx ending (SIG %d) - %s",sig,swversion);
if (debug) {
// Avoid stdio FILE* interlocks within signal handler
char buf[64];
@@ -374,7 +374,7 @@ int main(int argc, char *const argv[])
igate_start();
#endif
- aprxlog("APRX start");
+ aprxlog("aprx start - %s",swversion);
// The main loop
@@ -633,3 +633,56 @@ va_dcl
}
}
+
+/* ---------------------------------------------------------- */
+
+void rfloghex(const char *portname, char direction, int discard, const uint8_t *buf, int buflen)
+{
+}
+
+void rflog(const char *portname, char direction, int discard, const char *tnc2buf, int tnc2len)
+{
+ if (rflogfile) {
+#if defined(HAVE_PTHREAD_CREATE) && defined(ENABLE_PTHREAD)
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
+#endif
+
+ FILE *fp = NULL;
+ const char *p;
+ if (strcmp("-",rflogfile)==0) {
+ if (debug < 2) return;
+ fp = stdout;
+ } else {
+ fp = fopen(rflogfile, "a");
+ }
+
+ if (fp) {
+ char timebuf[60];
+ printtime(timebuf, sizeof(timebuf));
+
+ (void)fprintf(fp, "%s %-9s ", timebuf, portname);
+ (void)fprintf(fp, "%c ", direction);
+
+ if (discard < 0) {
+ fprintf(fp, "*");
+ }
+ if (discard > 0) {
+ fprintf(fp, "#");
+ }
+ //replace non printing TNC2 characters in log print
+ for(p=tnc2buf;p<tnc2buf+tnc2len;p++){
+ if(*p<0x20 || *p>0x7e)
+ fprintf(fp,"<0x%02x>",*p);
+ else
+ fputc(*p,fp);
+ }
+ fputc('\n',fp);
+
+ if (fp != stdout)
+ fclose(fp);
+ }
+#if defined(HAVE_PTHREAD_CREATE) && defined(ENABLE_PTHREAD)
+ pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
+#endif
+ }
+}
diff --git a/aprx.conf.in b/aprx.conf.in
index ae78413..414d2a4 100644
--- a/aprx.conf.in
+++ b/aprx.conf.in
@@ -193,6 +193,27 @@ aprxlog @VARLOG@/aprx.log
# #telem-to-is true # set to 'false' to disable
#</interface>
+#
+# tcp-device behaves identically to local serial port, but allows
+# access to remote TCP/IP sockets. A common application is remote
+# KISS modems connected to Ethernet-to-serial adapters from suppliers
+# such as Lantronix.
+# It's important that this remote socket is a raw TCP socket and not
+# handle any byte codes as command escapes.
+#
+# tcp-device hostname portnumber mode
+# - hostname may be a domain name, IPv4 address, or a IPv6 address
+# - portnumber is any valid TCP port (1-65535)
+# - mode is the same as serial-device (KISS, TNC2, etc.)
+#
+
+#<interface>
+# tcp-device 192.0.2.10 10001 KISS
+# #callsign $mycall # callsign defaults to $mycall
+# #tx-ok false # transmitter enable defaults to false
+# #telem-to-is true # set to 'false' to disable
+#</interface>
+
# *********** Multiple <beacon> definitions can follow *********
<beacon>
diff --git a/aprx.h b/aprx.h
index b48ff34..0e8e911 100644
--- a/aprx.h
+++ b/aprx.h
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
@@ -157,7 +157,6 @@ extern const char *aprsis_login;
extern int die_now;
extern const char *mycall;
extern const char *tocall;
-extern const uint8_t tocall25[7];
extern float myloc_lat;
extern float myloc_coslat;
extern float myloc_lon;
@@ -170,7 +169,6 @@ extern const char *swname;
extern const char *swversion;
extern void timetick(void);
-extern struct timeval now; // Public wall lock time that can jump around
extern struct timeval tick; // Monotonic clock, progresses regularly from boot. NOT wall clock time.
extern int time_reset; // Set during ONE call cycle of prepolls
extern int debug;
@@ -193,6 +191,8 @@ extern void aprxlog(const char *fmt, ...);
/* VARARGS */
extern void aprxlog(va_list);
#endif
+extern void rflog(const char *portname, char direction, int discard, const char *tnc2buf, int tnc2len);
+extern void rfloghex(const char *portname, char direction, int discard, const uint8_t *buf, int buflen);
/* netresolver.c */
extern void netresolv_start(void); // separate thread working on this!
@@ -384,7 +384,6 @@ extern void igate_from_aprsis(const char *ax25, int ax25len);
extern void igate_to_aprsis(const char *portname, const int tncid, const char *tnc2buf, int tnc2addrlen, int tnc2len, const int discard, const int strictax25);
extern void enable_tx_igate(const char *, const char *);
#endif
-extern void rflog(const char *portname, char direction, int discard, const char *tnc2buf, int tnc2len);
extern const char *tnc2_verify_callsign_format(const char *t, int starok, int strictax25, const char *e);
/* netax25.c */
@@ -667,6 +666,7 @@ extern int digipeater_config(struct configfile *cf);
extern void digipeater_receive(struct digipeater_source *src, struct pbuf_t *pb);
extern int digipeater_receive_filter(struct digipeater_source *src, struct pbuf_t *pb);
extern dupecheck_t *digipeater_find_dupecheck(const struct aprx_interface *aif);
+extern struct digipeater* digipeater_find_by_iface(const struct aprx_interface *aif);
/* interface.c */
@@ -728,7 +728,7 @@ extern int interface_is_telemetrable(const struct aprx_interface *iface );
extern void interface_receive_ax25( const struct aprx_interface *aif, const char *ifaddress, const int is_aprs, const int ui_pid, const uint8_t *axbuf, const int axaddrlen, const int axlen, const char *tnc2buf, const int tnc2addrlen, const int tnc2len);
extern void interface_transmit_ax25(const struct aprx_interface *aif, uint8_t *axaddr, const int axaddrlen, const char *axdata, const int axdatalen);
-extern void interface_receive_3rdparty(const struct aprx_interface *aif, const char *fromcall, const char *origtocall, const char *gwtype, const char *tnc2data, const int tnc2datalen);
+extern void interface_receive_3rdparty(const struct aprx_interface *aif, char **heads, const int headscount, const char *gwtype, const char *tnc2data, const int tnc2datalen);
extern int interface_transmit_beacon(const struct aprx_interface *aif, const char *src, const char *dest, const char *via, const char *tncbuf, const int tnclen);
extern int process_message_to_myself(const struct aprx_interface*const srcif, const struct pbuf_t*const pb);
diff --git a/aprxpolls.c b/aprxpolls.c
index bb73032..a5b3642 100644
--- a/aprxpolls.c
+++ b/aprxpolls.c
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
diff --git a/ax25.c b/ax25.c
index 2d94605..4f56982 100644
--- a/ax25.c
+++ b/ax25.c
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
diff --git a/beacon.c b/beacon.c
index d0c588b..1feaf02 100644
--- a/beacon.c
+++ b/beacon.c
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
@@ -337,7 +337,7 @@ static void beacon_set(struct configfile *cf,
str = config_SKIPSPACE(str);
if (strlen(code) != 2) {
has_fault = 1;
- printf("Symbol code lenth is not exactly 2 chars\n");
+ printf("Symbol code length is not exactly 2 chars\n");
}
if (debug)
@@ -690,8 +690,10 @@ static void fix_beacon_time(char *txt, int txtlen)
{
int hour, min, sec;
char hms[8];
+ struct timeval zulutime;
- sec = now.tv_sec % (3600*24); // UNIX time is UTC -> no need to play with fancy timezone conversions and summer times...
+ gettimeofday(&zulutime, NULL);
+ sec = zulutime.tv_sec % (3600*24); // UNIX time is UTC -> no need to play with fancy timezone conversions and summer times...
hour = sec / 3600;
min = (sec / 60) % 60;
sec = sec % 60;
@@ -961,7 +963,7 @@ static void beacon_it(struct beaconset *bset, struct beaconmsg *bm)
}
return; // spawning done, successfull or not..
} else {
- if (debug) printf("Nothing to beacon now.\n");
+ if (debug>1) printf("Nothing to beacon now.\n");
return;
}
@@ -1198,7 +1200,7 @@ int beacon_postpoll(struct aprxpolls *app)
}
for (idx = 0, P = app->polls; idx < app->pollcount; ++idx, ++P) {
if (bset->exec_fd == P->fd) {
- if (debug) printf("revents of exec_fd = 0x%x\n", P->revents);
+ if (debug>1) printf("revents of exec_fd = 0x%x\n", P->revents);
if (P->revents & (POLLIN | POLLPRI | POLLHUP)) {
msg_exec_read(bset);
}
@@ -1210,7 +1212,7 @@ int beacon_postpoll(struct aprxpolls *app)
beacon_now(bset);
}
- if (debug) printf("beacon_postpoll()\n");
+ if (debug>1) printf("beacon_postpoll()\n");
return 0;
diff --git a/build-stamp b/build-stamp
deleted file mode 100644
index e69de29..0000000
diff --git a/cellmalloc.c b/cellmalloc.c
index b999109..8511c32 100644
--- a/cellmalloc.c
+++ b/cellmalloc.c
@@ -1,5 +1,5 @@
/********************************************************************
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
diff --git a/cellmalloc.h b/cellmalloc.h
index dd90a93..a770c3b 100644
--- a/cellmalloc.h
+++ b/cellmalloc.h
@@ -1,5 +1,5 @@
/********************************************************************
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
diff --git a/config.c b/config.c
index 7efb98e..a30fdd6 100644
--- a/config.c
+++ b/config.c
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
@@ -153,6 +153,9 @@ char *config_SKIPTEXT(char *Y, int *lenp)
i = (int) strtol(hx, NULL, 16);
*O++ = i;
++len;
+ } else {
+ *O++ = '\\';
+ *O++ = *Y;
}
} else {
*O++ = *Y;
diff --git a/configure b/configure
index cccfc02..708fd80 100755
--- a/configure
+++ b/configure
@@ -621,7 +621,6 @@ ac_includes_default="\
ac_subst_vars='LTLIBOBJS
LIBOBJS
-SVNVERSION_STRING
VERSION_STRING
LIBCRYPTO
LIBSSL
@@ -4964,8 +4963,6 @@ fi
t_vers="`cat VERSION`"
VERSION_STRING="`cat VERSION`"
-t_vers="`cat SVNVERSION`"
-SVNVERSION_STRING="$t_vers"
ac_config_files="$ac_config_files Makefile"
diff --git a/configure-stamp b/configure-stamp
deleted file mode 100644
index e69de29..0000000
diff --git a/configure.in b/configure.in
index 8442293..9983566 100644
--- a/configure.in
+++ b/configure.in
@@ -310,8 +310,6 @@ fi
dnl Define compilation variables supplying version information
t_vers="`cat VERSION`"
AC_SUBST(VERSION_STRING, "`cat VERSION`")
-t_vers="`cat SVNVERSION`"
-AC_SUBST(SVNVERSION_STRING, "$t_vers")
dnl Output files
AC_CONFIG_FILES([Makefile])
diff --git a/crc.c b/crc.c
index 77cfa51..c54399a 100644
--- a/crc.c
+++ b/crc.c
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
diff --git a/debian/aprx.init b/debian/aprx.init
index 0043822..37f4b19 100644
--- a/debian/aprx.init
+++ b/debian/aprx.init
@@ -40,18 +40,19 @@ SCRIPTNAME=/etc/init.d/$NAME
#
do_start()
{
- # Return
- # 0 if daemon has been started
- # 1 if daemon was already running
- # 2 if daemon could not be started
- start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
- || return 1
- start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
- $DAEMON_ARGS \
- || return 2
- # Add code here, if necessary, that waits for the process to be ready
- # to handle requests from services started subsequently which depend
- # on this one. As a last resort, sleep for some time.
+ # Return
+ # 0 if daemon has been started
+ # 1 if daemon was already running
+ # 2 if daemon could not be started
+ [ "$STARTAPRX" != "yes" ] && return 2
+ start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
+ || return 1
+ start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
+ $DAEMON_ARGS \
+ || return 2
+ # Add code here, if necessary, that waits for the process to be ready
+ # to handle requests from services started subsequently which depend
+ # on this one. As a last resort, sleep for some time.
}
#
@@ -59,25 +60,25 @@ do_start()
#
do_stop()
{
- # Return
- # 0 if daemon has been stopped
- # 1 if daemon was already stopped
- # 2 if daemon could not be stopped
- # other if a failure occurred
- start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
- RETVAL="$?"
- [ "$RETVAL" = 2 ] && return 2
- # Wait for children to finish too if this is a daemon that forks
- # and if the daemon is only ever run from this initscript.
- # If the above conditions are not satisfied then add some other code
- # that waits for the process to drop all resources that could be
- # needed by services started subsequently. A last resort is to
- # sleep for some time.
- start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
- [ "$?" = 2 ] && return 2
- # Many daemons don't delete their pidfiles when they exit.
- rm -f $PIDFILE
- return "$RETVAL"
+ # Return
+ # 0 if daemon has been stopped
+ # 1 if daemon was already stopped
+ # 2 if daemon could not be stopped
+ # other if a failure occurred
+ start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
+ RETVAL="$?"
+ [ "$RETVAL" = 2 ] && return 2
+ # Wait for children to finish too if this is a daemon that forks
+ # and if the daemon is only ever run from this initscript.
+ # If the above conditions are not satisfied then add some other code
+ # that waits for the process to drop all resources that could be
+ # needed by services started subsequently. A last resort is to
+ # sleep for some time.
+ start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
+ [ "$?" = 2 ] && return 2
+ # Many daemons don't delete their pidfiles when they exit.
+ rm -f $PIDFILE
+ return "$RETVAL"
}
@@ -85,71 +86,71 @@ do_stop()
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
- #
- # If the daemon can reload its configuration without
- # restarting (for example, when it is sent a SIGHUP),
- # then implement that here.
- #
- start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
- return 0
+ #
+ # If the daemon can reload its configuration without
+ # restarting (for example, when it is sent a SIGHUP),
+ # then implement that here.
+ #
+ start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
+ return 0
}
case "$1" in
- start)
- [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
- do_start
- case "$?" in
- 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
- 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
- esac
- ;;
- stop)
- [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
- do_stop
- case "$?" in
- 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
- 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
- esac
- ;;
+ start)
+ [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
+ do_start
+ case "$?" in
+ 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
+ 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
+ esac
+ ;;
+stop)
+ [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
+ do_stop
+ case "$?" in
+ 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
+ 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
+esac
+;;
status)
- status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
- ;;
+ status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
+ ;;
#reload|force-reload)
- #
- # If do_reload() is not implemented then leave this commented out
- # and leave 'force-reload' as an alias for 'restart'.
- #
- #log_daemon_msg "Reloading $DESC" "$NAME"
- #do_reload
- #log_end_msg $?
- #;;
+ #
+ # If do_reload() is not implemented then leave this commented out
+ # and leave 'force-reload' as an alias for 'restart'.
+ #
+ #log_daemon_msg "Reloading $DESC" "$NAME"
+ #do_reload
+ #log_end_msg $?
+ #;;
restart|force-reload)
- #
- # If the "reload" option is implemented then remove the
- # 'force-reload' alias
- #
- log_daemon_msg "Restarting $DESC" "$NAME"
- do_stop
- case "$?" in
- 0|1)
- do_start
- case "$?" in
- 0) log_end_msg 0 ;;
- 1) log_end_msg 1 ;; # Old process is still running
- *) log_end_msg 1 ;; # Failed to start
- esac
- ;;
- *)
- # Failed to stop
- log_end_msg 1
- ;;
- esac
- ;;
+ #
+ # If the "reload" option is implemented then remove the
+ # 'force-reload' alias
+ #
+ log_daemon_msg "Restarting $DESC" "$NAME"
+ do_stop
+ case "$?" in
+ 0|1)
+ do_start
+ case "$?" in
+ 0) log_end_msg 0 ;;
+ 1) log_end_msg 1 ;; # Old process is still running
+ *) log_end_msg 1 ;; # Failed to start
+ esac
+ ;;
*)
- #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
- echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
- exit 3
- ;;
+ # Failed to stop
+ log_end_msg 1
+ ;;
+ esac
+ ;;
+ *)
+ #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
+ echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
+ exit 3
+ ;;
esac
:
diff --git a/debian/aprx.postinst.debhelper b/debian/aprx.postinst.debhelper
deleted file mode 100644
index d9381e4..0000000
--- a/debian/aprx.postinst.debhelper
+++ /dev/null
@@ -1,15 +0,0 @@
-# Automatically added by dh_installinit
-if [ -x "/etc/init.d/aprx" ]; then
- update-rc.d aprx defaults >/dev/null
- if [ -n "$2" ]; then
- _dh_action=restart
- else
- _dh_action=start
- fi
- if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then
- invoke-rc.d aprx $_dh_action || exit $?
- else
- /etc/init.d/aprx $_dh_action || exit $?
- fi
-fi
-# End automatically added section
diff --git a/debian/aprx.postrm.debhelper b/debian/aprx.postrm.debhelper
deleted file mode 100644
index bc814dd..0000000
--- a/debian/aprx.postrm.debhelper
+++ /dev/null
@@ -1,5 +0,0 @@
-# Automatically added by dh_installinit
-if [ "$1" = "purge" ] ; then
- update-rc.d aprx remove >/dev/null || exit $?
-fi
-# End automatically added section
diff --git a/debian/aprx.prerm.debhelper b/debian/aprx.prerm.debhelper
deleted file mode 100644
index 0e93bb5..0000000
--- a/debian/aprx.prerm.debhelper
+++ /dev/null
@@ -1,9 +0,0 @@
-# Automatically added by dh_installinit
-if [ -x "/etc/init.d/aprx" ] && [ "$1" = remove ]; then
- if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then
- invoke-rc.d aprx stop || exit $?
- else
- /etc/init.d/aprx stop || exit $?
- fi
-fi
-# End automatically added section
diff --git a/debian/aprx.substvars b/debian/aprx.substvars
deleted file mode 100644
index 36e5a58..0000000
--- a/debian/aprx.substvars
+++ /dev/null
@@ -1 +0,0 @@
-shlibs:Depends=libc6 (>= 2.7-1)
diff --git a/debian/aprx/DEBIAN/conffiles b/debian/aprx/DEBIAN/conffiles
deleted file mode 100644
index 4c1c3ce..0000000
--- a/debian/aprx/DEBIAN/conffiles
+++ /dev/null
@@ -1,5 +0,0 @@
-/etc/apparmor.d/sbin.aprx
-/etc/aprx.conf
-/etc/logrotate.d/aprx
-/etc/default/aprx
-/etc/init.d/aprx
diff --git a/debian/aprx/DEBIAN/control b/debian/aprx/DEBIAN/control
deleted file mode 100644
index b739b92..0000000
--- a/debian/aprx/DEBIAN/control
+++ /dev/null
@@ -1,19 +0,0 @@
-Package: aprx
-Version: 2.08.580-1
-Architecture: i386
-Maintainer: HAM APRX release maintenance <aprx at ham>
-Installed-Size: 1048
-Depends: libc6 (>= 2.7-1), openssl
-Section: hamradio
-Priority: extra
-Description: APRS Digipeater and iGate
- Aprx is an APRS specific Digipeater and iGate.
- It supports multiple KISS-TNCs on serial ports and listening
- to any kernel AX.25 network interfaces.
- .
- Additional features include a built-in "erlang-monitor" to analyze
- activity level of radio channels.
- .
- This software requires a valid (and unique) ham radio callsign to
- operate fully and is therefore useful mainly for licensed radio
- amateurs.
diff --git a/debian/aprx/DEBIAN/md5sums b/debian/aprx/DEBIAN/md5sums
deleted file mode 100644
index 282a406..0000000
--- a/debian/aprx/DEBIAN/md5sums
+++ /dev/null
@@ -1,13 +0,0 @@
-7c2a0786fee7fee92b86115088853a62 usr/sbin/aprx
-d6a98f1bbd799491f9559fc43e8bf7f6 usr/sbin/aprx-stat
-a9d04507f86642315745ba8f0e76df32 usr/share/man/man8/aprx.8.gz
-9cf04acfcca16e1c5791bcd395052b27 usr/share/man/man8/aprx-stat.8.gz
-673c8ba180344e2d5c22bb75f99809ae usr/share/doc/aprx/README
-09890d56e7d42c48f4bafcff6366b304 usr/share/doc/aprx/LICENSE
-6a4c523ff4e1adba1aaf0b8d3325fb08 usr/share/doc/aprx/ROADMAP
-c994b2fce146b8ef5cda6678ca45b6f2 usr/share/doc/aprx/copyright
-261f41ba62cd3667fa45400cb41c92f9 usr/share/doc/aprx/TODO.gz
-70e5e4e805429add4c0fd5958722e6b3 usr/share/doc/aprx/PROTOCOLS.gz
-5105fa38a3b4f732baea02a62b5c6eb9 usr/share/doc/aprx/aprx.conf.gz
-02cd7c464362015dd31ea4c5e0d8fe2b usr/share/doc/aprx/aprx-complex.conf.gz
-4823ba66d187982a7570635cbed33a79 usr/share/doc/aprx/aprx-manual.pdf.gz
diff --git a/debian/aprx/DEBIAN/postinst b/debian/aprx/DEBIAN/postinst
deleted file mode 100755
index d0406f7..0000000
--- a/debian/aprx/DEBIAN/postinst
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/sh
-set -e
-# Automatically added by dh_installinit
-if [ -x "/etc/init.d/aprx" ]; then
- update-rc.d aprx defaults >/dev/null
- if [ -n "$2" ]; then
- _dh_action=restart
- else
- _dh_action=start
- fi
- if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then
- invoke-rc.d aprx $_dh_action || exit $?
- else
- /etc/init.d/aprx $_dh_action || exit $?
- fi
-fi
-# End automatically added section
diff --git a/debian/aprx/DEBIAN/postrm b/debian/aprx/DEBIAN/postrm
deleted file mode 100755
index 4dd5333..0000000
--- a/debian/aprx/DEBIAN/postrm
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-set -e
-# Automatically added by dh_installinit
-if [ "$1" = "purge" ] ; then
- update-rc.d aprx remove >/dev/null || exit $?
-fi
-# End automatically added section
diff --git a/debian/aprx/DEBIAN/prerm b/debian/aprx/DEBIAN/prerm
deleted file mode 100755
index f96d6f9..0000000
--- a/debian/aprx/DEBIAN/prerm
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-set -e
-# Automatically added by dh_installinit
-if [ -x "/etc/init.d/aprx" ] && [ "$1" = remove ]; then
- if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then
- invoke-rc.d aprx stop || exit $?
- else
- /etc/init.d/aprx stop || exit $?
- fi
-fi
-# End automatically added section
diff --git a/debian/aprx/etc/apparmor.d/sbin.aprx b/debian/aprx/etc/apparmor.d/sbin.aprx
deleted file mode 100644
index 00b878f..0000000
--- a/debian/aprx/etc/apparmor.d/sbin.aprx
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <tunables/global>
-
-/sbin/aprx {
- #include <abstractions/base>
- #include <abstractions/nameservice>
-
-
- capability setgid,
- capability setuid,
- capability sys_chroot,
-
-
- /etc/aprx.conf r,
- owner /var/run/aprx.pid rwk,
- owner /var/run/aprx.state rwk,
- owner /var/log/aprx/* rwk,
-}
diff --git a/debian/aprx/etc/default/aprx b/debian/aprx/etc/default/aprx
deleted file mode 100644
index 8fe2c08..0000000
--- a/debian/aprx/etc/default/aprx
+++ /dev/null
@@ -1,10 +0,0 @@
-#
-# STARTAPRX: start aprx on boot. Should be set to "yes" once you have
-# configured aprx.
-#
-STARTAPRX="no"
-
-#
-# Additional options that are passed to the Daemon.
-#
-DAEMON_OPTS=""
diff --git a/debian/aprx/etc/init.d/aprx b/debian/aprx/etc/init.d/aprx
deleted file mode 100755
index 0043822..0000000
--- a/debian/aprx/etc/init.d/aprx
+++ /dev/null
@@ -1,155 +0,0 @@
-#! /bin/sh
-### BEGIN INIT INFO
-# Provides: aprx
-# Required-Start: $syslog $local_fs
-# Required-Stop: $syslog $local_fs
-# Should-Start: ax25ifs
-# Default-Start: 2 3 4 5
-# Default-Stop: 0 1 6
-# Short-Description: start and stop aprx
-# Description: Monitor and gateway radio amateur APRS radio network datagrams
-### END INIT INFO
-
-# Do NOT "set -e"
-
-# PATH should only include /usr/* if it runs after the mountnfs.sh script
-PATH=/sbin:/usr/sbin:/bin:/usr/bin
-DESC="aprx igate"
-NAME=aprx
-DAEMON=/usr/sbin/$NAME
-DAEMON_ARGS=""
-PIDFILE=/var/run/$NAME.pid
-SCRIPTNAME=/etc/init.d/$NAME
-
-# Exit if the package is not installed
-[ -x "$DAEMON" ] || exit 0
-
-# Read configuration variable file if it is present
-[ -r /etc/default/$NAME ] && . /etc/default/$NAME
-
-# Load the VERBOSE setting and other rcS variables
-. /lib/init/vars.sh
-
-# Define LSB log_* functions.
-# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
-# and status_of_proc is working.
-. /lib/lsb/init-functions
-
-#
-# Function that starts the daemon/service
-#
-do_start()
-{
- # Return
- # 0 if daemon has been started
- # 1 if daemon was already running
- # 2 if daemon could not be started
- start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
- || return 1
- start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
- $DAEMON_ARGS \
- || return 2
- # Add code here, if necessary, that waits for the process to be ready
- # to handle requests from services started subsequently which depend
- # on this one. As a last resort, sleep for some time.
-}
-
-#
-# Function that stops the daemon/service
-#
-do_stop()
-{
- # Return
- # 0 if daemon has been stopped
- # 1 if daemon was already stopped
- # 2 if daemon could not be stopped
- # other if a failure occurred
- start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
- RETVAL="$?"
- [ "$RETVAL" = 2 ] && return 2
- # Wait for children to finish too if this is a daemon that forks
- # and if the daemon is only ever run from this initscript.
- # If the above conditions are not satisfied then add some other code
- # that waits for the process to drop all resources that could be
- # needed by services started subsequently. A last resort is to
- # sleep for some time.
- start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
- [ "$?" = 2 ] && return 2
- # Many daemons don't delete their pidfiles when they exit.
- rm -f $PIDFILE
- return "$RETVAL"
-}
-
-
-#
-# Function that sends a SIGHUP to the daemon/service
-#
-do_reload() {
- #
- # If the daemon can reload its configuration without
- # restarting (for example, when it is sent a SIGHUP),
- # then implement that here.
- #
- start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
- return 0
-}
-
-case "$1" in
- start)
- [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
- do_start
- case "$?" in
- 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
- 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
- esac
- ;;
- stop)
- [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
- do_stop
- case "$?" in
- 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
- 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
- esac
- ;;
- status)
- status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
- ;;
- #reload|force-reload)
- #
- # If do_reload() is not implemented then leave this commented out
- # and leave 'force-reload' as an alias for 'restart'.
- #
- #log_daemon_msg "Reloading $DESC" "$NAME"
- #do_reload
- #log_end_msg $?
- #;;
- restart|force-reload)
- #
- # If the "reload" option is implemented then remove the
- # 'force-reload' alias
- #
- log_daemon_msg "Restarting $DESC" "$NAME"
- do_stop
- case "$?" in
- 0|1)
- do_start
- case "$?" in
- 0) log_end_msg 0 ;;
- 1) log_end_msg 1 ;; # Old process is still running
- *) log_end_msg 1 ;; # Failed to start
- esac
- ;;
- *)
- # Failed to stop
- log_end_msg 1
- ;;
- esac
- ;;
- *)
- #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
- echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
- exit 3
- ;;
-esac
-
-:
diff --git a/debian/aprx/etc/logrotate.d/aprx b/debian/aprx/etc/logrotate.d/aprx
deleted file mode 100644
index 3665ba2..0000000
--- a/debian/aprx/etc/logrotate.d/aprx
+++ /dev/null
@@ -1,8 +0,0 @@
-/var/log/aprx/aprx-rf.log /var/log/aprx/aprx.log /var/log/aprx/dprs.log /var/log/aprx/erlang.log {
- weekly
- rotate 4
- compress
- missingok
- notifempty
- create 644 root adm
-}
diff --git a/debian/aprx/usr/sbin/aprx b/debian/aprx/usr/sbin/aprx
deleted file mode 100755
index b078b09..0000000
Binary files a/debian/aprx/usr/sbin/aprx and /dev/null differ
diff --git a/debian/aprx/usr/sbin/aprx-stat b/debian/aprx/usr/sbin/aprx-stat
deleted file mode 100755
index bd8f3bb..0000000
Binary files a/debian/aprx/usr/sbin/aprx-stat and /dev/null differ
diff --git a/debian/aprx/usr/share/doc/aprx/LICENSE b/debian/aprx/usr/share/doc/aprx/LICENSE
deleted file mode 100644
index db21adc..0000000
--- a/debian/aprx/usr/share/doc/aprx/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2007-2014, Matti Aarnio
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * 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.
- * Neither the name of Matti Aarnio 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 COPYRIGHT HOLDERS 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 COPYRIGHT
-OWNER 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.
diff --git a/debian/aprx/usr/share/doc/aprx/PROTOCOLS.gz b/debian/aprx/usr/share/doc/aprx/PROTOCOLS.gz
deleted file mode 100644
index a623c2d..0000000
Binary files a/debian/aprx/usr/share/doc/aprx/PROTOCOLS.gz and /dev/null differ
diff --git a/debian/aprx/usr/share/doc/aprx/README b/debian/aprx/usr/share/doc/aprx/README
deleted file mode 100644
index 8c130bc..0000000
--- a/debian/aprx/usr/share/doc/aprx/README
+++ /dev/null
@@ -1,86 +0,0 @@
-
- APRX v2.08
-
-A multitalented APRS / DPRS / APRSIS "i-gate" with following properties:
-
- Config file (-f option) default is: /etc/aprx.conf
- Other runtime options are: -v, -d, -h/-? (verbout, debug and help)
-
- - Rx-IGate functionality works correctly
- - Tx-IGate functionality works correctly
-
- - Can do APRS New-N and generic AX.25 node digipeater functionality
- with transmitters
-
- - Has same-channel Viscous Digipeater functionality to not to digipeat
- at all, if during initial wait period the packet is heard again.
-
- - Has cross-interface Viscous Digipeater functionality to not to digipeat,
- if during the initial wait period the packet is heard on destination
- interface at least once, and at least once from other sources.
-
- - Can receive data from multiple receivers/modems on local machine
- serial ports, both classical and USB.
-
- - Can receive data from remote TCP stream connectable serial ports
- over the internet.
-
- - Understands on serial ports (local and remote TCP ones):
- - several KISS protocol variants, checksummed variants preferred
- - TNC2 debug style text (Rx-iGate receive only.)
- - D-STAR data side-channel "D-PRS"
-
- - Connects with one callsign-ssid pair to APRS-IS core for all
- received radio ports (the "mycall" parameter), but reports
- receiving radio port at each Rx-iGated packet
-
- - Knows that messages with following tokens in VIA fields of the
- path are not to be relayed into network:
- RFONLY, NOGATE, TCPIP, TCPXX
-
- - Knows that following source address prefixes are bogus and thus
- to be junked at Rx-iGate:
- WIDE, RELAY, TRACE, TCPIP, TCPXX, NOCALL, N0CALL
- (Actually these are string prefixes, so any WIDE*-* will block, etc.)
-
- - Has integrated D-PRS -> APRS/APRSIS Rx-iGate.
- Can even do D-PRS -> APRS RF conversion.
- This is experimental quality for "GPS" packets, the "GPS-A" is OK.
-
- - Does not require machine to have AX.25 protocol support internally!
-
- - On Linux machine with kernel internal AX.25 protocol support, does
- listen on internal AX.25 network in promiscuous form, and requires
- to be running as root to do that. Does not fail to start in case
- the port fails to open (running as non-root.)
-
- - Built-in "erlang-monitor" actually counts bytes per time interval
- (1 min, 10 min, and 20 min) on each receiving interface, including
- all that feed internal AX.25 network.
-
- - Telemetry reported erlang data is sent out every 20 minutes, and
- contains summarized data from 10 minute round-robin memory arrays.
- These are _not_ sent at exact 10 minutes of wall-clock, but exact
- 20 minutes from previous telemetry reporting, and first one is sent
- 20 minutes after program start.
-
- - Telemetry reported erlang data can be sent also over APRS radio
- port, but only for ports with valid AX.25 callsigns. See aprx-manual.pdf
-
- - The netbeacons are distributed timewise more evenly around the interval,
- and even the interval length is varied at random in between 20 and 30
- minutes. Number of netbeacons are unlimited, but their minimum transmit
- interval is 3 seconds making the amount of beacons sendable in 20 minutes
- to be: 20*60/3 = 400. All will be sent, but the cycle will just take
- longer.
-
- - Source code is at SVN repository: http://repo.ham.fi/svn/aprx
- - A Wiki page of this package: http://wiki.ham.fi/Aprx.en
- - A google-group for Aprx: http://groups.google.com/group/aprx-software
-
- - This program is also compilable as "EMBEDDED" target without
- any statistics buffer required at the system disk (or RAM-disk).
- See the INSTALL file.
-
-
-by Matti Aarnio - OH2MQK - oh2mqk-at-sral-fi - 2007-2014
diff --git a/debian/aprx/usr/share/doc/aprx/ROADMAP b/debian/aprx/usr/share/doc/aprx/ROADMAP
deleted file mode 100644
index 95f70c4..0000000
--- a/debian/aprx/usr/share/doc/aprx/ROADMAP
+++ /dev/null
@@ -1,26 +0,0 @@
- Aprx Roadmap and Future Directions
-
-
-Version 1
- - APRS Rx-only iGate - Complete, working
- - channel activity monitoring and telemetry - Complete, working
-
-
-Version 2
- - Digipeater - Working
- - Analyze and detect station distance - Working
- - Radio beacons - Working
- - Bidirection (Rx/Tx) APRS iGate - Working
- - DPRS->APRS GW - Working
-
-Version 2+
-
- - Port to ucLinux - Planned (pthread OK)
-
- - Port to Windows
-
- - Automated coverage statistics analyzer, and
- reporting it via digi node identity beacons.
- "ALOHA circles"
-
- - Automated coverage plotting
diff --git a/debian/aprx/usr/share/doc/aprx/TODO.gz b/debian/aprx/usr/share/doc/aprx/TODO.gz
deleted file mode 100644
index 848a682..0000000
Binary files a/debian/aprx/usr/share/doc/aprx/TODO.gz and /dev/null differ
diff --git a/debian/aprx/usr/share/doc/aprx/aprx-complex.conf.gz b/debian/aprx/usr/share/doc/aprx/aprx-complex.conf.gz
deleted file mode 100644
index 331afe6..0000000
Binary files a/debian/aprx/usr/share/doc/aprx/aprx-complex.conf.gz and /dev/null differ
diff --git a/debian/aprx/usr/share/doc/aprx/aprx-manual.pdf.gz b/debian/aprx/usr/share/doc/aprx/aprx-manual.pdf.gz
deleted file mode 100644
index 238586e..0000000
Binary files a/debian/aprx/usr/share/doc/aprx/aprx-manual.pdf.gz and /dev/null differ
diff --git a/debian/aprx/usr/share/doc/aprx/aprx.conf.gz b/debian/aprx/usr/share/doc/aprx/aprx.conf.gz
deleted file mode 100644
index 3a2c225..0000000
Binary files a/debian/aprx/usr/share/doc/aprx/aprx.conf.gz and /dev/null differ
diff --git a/debian/aprx/usr/share/doc/aprx/copyright b/debian/aprx/usr/share/doc/aprx/copyright
deleted file mode 100644
index 322cb19..0000000
--- a/debian/aprx/usr/share/doc/aprx/copyright
+++ /dev/null
@@ -1 +0,0 @@
-See LICENSE.
diff --git a/debian/aprx/usr/share/man/man8/aprx-stat.8.gz b/debian/aprx/usr/share/man/man8/aprx-stat.8.gz
deleted file mode 100644
index 0bf6968..0000000
Binary files a/debian/aprx/usr/share/man/man8/aprx-stat.8.gz and /dev/null differ
diff --git a/debian/aprx/usr/share/man/man8/aprx.8.gz b/debian/aprx/usr/share/man/man8/aprx.8.gz
deleted file mode 100644
index 4d3b82c..0000000
Binary files a/debian/aprx/usr/share/man/man8/aprx.8.gz and /dev/null differ
diff --git a/debian/changelog b/debian/changelog
deleted file mode 100644
index 3b6a4a0..0000000
--- a/debian/changelog
+++ /dev/null
@@ -1,12 +0,0 @@
-aprx (2.08.593-1) unstable; urgency=low
-
- * See main ChangeLog.
-
- -- aprx maintainer <arpx at ham> Sun, 06 Apr 2014 02:06:07 +0300
-
-aprx (0.0.0-1) unstable; urgency=low
-
- * Initial debianization.
-
- -- Kimmo Jukarainen <oh3gnu at ham> Thu, 3 Jan 2008 20:35:29 +0200
-
diff --git a/debian/changelog.release b/debian/changelog.release
new file mode 100644
index 0000000..30b55e3
--- /dev/null
+++ b/debian/changelog.release
@@ -0,0 +1,12 @@
+aprx (@VERSION@) unstable; urgency=low
+
+ * See changelog: https://github.com/PhirePhly/aprx/commits/master
+
+ -- Kenneth Finnegan <kennethfinnegan2007 at gmail.com> @RFCDATE@
+
+aprx (0.0.0-1) unstable; urgency=low
+
+ * Initial debianization.
+
+ -- Kimmo Jukarainen <oh3gnu at ham> Thu, 3 Jan 2008 20:35:29 +0200
+
diff --git a/debian/control b/debian/control
index 139e156..b371af5 100644
--- a/debian/control
+++ b/debian/control
@@ -1,7 +1,7 @@
Source: aprx
Section: hamradio
Priority: extra
-Maintainer: HAM APRX release maintenance <aprx at ham>
+Maintainer: Kenneth Finnegan <kennethfinnegan2007 at gmail.com>
Build-Depends: debhelper (>= 4), libssl-dev
Standards-Version: 3.7.2
diff --git a/debian/files b/debian/files
deleted file mode 100644
index 0d9a581..0000000
--- a/debian/files
+++ /dev/null
@@ -1 +0,0 @@
-aprx_2.08.580-1_i386.deb hamradio extra
diff --git a/digipeater.c b/digipeater.c
index 329169a..f96565a 100644
--- a/digipeater.c
+++ b/digipeater.c
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
@@ -20,23 +20,23 @@ static struct digipeater **digis;
static struct timeval tokenbucket_timer;
struct viastate {
- int hopsreq;
- int hopsdone;
- int tracereq;
- int tracedone;
- int digireq;
- int digidone;
-
- int fixthis;
- int fixall;
- int probably_heard_direct;
+ int hopsreq;
+ int hopsdone;
+ int tracereq;
+ int tracedone;
+ int digireq;
+ int digidone;
+
+ int fixthis;
+ int fixall;
+ int probably_heard_direct;
};
struct digistate {
- struct viastate v;
+ struct viastate v;
- int ax25addrlen;
- uint8_t ax25addr[90]; // 70 for address, a bit more for "body"
+ int ax25addrlen;
+ uint8_t ax25addr[90]; // 70 for address, a bit more for "body"
};
@@ -48,18 +48,18 @@ struct digistate {
static char * tracewords[] = { "WIDE","TRACE","RELAY" };
static int tracewordlens[] = { 4, 5, 5 };
static const struct tracewide default_trace_param = {
- 4, 4, 1,
- 3,
- tracewords,
- tracewordlens
+ 4, 4, 1, // maxreq, maxdone, is_trace
+ 3, // Count of tracewords defined above
+ tracewords,
+ tracewordlens
};
static char * widewords[] = { "WIDE","RELAY" };
static int widewordlens[] = { 4,5 };
static const struct tracewide default_wide_param = {
- 4, 4, 0,
- 2,
- widewords,
- widewordlens
+ 4, 4, 0,
+ 2,
+ widewords,
+ widewordlens
};
static int run_tokenbucket_timers(void);
@@ -77,1779 +77,1788 @@ float rateincrementmax = 9999999.9;
* AX.25 datastream per se.
*/
static int regex_filter_add(struct configfile *cf,
- struct digipeater_source *src,
- char *param1,
- char *str)
+ struct digipeater_source *src,
+ char *param1,
+ char *str)
{
- int rc;
- int groupcode = -1;
- regex_t re, *rep;
- char errbuf[2000];
-
- if (strcmp(param1, "source") == 0) {
- groupcode = 0;
- } else if (strcmp(param1, "destination") == 0) {
- groupcode = 1;
- } else if (strcmp(param1, "via") == 0) {
- groupcode = 2;
- } else if (strcmp(param1, "data") == 0) {
- groupcode = 3;
- } else {
- printf("%s:%d ERROR: Bad RE target: '%s' must be one of: source, destination, via\n",
- cf->name, cf->linenum, param1);
- return 1;
- }
-
- if (!*str) {
- printf("%s:%d ERROR: Expected RE pattern missing or a NUL string.\n",
- cf->name, cf->linenum);
- return 1; /* Bad input.. */
- }
-
- param1 = str;
- str = config_SKIPTEXT(str, NULL); // Handle quoted string
- str = config_SKIPSPACE(str);
-
- memset(&re, 0, sizeof(re));
- rc = regcomp(&re, param1, REG_EXTENDED | REG_NOSUB);
-
- if (rc != 0) { /* Something is bad.. */
- *errbuf = 0;
- regerror(rc, &re, errbuf, sizeof(errbuf));
- printf("%s:%d ERROR: Bad POSIX RE input, error: %s\n",
- cf->name, cf->linenum, errbuf);
- return 1;
- }
-
- /* param1 and str were processed successfully ... */
-
- rep = calloc(1,sizeof(*rep));
- *rep = re;
-
- switch (groupcode) {
- case 0:
- src->sourceregscount += 1;
- src->sourceregs =
- realloc(src->sourceregs,
- src->sourceregscount * sizeof(void *));
- src->sourceregs[src->sourceregscount - 1] = rep;
- break;
- case 1:
- src->destinationregscount += 1;
- src->destinationregs =
- realloc(src->destinationregs,
- src->destinationregscount * sizeof(void *));
- src->destinationregs[src->destinationregscount - 1] = rep;
- break;
- case 2:
- src->viaregscount += 1;
- src->viaregs = realloc(src->viaregs,
- src->viaregscount * sizeof(void *));
- src->viaregs[src->viaregscount - 1] = rep;
- break;
- case 3:
- src->dataregscount += 1;
- src->dataregs =
- realloc(src->dataregs,
- src->dataregscount * sizeof(void *));
- src->dataregs[src->dataregscount - 1] = rep;
- break;
- }
- return 0; // OK state
+ int rc;
+ int groupcode = -1;
+ regex_t re, *rep;
+ char errbuf[2000];
+
+ if (strcmp(param1, "source") == 0) {
+ groupcode = 0;
+ } else if (strcmp(param1, "destination") == 0) {
+ groupcode = 1;
+ } else if (strcmp(param1, "via") == 0) {
+ groupcode = 2;
+ } else if (strcmp(param1, "data") == 0) {
+ groupcode = 3;
+ } else {
+ printf("%s:%d ERROR: Bad RE target: '%s' must be one of: source, destination, via\n",
+ cf->name, cf->linenum, param1);
+ return 1;
+ }
+
+ if (!*str) {
+ printf("%s:%d ERROR: Expected RE pattern missing or a NUL string.\n",
+ cf->name, cf->linenum);
+ return 1; /* Bad input.. */
+ }
+
+ param1 = str;
+ str = config_SKIPTEXT(str, NULL); // Handle quoted string
+ str = config_SKIPSPACE(str);
+
+ memset(&re, 0, sizeof(re));
+ rc = regcomp(&re, param1, REG_EXTENDED | REG_NOSUB);
+
+ if (rc != 0) { /* Something is bad.. */
+ *errbuf = 0;
+ regerror(rc, &re, errbuf, sizeof(errbuf));
+ printf("%s:%d ERROR: Bad POSIX RE input, error: %s\n",
+ cf->name, cf->linenum, errbuf);
+ return 1;
+ }
+
+ /* param1 and str were processed successfully ... */
+
+ rep = calloc(1,sizeof(*rep));
+ *rep = re;
+
+ switch (groupcode) {
+ case 0:
+ src->sourceregscount += 1;
+ src->sourceregs = realloc(src->sourceregs,
+ src->sourceregscount * sizeof(void *));
+ src->sourceregs[src->sourceregscount - 1] = rep;
+ break;
+ case 1:
+ src->destinationregscount += 1;
+ src->destinationregs = realloc(src->destinationregs,
+ src->destinationregscount * sizeof(void *));
+ src->destinationregs[src->destinationregscount - 1] = rep;
+ break;
+ case 2:
+ src->viaregscount += 1;
+ src->viaregs = realloc(src->viaregs,
+ src->viaregscount * sizeof(void *));
+ src->viaregs[src->viaregscount - 1] = rep;
+ break;
+ case 3:
+ src->dataregscount += 1;
+ src->dataregs = realloc(src->dataregs,
+ src->dataregscount * sizeof(void *));
+ src->dataregs[src->dataregscount - 1] = rep;
+ break;
+ }
+ return 0; // OK state
}
static int match_tracewide(const char *via, const struct tracewide *twp)
{
- int i;
- if (twp == NULL) return 0;
-
- for (i = 0; i < twp->nkeys; ++i) {
- // if (debug>2) printf(" match:'%s'",twp->keys[i]);
- if (memcmp(via, twp->keys[i], twp->keylens[i]) == 0) {
- return twp->keylens[i];
- }
- }
- return 0;
+ int i;
+ if (twp == NULL) return 0;
+
+ for (i = 0; i < twp->nkeys; ++i) {
+ // if (debug>2) printf(" match:'%s'",twp->keys[i]);
+ if (memcmp(via, twp->keys[i], twp->keylens[i]) == 0) {
+ return twp->keylens[i];
+ }
+ }
+ return 0;
}
static int match_aliases(const char *via, struct aprx_interface *txif)
{
- int i;
- for (i = 0; i < txif->aliascount; ++i) {
- if (strcmp(via, txif->aliases[i]) == 0)
- return 1;
- }
- return 0;
+ int i;
+ for (i = 0; i < txif->aliascount; ++i) {
+ if (strcmp(via, txif->aliases[i]) == 0)
+ return 1;
+ }
+ return 0;
}
-static int count_single_tnc2_tracewide(struct viastate *state, const char *viafield, const int istrace, const int matchlen, const int viaindex)
+// Counts the number of requested and consumed hops in an alias
+// and adds those to the viastate->{digireq,digidone,tracereq,tracedone}.
+// returns 1 on horrific failure
+static int count_single_tnc2_tracewide(struct viastate *state,
+ const char *viafield, const int istrace,
+ const int matchlen, const int viaindex)
{
- const char *p = viafield + matchlen;
- const char reqc = p[0];
- const char c = p[1];
- const char remc = p[2];
- int req, done;
-
- int hasHflag = (strchr(viafield,'*') != NULL);
-
- // Non-matched case, may have H-bit flag
- if (matchlen == 0) {
- /*
- state->hopsreq += 0;
- state->hopsdone += 0;
- state->tracereq += 0;
- state->tracedone += 0;
- */
- state->digireq += 1;
- state->digidone += hasHflag;
- if (viaindex == 2 && !hasHflag)
- state->probably_heard_direct = 1;
- // if (debug>1) printf(" a[req=%d,done=%d,trace=%d]",0,0,hasHflag);
- return 0;
- }
-
- // Is the character following matched part one of: [1-7]
- if (!('1' <= reqc && reqc <= '7')) {
- // Not a digit, this is single matcher..
- state->hopsreq += 1;
- state->hopsdone += hasHflag;
- if (istrace) {
- state->tracereq += 1;
- state->tracedone += hasHflag;
- }
- if (viaindex == 2 && !hasHflag)
- state->probably_heard_direct = 1;
- // if (debug>1) printf(" d[req=%d,done=%d]",1,hasHflag);
- return 0;
- }
-
- req = reqc - '0';
-
- if (c == '*' && remc == 0) { // WIDE1*
- state->hopsreq += req;
- state->hopsdone += req;
- if (istrace) {
- state->tracereq += req;
- state->tracedone += req;
- }
- // if (debug>1) printf(" e[req=%d,done=%d]",req,req);
- return 0;
- }
- if (c == 0) { // Bogus WIDE1 - uidigi puts these out.
- state->fixthis = 1;
- state->hopsreq += req;
- state->hopsdone += req;
- if (istrace) {
- state->tracereq += req;
- state->tracedone += req;
- }
- // if (debug>1) printf(" E[req=%d,done=%d]",req,req);
- return 0;
- }
- // Not WIDE1-
- if (c != '-') {
- state->hopsreq += 1;
- state->hopsdone += hasHflag;
- if (istrace) {
- state->tracereq += 1;
- state->tracedone += hasHflag;
- }
- // if (debug>1) printf(" f[req=%d,done=%d]",1,hasHflag);
- return 0;
- }
-
- // OK, it is "WIDEn-" plus "N"
- if ('0' <= remc && remc <= '7' && p[3] == 0) {
- state->hopsreq += req;
- done = req - (remc - '0');
- state->hopsdone += done;
- if (done < 0) {
- // Something like "WIDE3-7", which is definitely bogus!
- state->fixall = 1;
- if (viaindex == 2 && !hasHflag)
- state->probably_heard_direct = 1;
- return 0;
- }
- if (istrace) {
- state->tracereq += req;
- state->tracedone += done;
- }
- if (viaindex == 2) {
- if (memcmp("TRACE",viafield,5)==0) // A real "TRACE" in first slot?
- state->probably_heard_direct = 1;
-
- else if (!hasHflag && done == 0) // WIDE3-3 on first slot
- state->probably_heard_direct = 1;
- }
- // if (debug>1) printf(" g[req=%d,done=%d%s]",req,done,hasHflag ? ",Hflag!":"");
- return 0;
-
- } else if (('8' <= remc && remc <= '9' && p[3] == 0) ||
- (remc == '1' && '0' <= p[3] && p[3] <= '5' && p[4] == 0)) {
- // The request has SSID value in range of 8 to 15
- state->fixall = 1;
- if (viaindex == 2 && !hasHflag)
- state->probably_heard_direct = 1;
- return 0;
-
- } else {
- // Yuck, impossible/syntactically invalid
- state->hopsreq += 1;
- state->hopsdone += hasHflag;
- if (istrace) {
- state->tracereq += 1;
- state->tracedone += hasHflag;
- }
- if (viaindex == 2 && !hasHflag)
- state->probably_heard_direct = 1;
- // if (debug>1) printf(" h[req=%d,done=%d]",1,hasHflag);
- return 1;
- }
+ const char *p = viafield + matchlen;
+ const char reqc = p[0];
+ const char c = p[1];
+ const char remc = p[2];
+ int req, done;
+
+ int hasHflag = (strchr(viafield,'*') != NULL);
+
+ // Non-matched case, may have H-bit flag
+ if (matchlen == 0) {
+ req = 1;
+ done = hasHflag;
+ if (viaindex == 2 && !hasHflag)
+ state->probably_heard_direct = 1;
+ // if (debug>1) printf(" a[req=%d,done=%d,trace=%d]",0,0,hasHflag);
+ goto addtostate;
+ }
+
+ // Is the character following matched part not [1-7]
+ if (!('1' <= reqc && reqc <= '7')) {
+ // Not a digit, this is single matcher..
+ req = 1;
+ done = hasHflag;
+
+ if (viaindex == 2 && !hasHflag)
+ state->probably_heard_direct = 1;
+ // if (debug>1) printf(" d[req=%d,done=%d]",1,hasHflag);
+ goto addtostate;
+ }
+
+ req = reqc - '0';
+
+ if (c == '*' && remc == 0) { // WIDE1*
+ done = req;
+ // if (debug>1) printf(" e[req=%d,done=%d]",req,req);
+ goto addtostate;
+ }
+ if (c == 0) { // Bogus WIDE1 - uidigi puts these out.
+ state->fixthis = 1;
+ done = req;
+ // if (debug>1) printf(" E[req=%d,done=%d]",req,req);
+ goto addtostate;
+ }
+ // Not WIDE1-
+ if (c != '-') {
+ req = 1;
+ done = hasHflag;
+ // if (debug>1) printf(" f[req=%d,done=%d]",1,hasHflag);
+ goto addtostate;
+ }
+
+ // OK, it is "WIDEn-" plus "N"
+ if ('0' <= remc && remc <= '7' && p[3] == 0) {
+ done = req - (remc - '0');
+ if (done < 0) {
+ // Something like "WIDE3-7", which is definitely bogus!
+ done = 0;
+ state->fixall = 1;
+ if (viaindex == 2 && !hasHflag)
+ state->probably_heard_direct = 1;
+ goto addtostate;
+ }
+ if (viaindex == 2) {
+ if (istrace) // A real "TRACE" in first slot?
+ state->probably_heard_direct = 1;
+
+ else if (!hasHflag && done == 0) // WIDE1-1/2-2/3-3/etc on first slot
+ state->probably_heard_direct = 1;
+ }
+ // if (debug>1) printf(" g[req=%d,done=%d%s]",req,done,hasHflag ? ",Hflag!":"");
+ goto addtostate;
+
+ } else if (('8' <= remc && remc <= '9' && p[3] == 0) ||
+ (remc == '1' && '0' <= p[3] && p[3] <= '5' && p[4] == 0)) {
+ // The request has SSID value in range of 8 to 15
+ state->fixall = 1;
+ if (viaindex == 2 && !hasHflag)
+ state->probably_heard_direct = 1;
+ return 0;
+
+ } else {
+ // Yuck, impossible/syntactically invalid
+ state->hopsreq += 1;
+ state->hopsdone += hasHflag;
+ if (istrace) {
+ state->tracereq += 1;
+ state->tracedone += hasHflag;
+ }
+ if (viaindex == 2 && !hasHflag)
+ state->probably_heard_direct = 1;
+ // if (debug>1) printf(" h[req=%d,done=%d]",1,hasHflag);
+ return 1;
+ }
+
+addtostate:;
+ // We've successfully parsed the field. Update the viastate and return 0
+ state->hopsreq += req;
+ state->hopsdone += done;
+ if (istrace) {
+ state->tracereq += req;
+ state->tracedone += done;
+ }
+ return 0;
}
-static int match_transmitter(const char *viafield, const struct digipeater_source *src, const int lastviachar)
+static int match_transmitter(const char *viafield,
+ const struct digipeater_source *src,
+ const int lastviachar)
{
- struct aprx_interface *aif = src->parent->transmitter;
- int tlen = strlen(aif->callsign);
+ struct aprx_interface *aif = src->parent->transmitter;
+ int tlen = strlen(aif->callsign);
- if (memcmp(viafield, aif->callsign, tlen) == 0) {
- if (viafield[tlen] == lastviachar)
- return 1;
- }
+ if (memcmp(viafield, aif->callsign, tlen) == 0) {
+ if (viafield[tlen] == lastviachar)
+ return 1;
+ }
- return 0;
+ return 0;
}
static int try_reject_filters(const int fieldtype,
- const char *field,
- struct digipeater_source *src)
+ const char *field,
+ struct digipeater_source *src)
{
- int i;
- int stat = 0;
- switch (fieldtype) {
- case 0: // Source
- for (i = 0; i < src->sourceregscount; ++i) {
- stat = regexec(src->sourceregs[i],
- field, 0, NULL, 0);
- if (stat == 0)
- return 1; /* MATCH! */
- }
- if (memcmp("MYCALL",field,6)==0) return 1;
- if (memcmp("N0CALL",field,6)==0) return 1;
- if (memcmp("NOCALL",field,6)==0) return 1;
- break;
- case 1: // Destination
-
- for (i = 0; i < src->destinationregscount; ++i) {
- int stat = regexec(src->destinationregs[i],
- field, 0, NULL, 0);
- if (stat == 0)
- return 1; /* MATCH! */
- }
- if (memcmp("MYCALL",field,6)==0) return 1;
- if (memcmp("N0CALL",field,6)==0) return 1;
- if (memcmp("NOCALL",field,6)==0) return 1;
- break;
- case 2: // Via
-
- for (i = 0; i < src->viaregscount; ++i) {
- int stat = regexec(src->viaregs[i],
- field, 0, NULL, 0);
- if (stat == 0)
- return 1; /* MATCH! */
- }
- if (memcmp("MYCALL",field,6)==0) return 1;
- if (memcmp("N0CALL",field,6)==0) return 1;
- if (memcmp("NOCALL",field,6)==0) return 1;
- break;
- case 3: // Data
-
- for (i = 0; i < src->dataregscount; ++i) {
- int stat = regexec(src->dataregs[i],
- field, 0, NULL, 0);
- if (stat == 0)
- return 1; /* MATCH! */
- }
- break;
- default:
- if (debug)
- printf("try_reject_filters(fieldtype=%d) - CODE BUG\n",
- fieldtype);
- return 1;
- }
- if (stat != 0 && stat != REG_NOMATCH) {
- // Some odd reason for an error?
-
- }
- return 0;
+ int i;
+ int stat = 0;
+ switch (fieldtype) {
+ case 0: // Source
+ for (i = 0; i < src->sourceregscount; ++i) {
+ stat = regexec(src->sourceregs[i],
+ field, 0, NULL, 0);
+ if (stat == 0)
+ return 1; /* MATCH! */
+ }
+ if (memcmp("MYCALL",field,6)==0) return 1;
+ if (memcmp("N0CALL",field,6)==0) return 1;
+ if (memcmp("NOCALL",field,6)==0) return 1;
+ break;
+ case 1: // Destination
+
+ for (i = 0; i < src->destinationregscount; ++i) {
+ int stat = regexec(src->destinationregs[i],
+ field, 0, NULL, 0);
+ if (stat == 0)
+ return 1; /* MATCH! */
+ }
+ if (memcmp("MYCALL",field,6)==0) return 1;
+ if (memcmp("N0CALL",field,6)==0) return 1;
+ if (memcmp("NOCALL",field,6)==0) return 1;
+ break;
+ case 2: // Via
+
+ for (i = 0; i < src->viaregscount; ++i) {
+ int stat = regexec(src->viaregs[i],
+ field, 0, NULL, 0);
+ if (stat == 0)
+ return 1; /* MATCH! */
+ }
+ if (memcmp("MYCALL",field,6)==0) return 1;
+ if (memcmp("N0CALL",field,6)==0) return 1;
+ if (memcmp("NOCALL",field,6)==0) return 1;
+ break;
+ case 3: // Data
+
+ for (i = 0; i < src->dataregscount; ++i) {
+ int stat = regexec(src->dataregs[i],
+ field, 0, NULL, 0);
+ if (stat == 0)
+ return 1; /* MATCH! */
+ }
+ break;
+ default:
+ if (debug)
+ printf("try_reject_filters(fieldtype=%d) - CODE BUG\n",
+ fieldtype);
+ return 1;
+ }
+ if (stat != 0 && stat != REG_NOMATCH) {
+ // Some odd reason for an error?
+
+ }
+ return 0;
}
/* Parse executed and requested WIDEn-N/TRACEn-N info */
-static int parse_tnc2_hops(struct digistate *state, struct digipeater_source *src, struct pbuf_t *pb)
+static int parse_tnc2_hops(struct digistate *state,
+ struct digipeater_source *src,
+ struct pbuf_t *pb)
{
- const char *p = pb->dstcall_end+1;
- const char *s;
- const struct digipeater *digi = src->parent;
- const char *lastviastar;
- char viafield[15]; // temp buffer for many uses
- int have_fault = 0;
- int viaindex = 1; // First via index will be 2..
- int activeviacount = 0;
- int len;
- int digiok;
-
- if (debug>1) printf(" hops count of buffer: %s\n",p);
-
- if (src->src_relaytype == DIGIRELAY_THIRDPARTY) {
- state->v.hopsreq = 1; // Bonus for tx-igated 3rd-party frames
- state->v.tracereq = 1; // Bonus for tx-igated 3rd-party frames
- state->v.hopsdone = 0;
- state->v.tracedone = 0;
- state->v.probably_heard_direct = 1;
- return 0;
- }
-
- // Copy the SRCCALL part of SRCALL>DSTCALL to viafield[] buffer
- len = pb->srccall_end - pb->data;
- if (len >= sizeof(viafield)) len = sizeof(viafield)-1;
- memcpy(viafield, pb->data, len);
- viafield[len] = 0;
- // if (debug>2)printf(" srccall='%s'",viafield);
- if (try_reject_filters(0, viafield, src)) {
- if (debug>1) printf(" - Src filters reject\n");
- return 1; // Src reject filters
- }
-
- // Copy the DSTCALL part of SRCALL>DSTCALL to viafield[] buffer
- len = pb->dstcall_end - pb->srccall_end -1;
- if (len >= sizeof(viafield)) len = sizeof(viafield)-1;
- memcpy(viafield, pb->srccall_end+1, len);
- viafield[len] = 0;
- // if (debug>2)printf(" destcall='%s'",viafield);
- if (try_reject_filters(1, viafield, src)) {
- if (debug>1) printf(" - Dest filters reject\n");
- return 1; // Dest reject filters
- }
-
- // Where is the last via-field with a start on it?
- len = pb->info_start - p; if (len < 0) len=0;
- lastviastar = memrchr(p, len, '*');
-
- // Loop over VIA fields to see if we need to digipeat anything.
- while (p < pb->info_start && !have_fault) {
- len = 0;
-
- if (*p == ':') {
- // A round may stop at ':' found at the end of the processed field,
- // then next round finds it at the start of the field.
- break;
- }
-
- // Scan for a VIA field ...
- for (s = p; s < pb->info_start; ++s) {
- if (*s == ',' || *s == ':') {
- // ... until comma or double-colon.
- break;
- }
- }
- // [p..s) is now one VIA field.
- if (s == p && *p != ':') { // BAD!
- have_fault = 1;
- if (debug>1) printf(" S==P ");
- break;
- }
- if (*p == 'q') break; // APRSIS q-constructs..
- ++viaindex;
-
- // Pick-up a viafield to separate buffer for processing
- len = s-p;
- if (len >= sizeof(viafield)) len = sizeof(viafield)-2;
- memcpy(viafield, p, len);
- viafield[len] = 0;
- if (*s == ',') ++s;
- p = s;
-
- // Only last via field with H-bit is indicated at TNC2 format,
- // but this digi code logic needs it at every VIA field where
- // it is set. Therefore this crooked way to add it to picked
- // up fields.
- if (strchr(viafield,'*') == NULL) {
- // If it exists somewhere, and we are not yet at it..
- if (lastviastar != NULL && p < lastviastar)
- strcat(viafield,"*"); // we do know that there is space for this.
- }
-
- if (debug>1) printf(" - ViaField[%d]: '%s'\n", viaindex, viafield);
-
- // VIA-field picked up, now analyze it..
-
- if (try_reject_filters(2, viafield, src)) {
- if (debug>1) printf(" - Via filters reject\n");
- return 1; // via reject filters
- }
-
- // Transmitter callsign match with H-flag set.
- if (match_transmitter(viafield, src, '*')) {
- if (debug>1) printf(" - Tx match reject\n");
- // Oops, LOOP! I have transmit this in past
- // (according to my transmitter callsign present
- // in a VIA field!)
- return 1;
- }
-
- // If there is no '*' meaning this has not been
- // processed, then this is active field..
- if (strchr(viafield, '*') == NULL)
- ++activeviacount;
-
- digiok = 0;
-
- // If first active field (without '*') matches
- // transmitter or alias, then this digi is accepted
- // regardless if it is APRS or some other protocol.
- if (activeviacount == 1 &&
- (match_transmitter(viafield, src, 0) ||
- match_aliases(viafield, digi->transmitter))) {
- if (debug>1) printf(" - Tx match accept!\n");
- state->v.hopsreq += 1;
- state->v.tracereq += 1;
- digiok = 1;
- }
-
- // .. otherwise following rules are applied only to APRS packets.
- if (pb->is_aprs) {
- if ((len = match_tracewide(viafield, src->src_trace))) {
- have_fault = count_single_tnc2_tracewide(&state->v, viafield, 1, len, viaindex);
- if (!have_fault)
- digiok = 1;
- } else if ((len = match_tracewide(viafield, digi->trace))) {
- have_fault = count_single_tnc2_tracewide(&state->v, viafield, 1, len, viaindex);
- if (!have_fault)
- digiok = 1;
- } else if ((len = match_tracewide(viafield, src->src_wide))) {
- have_fault = count_single_tnc2_tracewide(&state->v, viafield, 0, len, viaindex);
- if (!have_fault)
- digiok = 1;
- } else if ((len = match_tracewide(viafield, digi->wide))) {
- have_fault = count_single_tnc2_tracewide(&state->v, viafield, 0, len, viaindex);
- if (!have_fault)
- digiok = 1;
- } else {
- // No match on trace or wide, but if there was earlier
- // match on interface or alias, then it set "digiok" for us.
- }
- }
- if (state->v.fixthis || state->v.fixall) {
- // Argh.. bogus WIDEn seen, which is what UIDIGIs put out..
- // Also some other broken requests are "fixed": like WIDE3-7
- // Fixing it: We set the missing H-bit, and continue processing.
- // (That fixing is done in incoming AX25 address field, which
- // we generally do not touch - with this exception.)
- pb->ax25addr[ AX25ADDRLEN*viaindex + AX25ADDRLEN-1 ] |= AX25HBIT;
- state->v.fixthis = 0;
- }
- if (!digiok) {
- if (debug>1) printf(" this via field is not matching with a TRACE, WIDE, ALIAS or INTERFACE.\n");
- break;
- }
- }
- if (debug>1) printf(" req=%d,done=%d [%s,%s,%s]\n",
- state->v.hopsreq,state->v.hopsdone,
- have_fault ? "FAULT":"OK",
- (state->v.hopsreq > state->v.hopsdone) ? "DIGIPEAT":"DROP",
- (state->v.tracereq > state->v.tracedone) ? "TRACE":"WIDE");
- return have_fault;
+ const char *p = pb->dstcall_end+1;
+ const char *s;
+ const struct digipeater *digi = src->parent;
+ const char *lastviastar;
+ char viafield[15]; // temp buffer for many uses
+ int have_fault = 0;
+ int viaindex = 1; // First via index will be 2..
+ int activeviacount = 0;
+ int len;
+ int digiok;
+
+ if (debug>1) printf(" hops count of buffer: %s\n",p);
+
+ if (src->src_relaytype == DIGIRELAY_THIRDPARTY) {
+ state->v.hopsreq = 1; // Bonus for tx-igated 3rd-party frames
+ state->v.tracereq = 1; // Bonus for tx-igated 3rd-party frames
+ state->v.hopsdone = 0;
+ state->v.tracedone = 0;
+ state->v.probably_heard_direct = 1;
+ return 0;
+ }
+
+ // Copy the SRCCALL part of SRCALL>DSTCALL to viafield[] buffer
+ len = pb->srccall_end - pb->data;
+ if (len >= sizeof(viafield)) len = sizeof(viafield)-1;
+ memcpy(viafield, pb->data, len);
+ viafield[len] = 0;
+ // if (debug>2)printf(" srccall='%s'",viafield);
+ if (try_reject_filters(0, viafield, src)) {
+ if (debug>1) printf(" - Src filters reject\n");
+ return 1; // Src reject filters
+ }
+
+ // Copy the DSTCALL part of SRCALL>DSTCALL to viafield[] buffer
+ len = pb->dstcall_end - pb->srccall_end -1;
+ if (len >= sizeof(viafield)) len = sizeof(viafield)-1;
+ memcpy(viafield, pb->srccall_end+1, len);
+ viafield[len] = 0;
+ // if (debug>2)printf(" destcall='%s'",viafield);
+ if (try_reject_filters(1, viafield, src)) {
+ if (debug>1) printf(" - Dest filters reject\n");
+ return 1; // Dest reject filters
+ }
+
+ // Where is the last via-field with a star on it?
+ len = pb->info_start - p; if (len < 0) len=0;
+ lastviastar = memrchr(p, len, '*');
+
+ // Loop over VIA fields to see if we need to digipeat anything.
+ while (p < pb->info_start && !have_fault) {
+ len = 0;
+
+ if (*p == ':') {
+ // A round may stop at ':' found at the end of the processed field,
+ // then next round finds it at the start of the field.
+ break;
+ }
+
+ // Scan for a VIA field ...
+ for (s = p; s < pb->info_start; ++s) {
+ if (*s == ',' || *s == ':') {
+ // ... until comma or double-colon.
+ break;
+ }
+ }
+ // [p..s) is now one VIA field.
+ if (s == p && *p != ':') { // BAD!
+ have_fault = 1;
+ if (debug>1) printf(" S==P ");
+ break;
+ }
+ if (*p == 'q') break; // APRSIS q-constructs..
+ ++viaindex;
+
+ // Pick-up a viafield to separate buffer for processing
+ len = s-p;
+ if (len >= sizeof(viafield)) len = sizeof(viafield)-2;
+ memcpy(viafield, p, len);
+ viafield[len] = 0;
+ if (*s == ',') ++s;
+ p = s;
+
+ // Only last via field with H-bit is indicated at TNC2 format,
+ // but this digi code logic needs it at every VIA field where
+ // it is set. Therefore this crooked way to add it to picked
+ // up fields.
+ if (strchr(viafield,'*') == NULL) {
+ // If it exists somewhere, and we are not yet at it..
+ if (lastviastar != NULL && p < lastviastar)
+ strcat(viafield,"*"); // we do know that there is space for this.
+ }
+
+ if (debug>1) printf(" - ViaField[%d]: '%s'\n", viaindex, viafield);
+
+ // VIA-field picked up, now analyze it..
+
+ if (try_reject_filters(2, viafield, src)) {
+ if (debug>1) printf(" - Via filters reject\n");
+ return 1; // via reject filters
+ }
+
+ // Transmitter callsign match with H-flag set.
+ if (match_transmitter(viafield, src, '*')) {
+ if (debug>1) printf(" - Tx match reject\n");
+ // Oops, LOOP! I have transmit this in past
+ // (according to my transmitter callsign present
+ // in a VIA field!)
+ return 1;
+ }
+
+ // If there is no '*' meaning this has not been
+ // processed, then this is active field..
+ if (strchr(viafield, '*') == NULL)
+ ++activeviacount;
+
+ digiok = 0;
+
+ // If first active field (without '*') matches
+ // transmitter or alias, then this digi is accepted
+ // regardless if it is APRS or some other protocol.
+ if (activeviacount == 1 &&
+ (match_transmitter(viafield, src, 0) ||
+ match_aliases(viafield, digi->transmitter))) {
+ if (debug>1) printf(" - Tx match accept!\n");
+ state->v.hopsreq += 1;
+ state->v.tracereq += 1;
+ digiok = 1;
+ }
+
+ // .. otherwise following rules are applied only to APRS packets.
+ if (pb->is_aprs) {
+
+ if ((len = match_tracewide(viafield, src->src_trace))) {
+ // Match source specific list of trace aliases
+ if (debug>1) printf("Trace (src specific)\n");
+ have_fault = count_single_tnc2_tracewide(&state->v, viafield, 1, len, viaindex);
+ if (!have_fault)
+ digiok = 1;
+ } else if ((len = match_tracewide(viafield, digi->trace))) {
+ // Match digipeater-wide list of trace aliases
+ if (debug>1) printf("Trace (global)\n");
+ have_fault = count_single_tnc2_tracewide(&state->v, viafield, 1, len, viaindex);
+ if (!have_fault)
+ digiok = 1;
+ } else if ((len = match_tracewide(viafield, src->src_wide))) {
+ // Match source specific list of non-trace aliases
+ if (debug>1) printf("Trace (src-specific, non-trace)\n");
+ have_fault = count_single_tnc2_tracewide(&state->v, viafield, 0, len, viaindex);
+ if (!have_fault)
+ digiok = 1;
+ } else if ((len = match_tracewide(viafield, digi->wide))) {
+ // Match digipeater-wide list of non-trace aliases
+ if (debug>1) printf("Trace (global, non-trace)\n");
+ have_fault = count_single_tnc2_tracewide(&state->v, viafield, 0, len, viaindex);
+ if (!have_fault)
+ digiok = 1;
+ } else {
+ // No match on trace or wide, but if there was earlier
+ // match on interface or alias, then it set "digiok" for us.
+ state->v.digidone += (int) (strchr(viafield,'*') != NULL);
+ if (debug>1) printf("Trace (non-alias) digi=%d\n",state->v.digidone);
+ }
+ }
+ if (state->v.fixthis || state->v.fixall) {
+ // Argh.. bogus WIDEn seen, which is what UIDIGIs put out..
+ // Also some other broken requests are "fixed": like WIDE3-7
+ // Fixing it: We set the missing H-bit, and continue processing.
+ // (That fixing is done in incoming AX25 address field, which
+ // we generally do not touch - with this exception.)
+ pb->ax25addr[ AX25ADDRLEN*viaindex + AX25ADDRLEN-1 ] |= AX25HBIT;
+ state->v.fixthis = 0;
+ }
+
+ if (digiok) {
+ if (debug>1) printf(" via field match %s\n", viafield);
+ if(state->v.hopsreq>state->v.hopsdone) break;
+ }
+ }
+ return have_fault;
}
static void free_tracewide(struct tracewide *twp)
{
- int i;
-
- if (twp == NULL) return;
- if (twp->keys) {
- for (i = 0; i < twp->nkeys; ++i)
- free((void*)(twp->keys[i]));
- free(twp->keys);
- }
- if (twp->keylens)
- free((void*)(twp->keylens));
-
- free(twp);
+ int i;
+
+ if (twp == NULL) return;
+ if (twp->keys) {
+ for (i = 0; i < twp->nkeys; ++i)
+ free((void*)(twp->keys[i]));
+ free(twp->keys);
+ }
+ if (twp->keylens)
+ free((void*)(twp->keylens));
+
+ free(twp);
}
static void free_source(struct digipeater_source *src)
{
- if (src == NULL) return;
- free(src);
+ if (src == NULL) return;
+ free(src);
}
static struct tracewide *digipeater_config_tracewide(struct configfile *cf, int is_trace)
{
- char *name, *param1;
- char *str = cf->buf;
- int has_fault = 0;
- int nkeys = 0;
- char **keywords = NULL;
- int *keylens = NULL;
- int maxreq = 4;
- int maxdone = 4;
- struct tracewide *tw;
-
- while (readconfigline(cf) != NULL) {
- if (configline_is_comment(cf))
- continue; /* Comment line, or empty line */
-
- // It can be severely indented...
- str = config_SKIPSPACE(cf->buf);
-
- name = str;
- str = config_SKIPTEXT(str, NULL);
- str = config_SKIPSPACE(str);
- config_STRLOWER(name);
-
- param1 = str;
- str = config_SKIPTEXT(str, NULL);
- str = config_SKIPSPACE(str);
-
- if (is_trace) {
- if (strcmp(name, "</trace>") == 0) {
- break;
- }
- } else {
- if (strcmp(name, "</wide>") == 0) {
- break;
- }
- }
-
- // ... actual parameters
- if (strcmp(name,"maxreq") == 0) {
- maxreq = atoi(param1);
- // if (debug) printf(" maxreq %d\n",maxreq);
-
- } else if (strcmp(name,"maxdone") == 0) {
- maxdone = atoi(param1);
- // if (debug) printf(" maxdone %d\n",maxdone);
-
- } else if (strcmp(name,"keys") == 0) {
- char *k = strtok(param1, ",");
- for (; k ; k = strtok(NULL,",")) {
- ++nkeys;
- // if (debug) printf(" n=%d key='%s'\n",nkeys,k);
- keywords = realloc(keywords, sizeof(char*) * nkeys);
- keywords[nkeys-1] = strdup(k);
-
- keylens = realloc(keylens, sizeof(int) * nkeys);
- keylens[nkeys-1] = strlen(k);
- }
-
- } else {
- has_fault = 1;
- printf("%s:%d ERROR: Unknown keyword inside %s subblock: '%s'\n",
- cf->name, cf->linenum, is_trace ? "<trace>":"<wide>", name);
- }
- }
-
- if (has_fault) {
- int i;
- for (i = 0; i < nkeys; ++i)
- free(keywords[i]);
- if (keywords != NULL)
- free(keywords);
- if (keylens != NULL)
- free(keylens);
- return NULL;
- }
-
- tw = calloc(1,sizeof(*tw));
-
- tw->maxreq = maxreq;
- tw->maxdone = maxdone;
- tw->is_trace = is_trace;
- tw->nkeys = nkeys;
- tw->keys = keywords;
- tw->keylens = keylens;
-
- return tw;
+ char *name, *param1;
+ char *str = cf->buf;
+ int has_fault = 0;
+ int nkeys = 0;
+ char **keywords = NULL;
+ int *keylens = NULL;
+ int maxreq = 4;
+ int maxdone = 4;
+ struct tracewide *tw;
+
+ while (readconfigline(cf) != NULL) {
+ if (configline_is_comment(cf))
+ continue; /* Comment line, or empty line */
+
+ // It can be severely indented...
+ str = config_SKIPSPACE(cf->buf);
+
+ name = str;
+ str = config_SKIPTEXT(str, NULL);
+ str = config_SKIPSPACE(str);
+ config_STRLOWER(name);
+
+ param1 = str;
+ str = config_SKIPTEXT(str, NULL);
+ str = config_SKIPSPACE(str);
+
+ if (is_trace) {
+ if (strcmp(name, "</trace>") == 0) {
+ break;
+ }
+ } else {
+ if (strcmp(name, "</wide>") == 0) {
+ break;
+ }
+ }
+
+ // ... actual parameters
+ if (strcmp(name,"maxreq") == 0) {
+ maxreq = atoi(param1);
+ // if (debug) printf(" maxreq %d\n",maxreq);
+
+ } else if (strcmp(name,"maxdone") == 0) {
+ maxdone = atoi(param1);
+ // if (debug) printf(" maxdone %d\n",maxdone);
+
+ } else if (strcmp(name,"keys") == 0) {
+ char *k = strtok(param1, ",");
+ for (; k ; k = strtok(NULL,",")) {
+ ++nkeys;
+ // if (debug) printf(" n=%d key='%s'\n",nkeys,k);
+ keywords = realloc(keywords, sizeof(char*) * nkeys);
+ keywords[nkeys-1] = strdup(k);
+
+ keylens = realloc(keylens, sizeof(int) * nkeys);
+ keylens[nkeys-1] = strlen(k);
+ }
+
+ } else {
+ has_fault = 1;
+ printf("%s:%d ERROR: Unknown keyword inside %s subblock: '%s'\n",
+ cf->name, cf->linenum, is_trace ? "<trace>":"<wide>", name);
+ }
+ }
+
+ if (has_fault) {
+ int i;
+ for (i = 0; i < nkeys; ++i)
+ free(keywords[i]);
+ if (keywords != NULL)
+ free(keywords);
+ if (keylens != NULL)
+ free(keylens);
+ return NULL;
+ }
+
+ tw = calloc(1,sizeof(*tw));
+
+ tw->maxreq = maxreq;
+ tw->maxdone = maxdone;
+ tw->is_trace = is_trace;
+ tw->nkeys = nkeys;
+ tw->keys = keywords;
+ tw->keylens = keylens;
+
+ return tw;
}
static struct digipeater_source *digipeater_config_source(struct configfile *cf)
{
- char *name, *param1;
- char *str = cf->buf;
- int has_fault = 0;
- int viscous_delay = 0;
- float ratelimit = 120;
- float rateincrement = 60;
-
- struct aprx_interface *source_aif = NULL;
- struct digipeater_source *source = NULL;
- digi_relaytype relaytype = DIGIRELAY_DIGIPEAT;
- struct filter_t *filters = NULL;
- struct tracewide *source_trace = NULL;
- struct tracewide *source_wide = NULL;
- struct digipeater_source regexsrc;
+ char *name, *param1;
+ char *str = cf->buf;
+ int has_fault = 0;
+ int viscous_delay = 0;
+ float ratelimit = 120;
+ float rateincrement = 60;
+
+ struct aprx_interface *source_aif = NULL;
+ struct digipeater_source *source = NULL;
+ digi_relaytype relaytype = DIGIRELAY_DIGIPEAT;
+ struct filter_t *filters = NULL;
+ struct tracewide *source_trace = NULL;
+ struct tracewide *source_wide = NULL;
+ struct digipeater_source regexsrc;
#ifndef DISABLE_IGATE
- char *via_path = NULL;
- char *msg_path = NULL;
- uint8_t ax25viapath[AX25ADDRLEN];
- uint8_t msgviapath[AX25ADDRLEN];
+ char *via_path = NULL;
+ char *msg_path = NULL;
+ uint8_t ax25viapath[AX25ADDRLEN];
+ uint8_t msgviapath[AX25ADDRLEN];
#endif
- memset(®exsrc, 0, sizeof(regexsrc));
+ memset(®exsrc, 0, sizeof(regexsrc));
#ifndef DISABLE_IGATE
- memset(ax25viapath, 0, sizeof(ax25viapath));
- memset(msgviapath, 0, sizeof(msgviapath));
+ memset(ax25viapath, 0, sizeof(ax25viapath));
+ memset(msgviapath, 0, sizeof(msgviapath));
#endif
- while (readconfigline(cf) != NULL) {
- if (configline_is_comment(cf))
- continue; /* Comment line, or empty line */
-
- // It can be severely indented...
- str = config_SKIPSPACE(cf->buf);
-
- name = str;
- str = config_SKIPTEXT(str, NULL);
- str = config_SKIPSPACE(str);
- config_STRLOWER(name);
-
- param1 = str;
- str = config_SKIPTEXT(str, NULL);
- str = config_SKIPSPACE(str);
-
- if (strcmp(name, "</source>") == 0) {
- break;
-
- // ... actual parameters
- } else if (strcmp(name,"source") == 0) {
- if (debug)
- printf("%s:%d <source> source = '%s'\n",
- cf->name, cf->linenum, param1);
-
- if (strcasecmp(param1,"$mycall") == 0)
- param1 = (char*)mycall;
-
- source_aif = find_interface_by_callsign(param1);
- if (source_aif == NULL) {
- has_fault = 1;
- printf("%s:%d ERROR: Digipeater source '%s' not found\n",
- cf->name, cf->linenum, param1);
- }
- if (debug>1)
- printf(" .. source_aif = %p\n", source_aif);
-
- } else if (strcmp(name, "viscous-delay") == 0) {
- viscous_delay = atoi(param1);
- if (debug) printf(" viscous-delay = %d\n",viscous_delay);
- if (viscous_delay < 0) {
- printf("%s:%d ERROR: Bad value for viscous-delay: '%s'\n",
- cf->name, cf->linenum, param1);
- viscous_delay = 0;
- has_fault = 1;
- }
- if (viscous_delay > 9) {
- printf("%s:%d ERROR: Too large value for viscous-delay: '%s'\n",
- cf->name, cf->linenum, param1);
- viscous_delay = 9;
- has_fault = 1;
- }
-
- } else if (strcmp(name, "ratelimit") == 0) {
- char *param2 = str;
- str = config_SKIPTEXT(str, NULL);
- str = config_SKIPSPACE(str);
-
- rateincrement = (float)atof(param1);
- ratelimit = (float)atof(param2);
- if (rateincrement < 0.01 || rateincrement > rateincrementmax)
- rateincrement = 60;
- if (ratelimit < 0.01 || ratelimit > ratelimitmax)
- ratelimit = 120;
- if (ratelimit < rateincrement)
- rateincrement = ratelimit;
- if (debug)
- printf(" .. ratelimit %f %f\n",
- rateincrement, ratelimit);
-
- } else if (strcmp(name,"regex-filter") == 0) {
- if (regex_filter_add(cf, ®exsrc, param1, str)) {
- // prints errors internally
- has_fault = 1;
- }
+ while (readconfigline(cf) != NULL) {
+ if (configline_is_comment(cf))
+ continue; /* Comment line, or empty line */
+
+ // It can be severely indented...
+ str = config_SKIPSPACE(cf->buf);
+
+ name = str;
+ str = config_SKIPTEXT(str, NULL);
+ str = config_SKIPSPACE(str);
+ config_STRLOWER(name);
+
+ param1 = str;
+ str = config_SKIPTEXT(str, NULL);
+ str = config_SKIPSPACE(str);
+
+ if (strcmp(name, "</source>") == 0) {
+ break;
+
+ // ... actual parameters
+ } else if (strcmp(name,"source") == 0) {
+ if (debug)
+ printf("%s:%d <source> source = '%s'\n",
+ cf->name, cf->linenum, param1);
+
+ if (strcasecmp(param1,"$mycall") == 0)
+ param1 = (char*)mycall;
+
+ source_aif = find_interface_by_callsign(param1);
+ if (source_aif == NULL) {
+ has_fault = 1;
+ printf("%s:%d ERROR: Digipeater source '%s' not found\n",
+ cf->name, cf->linenum, param1);
+ }
+ if (debug>1)
+ printf(" .. source_aif = %p\n", source_aif);
+
+ } else if (strcmp(name, "viscous-delay") == 0) {
+ viscous_delay = atoi(param1);
+ if (debug) printf(" viscous-delay = %d\n",viscous_delay);
+ if (viscous_delay < 0) {
+ printf("%s:%d ERROR: Bad value for viscous-delay: '%s'\n",
+ cf->name, cf->linenum, param1);
+ viscous_delay = 0;
+ has_fault = 1;
+ }
+ if (viscous_delay > 9) {
+ printf("%s:%d ERROR: Too large value for viscous-delay: '%s'\n",
+ cf->name, cf->linenum, param1);
+ viscous_delay = 9;
+ has_fault = 1;
+ }
+
+ } else if (strcmp(name, "ratelimit") == 0) {
+ char *param2 = str;
+ str = config_SKIPTEXT(str, NULL);
+ str = config_SKIPSPACE(str);
+
+ rateincrement = (float)atof(param1);
+ ratelimit = (float)atof(param2);
+ if (rateincrement < 0.01 || rateincrement > rateincrementmax)
+ rateincrement = 60;
+ if (ratelimit < 0.01 || ratelimit > ratelimitmax)
+ ratelimit = 120;
+ if (ratelimit < rateincrement)
+ rateincrement = ratelimit;
+ if (debug)
+ printf(" .. ratelimit %f %f\n",
+ rateincrement, ratelimit);
+
+ } else if (strcmp(name,"regex-filter") == 0) {
+ if (regex_filter_add(cf, ®exsrc, param1, str)) {
+ // prints errors internally
+ has_fault = 1;
+ }
#ifndef DISABLE_IGATE
- } else if (strcmp(name, "via-path") == 0) {
-
- // Validate that source callsign is "APRSIS"
- // or "DPRS" for this parameter
-
- if (source_aif == NULL ||
- (strcmp(source_aif->callsign,"APRSIS") != 0 &&
- strcmp(source_aif->callsign,"DPRS") != 0)) {
- printf("%s:%d ERROR: via-path parameter is available only on 'source APRSIS' and 'source DPRS' cases.\n",
- cf->name, cf->linenum);
- has_fault = 1;
- continue;
- }
-
- via_path = strdup(param1);
- config_STRUPPER(via_path);
-
- if (parse_ax25addr(ax25viapath, via_path, 0x00)) {
- has_fault = 1;
- printf("%s:%d ERROR: via-path parameter is not valid AX.25 callsign: '%s'\n",
- cf->name, cf->linenum, via_path);
- free(via_path);
- via_path = NULL;
- continue;
- }
-
- if (debug)
- printf("via-path '%s'\n", via_path);
-
- } else if (strcmp(name, "msg-path") == 0) {
-
- // Validate that source callsign is "APRSIS"
- // or "DPRS" for this parameter
-
- if (source_aif == NULL ||
- (strcmp(source_aif->callsign,"APRSIS") != 0 &&
- strcmp(source_aif->callsign,"DPRS") != 0)) {
- printf("%s:%d ERROR: msg-path parameter is available only on 'source APRSIS' and 'source DPRS' cases.\n",
- cf->name, cf->linenum);
- has_fault = 1;
- continue;
- }
-
- msg_path = strdup(param1);
- config_STRUPPER(msg_path);
-
- if (parse_ax25addr(msgviapath, msg_path, 0x00)) {
- has_fault = 1;
- printf("%s:%d ERROR: msg-path parameter is not valid AX.25 callsign: '%s'\n",
- cf->name, cf->linenum, msg_path);
- free(msg_path);
- msg_path = NULL;
- continue;
- }
-
- if (debug)
- printf("msg-path '%s'\n", msg_path);
+ } else if (strcmp(name, "via-path") == 0) {
+
+ // Validate that source callsign is "APRSIS"
+ // or "DPRS" for this parameter
+
+ if (source_aif == NULL ||
+ (strcmp(source_aif->callsign,"APRSIS") != 0 &&
+ strcmp(source_aif->callsign,"DPRS") != 0)) {
+ printf("%s:%d ERROR: via-path parameter is available only on 'source APRSIS' and 'source DPRS' cases.\n",
+ cf->name, cf->linenum);
+ has_fault = 1;
+ continue;
+ }
+
+ via_path = strdup(param1);
+ config_STRUPPER(via_path);
+
+ if (parse_ax25addr(ax25viapath, via_path, 0x00)) {
+ has_fault = 1;
+ printf("%s:%d ERROR: via-path parameter is not valid AX.25 callsign: '%s'\n",
+ cf->name, cf->linenum, via_path);
+ free(via_path);
+ via_path = NULL;
+ continue;
+ }
+
+ if (debug)
+ printf("via-path '%s'\n", via_path);
+
+ } else if (strcmp(name, "msg-path") == 0) {
+
+ // Validate that source callsign is "APRSIS"
+ // or "DPRS" for this parameter
+
+ if (source_aif == NULL ||
+ (strcmp(source_aif->callsign,"APRSIS") != 0 &&
+ strcmp(source_aif->callsign,"DPRS") != 0)) {
+ printf("%s:%d ERROR: msg-path parameter is available only on 'source APRSIS' and 'source DPRS' cases.\n",
+ cf->name, cf->linenum);
+ has_fault = 1;
+ continue;
+ }
+
+ msg_path = strdup(param1);
+ config_STRUPPER(msg_path);
+
+ if (parse_ax25addr(msgviapath, msg_path, 0x00)) {
+ has_fault = 1;
+ printf("%s:%d ERROR: msg-path parameter is not valid AX.25 callsign: '%s'\n",
+ cf->name, cf->linenum, msg_path);
+ free(msg_path);
+ msg_path = NULL;
+ continue;
+ }
+
+ if (debug)
+ printf("msg-path '%s'\n", msg_path);
#endif
- } else if (strcmp(name,"<trace>") == 0) {
- if (source_trace == NULL) {
- source_trace = digipeater_config_tracewide(cf, 1);
- // prints errors internally
- } else {
- has_fault = 1;
- printf("%s:%d ERROR: double definition of <trace> block.\n",
- cf->name, cf->linenum);
- }
-
- } else if (strcmp(name,"<wide>") == 0) {
- if (source_wide == NULL) {
- source_wide = digipeater_config_tracewide(cf, 0);
- // prints errors internally
- } else {
- has_fault = 1;
- printf("%s:%d ERROR: double definition of <wide> block.\n",
- cf->name, cf->linenum);
- }
-
- } else if (strcmp(name,"filter") == 0) {
- if (filter_parse(&filters, param1)) {
- // prints errors internally
-
- has_fault = 1;
- printf("%s:%d ERROR: Error at filter parser.\n",
- cf->name, cf->linenum);
- } else {
- if (debug)
- printf(" .. OK filter %s\n", param1);
- }
-
- } else if (strcmp(name,"relay-type") == 0 || // documented name
- strcmp(name,"relay-format") == 0 || // an alias
- strcmp(name,"digi-mode") == 0) { // very old alias
- config_STRLOWER(param1);
- if (strcmp(param1,"digipeat") == 0) {
- relaytype = DIGIRELAY_DIGIPEAT;
- } else if (strcmp(param1,"digipeated") == 0) {
- relaytype = DIGIRELAY_DIGIPEAT;
- } else if (strcmp(param1,"digipeater") == 0) {
- relaytype = DIGIRELAY_DIGIPEAT;
- } else if (strcmp(param1,"directonly") == 0) {
- relaytype = DIGIRELAY_DIGIPEAT_DIRECTONLY;
- } else if (strcmp(param1,"third-party") == 0) {
- relaytype = DIGIRELAY_THIRDPARTY;
- } else if (strcmp(param1,"3rd-party") == 0) {
- relaytype = DIGIRELAY_THIRDPARTY;
- } else {
- printf("%s:%d ERROR: Digipeater <source>'s %s did not recognize: '%s' \n", cf->name, cf->linenum, name, param1);
- has_fault = 1;
- }
- } else {
- printf("%s:%d ERROR: Digipeater <source>'s %s did not recognize: '%s' \n", cf->name, cf->linenum, name, param1);
- has_fault = 1;
- }
- }
-
- if (source_aif == NULL) {
- has_fault = 1;
- printf("%s:%d ERROR: Missing or bad 'source =' definition at this <source> group.\n",
- cf->name, cf->linenum);
- }
-
- if (!has_fault && (source_aif != NULL)) {
- source = calloc(1,sizeof(*source));
-
- source->src_if = source_aif;
- source->src_relaytype = relaytype;
- source->src_filters = filters;
- source->src_trace = source_trace;
- source->src_wide = source_wide;
+ } else if (strcmp(name,"<trace>") == 0) {
+ if (source_trace == NULL) {
+ source_trace = digipeater_config_tracewide(cf, 1);
+ // prints errors internally
+ } else {
+ has_fault = 1;
+ printf("%s:%d ERROR: double definition of <trace> block.\n",
+ cf->name, cf->linenum);
+ }
+
+ } else if (strcmp(name,"<wide>") == 0) {
+ if (source_wide == NULL) {
+ source_wide = digipeater_config_tracewide(cf, 0);
+ // prints errors internally
+ } else {
+ has_fault = 1;
+ printf("%s:%d ERROR: double definition of <wide> block.\n",
+ cf->name, cf->linenum);
+ }
+
+ } else if (strcmp(name,"filter") == 0) {
+ if (filter_parse(&filters, param1)) {
+ // prints errors internally
+
+ has_fault = 1;
+ printf("%s:%d ERROR: Error at filter parser.\n",
+ cf->name, cf->linenum);
+ } else {
+ if (debug)
+ printf(" .. OK filter %s\n", param1);
+ }
+
+ } else if (strcmp(name,"relay-type") == 0 || // documented name
+ strcmp(name,"relay-format") == 0 || // an alias
+ strcmp(name,"digi-mode") == 0) { // very old alias
+ config_STRLOWER(param1);
+ if (strcmp(param1,"digipeat") == 0) {
+ relaytype = DIGIRELAY_DIGIPEAT;
+ } else if (strcmp(param1,"digipeated") == 0) {
+ relaytype = DIGIRELAY_DIGIPEAT;
+ } else if (strcmp(param1,"digipeater") == 0) {
+ relaytype = DIGIRELAY_DIGIPEAT;
+ } else if (strcmp(param1,"directonly") == 0) {
+ relaytype = DIGIRELAY_DIGIPEAT_DIRECTONLY;
+ } else if (strcmp(param1,"third-party") == 0) {
+ relaytype = DIGIRELAY_THIRDPARTY;
+ } else if (strcmp(param1,"3rd-party") == 0) {
+ relaytype = DIGIRELAY_THIRDPARTY;
+ } else {
+ printf("%s:%d ERROR: Digipeater <source>'s %s did not recognize: '%s' \n", cf->name, cf->linenum, name, param1);
+ has_fault = 1;
+ }
+ } else {
+ printf("%s:%d ERROR: Digipeater <source>'s %s did not recognize: '%s' \n", cf->name, cf->linenum, name, param1);
+ has_fault = 1;
+ }
+ }
+
+ if (source_aif == NULL) {
+ has_fault = 1;
+ printf("%s:%d ERROR: Missing or bad 'source =' definition at this <source> group.\n",
+ cf->name, cf->linenum);
+ }
+
+ if (!has_fault && (source_aif != NULL)) {
+ source = calloc(1,sizeof(*source));
+
+ source->src_if = source_aif;
+ source->src_relaytype = relaytype;
+ source->src_filters = filters;
+ source->src_trace = source_trace;
+ source->src_wide = source_wide;
#ifndef DISABLE_IGATE
- source->via_path = via_path;
- source->msg_path = msg_path;
- memcpy(source->ax25viapath, ax25viapath, sizeof(ax25viapath));
- memcpy(source->msgviapath, msgviapath, sizeof(msgviapath));
- if (msg_path == NULL) { // default value of via-path !
- source->msg_path = via_path;
- memcpy(source->msgviapath, ax25viapath, sizeof(ax25viapath));
- }
+ source->via_path = via_path;
+ source->msg_path = msg_path;
+ memcpy(source->ax25viapath, ax25viapath, sizeof(ax25viapath));
+ memcpy(source->msgviapath, msgviapath, sizeof(msgviapath));
+ if (msg_path == NULL) { // default value of via-path !
+ source->msg_path = via_path;
+ memcpy(source->msgviapath, ax25viapath, sizeof(ax25viapath));
+ }
#endif
- source->viscous_delay = viscous_delay;
-
- source->tbf_limit = (ratelimit * TOKENBUCKET_INTERVAL)/60;
- source->tbf_increment = (rateincrement * TOKENBUCKET_INTERVAL)/60;
- source->tokenbucket = source->tbf_limit;
-
- // RE pattern reject filters
- source->sourceregscount = regexsrc.sourceregscount;
- source->sourceregs = regexsrc.sourceregs;
- source->destinationregscount = regexsrc.destinationregscount;
- source->destinationregs = regexsrc.destinationregs;
- source->viaregscount = regexsrc.viaregscount;
- source->viaregs = regexsrc.viaregs;
- source->dataregscount = regexsrc.dataregscount;
- source->dataregs = regexsrc.dataregs;
-
- } else {
- // Errors detected
- free_tracewide(source_trace);
- free_tracewide(source_wide);
- // filters_free(filters);
- // free regexsrc's allocations
- if (debug)
- printf("Seen errors at <digipeater><source> definition.\n");
- }
-
- if (debug>1)printf(" .. <source> definition returning %p\n",source);
- return source;
+ source->viscous_delay = viscous_delay;
+
+ source->tbf_limit = (ratelimit * TOKENBUCKET_INTERVAL)/60;
+ source->tbf_increment = (rateincrement * TOKENBUCKET_INTERVAL)/60;
+ source->tokenbucket = source->tbf_limit;
+
+ // RE pattern reject filters
+ source->sourceregscount = regexsrc.sourceregscount;
+ source->sourceregs = regexsrc.sourceregs;
+ source->destinationregscount = regexsrc.destinationregscount;
+ source->destinationregs = regexsrc.destinationregs;
+ source->viaregscount = regexsrc.viaregscount;
+ source->viaregs = regexsrc.viaregs;
+ source->dataregscount = regexsrc.dataregscount;
+ source->dataregs = regexsrc.dataregs;
+
+ } else {
+ // Errors detected
+ free_tracewide(source_trace);
+ free_tracewide(source_wide);
+ // filters_free(filters);
+ // free regexsrc's allocations
+ if (debug)
+ printf("Seen errors at <digipeater><source> definition.\n");
+ }
+
+ if (debug>1)printf(" .. <source> definition returning %p\n",source);
+ return source;
}
int digipeater_config(struct configfile *cf)
{
- char *name, *param1;
- char *str = cf->buf;
- int has_fault = 0;
- int i;
- const int line0 = cf->linenum;
-
- struct aprx_interface *aif = NULL;
- float ratelimit = 60;
- float rateincrement = 60;
- float srcratelimit = 60;
- float srcrateincrement = 60;
- int sourcecount = 0;
- int dupestoretime = 30; // FIXME: parametrize! 30 is minimum..
- struct digipeater_source **sources = NULL;
- struct digipeater *digi = NULL;
- struct tracewide *traceparam = NULL;
- struct tracewide *wideparam = NULL;
-
- while (readconfigline(cf) != NULL) {
- if (configline_is_comment(cf))
- continue; /* Comment line, or empty line */
-
- // It can be severely indented...
- str = config_SKIPSPACE(cf->buf);
-
- name = str;
- str = config_SKIPTEXT(str, NULL);
- str = config_SKIPSPACE(str);
- config_STRLOWER(name);
-
- param1 = str;
- str = config_SKIPTEXT(str, NULL);
- str = config_SKIPSPACE(str);
-
- if (strcmp(name, "</digipeater>") == 0) {
- break;
- }
- if (strcmp(name, "transmit") == 0 ||
- strcmp(name, "transmitter") == 0) {
- if (strcasecmp(param1,"$mycall") == 0)
- param1 = (char*)mycall;
-
- aif = find_interface_by_callsign(param1);
- if (aif != NULL && (!aif->tx_ok)) {
- aif = NULL; // Not
- printf("%s:%d ERROR: This transmit interface has no TX-OK TRUE setting: '%s'\n",
- cf->name, cf->linenum, param1);
- has_fault = 1;
- } else if (aif != NULL && aif->txrefcount > 0) {
- aif = NULL;
- printf("%s:%d ERROR: This transmit interface is being used on multiple <digipeater>s as transmitter: '%s'\n",
- cf->name, cf->linenum, param1);
- has_fault = 1;
- } else if (aif == NULL) {
- printf("%s:%d ERROR: Unknown interface: '%s'\n",
- cf->name, cf->linenum, param1);
- has_fault = 1;
- }
-
- } else if (strcmp(name, "ratelimit") == 0) {
- char *param2 = str;
- str = config_SKIPTEXT(str, NULL);
- str = config_SKIPSPACE(str);
-
- rateincrement = (float)atof(param1);
- ratelimit = (float)atof(param2);
- if (rateincrement < 0.01 || rateincrement > rateincrementmax)
- rateincrement = 60;
- if (ratelimit < 0.01 || ratelimit > ratelimitmax)
- ratelimit = 60;
- if (ratelimit < rateincrement)
- rateincrement = ratelimit;
- if (debug)
- printf(" .. ratelimit %f %f\n",
- rateincrement, ratelimit);
-
- } else if (strcmp(name, "srcratelimit") == 0) {
- char *param2 = str;
- str = config_SKIPTEXT(str, NULL);
- str = config_SKIPSPACE(str);
-
- srcrateincrement = (float)atof(param1);
- srcratelimit = (float)atof(param2);
- if (srcrateincrement < 0.01 || srcrateincrement > rateincrementmax)
- srcrateincrement = 60;
- if (srcratelimit < 0.01 || srcratelimit > ratelimitmax)
- srcratelimit = 60;
- if (srcratelimit < srcrateincrement)
- srcrateincrement = srcratelimit;
- if (debug)
- printf(" .. srcratelimit %f %f\n",
- srcrateincrement, srcratelimit);
-
- } else if (strcmp(name, "<trace>") == 0) {
- if (traceparam == NULL) {
- traceparam = digipeater_config_tracewide(cf, 1);
- if (traceparam == NULL) {
- printf("%s:%d ERROR: <trace> definition failed!\n",
- cf->name, cf->linenum);
- has_fault = 1;
- }
- } else {
- printf("%s:%d ERROR: Double definition of <trace> !\n",
- cf->name, cf->linenum);
- has_fault = 1;
- }
-
- } else if (strcmp(name, "<wide>") == 0) {
- if (wideparam == NULL) {
- wideparam = digipeater_config_tracewide(cf, 0);
- if (wideparam == NULL) {
- printf("%s:%d ERROR: <wide> definition failed!\n",
- cf->name, cf->linenum);
- has_fault = 1;
- }
- } else {
- printf("%s:%d ERROR: Double definition of <wide> !\n",
- cf->name, cf->linenum);
- has_fault = 1;
- }
-
- } else if (strcmp(name, "<source>") == 0) {
- struct digipeater_source *src =
- digipeater_config_source(cf);
- if (src != NULL) {
- // Found a source, link it!
- sources = realloc(sources, sizeof(void*) * (sourcecount+1));
- sources[sourcecount] = src;
- ++sourcecount;
- } else {
- has_fault = 1;
- printf("%s:%d ERROR: <source> definition failed\n",
- cf->name, cf->linenum);
- }
-
- } else {
- printf("%s:%d ERROR: Unknown <digipeater> config keyword: '%s'\n",
- cf->name, cf->linenum, name);
- has_fault = 1;
- continue;
- }
- }
-
- if (aif == NULL && !has_fault) {
- printf("%s:%d ERROR: Digipeater defined without transmit interface.\n",
- cf->name, cf->linenum);
- has_fault = 1;
- }
- if (sourcecount == 0 && !has_fault) {
- printf("%s:%d ERROR: Digipeater defined without <source>:s.\n",
- cf->name, cf->linenum);
- has_fault = 1;
- }
- // Check that source definitions are unique
- for ( i = 0; i < sourcecount; ++i ) {
- int j;
- for (j = i+1; j < sourcecount; ++j) {
- if (sources[i]->src_if == sources[j]->src_if) {
- has_fault = 1;
- printf("%s:%d Two <source>s on this <digipeater> definition use same <interface>: '%s'\n",
- cf->name, line0, sources[i]->src_if->callsign);
- }
- }
- }
-
- if (has_fault) {
- // Free allocated resources and link pointers, if any
- for ( i = 0; i < sourcecount; ++i ) {
- free_source(sources[i]);
- }
- if (sources != NULL)
- free(sources);
-
- free_tracewide(traceparam);
- free_tracewide(wideparam);
-
- printf("ERROR: Config fault observed on <digipeater> definitions! \n");
- } else {
- // Construct the digipeater
-
- digi = calloc(1,sizeof(*digi));
-
- if (debug>1)printf("<digipeater> sourcecount=%d\n",sourcecount);
-
- // up-link all interfaces used as sources
- for ( i = 0; i < sourcecount; ++i ) {
- struct digipeater_source *src = sources[i];
- src->parent = digi; // Set parent link
-
- src->src_if->digisources = realloc( src->src_if->digisources,
- (src->src_if->digisourcecount +1) * (sizeof(void*)));
- src->src_if->digisources[src->src_if->digisourcecount] = src;
- src->src_if->digisourcecount += 1;
- }
-
- aif->txrefcount += 1; // Increment Tx usage Reference count.
- // We permit only one <digipeater> to
- // use any given Tx-interface. (Rx:es
- // permit multiple uses.)
- digi->transmitter = aif;
- digi->tbf_limit = (ratelimit * TOKENBUCKET_INTERVAL)/60;
- digi->tbf_increment = (rateincrement * TOKENBUCKET_INTERVAL)/60;
- digi->src_tbf_limit = (srcratelimit * TOKENBUCKET_INTERVAL)/60;
- digi->src_tbf_increment = (srcrateincrement * TOKENBUCKET_INTERVAL)/60;
- digi->tokenbucket = digi->tbf_limit;
-
- digi->dupechecker = dupecheck_new(dupestoretime); // Dupecheck is per transmitter
+ char *name, *param1;
+ char *str = cf->buf;
+ int has_fault = 0;
+ int i;
+ const int line0 = cf->linenum;
+
+ struct aprx_interface *aif = NULL;
+ float ratelimit = 60;
+ float rateincrement = 60;
+ float srcratelimit = 60;
+ float srcrateincrement = 60;
+ int sourcecount = 0;
+ int dupestoretime = 30; // FIXME: parametrize! 30 is minimum..
+ struct digipeater_source **sources = NULL;
+ struct digipeater *digi = NULL;
+ struct tracewide *traceparam = NULL;
+ struct tracewide *wideparam = NULL;
+
+ while (readconfigline(cf) != NULL) {
+ if (configline_is_comment(cf))
+ continue; /* Comment line, or empty line */
+
+ // It can be severely indented...
+ str = config_SKIPSPACE(cf->buf);
+
+ name = str;
+ str = config_SKIPTEXT(str, NULL);
+ str = config_SKIPSPACE(str);
+ config_STRLOWER(name);
+
+ param1 = str;
+ str = config_SKIPTEXT(str, NULL);
+ str = config_SKIPSPACE(str);
+
+ if (strcmp(name, "</digipeater>") == 0) {
+ break;
+ }
+ if (strcmp(name, "transmit") == 0 ||
+ strcmp(name, "transmitter") == 0) {
+ if (strcasecmp(param1,"$mycall") == 0)
+ param1 = (char*)mycall;
+
+ aif = find_interface_by_callsign(param1);
+ if (aif != NULL && (!aif->tx_ok)) {
+ aif = NULL; // Not
+ printf("%s:%d ERROR: This transmit interface has no TX-OK TRUE setting: '%s'\n",
+ cf->name, cf->linenum, param1);
+ has_fault = 1;
+ } else if (aif != NULL && aif->txrefcount > 0) {
+ aif = NULL;
+ printf("%s:%d ERROR: This transmit interface is being used on multiple <digipeater>s as transmitter: '%s'\n",
+ cf->name, cf->linenum, param1);
+ has_fault = 1;
+ } else if (aif == NULL) {
+ printf("%s:%d ERROR: Unknown interface: '%s'\n",
+ cf->name, cf->linenum, param1);
+ has_fault = 1;
+ }
+
+ } else if (strcmp(name, "ratelimit") == 0) {
+ char *param2 = str;
+ str = config_SKIPTEXT(str, NULL);
+ str = config_SKIPSPACE(str);
+
+ rateincrement = (float)atof(param1);
+ ratelimit = (float)atof(param2);
+ if (rateincrement < 0.01 || rateincrement > rateincrementmax)
+ rateincrement = 60;
+ if (ratelimit < 0.01 || ratelimit > ratelimitmax)
+ ratelimit = 60;
+ if (ratelimit < rateincrement)
+ rateincrement = ratelimit;
+ if (debug)
+ printf(" .. ratelimit %f %f\n",
+ rateincrement, ratelimit);
+
+ } else if (strcmp(name, "srcratelimit") == 0) {
+ char *param2 = str;
+ str = config_SKIPTEXT(str, NULL);
+ str = config_SKIPSPACE(str);
+
+ srcrateincrement = (float)atof(param1);
+ srcratelimit = (float)atof(param2);
+ if (srcrateincrement < 0.01 || srcrateincrement > rateincrementmax)
+ srcrateincrement = 60;
+ if (srcratelimit < 0.01 || srcratelimit > ratelimitmax)
+ srcratelimit = 60;
+ if (srcratelimit < srcrateincrement)
+ srcrateincrement = srcratelimit;
+ if (debug)
+ printf(" .. srcratelimit %f %f\n",
+ srcrateincrement, srcratelimit);
+
+ } else if (strcmp(name, "<trace>") == 0) {
+ if (traceparam == NULL) {
+ traceparam = digipeater_config_tracewide(cf, 1);
+ if (traceparam == NULL) {
+ printf("%s:%d ERROR: <trace> definition failed!\n",
+ cf->name, cf->linenum);
+ has_fault = 1;
+ }
+ } else {
+ printf("%s:%d ERROR: Double definition of <trace> !\n",
+ cf->name, cf->linenum);
+ has_fault = 1;
+ }
+
+ } else if (strcmp(name, "<wide>") == 0) {
+ if (wideparam == NULL) {
+ wideparam = digipeater_config_tracewide(cf, 0);
+ if (wideparam == NULL) {
+ printf("%s:%d ERROR: <wide> definition failed!\n",
+ cf->name, cf->linenum);
+ has_fault = 1;
+ }
+ } else {
+ printf("%s:%d ERROR: Double definition of <wide> !\n",
+ cf->name, cf->linenum);
+ has_fault = 1;
+ }
+
+ } else if (strcmp(name, "<source>") == 0) {
+ struct digipeater_source *src =
+ digipeater_config_source(cf);
+ if (src != NULL) {
+ // Found a source, link it!
+ sources = realloc(sources, sizeof(void*) * (sourcecount+1));
+ sources[sourcecount] = src;
+ ++sourcecount;
+ } else {
+ has_fault = 1;
+ printf("%s:%d ERROR: <source> definition failed\n",
+ cf->name, cf->linenum);
+ }
+
+ } else {
+ printf("%s:%d ERROR: Unknown <digipeater> config keyword: '%s'\n",
+ cf->name, cf->linenum, name);
+ has_fault = 1;
+ continue;
+ }
+ }
+
+ if (aif == NULL && !has_fault) {
+ printf("%s:%d ERROR: Digipeater defined without transmit interface.\n",
+ cf->name, cf->linenum);
+ has_fault = 1;
+ }
+ if (sourcecount == 0 && !has_fault) {
+ printf("%s:%d ERROR: Digipeater defined without <source>:s.\n",
+ cf->name, cf->linenum);
+ has_fault = 1;
+ }
+ // Check that source definitions are unique
+ for ( i = 0; i < sourcecount; ++i ) {
+ int j;
+ for (j = i+1; j < sourcecount; ++j) {
+ if (sources[i]->src_if == sources[j]->src_if) {
+ has_fault = 1;
+ printf("%s:%d Two <source>s on this <digipeater> definition use same <interface>: '%s'\n",
+ cf->name, line0, sources[i]->src_if->callsign);
+ }
+ }
+ }
+
+ if (has_fault) {
+ // Free allocated resources and link pointers, if any
+ for ( i = 0; i < sourcecount; ++i ) {
+ free_source(sources[i]);
+ }
+ if (sources != NULL)
+ free(sources);
+
+ free_tracewide(traceparam);
+ free_tracewide(wideparam);
+
+ printf("ERROR: Config fault observed on <digipeater> definitions! \n");
+ } else {
+ // Construct the digipeater
+
+ digi = calloc(1,sizeof(*digi));
+
+ if (debug>1)printf("<digipeater> sourcecount=%d\n",sourcecount);
+
+ // up-link all interfaces used as sources
+ for ( i = 0; i < sourcecount; ++i ) {
+ struct digipeater_source *src = sources[i];
+ src->parent = digi; // Set parent link
+
+ src->src_if->digisources = realloc( src->src_if->digisources,
+ (src->src_if->digisourcecount +1) * (sizeof(void*)));
+ src->src_if->digisources[src->src_if->digisourcecount] = src;
+ src->src_if->digisourcecount += 1;
+ }
+
+ aif->txrefcount += 1; // Increment Tx usage Reference count.
+ // We permit only one <digipeater> to
+ // use any given Tx-interface. (Rx:es
+ // permit multiple uses.)
+ digi->transmitter = aif;
+ digi->tbf_limit = (ratelimit * TOKENBUCKET_INTERVAL)/60;
+ digi->tbf_increment = (rateincrement * TOKENBUCKET_INTERVAL)/60;
+ digi->src_tbf_limit = (srcratelimit * TOKENBUCKET_INTERVAL)/60;
+ digi->src_tbf_increment = (srcrateincrement * TOKENBUCKET_INTERVAL)/60;
+ digi->tokenbucket = digi->tbf_limit;
+
+ digi->dupechecker = dupecheck_new(dupestoretime); // Dupecheck is per transmitter
#ifndef DISABLE_IGATE
- digi->historydb = historydb_new(); // HistoryDB is per transmitter
+ digi->historydb = historydb_new(); // HistoryDB is per transmitter
#endif
- digi->trace = (traceparam != NULL) ? traceparam : & default_trace_param;
- digi->wide = (wideparam != NULL) ? wideparam : & default_wide_param;
+ digi->trace = (traceparam != NULL) ? traceparam : & default_trace_param;
+ digi->wide = (wideparam != NULL) ? wideparam : & default_wide_param;
- digi->sourcecount = sourcecount;
- digi->sources = sources;
+ digi->sourcecount = sourcecount;
+ digi->sources = sources;
- digis = realloc( digis, sizeof(void*) * (digi_count+1));
- digis[digi_count] = digi;
- ++digi_count;
- }
- return has_fault;
+ digis = realloc( digis, sizeof(void*) * (digi_count+1));
+ digis[digi_count] = digi;
+ ++digi_count;
+ }
+ return has_fault;
}
static int decrement_ssid(uint8_t *ax25addr)
{
- // bit-field manipulation
- int ssid = (ax25addr[AX25ADDRLEN-1] >> 1) & 0x0F;
- if (ssid > 0)
- --ssid;
- ax25addr[AX25ADDRLEN-1] = (ax25addr[AX25ADDRLEN-1] & 0xE1) | (ssid << 1);
- return ssid;
+ // bit-field manipulation
+ int ssid = (ax25addr[AX25ADDRLEN-1] >> 1) & 0x0F;
+ if (ssid > 0)
+ --ssid;
+ ax25addr[AX25ADDRLEN-1] = (ax25addr[AX25ADDRLEN-1] & 0xE1) | (ssid << 1);
+ return ssid;
}
/* 0 == accept, otherwise reject */
/*
-int digipeater_receive_filter(struct digipeater_source *src, struct pbuf_t *pb)
-{
-
- if (src->src_filters == NULL) {
- if (debug>1)
- printf("No source filters, accepted the packet from %s.\n", src->src_if->callsign);
- return 0;
- }
- int rc = filter_process(pb, src->src_filters, src->parent->historydb);
- if (rc != 1) {
- if (debug>1)
- printf("Source filtering rejected the packet from %s.\n", src->src_if->callsign);
- return 1;
- }
- if (debug>1)
- printf("Source filtering accepted the packet from %s.\n", src->src_if->callsign);
- return 0;
-}
-*/
+ int digipeater_receive_filter(struct digipeater_source *src, struct pbuf_t *pb)
+ {
+
+ if (src->src_filters == NULL) {
+ if (debug>1)
+ printf("No source filters, accepted the packet from %s.\n", src->src_if->callsign);
+ return 0;
+ }
+ int rc = filter_process(pb, src->src_filters, src->parent->historydb);
+ if (rc != 1) {
+ if (debug>1)
+ printf("Source filtering rejected the packet from %s.\n", src->src_if->callsign);
+ return 1;
+ }
+ if (debug>1)
+ printf("Source filtering accepted the packet from %s.\n", src->src_if->callsign);
+ return 0;
+ }
+ */
static void digipeater_receive_backend(struct digipeater_source *src, struct pbuf_t *pb)
{
- int len, viaindex;
- struct digistate state;
- struct viastate viastate;
- struct digipeater *digi = src->parent;
- char viafield[14]; // room for text format
- uint8_t *axaddr, *e;
-
- memset(&state, 0, sizeof(state));
- memset(&viastate, 0, sizeof(viastate));
-
- // 2) Verify that none of our interface callsigns does match any
- // of already DIGIPEATED via fields! (fields that have H-bit set)
- // ( present implementation: this digi's transmitter callsign is
- // verified)
-
- // Parse executed and requested WIDEn-N/TRACEn-N info
- if (parse_tnc2_hops(&state, src, pb)) {
- // A fault was observed! -- tests include "not this transmitter"
- if (debug>1)
- printf("Parse_tnc2_hops rejected this.");
- return;
- }
-
- if (pb->is_aprs) {
-
- if (state.v.probably_heard_direct) {
- // Collect a decaying average of distances to stations?
- // .. could auto-beacon an aloha-circle - maybe
- // .. note: this does not get packets that have no VIA fields.
- // Score of direct DX:es?
- // .. note: this does not get packets that have no VIA fields.
- } else {
- if (src->src_relaytype == DIGIRELAY_DIGIPEAT_DIRECTONLY) {
- // Source relaytype is DIRECTONLY, and this was not
- // likely directly heard...
- if (debug>1) printf("DIRECTONLY -mode, and packet is probably not direct heard.");
- return;
- }
- }
- // Keep score of all DX packets?
-
- if (try_reject_filters(3, pb->info_start, src)) {
- if (debug>1)
- printf(" - Data body regexp filters reject\n");
- return; // data body regexp reject filters
- }
-
- // FIXME: 3) aprsc style filters checking in service area of the packet..
-
- }
-
- // 4) Hop-count filtering:
-
- // APRSIS sourced packets have different rules than DIGIPEAT
- // packets...
- if (state.v.hopsreq <= state.v.hopsdone) {
- if (debug>1) printf(" No remaining hops to execute.\n");
- return;
- }
- if (state.v.hopsreq > digi->trace->maxreq ||
- state.v.hopsreq > digi->wide->maxreq ||
- state.v.tracereq > digi->trace->maxreq ||
- state.v.hopsdone > digi->trace->maxdone ||
- state.v.hopsdone > digi->wide->maxdone ||
- state.v.tracedone > digi->trace->maxdone) {
- if (debug) printf(" Packet exceeds digipeat limits\n");
- if (!state.v.probably_heard_direct) {
- if (debug) printf(".. discard.\n");
- return;
- } else {
- state.v.fixall = 1;
- }
- }
-
- // if (debug) printf(" Packet accepted to digipeat!\n");
-
- state.ax25addrlen = pb->ax25addrlen;
- memcpy(state.ax25addr, pb->ax25addr, pb->ax25addrlen);
- axaddr = state.ax25addr + 2*AX25ADDRLEN;
- e = state.ax25addr + state.ax25addrlen;
-
- if (state.v.fixall) {
- // Okay, insert my transmitter callsign on the first
- // VIA field, and mark the rest with H-bit
- // (in search loop below)
- int taillen = e - axaddr;
- if (state.ax25addrlen >= AX25ADDRMAXLEN) {
- if (debug) printf(" FIXALL TRACE overgrows the VIA fields! Dropping last of incoming ones.\n");
- // Drop the last via field to make room for insert below.
- state.ax25addrlen -= AX25ADDRLEN;
- taillen -= AX25ADDRLEN;
- }
- // If we have a tail, move it up (there is always room for it)
- if (taillen > 0)
- memmove(axaddr+AX25ADDRLEN, axaddr, taillen);
- state.ax25addrlen += AX25ADDRLEN;
- e = state.ax25addr + state.ax25addrlen; // recalculate!
-
- // Put the transmitter callsign in
- memcpy(axaddr, digi->transmitter->ax25call, AX25ADDRLEN);
-
- // Set Address Termination bit at the last VIA field
- // (possibly ours, or maybe the previous one was truncated..)
- axaddr[state.ax25addrlen-1] |= AX25ATERM;
- }
-
- // Search for first AX.25 VIA field that does not have H-bit set:
- viaindex = 1; // First via field is number 2
- *viafield = 0; // clear that buffer for starters
- for (; axaddr < e; axaddr += AX25ADDRLEN, ++viaindex) {
- ax25_to_tnc2_fmtaddress(viafield, axaddr, 0);
- // if (debug>1) {
- // printf(" via: %s", viafield);
- // }
-
- // Initial parsing said that things are seriously wrong..
- // .. and we will digipeat the packet with all H-bits set.
- if (state.v.fixall) axaddr[AX25ADDRLEN-1] |= AX25HBIT;
-
- if (!(axaddr[AX25ADDRLEN-1] & AX25HBIT)) // No "Has Been Digipeated" bit set
- break; // this doesn't happen in "fixall" mode
- }
-
- switch (src->src_relaytype) {
- case DIGIRELAY_THIRDPARTY:
- // Effectively disable the digipeat modifying of address
- axaddr = e;
- break;
- case DIGIRELAY_DIGIPEAT:
- // Normal functionality
- break;
- default: ;
- }
-
- // Unprocessed VIA field found (not in FIXALL mode)
- if (axaddr < e) { // VIA-field of interest has been found
-
-// FIXME: 5) / 6) Cross-frequency/cross-band digipeat may add a special
-// label telling that the message originated on other band
-
- // 7) WIDEn-N treatment (as well as transmitter matching digi)
- if (pb->digi_like_aprs) {
- if (strcmp(viafield,digi->transmitter->callsign) == 0 ||
- // Match on the transmitter callsign without the star...
- match_aliases(viafield, digi->transmitter)) {
- // .. or match transmitter interface alias.
-
- // Treat it as a TRACE request.
-
- int aterm = axaddr[AX25ADDRLEN-1] & AX25ATERM; // save old address termination bit
- // Put the transmitter callsign in, and set the H-bit.
- memcpy(axaddr, digi->transmitter->ax25call, AX25ADDRLEN);
- axaddr[AX25ADDRLEN-1] |= (AX25HBIT | aterm); // Set H-bit
-
- } else if ((len = match_tracewide(viafield, src->src_trace))) {
- count_single_tnc2_tracewide(&viastate, viafield, 1, len, viaindex);
- } else if ((len = match_tracewide(viafield, digi->trace))) {
- count_single_tnc2_tracewide(&viastate, viafield, 1, len, viaindex);
- } else if ((len = match_tracewide(viafield, src->src_wide))) {
- count_single_tnc2_tracewide(&viastate, viafield, 0, len, viaindex);
- } else if ((len = match_tracewide(viafield, digi->wide))) {
- count_single_tnc2_tracewide(&viastate, viafield, 0, len, viaindex);
- }
-
- } else { // Not "digi_as_aprs" rules
-
- if (strcmp(viafield,digi->transmitter->callsign) == 0) {
- // Match on the transmitter callsign without the star.
- // Treat it as a TRACE request.
- int aterm = axaddr[AX25ADDRLEN-1] & AX25ATERM; // save old address termination bit
- // Put the transmitter callsign in, and set the H-bit.
- memcpy(axaddr, digi->transmitter->ax25call, AX25ADDRLEN);
- axaddr[AX25ADDRLEN-1] |= (AX25HBIT | aterm); // Set H-bit
-
- } else if (match_aliases(viafield, digi->transmitter)) {
- // Match on the aliases.
- // Treat it as a TRACE request.
- int aterm = axaddr[AX25ADDRLEN-1] & AX25ATERM; // save old address termination bit
- // Put the transmitter callsign in, and set the H-bit.
- memcpy(axaddr, digi->transmitter->ax25call, AX25ADDRLEN);
- axaddr[AX25ADDRLEN-1] |= (AX25HBIT | aterm); // Set H-bit
- }
- }
-
- if (viastate.tracereq > viastate.tracedone) {
- // if (debug) printf(" TRACE on %s!\n",viafield);
- // Must move it up in memory to be able to put
- // transmitter callsign in
- int taillen = e - axaddr;
- int newssid;
- if (state.ax25addrlen >= AX25ADDRMAXLEN) {
- if (debug) printf(" TRACE overgrows the VIA fields! Discard.\n");
- return;
- }
- memmove(axaddr+AX25ADDRLEN, axaddr, taillen);
- state.ax25addrlen += AX25ADDRLEN;
-
- newssid = decrement_ssid(axaddr+AX25ADDRLEN);
- if (newssid <= 0)
- axaddr[2*AX25ADDRLEN-1] |= AX25HBIT; // Set H-bit
- // Put the transmitter callsign in, and set the H-bit.
- memcpy(axaddr, digi->transmitter->ax25call, AX25ADDRLEN);
- axaddr[AX25ADDRLEN-1] |= AX25HBIT; // Set H-bit
-
- } else if (viastate.hopsreq > viastate.hopsdone) {
- // If configuration didn't process "WIDE" et.al. as
- // a TRACE, then here we process them without trace..
- int newssid;
- if (debug) printf(" VIA on %s!\n",viafield);
- newssid = decrement_ssid(axaddr);
- if (newssid <= 0)
- axaddr[AX25ADDRLEN-1] |= AX25HBIT; // Set H-bit
- }
- }
- {
- history_cell_t *hcell;
- char tbuf[2800];
- int is_ui = 0, ui_pid = -1, frameaddrlen = 0, tnc2addrlen = 0, t2l;
- // uint8_t *u = state.ax25addr + state.ax25addrlen;
- // *u++ = 0;
- // *u++ = 0;
- // *u++ = 0;
- t2l = ax25_format_to_tnc( state.ax25addr,
- state.ax25addrlen+AX25ADDRLEN-1,
- tbuf, sizeof(tbuf),
- & frameaddrlen, &tnc2addrlen,
- & is_ui, &ui_pid );
- tbuf[t2l] = 0;
- if (debug) {
- printf(" out-hdr: '%s' data='",tbuf);
- (void)fwrite(pb->ax25data+2, pb->ax25datalen-2, // without Control+PID
- 1, stdout);
- printf("'\n");
- }
+ int len, viaindex;
+ struct digistate state;
+ struct viastate viastate;
+ struct digipeater *digi = src->parent;
+ char viafield[14]; // room for text format
+ uint8_t *axaddr, *e;
+
+ memset(&state, 0, sizeof(state));
+ memset(&viastate, 0, sizeof(viastate));
+
+ // 2) Verify that none of our interface callsigns does match any
+ // of already DIGIPEATED via fields! (fields that have H-bit set)
+ // ( present implementation: this digi's transmitter callsign is
+ // verified)
+
+ // Parse executed and requested WIDEn-N/TRACEn-N info
+ if (parse_tnc2_hops(&state, src, pb)) {
+ // A fault was observed! -- tests include "not this transmitter"
+ if (debug>1)
+ printf("Parse_tnc2_hops rejected this.");
+ return;
+ }
+
+ if (pb->is_aprs) {
+
+ if (state.v.probably_heard_direct) {
+ // Collect a decaying average of distances to stations?
+ // .. could auto-beacon an aloha-circle - maybe
+ // .. note: this does not get packets that have no VIA fields.
+ // Score of direct DX:es?
+ // .. note: this does not get packets that have no VIA fields.
+ } else {
+ if (src->src_relaytype == DIGIRELAY_DIGIPEAT_DIRECTONLY) {
+ // Source relaytype is DIRECTONLY, and this was not
+ // likely directly heard...
+ if (debug>1) printf("DIRECTONLY -mode, and packet is probably not direct heard.");
+ return;
+ }
+ }
+ // Keep score of all DX packets?
+
+ if (try_reject_filters(3, pb->info_start, src)) {
+ if (debug>1)
+ printf(" - Data body regexp filters reject\n");
+ return; // data body regexp reject filters
+ }
+
+ // FIXME: 3) aprsc style filters checking in service area of the packet..
+
+ }
+
+ // 4) Hop-count filtering:
+
+ // APRSIS sourced packets have different rules than DIGIPEAT
+ // packets...
+ if (state.v.hopsreq <= state.v.hopsdone) {
+ if (debug>1) printf(" No remaining hops to execute.\n");
+ return;
+ }
+ if (state.v.hopsreq > digi->trace->maxreq ||
+ state.v.hopsreq > digi->wide->maxreq ||
+ state.v.tracereq > digi->trace->maxreq ||
+ state.v.digidone > digi->trace->maxdone ||
+ state.v.digidone > digi->wide->maxdone ||
+ state.v.hopsdone > digi->trace->maxdone ||
+ state.v.hopsdone > digi->wide->maxdone ||
+ state.v.tracedone > digi->trace->maxdone) {
+ if (debug) printf(" Packet exceeds digipeat limits\n");
+ if (!state.v.probably_heard_direct) {
+ if (debug) printf(".. discard.\n");
+ return;
+ } else {
+ state.v.fixall = 1;
+ }
+ }
+
+ // if (debug) printf(" Packet accepted to digipeat!\n");
+
+ state.ax25addrlen = pb->ax25addrlen;
+ memcpy(state.ax25addr, pb->ax25addr, pb->ax25addrlen);
+ axaddr = state.ax25addr + 2*AX25ADDRLEN;
+ e = state.ax25addr + state.ax25addrlen;
+
+ if (state.v.fixall) {
+ // Okay, insert my transmitter callsign on the first
+ // VIA field, and mark the rest with H-bit
+ // (in search loop below)
+ int taillen = e - axaddr;
+ if (state.ax25addrlen >= AX25ADDRMAXLEN) {
+ if (debug) printf(" FIXALL TRACE overgrows the VIA fields! Dropping last of incoming ones.\n");
+ // Drop the last via field to make room for insert below.
+ state.ax25addrlen -= AX25ADDRLEN;
+ taillen -= AX25ADDRLEN;
+ }
+ // If we have a tail, move it up (there is always room for it)
+ if (taillen > 0)
+ memmove(axaddr+AX25ADDRLEN, axaddr, taillen);
+ state.ax25addrlen += AX25ADDRLEN;
+ e = state.ax25addr + state.ax25addrlen; // recalculate!
+
+ // Put the transmitter callsign in
+ memcpy(axaddr, digi->transmitter->ax25call, AX25ADDRLEN);
+
+ // Set Address Termination bit at the last VIA field
+ // (possibly ours, or maybe the previous one was truncated..)
+ axaddr[state.ax25addrlen-1] |= AX25ATERM;
+ }
+
+ // Search for first AX.25 VIA field that does not have H-bit set:
+ viaindex = 1; // First via field is number 2
+ *viafield = 0; // clear that buffer for starters
+ for (; axaddr < e; axaddr += AX25ADDRLEN, ++viaindex) {
+ ax25_to_tnc2_fmtaddress(viafield, axaddr, 0);
+ // if (debug>1) {
+ // printf(" via: %s", viafield);
+ // }
+
+ // Initial parsing said that things are seriously wrong..
+ // .. and we will digipeat the packet with all H-bits set.
+ if (state.v.fixall) axaddr[AX25ADDRLEN-1] |= AX25HBIT;
+
+ if (!(axaddr[AX25ADDRLEN-1] & AX25HBIT)) // No "Has Been Digipeated" bit set
+ break; // this doesn't happen in "fixall" mode
+ }
+
+ switch (src->src_relaytype) {
+ case DIGIRELAY_THIRDPARTY:
+ // Effectively disable the digipeat modifying of address
+ axaddr = e;
+ break;
+ case DIGIRELAY_DIGIPEAT:
+ // Normal functionality
+ break;
+ default: ;
+ }
+
+ // Unprocessed VIA field found (not in FIXALL mode)
+ if (axaddr < e) { // VIA-field of interest has been found
+
+ // FIXME: 5) / 6) Cross-frequency/cross-band digipeat may add a special
+ // label telling that the message originated on other band
+
+ // 7) WIDEn-N treatment (as well as transmitter matching digi)
+ if (pb->digi_like_aprs) {
+ if (strcmp(viafield,digi->transmitter->callsign) == 0 ||
+ // Match on the transmitter callsign without the star...
+ match_aliases(viafield, digi->transmitter)) {
+ // .. or match transmitter interface alias.
+
+ // Treat it as a TRACE request.
+
+ int aterm = axaddr[AX25ADDRLEN-1] & AX25ATERM; // save old address termination bit
+ // Put the transmitter callsign in, and set the H-bit.
+ memcpy(axaddr, digi->transmitter->ax25call, AX25ADDRLEN);
+ axaddr[AX25ADDRLEN-1] |= (AX25HBIT | aterm); // Set H-bit
+
+ } else if ((len = match_tracewide(viafield, src->src_trace))) {
+ count_single_tnc2_tracewide(&viastate, viafield, 1, len, viaindex);
+ } else if ((len = match_tracewide(viafield, digi->trace))) {
+ count_single_tnc2_tracewide(&viastate, viafield, 1, len, viaindex);
+ } else if ((len = match_tracewide(viafield, src->src_wide))) {
+ count_single_tnc2_tracewide(&viastate, viafield, 0, len, viaindex);
+ } else if ((len = match_tracewide(viafield, digi->wide))) {
+ count_single_tnc2_tracewide(&viastate, viafield, 0, len, viaindex);
+ }
+
+ } else { // Not "digi_as_aprs" rules
+
+ if (strcmp(viafield,digi->transmitter->callsign) == 0) {
+ // Match on the transmitter callsign without the star.
+ // Treat it as a TRACE request.
+ int aterm = axaddr[AX25ADDRLEN-1] & AX25ATERM; // save old address termination bit
+ // Put the transmitter callsign in, and set the H-bit.
+ memcpy(axaddr, digi->transmitter->ax25call, AX25ADDRLEN);
+ axaddr[AX25ADDRLEN-1] |= (AX25HBIT | aterm); // Set H-bit
+
+ } else if (match_aliases(viafield, digi->transmitter)) {
+ // Match on the aliases.
+ // Treat it as a TRACE request.
+ int aterm = axaddr[AX25ADDRLEN-1] & AX25ATERM; // save old address termination bit
+ // Put the transmitter callsign in, and set the H-bit.
+ memcpy(axaddr, digi->transmitter->ax25call, AX25ADDRLEN);
+ axaddr[AX25ADDRLEN-1] |= (AX25HBIT | aterm); // Set H-bit
+ }
+ }
+
+ if (viastate.tracereq > viastate.tracedone) {
+ // if (debug) printf(" TRACE on %s!\n",viafield);
+ // Must move it up in memory to be able to put
+ // transmitter callsign in
+ int taillen = e - axaddr;
+ int newssid;
+ if (state.ax25addrlen >= AX25ADDRMAXLEN) {
+ if (debug) printf(" TRACE overgrows the VIA fields! Discard.\n");
+ return;
+ }
+ memmove(axaddr+AX25ADDRLEN, axaddr, taillen);
+ state.ax25addrlen += AX25ADDRLEN;
+
+ newssid = decrement_ssid(axaddr+AX25ADDRLEN);
+ if (newssid <= 0)
+ axaddr[2*AX25ADDRLEN-1] |= AX25HBIT; // Set H-bit
+ // Put the transmitter callsign in, and set the H-bit.
+ memcpy(axaddr, digi->transmitter->ax25call, AX25ADDRLEN);
+ axaddr[AX25ADDRLEN-1] |= AX25HBIT; // Set H-bit
+
+ } else if (viastate.hopsreq > viastate.hopsdone) {
+ // If configuration didn't process "WIDE" et.al. as
+ // a TRACE, then here we process them without trace..
+ int newssid;
+ if (debug) printf(" VIA on %s!\n",viafield);
+ newssid = decrement_ssid(axaddr);
+ if (newssid <= 0)
+ axaddr[AX25ADDRLEN-1] |= AX25HBIT; // Set H-bit
+ }
+ }
+ {
+ history_cell_t *hcell;
+ char tbuf[2800];
+ int is_ui = 0, ui_pid = -1, frameaddrlen = 0, tnc2addrlen = 0, t2l;
+ // uint8_t *u = state.ax25addr + state.ax25addrlen;
+ // *u++ = 0;
+ // *u++ = 0;
+ // *u++ = 0;
+ t2l = ax25_format_to_tnc( state.ax25addr,
+ state.ax25addrlen+AX25ADDRLEN-1,
+ tbuf, sizeof(tbuf),
+ & frameaddrlen, &tnc2addrlen,
+ & is_ui, &ui_pid );
+ tbuf[t2l] = 0;
+ if (debug) {
+ printf(" out-hdr: '%s' data='",tbuf);
+ (void)fwrite(pb->ax25data+2, pb->ax25datalen-2, // without Control+PID
+ 1, stdout);
+ printf("'\n");
+ }
#ifndef DISABLE_IGATE
- // Insert into history database - track every packet
- hcell = historydb_insert_( digi->historydb, pb, 1 );
-
- if (hcell != NULL) {
- if (hcell->tokenbucket < 1.0) {
- if (debug) printf("TRANSMITTER SOURCE CALLSIGN RATELIMIT DISCARD.\n");
- return;
- }
- hcell->tokenbucket -= 1.0;
- }
+ // Insert into history database - track every packet
+ hcell = historydb_insert_( digi->historydb, pb, 1 );
+
+ if (hcell != NULL) {
+ if (hcell->tokenbucket < 1.0) {
+ if (debug) printf("TRANSMITTER SOURCE CALLSIGN RATELIMIT DISCARD.\n");
+ return;
+ }
+ hcell->tokenbucket -= 1.0;
+ }
#endif
- // Now we do token bucket filtering -- rate limiting
- if (digi->tokenbucket < 1.0) {
- if (debug) printf("TRANSMITTER RATELIMIT DISCARD.\n");
- return;
- }
- digi->tokenbucket -= 1.0;
-
- if (pb->is_aprs && rflogfile) {
- int t2l2;
- // Essentially Debug logging.. to file
-
- if (sizeof(tbuf) - pb->ax25datalen > t2l && t2l > 0) {
- // Have space for body too, skip leading Ctrl+PID bytes
- memcpy(tbuf+t2l, pb->ax25data+2, pb->ax25datalen-2); // Ctrl+PID skiped
- t2l2 = t2l + pb->ax25datalen-2; // tbuf size sans Ctrl+PID
-
- rflog( digi->transmitter->callsign, 'T', 0, tbuf, t2l2 );
- tbuf[t2l]=0;
- }
- }
-
- // Feed to dupe-filter (transmitter specific)
- // this means we have already seen it, and when
- // it comes back from somewhere, we do not digipeat
- // it ourselves.
-
- // This recording is needed at output side of digipeater
- // for APRSIS and DPRS transmit gates.
-
- if (t2l>0) {
- dupecheck_aprs( digi->dupechecker,
- (const char *)tbuf,
- t2l,
- (const char *)pb->ax25data+2,
- pb->ax25datalen-2 ); // ignore Ctrl+PID
- } else {
- dupecheck_aprs( digi->dupechecker,
- (const char *)state.ax25addr,
- state.ax25addrlen,
- (const char *)pb->ax25data+2,
- pb->ax25datalen-2 ); // ignore Ctrl+PID
- }
- }
-
- // Feed to interface_transmit_ax25() with new header and body
- interface_transmit_ax25( digi->transmitter,
- state.ax25addr, state.ax25addrlen,
- (const char*)pb->ax25data, pb->ax25datalen );
- if (debug>1) printf("Done.\n");
+ // Now we do token bucket filtering -- rate limiting
+ if (digi->tokenbucket < 1.0) {
+ if (debug) printf("TRANSMITTER RATELIMIT DISCARD.\n");
+ return;
+ }
+ digi->tokenbucket -= 1.0;
+
+ if (pb->is_aprs && rflogfile) {
+ int t2l2;
+ // Essentially Debug logging.. to file
+
+ if (sizeof(tbuf) - pb->ax25datalen > t2l && t2l > 0) {
+ // Have space for body too, skip leading Ctrl+PID bytes
+ memcpy(tbuf+t2l, pb->ax25data+2, pb->ax25datalen-2); // Ctrl+PID skiped
+ t2l2 = t2l + pb->ax25datalen-2; // tbuf size sans Ctrl+PID
+
+ rflog( digi->transmitter->callsign, 'T', 0, tbuf, t2l2 );
+ tbuf[t2l]=0;
+ }
+ }
+
+ // Feed to dupe-filter (transmitter specific)
+ // this means we have already seen it, and when
+ // it comes back from somewhere, we do not digipeat
+ // it ourselves.
+
+ // This recording is needed at output side of digipeater
+ // for APRSIS and DPRS transmit gates.
+
+ if (t2l>0) {
+ dupecheck_aprs( digi->dupechecker,
+ (const char *)tbuf,
+ t2l,
+ (const char *)pb->ax25data+2,
+ pb->ax25datalen-2 ); // ignore Ctrl+PID
+ } else {
+ dupecheck_aprs( digi->dupechecker,
+ (const char *)state.ax25addr,
+ state.ax25addrlen,
+ (const char *)pb->ax25data+2,
+ pb->ax25datalen-2 ); // ignore Ctrl+PID
+ }
+ }
+
+ // Feed to interface_transmit_ax25() with new header and body
+ interface_transmit_ax25( digi->transmitter,
+ state.ax25addr, state.ax25addrlen,
+ (const char*)pb->ax25data, pb->ax25datalen );
+ if (debug>1) printf("Done.\n");
}
void digipeater_receive( struct digipeater_source *src,
- struct pbuf_t *pb )
+ struct pbuf_t *pb )
{
- // Below numbers like "4)" refer to Requirement Specification
- // paper chapter 2.6: Digipeater Rules
-
- // The dupe-filter exists for APRS frames, possibly for some
- // selected UI frame types, and definitely not for CONS frames.
-
- if (debug)
- printf("digipeater_receive() from %s, is_aprs=%d viscous_delay=%d\n",
- src->src_if->callsign, pb->is_aprs, src->viscous_delay);
-
- if (src->tokenbucket < 1.0) {
- if (debug) printf("SOURCE RATELIMIT DISCARD\n");
- return;
- }
- src->tokenbucket -= 1.0;
-
-
- if (pb->is_aprs) {
-
- const int source_is_transmitter = (src->src_if ==
- src->parent->transmitter);
-
- // 1) Feed to dupe-filter (transmitter specific)
- // If the dupe detector on this packet has reached
- // count > 1, drop it.
-
- int jittery = src->viscous_delay > 0 ? random() % 3 + src->viscous_delay : 0;
- dupe_record_t *dupe = dupecheck_pbuf( src->parent->dupechecker,
- pb, jittery);
- if (dupe == NULL) { // Oops.. allocation error!
- if (debug)
- printf("digipeater_receive() - dupecheck_pbuf() allocation error, packet discarded\n");
- return;
- }
-
- // 1.1) optional viscous delay!
-
- if (src->viscous_delay == 0) { // No delay, direct cases
-
- // First packet on direct source arrives here
- // with seen = 1
-
- // 1.x) Analyze dupe checking
-
- if (debug>1)
- printf("Seen this packet %d times (delayed=%d)\n",
- dupe->delayed_seen + dupe->seen,
- dupe->delayed_seen);
-
- if (dupe->seen > 1) {
- // N:th direct packet, duplicate.
- // Drop this direct packet.
- if (debug>1) printf(".. discarded\n");
- return;
- }
-
- if (dupe->seen == 1 && dupe->delayed_seen > 0 &&
- dupe->pbuf == NULL) {
- // First direct, but dupe record does not have
- // pbuf anymore indicating that a delayed
- // handling did process it sometime in past.
- // Drop this direct packet.
- if (debug>1) printf(".. discarded\n");
- return;
- }
-
- if (dupe->seen == 1 && dupe->delayed_seen >= 0 &&
- dupe->pbuf != NULL) {
-
- // First direct, and pbuf exists in dupe record.
- // It was added first to viscous queue, and
- // a bit latter came this direct one.
- // Remove one from viscous queue, and proceed
- // with direct processing.
-
- if (debug>1) printf(" .. discard dupe record, process immediately");
-
- pbuf_put(dupe->pbuf);
- dupe->pbuf = NULL;
- dupe = NULL; // Do not do dupecheck_put() here!
- }
-
- } else { // src->viscous_delay > 0
-
- // First packet on viscous source arrives here
- // with dupe->delayed_seen = 1
-
- // Has this been seen on direct channel?
- if (dupe->seen > 0) {
- // Already processed thru direct processing,
- // no point in adding this to viscous delay queue
- if (debug>1)
- printf("Seen this packet %d times. Discarding it.\n",
- dupe->delayed_seen + dupe->seen);
- return;
- }
-
- // Depending on source definition, the transmitter is
- // either non-viscous or viscous. We care about it
- // only when the source is viscous:
- if (source_is_transmitter)
- dupe->seen_on_transmitter += 1;
-
- if (dupe->delayed_seen > 1) {
- // 2nd or more of same packet from delayed source
- if (debug>1)
- printf("Seen this packet %d times.\n",
- dupe->delayed_seen + dupe->seen);
-
- // If any of them is transmitter interface, then
- // drop the queued packet, and drop current one.
- if (dupe->seen_on_transmitter > 0) {
-
- // If pbuf is on delayed queue, drop it.
- if (dupe->pbuf != NULL) {
- pbuf_put(dupe->pbuf);
- dupe->pbuf = NULL;
- dupe = NULL; // Do not do dupecheck_put() here!
- }
-
- }
- if (debug>1) printf(".. discarded\n");
- return;
- }
-
- // First time that we have seen this packet at all.
- // Put the pbuf_t on viscous delay queue.. (Put
- // this dupe_record_t there, and the pbuf_t pointer
- // is already in that dupe_record_t.)
- src->viscous_queue_size += 1;
- if (src->viscous_queue_size > src->viscous_queue_space) {
- src->viscous_queue_space += 16;
- src->viscous_queue = realloc( src->viscous_queue,
- sizeof(void*) *
- src->viscous_queue_space );
- }
- src->viscous_queue[ src->viscous_queue_size -1 ]
- = dupecheck_get(dupe);
-
- if (debug) printf("%ld ENTER VISCOUS QUEUE: len=%d pbuf=%p\n",
- tick.tv_sec, src->viscous_queue_size, pb);
- return; // Put on viscous queue
-
- }
- }
- // Send directly to backend
- if (debug>1) printf(".. direct to processing\n");
- digipeater_receive_backend(src, pb);
+ // Below numbers like "4)" refer to Requirement Specification
+ // paper chapter 2.6: Digipeater Rules
+
+ // The dupe-filter exists for APRS frames, possibly for some
+ // selected UI frame types, and definitely not for CONS frames.
+
+ if (debug)
+ printf("digipeater_receive() from %s, is_aprs=%d viscous_delay=%d\n",
+ src->src_if->callsign, pb->is_aprs, src->viscous_delay);
+
+ if (src->tokenbucket < 1.0) {
+ if (debug) printf("SOURCE RATELIMIT DISCARD\n");
+ return;
+ }
+ src->tokenbucket -= 1.0;
+
+
+ if (pb->is_aprs) {
+
+ const int source_is_transmitter = (src->src_if ==
+ src->parent->transmitter);
+
+ // 1) Feed to dupe-filter (transmitter specific)
+ // If the dupe detector on this packet has reached
+ // count > 1, drop it.
+
+ int jittery = src->viscous_delay > 0 ? random() % 3 + src->viscous_delay : 0;
+ dupe_record_t *dupe = dupecheck_pbuf( src->parent->dupechecker,
+ pb, jittery);
+ if (dupe == NULL) { // Oops.. allocation error!
+ if (debug)
+ printf("digipeater_receive() - dupecheck_pbuf() allocation error, packet discarded\n");
+ return;
+ }
+
+ // 1.1) optional viscous delay!
+
+ if (src->viscous_delay == 0) { // No delay, direct cases
+
+ // First packet on direct source arrives here
+ // with seen = 1
+
+ // 1.x) Analyze dupe checking
+
+ if (debug>1)
+ printf("Seen this packet %d times (delayed=%d)\n",
+ dupe->delayed_seen + dupe->seen,
+ dupe->delayed_seen);
+
+ if (dupe->seen > 1) {
+ // N:th direct packet, duplicate.
+ // Drop this direct packet.
+ if (debug>1) printf(".. discarded\n");
+ return;
+ }
+
+ if (dupe->seen == 1 && dupe->delayed_seen > 0 &&
+ dupe->pbuf == NULL) {
+ // First direct, but dupe record does not have
+ // pbuf anymore indicating that a delayed
+ // handling did process it sometime in past.
+ // Drop this direct packet.
+ if (debug>1) printf(".. discarded\n");
+ return;
+ }
+
+ if (dupe->seen == 1 && dupe->delayed_seen >= 0 &&
+ dupe->pbuf != NULL) {
+
+ // First direct, and pbuf exists in dupe record.
+ // It was added first to viscous queue, and
+ // a bit latter came this direct one.
+ // Remove one from viscous queue, and proceed
+ // with direct processing.
+
+ if (debug>1) printf(" .. discard dupe record, process immediately");
+
+ pbuf_put(dupe->pbuf);
+ dupe->pbuf = NULL;
+ dupe = NULL; // Do not do dupecheck_put() here!
+ }
+
+ } else { // src->viscous_delay > 0
+
+ // First packet on viscous source arrives here
+ // with dupe->delayed_seen = 1
+
+ // Has this been seen on direct channel?
+ if (dupe->seen > 0) {
+ // Already processed thru direct processing,
+ // no point in adding this to viscous delay queue
+ if (debug>1)
+ printf("Seen this packet %d times. Discarding it.\n",
+ dupe->delayed_seen + dupe->seen);
+ return;
+ }
+
+ // Depending on source definition, the transmitter is
+ // either non-viscous or viscous. We care about it
+ // only when the source is viscous:
+ if (source_is_transmitter)
+ dupe->seen_on_transmitter += 1;
+
+ if (dupe->delayed_seen > 1) {
+ // 2nd or more of same packet from delayed source
+ if (debug>1)
+ printf("Seen this packet %d times.\n",
+ dupe->delayed_seen + dupe->seen);
+
+ // If any of them is transmitter interface, then
+ // drop the queued packet, and drop current one.
+ if (dupe->seen_on_transmitter > 0) {
+
+ // If pbuf is on delayed queue, drop it.
+ if (dupe->pbuf != NULL) {
+ pbuf_put(dupe->pbuf);
+ dupe->pbuf = NULL;
+ dupe = NULL; // Do not do dupecheck_put() here!
+ }
+
+ }
+ if (debug>1) printf(".. discarded\n");
+ return;
+ }
+
+ // First time that we have seen this packet at all.
+ // Put the pbuf_t on viscous delay queue.. (Put
+ // this dupe_record_t there, and the pbuf_t pointer
+ // is already in that dupe_record_t.)
+ src->viscous_queue_size += 1;
+ if (src->viscous_queue_size > src->viscous_queue_space) {
+ src->viscous_queue_space += 16;
+ src->viscous_queue = realloc( src->viscous_queue,
+ sizeof(void*) *
+ src->viscous_queue_space );
+ }
+ src->viscous_queue[ src->viscous_queue_size -1 ]
+ = dupecheck_get(dupe);
+
+ if (debug) printf("%ld ENTER VISCOUS QUEUE: len=%d pbuf=%p\n",
+ tick.tv_sec, src->viscous_queue_size, pb);
+ return; // Put on viscous queue
+
+ }
+ }
+ // Send directly to backend
+ if (debug>1) printf(".. direct to processing\n");
+ digipeater_receive_backend(src, pb);
}
dupecheck_t *digipeater_find_dupecheck(const struct aprx_interface *aif)
{
- int i;
- for (i = 0; i < digi_count; ++i) {
- if (aif == digis[i]->transmitter)
- return digis[i]->dupechecker;
- }
- return NULL;
+ int i;
+ for (i = 0; i < digi_count; ++i) {
+ if (aif == digis[i]->transmitter)
+ return digis[i]->dupechecker;
+ }
+ return NULL;
+}
+
+struct digipeater* digipeater_find_by_iface(const struct aprx_interface *aif) {
+ int i;
+ for (i = 0; i < digi_count; i++) {
+ if (aif == digis[i]->transmitter)
+ return digis[i];
+ }
+
+ if (debug > 1) printf(" Failed to find digipeater by aprx_interface\n");
+ return NULL;
}
+
static void digipeater_resettime(void *arg)
{
- struct timeval *tv = (struct timeval *)arg;
- *tv = tick;
+ struct timeval *tv = (struct timeval *)arg;
+ *tv = tick;
}
// Viscous queue processing needs poll digis <source>s for delayed actions
int digipeater_prepoll(struct aprxpolls *app)
{
- int d, s;
-
- if (tokenbucket_timer.tv_sec == 0) {
- tokenbucket_timer = tick; // init this..
- }
-
- // If the time(2) has jumped around a lot,
- // and we didn't get around to do our work, reset the timer.
-
- if (time_reset) {
- digipeater_resettime(&tokenbucket_timer);
- }
-
- if (tv_timercmp( &tokenbucket_timer, &tick ) <= 0) {
- // Run the digipeater timer handling now
- // Will also advance the timer!
- if (debug>2) printf("digipeater_prepoll() run tokenbucket_timers\n");
- tv_timeradd_seconds( &tokenbucket_timer, &tokenbucket_timer, TOKENBUCKET_INTERVAL);
- run_tokenbucket_timers();
- }
-
- if (tv_timercmp( &tokenbucket_timer, &app->next_timeout ) <= 0) {
- app->next_timeout = tokenbucket_timer;
- }
-
- // if (debug>2) printf("digipeater_prepoll - 1 - timeout millis=%d\n",aprxpolls_millis(app));
-
- // Over all digipeaters..
- for (d = 0; d < digi_count; ++d) {
- struct digipeater *digi = digis[d];
- // Over all sources in those digipeaters
- for (s = 0; s < digi->sourcecount; ++s) {
- struct timeval tv;
- struct digipeater_source * src = digi->sources[s];
- // If viscous delay is zero, there is no work...
- // if (src->viscous_delay == 0)
- // continue;
- // Delay is non-zero, perhaps there is work?
- if (src->viscous_queue_size == 0) // Empty queue
- continue;
- // First entry expires first
- tv.tv_sec = src->viscous_queue[0]->t + src->viscous_delay;
- tv.tv_usec = 0;
- if (tv_timercmp(&app->next_timeout, &tv) > 0) {
- app->next_timeout = tv;
- // if (debug>2) printf("digipeater_prepoll - 2 - timeout millis=%d\n",aprxpolls_millis(app));
- }
- }
- }
-
- return 0;
+ int d, s;
+
+ if (tokenbucket_timer.tv_sec == 0) {
+ tokenbucket_timer = tick; // init this..
+ }
+
+ // If the time(2) has jumped around a lot,
+ // and we didn't get around to do our work, reset the timer.
+
+ if (time_reset) {
+ digipeater_resettime(&tokenbucket_timer);
+ }
+
+ if (tv_timercmp( &tokenbucket_timer, &tick ) <= 0) {
+ // Run the digipeater timer handling now
+ // Will also advance the timer!
+ if (debug>2) printf("digipeater_prepoll() run tokenbucket_timers\n");
+ tv_timeradd_seconds( &tokenbucket_timer, &tokenbucket_timer, TOKENBUCKET_INTERVAL);
+ run_tokenbucket_timers();
+ }
+
+ if (tv_timercmp( &tokenbucket_timer, &app->next_timeout ) <= 0) {
+ app->next_timeout = tokenbucket_timer;
+ }
+
+ // if (debug>2) printf("digipeater_prepoll - 1 - timeout millis=%d\n",aprxpolls_millis(app));
+
+ // Over all digipeaters..
+ for (d = 0; d < digi_count; ++d) {
+ struct digipeater *digi = digis[d];
+ // Over all sources in those digipeaters
+ for (s = 0; s < digi->sourcecount; ++s) {
+ struct timeval tv;
+ struct digipeater_source * src = digi->sources[s];
+ // If viscous delay is zero, there is no work...
+ // if (src->viscous_delay == 0)
+ // continue;
+ // Delay is non-zero, perhaps there is work?
+ if (src->viscous_queue_size == 0) // Empty queue
+ continue;
+ // First entry expires first
+ tv.tv_sec = src->viscous_queue[0]->t + src->viscous_delay;
+ tv.tv_usec = 0;
+ if (tv_timercmp(&app->next_timeout, &tv) > 0) {
+ app->next_timeout = tv;
+ // if (debug>2) printf("digipeater_prepoll - 2 - timeout millis=%d\n",aprxpolls_millis(app));
+ }
+ }
+ }
+
+ return 0;
}
static void sourcecalltick(struct digipeater *digi);
int digipeater_postpoll(struct aprxpolls *app)
{
- int d, s, i, donecount;
-
- if (tv_timercmp(&tokenbucket_timer, &tick) < 0) {
- tv_timeradd_seconds( &tokenbucket_timer, &tokenbucket_timer, TOKENBUCKET_INTERVAL);
- run_tokenbucket_timers();
- }
-
- // Over all digipeaters..
- for (d = 0; d < digi_count; ++d) {
- struct digipeater *digi = digis[d];
-
- // Over all sources in those digipeaters
- for (s = 0; s < digi->sourcecount; ++s) {
- struct digipeater_source * src = digi->sources[s];
-
- // If viscous delay is zero, there is no work...
- // if (src->viscous_delay == 0)
- // continue;
- // Delay is non-zero, perhaps there is work?
- if (src->viscous_queue_size == 0) // Empty queue
- continue;
- // Feed backend from viscous queue
- donecount = 0;
- for (i = 0; i < src->viscous_queue_size; ++i) {
- struct dupe_record_t *dupe = src->viscous_queue[i];
- time_t t = dupe->t + src->viscous_delay;
- if ((t - tick.tv_sec) <= 0) {
- if (debug)printf("%ld LEAVE VISCOUS QUEUE: dupe=%p pbuf=%p\n",
- tick.tv_sec, dupe, dupe->pbuf);
- if (dupe->pbuf != NULL) {
- // We send the pbuf from viscous queue, if it still is
- // present in the dupe record. (For example direct sourced
- // packets remove a packet from queued dupe record.)
- digipeater_receive_backend(src, dupe->pbuf);
-
- // Remove the delayed pbuf from this dupe record.
- pbuf_put(dupe->pbuf);
- dupe->pbuf = NULL;
- }
- dupecheck_put(dupe);
- ++donecount;
- } else {
- break; // found a case we are not yet interested in.
- }
- }
- if (donecount > 0) {
- if (donecount >= src->viscous_queue_size) {
- // All cleared
- src->viscous_queue_size = 0;
- } else {
- // Compact the queue left after this processing round
- i = src->viscous_queue_size - donecount;
- memcpy(&src->viscous_queue[0],
- &src->viscous_queue[donecount],
- sizeof(void*) * i);
- src->viscous_queue_size = i;
- }
- }
- }
- }
-
- return 0;
+ int d, s, i, donecount;
+
+ if (tv_timercmp(&tokenbucket_timer, &tick) < 0) {
+ tv_timeradd_seconds( &tokenbucket_timer, &tokenbucket_timer, TOKENBUCKET_INTERVAL);
+ run_tokenbucket_timers();
+ }
+
+ // Over all digipeaters..
+ for (d = 0; d < digi_count; ++d) {
+ struct digipeater *digi = digis[d];
+
+ // Over all sources in those digipeaters
+ for (s = 0; s < digi->sourcecount; ++s) {
+ struct digipeater_source * src = digi->sources[s];
+
+ // If viscous delay is zero, there is no work...
+ // if (src->viscous_delay == 0)
+ // continue;
+ // Delay is non-zero, perhaps there is work?
+ if (src->viscous_queue_size == 0) // Empty queue
+ continue;
+ // Feed backend from viscous queue
+ donecount = 0;
+ for (i = 0; i < src->viscous_queue_size; ++i) {
+ struct dupe_record_t *dupe = src->viscous_queue[i];
+ time_t t = dupe->t + src->viscous_delay;
+ if ((t - tick.tv_sec) <= 0) {
+ if (debug)printf("%ld LEAVE VISCOUS QUEUE: dupe=%p pbuf=%p\n",
+ tick.tv_sec, dupe, dupe->pbuf);
+ if (dupe->pbuf != NULL) {
+ // We send the pbuf from viscous queue, if it still is
+ // present in the dupe record. (For example direct sourced
+ // packets remove a packet from queued dupe record.)
+ digipeater_receive_backend(src, dupe->pbuf);
+
+ // Remove the delayed pbuf from this dupe record.
+ pbuf_put(dupe->pbuf);
+ dupe->pbuf = NULL;
+ }
+ dupecheck_put(dupe);
+ ++donecount;
+ } else {
+ break; // found a case we are not yet interested in.
+ }
+ }
+ if (donecount > 0) {
+ if (donecount >= src->viscous_queue_size) {
+ // All cleared
+ src->viscous_queue_size = 0;
+ } else {
+ // Compact the queue left after this processing round
+ i = src->viscous_queue_size - donecount;
+ memcpy(&src->viscous_queue[0],
+ &src->viscous_queue[donecount],
+ sizeof(void*) * i);
+ src->viscous_queue_size = i;
+ }
+ }
+ }
+ }
+
+ return 0;
}
static int run_tokenbucket_timers()
{
- int d, s;
- // Over all digipeaters..
- for (d = 0; d < digi_count; ++d) {
- struct digipeater *digi = digis[d];
+ int d, s;
+ // Over all digipeaters..
+ for (d = 0; d < digi_count; ++d) {
+ struct digipeater *digi = digis[d];
- digi->tokenbucket += digi->tbf_increment;
- if (digi->tokenbucket > digi->tbf_limit)
- digi->tokenbucket = digi->tbf_limit;
+ digi->tokenbucket += digi->tbf_increment;
+ if (digi->tokenbucket > digi->tbf_limit)
+ digi->tokenbucket = digi->tbf_limit;
#ifndef DISABLE_IGATE
- sourcecalltick(digi);
+ sourcecalltick(digi);
#endif
- // Over all sources in those digipeaters
- for (s = 0; s < digi->sourcecount; ++s) {
- struct digipeater_source * src = digi->sources[s];
+ // Over all sources in those digipeaters
+ for (s = 0; s < digi->sourcecount; ++s) {
+ struct digipeater_source * src = digi->sources[s];
- src->tokenbucket += src->tbf_increment;
- if (src->tokenbucket > src->tbf_limit)
- src->tokenbucket = src->tbf_limit;
+ src->tokenbucket += src->tbf_increment;
+ if (src->tokenbucket > src->tbf_limit)
+ src->tokenbucket = src->tbf_limit;
- }
- }
+ }
+ }
- return 0;
+ return 0;
}
#ifndef DISABLE_IGATE
static void sourcecalltick(struct digipeater *digi)
{
- int i;
- historydb_t *db = digi->historydb;
- if (db == NULL) return; // Should never happen..
-
- for (i = 0; i < HISTORYDB_HASH_MODULO; ++i) {
- history_cell_t *c = db->hash[i];
- for ( ; c != NULL; c = c->next ) {
- c->tokenbucket += digi->src_tbf_increment;
- if (c->tokenbucket > digi->src_tbf_limit)
- c->tokenbucket = digi->src_tbf_limit;
- }
- }
+ int i;
+ historydb_t *db = digi->historydb;
+ if (db == NULL) return; // Should never happen..
+
+ for (i = 0; i < HISTORYDB_HASH_MODULO; ++i) {
+ history_cell_t *c = db->hash[i];
+ for ( ; c != NULL; c = c->next ) {
+ c->tokenbucket += digi->src_tbf_increment;
+ if (c->tokenbucket > digi->src_tbf_limit)
+ c->tokenbucket = digi->src_tbf_limit;
+ }
+ }
}
#endif
@@ -1857,11 +1866,11 @@ static void sourcecalltick(struct digipeater *digi)
#if !defined(HAVE_MEMRCHR) && !defined(_FOR_VALGRIND_)
void *memrchr(const void *s, int c, size_t n) {
- const unsigned char *p = s;
- c &= 0xFF;
- for (p = s+n; n > 0; --n, --p) {
- if (*p == c) return (void*)p;
- }
- return NULL;
+ const unsigned char *p = s;
+ c &= 0xFF;
+ for (p = s+n; n > 0; --n, --p) {
+ if (*p == c) return (void*)p;
+ }
+ return NULL;
}
#endif
diff --git a/doc/aprx-manual-pics.odp b/doc/aprx-manual-pics.odp
index 6412ea4..c9a0129 100644
Binary files a/doc/aprx-manual-pics.odp and b/doc/aprx-manual-pics.odp differ
diff --git a/doc/aprx-manual.odt b/doc/aprx-manual.odt
index d8cea5d..cdf9721 100644
Binary files a/doc/aprx-manual.odt and b/doc/aprx-manual.odt differ
diff --git a/doc/aprx-manual.pdf b/doc/aprx-manual.pdf
index d8dcd6e..21d29f4 100644
Binary files a/doc/aprx-manual.pdf and b/doc/aprx-manual.pdf differ
diff --git a/dprsgw.c b/dprsgw.c
index 4c42523..6c13b3e 100644
--- a/dprsgw.c
+++ b/dprsgw.c
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
@@ -680,7 +680,6 @@ static void dprsgw_nmea_igate( const struct aprx_interface *aif,
if (!dprsgw_ratelimit( dp, tnc2buf )) {
- char *fromcall, *origtocall;
char *b;
if (aif != NULL) {
@@ -689,23 +688,24 @@ static void dprsgw_nmea_igate( const struct aprx_interface *aif,
erlang_add(aif->callsign, ERLANG_RX, 0, 1);
}
- fromcall = tnc2buf;
- p = fromcall;
- origtocall = NULL;
+ char *heads[2];
+ heads[0] = tnc2buf;
+ p = heads[0];
+ heads[1] = NULL;
while (*p != '>' && *p != 0) ++p;
if (*p == '>') {
*p++ = 0;
- origtocall = p;
+ heads[1] = p;
} else
return; // BAD :-(
- p = origtocall;
+ p = heads[1];
while (p != NULL && *p != ':' && *p != 0 && *p != ',') ++p;
if (p != NULL && (*p == ':' || *p == ',')) {
*p++ = 0;
}
b = tnc2buf + tnc2addrlen +1;
interface_receive_3rdparty( aif,
- fromcall, origtocall, "DSTAR*",
+ heads, 2, "DSTAR*",
b, tnc2buflen - (b-tnc2buf) );
}
}
@@ -731,7 +731,7 @@ static void dprsgw_rxigate( struct serialport *S )
tnc2bodylen -= 10; // header + body together
tnc2body = memchr( tnc2addr, ':', tnc2addrlen);
if (tnc2body != NULL) {
- char *fromcall, *origtocall;
+ char *heads[2];
char *s;
tnc2addrlen = tnc2body - tnc2addr;
@@ -747,23 +747,23 @@ static void dprsgw_rxigate( struct serialport *S )
// Bytes have been counted previously, now count meaningful packet
erlang_add( aif->callsign, ERLANG_RX, 0, 1 );
- fromcall = (char*)tnc2addr;
- s = fromcall;
- origtocall = NULL;
+ heads[0] = (char*)tnc2addr;
+ s = heads[0];
+ heads[1] = NULL;
while (*s != '>' && *s != 0) ++s;
if (*s == '>') {
*s++ = 0;
- origtocall = s;
+ heads[1] = s;
} else
return; // BAD :-(
- s = origtocall;
+ s = heads[1];
while (s != NULL && *s != ':' && *s != 0 && *s != ',') ++s;
if (s != NULL && (*s == ':' || *s == ',')) {
*s++ = 0;
}
interface_receive_3rdparty( aif,
- fromcall, origtocall, "DSTAR*",
+ heads, 2, "DSTAR*",
(const char*)tnc2body, tnc2bodylen - (tnc2body-tnc2addr) );
return;
@@ -1021,10 +1021,10 @@ void igate_to_aprsis(const char *portname, const int tncid, const char *tnc2buf,
printf("DPRS RX-IGATE: %s\n", tnc2buf);
}
-void interface_receive_3rdparty(const struct aprx_interface *aif, const char *fromcall, const char *origtocall, const char *gwtype, const char *tnc2data, const int tnc2datalen) // DPRSGW_DEBUG_MAIN
+void interface_receive_3rdparty(const struct aprx_interface *aif, char **heads, int headscount, const char *gwtype, const char *tnc2data, const int tnc2datalen) // DPRSGW_DEBUG_MAIN
{
printf("DPRS 3RDPARTY RX: ....:}%s>%s,%s,GWCALLSIGN*:%s\n",
- fromcall, origtocall, gwtype, tnc2data);
+ heads[0], heads[1], gwtype, tnc2data);
}
int debug = 3;
diff --git a/dupecheck.c b/dupecheck.c
index d14c543..4733ad6 100644
--- a/dupecheck.c
+++ b/dupecheck.c
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
@@ -12,8 +12,7 @@
/*
* Some parts of this code are copied from:
- */
-/*
+ *
* aprsc
*
* (c) Heikki Hannikainen, OH7LZB <hessu at hes.iki.fi>
diff --git a/erlang.c b/erlang.c
index 11f07bc..a99cff6 100644
--- a/erlang.c
+++ b/erlang.c
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
@@ -295,6 +295,8 @@ static int erlang_backingstore_open(int do_create)
"Open of '%s' for erlang_backingstore file failed! errno=%d: %s",
erlang_backingstore, errno, strerror(errno));
erlang_data_is_nonshared = 1;
+ } else {
+ erlang_data_is_nonshared = 0;
}
#endif
return erlang_backingstore_grow(do_create, 0); /* Just open */
diff --git a/filter.c b/filter.c
index df21556..207a26d 100644
--- a/filter.c
+++ b/filter.c
@@ -7,6 +7,8 @@
* *
********************************************************************/
/*
+ * Some parts of this code are copied from:
+ *
* aprsc
*
* (c) Matti Aarnio, OH2MQK, <oh2mqk at sral.fi>
@@ -1625,23 +1627,24 @@ static int filter_process_one_d(struct pbuf_t *pb, struct filter_t *f)
++j;
if (j > 10) break; // way too many callsigns... (code bug?)
+ if (*d == ':') break; //end of via fields
if (*d == ',') ++d; // second round and onwards..
for (i = 0; i+d <= q && i <= CALLSIGNLEN_MAX; ++i) {
- if (d[i] == ',')
+ if ((d[i] == ',') || (d[i] == ':'))
break;
}
// hlog(LOG_INFO, "d: -> (%d,%d) '%.*s'", (int)(d-pb->data), i, i, d);
// digipeater address ",addr,"
- memset( &ref, 0, sizeof(ref) ); // clear it all
+ memset( &ref, 0, sizeof(ref) ); // clear it all
memcpy( ref.callsign, d, i);
if (i > CALLSIGNLEN_MAX) i = CALLSIGNLEN_MAX;
rc = filter_match_on_callsignset(&ref, i, f, MatchWild);
if (rc) {
- return (rc == 1);
+ return (rc);
}
d += i;
}
@@ -1720,7 +1723,7 @@ static int filter_process_one_f(struct pbuf_t *pb, struct filter_t *f, historydb
history = historydb_lookup( historydb, callsign, i );
f->h.hist_age = tick.tv_sec + hist_lookup_interval;
if (!history) {
- if (debug) printf("f-filter: no history lookup result (%*s) -> return 0\n", i, callsign );
+ if (debug) printf("f-filter: no history lookup result (%.*s) -> return 0\n", i, callsign );
return 0; /* no lookup result.. */
}
f->h.u3.numnames = 1;
diff --git a/filter.c.2.06-to-head.diff b/filter.c.2.06-to-head.diff
deleted file mode 100644
index 14df525..0000000
--- a/filter.c.2.06-to-head.diff
+++ /dev/null
@@ -1,585 +0,0 @@
-Index: filter.c
-===================================================================
---- filter.c (revision 507)
-+++ filter.c (working copy)
-@@ -3,7 +3,7 @@
- * minimal requirement of esoteric facilities or *
- * libraries of any kind beyond UNIX system libc. *
- * *
-- * (c) Matti Aarnio - OH2MQK, 2007-2012 *
-+ * (c) Matti Aarnio - OH2MQK, 2007-2014 *
- * *
- ********************************************************************/
- /*
-@@ -30,6 +30,7 @@
- d/digi1/digi2... Digipeater filter (*)
- e/call1/call1/... Entry station filter (*)
- f/call/dist Friend Range filter
-+ g/call1/call2.. Group Messaging filter (*)
- m/dist My Range filter
- o/obj1/obj2... Object filter (*)
- p/aa/bb/cc... Prefix filter
-@@ -36,8 +37,8 @@
- q/con/ana q Contruct filter
- r/lat/lon/dist Range filter
- s/pri/alt/over Symbol filter
-- t/poimntqsu*c Type filter
-- t/poimntqsu*c/call/km Type filter
-+ t/poimntqsu3*c Type filter
-+ t/poimntqsu3*c/call/km Type filter
- u/unproto1/unproto2/.. Unproto filter (*)
-
- Sample usage frequencies (out of entire APRS-IS):
-@@ -338,7 +339,7 @@
- if (f->len == keylen) {
- int cmp = strncasecmp(f->callsign, uckey, keylen);
- if (cmp == 0) { /* Have key match */
-- f->expirytime = now.tv_sec + filter_entrycall_maxage;
-+ f->expirytime = tick.tv_sec + filter_entrycall_maxage;
- f2 = f;
- break;
- }
-@@ -356,11 +357,11 @@
- #ifndef _FOR_VALGRIND_
- f = cellmalloc(filter_entrycall_cells);
- #else
-- f = malloc(sizeof(*f));
-+ f = calloc(1, sizeof(*f));
- #endif
- if (f) {
- f->next = *fp;
-- f->expirytime = now.tv_sec + filter_entrycall_maxage;
-+ f->expirytime = tick.tv_sec + filter_entrycall_maxage;
- f->hash = hash;
- f->len = keylen;
- memcpy(f->callsign, uckey, keylen);
-@@ -405,7 +406,7 @@
- int rc = strncasecmp(f->callsign, key, keylen);
- if (rc == 0) { /* Have key match, see if it is
- still valid entry ? */
-- if (f->expirytime < now.tv_sec - 60) {
-+ if ((f->expirytime - (tick.tv_sec - 60)) < 0) {
- f2 = f;
- break;
- }
-@@ -432,7 +433,7 @@
- fp = & filter_entrycall_hash[k];
- while (( f = *fp )) {
- /* Did it expire ? */
-- if (f->expirytime <= now.tv_sec) {
-+ if ((f->expirytime - tick.tv_sec) <= 0) {
- *fp = f->next;
- f->next = NULL;
- filter_entrycall_free(f);
-@@ -539,7 +540,7 @@
- if (f->len == keylen) {
- int cmp = memcmp(f->callsign, uckey, keylen);
- if (cmp == 0) { /* Have key match */
-- f->expirytime = now.tv_sec + filter_wx_maxage;
-+ f->expirytime = tick.tv_sec + filter_wx_maxage;
- f2 = f;
- break;
- }
-@@ -557,12 +558,12 @@
- #ifndef _FOR_VALGRIND_
- f = cellmalloc(filter_wx_cells);
- #else
-- f = malloc(sizeof(*f));
-+ f = calloc(1, sizeof(*f));
- #endif
- ++filter_wx_cellgauge;
- if (f) {
- f->next = *fp;
-- f->expirytime = now.tv_sec + filter_wx_maxage;
-+ f->expirytime = tick.tv_sec + filter_wx_maxage;
- f->hash = hash;
- f->len = keylen;
- memcpy(f->callsign, key, keylen);
-@@ -593,7 +594,7 @@
- int rc = strncasecmp(f->callsign, key, keylen);
- if (rc == 0) { /* Have key match, see if it is
- still valid entry ? */
-- if (f->expirytime < now.tv_sec - 60) {
-+ if ((f->expirytime - (tick.tv_sec - 60)) < 0) {
- f2 = f;
- break;
- }
-@@ -621,7 +622,7 @@
- fp = & filter_wx_hash[k];
- while (( f = *fp )) {
- /* Did it expire ? */
-- if (f->expirytime <= now.tv_sec) {
-+ if ((f->expirytime - tick.tv_sec) <= 0) {
- *fp = f->next;
- f->next = NULL;
- filter_wx_free(f);
-@@ -804,13 +805,27 @@
- /* count the number of prefixes in there.. */
- while (*p) {
- if (*p) ++refmax;
-- while (*p && *p != '/' && *p != ',') ++p;
-- if (*p == '/' || *p == ',') ++p;
-+ while (*p && *p != '/') ++p;
-+ if (*p == '/') ++p;
- }
-- if (refmax == 0) return -1; /* No prefixes ?? */
-+ if (refmax == 0) {
-+ printf("Filter definition of '%s' has no prefixes defined.\n", filt0);
-+ return -1; /* No prefixes ?? */
-+ }
-
-- refbuf = malloc(sizeof(*refbuf)*refmax);
-- refcount = 0;
-+ if (ff && ff->h.type == f0->h.type) { /* SAME TYPE,
-+ extend previous record! */
-+ extend = 1;
-+ refcount = ff->h.u3.numnames + refmax;
-+ refbuf = realloc(ff->h.u5.refcallsigns, sizeof(*refbuf) * refcount);
-+ ff->h.u5.refcallsigns = refbuf;
-+ refcount = ff->h.u3.numnames;
-+ } else {
-+ refbuf = calloc(1, sizeof(*refbuf)*refmax);
-+ refcount = 0;
-+ f0->h.u5.refcallsigns = refbuf;
-+ f0->h.u3.numnames = 0;
-+ }
-
- p = filt0;
- if (*p == '-') ++p;
-@@ -824,24 +839,28 @@
- memset(prefixbuf, 0, sizeof(prefixbuf));
- i = 0;
- wildcard = 0;
-- while (*p != 0 && *p != '/' && *p != ',') {
-+ while (*p != 0 && *p != '/') {
- int c = *p++;
- if (c == '*') {
-- wildcard = 1;
-- if (wildok != MatchWild)
-- return -1;
-- continue;
-+ wildcard = 1;
-+ if (wildok != MatchWild) {
-+ printf("Wild-card matching not permitted, yet filter definition says: '%s'\n", filt0);
-+ return -1;
-+ }
-+ continue;
- }
-- ++i;
-- if (i < (CALLSIGNLEN_MAX)) {
-- *k = c;
-- ++k;
-+ if (i < CALLSIGNLEN_MAX) {
-+ *k++ = c;
-+ ++i;
-+ } else {
-+ printf("Too long callsign string: '%s' input: '%s'\n", prefixbuf, filt0);
-+ return -1; // invalid input
- }
- }
- *k = 0;
- /* OK, we have one prefix part collected, scan source until next '/' */
-- if (*p != 0 && *p != '/' && *p != ',') ++p;
-- if (*p == '/' || *p == ',') ++p;
-+ if (*p != 0 && *p != '/') ++p;
-+ if (*p == '/') ++p;
- /* If there is more of patterns, the loop continues.. */
-
- /* Store the refprefix */
-@@ -855,11 +874,10 @@
- ++refcount;
- }
-
-- f0->h.u5.refcallsigns = refbuf;
-- f0->h.u3.numnames = refcount;
-+ f0->h.u3.numnames = refcount;
- if (extend) {
- char *s;
-- ff->h.u3.numnames = refcount;
-+ ff->h.u3.numnames = refcount;
- i = strlen(ff->h.text) + strlen(filt0)+2;
- if (i <= FILT_TEXTBUFSIZE) {
- /* Fits in our built-in buffer block - like previous..
-@@ -1081,7 +1099,6 @@
-
-
- break;
--#if 0
- case 'd':
- case 'D':
- /* d/digi1/digi2... Digipeater filter (*) */
-@@ -1093,7 +1110,6 @@
- return 0;
-
- break;
--#endif
- #if 0
- case 'e':
- case 'E':
-@@ -1133,11 +1149,31 @@
- */
-
- break;
--#if 0
-+
-+ case 'g':
-+ case 'G':
-+ // g/call1/call2/ Group Messaging filter
-+ i = filter_parse_one_callsignset(ffp, &f0, filt0, MatchWild );
-+ if (i < 0)
-+ return i;
-+ if (i > 0) /* extended previous */
-+ return 0;
-+ break;
-+
- case 'm':
- case 'M':
- /* m/dist My range filter */
-
-+ if (myloc_latstr == NULL) {
-+ printf("The M/radius_km filter requires top-level myloc definition. It doesn't exist.\n");
-+ return -1;
-+ }
-+
-+ f0.h.type = 'r'; // internal implementation at Aprx is a RANGE filter.
-+ f0.h.f_latN = myloc_lat; // radians
-+ f0.h.f_lonE = myloc_lon; // radians
-+ f0.h.u1.f_coslat = myloc_coslat;
-+
- i = sscanf(filt+1, "/%f", &f0.h.u2.f_dist);
- if (i != 1 || f0.h.u2.f_dist < 0.1) {
- // hlog(LOG_DEBUG, "Bad filter parse: %s", filt0);
-@@ -1149,7 +1185,7 @@
-
- // hlog(LOG_DEBUG, "Filter: %s -> M %.3f", filt0, f0.h.u2.f_dist);
- break;
--#endif
-+
- case 'o':
- case 'O':
- /* o/obje1/obj2... Object filter (*) */
-@@ -1315,6 +1351,9 @@
- case '*':
- f0.h.u4.bitflags |= ~T_CWOP; /* "ALL" -- excluding CWOP */
- break;
-+ case '3':
-+ f0.h.u4.bitflags |= T_THIRDPARTY;
-+ break;
- case 'c': case 'C':
- f0.h.u4.bitflags |= T_CWOP;
- break;
-@@ -1409,7 +1448,7 @@
- } else
- f->h.text = strdup(filt0); /* and copy of filter text */
- #else
-- f = malloc(sizeof(*f) + strlen(filt0));
-+ f = calloc(1, sizeof(*f) + strlen(filt0));
- *f = f0; /* store pre-parsed values */
- f->h.text = f->textbuf;
- strcpy(f->textbuf, filt); /* and copy of filter text */
-@@ -1556,22 +1595,21 @@
- if (i > CALLSIGNLEN_MAX) i = CALLSIGNLEN_MAX;
-
- /* source address "addr">... */
-- memset( ref.callsign, 0, sizeof(ref.callsign));
-+ memset( &ref, 0, sizeof(ref) ); // clear it all
- memcpy( ref.callsign, pb->data, i);
-
- return filter_match_on_callsignset(&ref, i, f, MatchWild);
- }
-
--#if 0
- static int filter_process_one_d(struct pbuf_t *pb, struct filter_t *f)
- {
- /* d/digi1/digi2... Digipeater filter
-
-- The digipeater filter will pass all packets that have been
-+ The digipeater filter will match all packets that have been
- digipeated by a particular station(s) (the station's call
- is in the path). This filter allows the * wildcard.
-
-- 25-35 filters in use at any given time.
-+ 25-35 instances in APRS-IS core at any given time.
- Up to 1300 invocations per second.
- */
- struct filter_refcallsign_t ref;
-@@ -1585,9 +1623,9 @@
-
- for (i = 0; d < q; ) {
- ++j;
-- if (j > 10) break; /* way too many callsigns... */
-+ if (j > 10) break; // way too many callsigns... (code bug?)
-
-- if (*d == ',') ++d; /* second round and onwards.. */
-+ if (*d == ',') ++d; // second round and onwards..
- for (i = 0; i+d <= q && i <= CALLSIGNLEN_MAX; ++i) {
- if (d[i] == ',')
- break;
-@@ -1595,9 +1633,9 @@
-
- // hlog(LOG_INFO, "d: -> (%d,%d) '%.*s'", (int)(d-pb->data), i, i, d);
-
-- /* digipeater address ",addr," */
-+ // digipeater address ",addr,"
-+ memset( &ref, 0, sizeof(ref) ); // clear it all
- memcpy( ref.callsign, d, i);
-- memset( ref.callsign+i, 0, sizeof(ref)-i );
-
- if (i > CALLSIGNLEN_MAX) i = CALLSIGNLEN_MAX;
-
-@@ -1609,7 +1647,6 @@
- }
- return 0;
- }
--#endif
-
- #if 0
- static int filter_process_one_e(struct pbuf_t *pb, struct filter_t *f)
-@@ -1616,7 +1653,7 @@
- {
- /* e/call1/call1/... Entry station filter
-
-- This filter passes all packets with the specified
-+ This filter matches all packets with the specified
- callsign-SSID(s) immediately following the q construct.
- This allows filtering based on receiving IGate, etc.
- Supports * wildcard.
-@@ -1633,8 +1670,8 @@
- return 0; /* Bad Entry-station callsign */
-
- /* entry station address "qA*,addr," */
-+ memset( &ref, 0, sizeof(ref) ); // clear it all
- memcpy( ref.callsign, e, i);
-- memset( ref.callsign+i, 0, sizeof(ref)-i );
-
- return filter_match_on_callsignset(&ref, i, f, MatchWild);
- }
-@@ -1644,6 +1681,7 @@
- static int filter_process_one_f(struct pbuf_t *pb, struct filter_t *f, historydb_t *historydb)
- {
- /* f/call/dist Friend Range filter
-+
- This is the same as the range filter except that the center is
- defined as the last known position of call.
-
-@@ -1678,9 +1716,9 @@
- }
-
- /* find friend's last location packet */
-- if (f->h.hist_age < now.tv_sec) {
-+ if (f->h.hist_age < tick.tv_sec) {
- history = historydb_lookup( historydb, callsign, i );
-- f->h.hist_age = now.tv_sec + hist_lookup_interval;
-+ f->h.hist_age = tick.tv_sec + hist_lookup_interval;
- if (!history) {
- if (debug) printf("f-filter: no history lookup result (%*s) -> return 0\n", i, callsign );
- return 0; /* no lookup result.. */
-@@ -1720,10 +1758,34 @@
- }
- #endif
-
--#if 0
-+static int filter_process_one_g(struct pbuf_t *pb, struct filter_t *f)
-+{
-+ /* g/call1/call2... Group Messaging filter
-+
-+ Pass all message traffic TO calls call1/call2/...
-+ (* wild card allowed)
-+
-+ */
-+
-+ struct filter_refcallsign_t ref;
-+ int i = pb->dstname_len;
-+
-+ if (i > CALLSIGNLEN_MAX) i = CALLSIGNLEN_MAX;
-+
-+ /* source address "addr">... */
-+ memset( &ref, 0, sizeof(ref) ); // clear it all
-+ memcpy( ref.callsign, pb->dstname, i);
-+
-+ return filter_match_on_callsignset(&ref, i, f, MatchWild);
-+}
-+
-+
-+
-+#if 0 // No M filter implementation, but there is M filter parse producing R filter..
- static int filter_process_one_m(struct pbuf_t *pb, struct filter_t *f)
- {
- /* m/dist My Range filter
-+
- This is the same as the range filter except that the center is
- defined as the last known position of the logged in client.
-
-@@ -1738,40 +1800,21 @@
-
- Caching the historydb_lookup() result will lower CPU power
- spent on the historydb.
-+
-+ At Aprx: Implemented using Range filter, and prepared at parse time..
- */
-
-- float lat1, lon1, coslat1;
- float lat2, lon2, coslat2;
- float r;
-- history_cell_t *history;
-
--
- if (!(pb->flags & F_HASPOS)) /* packet with a position.. (msgs with RECEIVER's position) */
- return 0;
-
-- if (!c->username) /* Should not happen... */
-- return 0;
--
-- if (f->h.hist_age < now.tv_sec) {
-- history = historydb_lookup( c->username, strlen(c->username) );
-- f->h.hist_age = now.tv_sec + hist_lookup_interval;
-- if (!history) return 0; /* no result */
-- f->h.u3.numnames = 1;
-- f->h.f_latN = history->lat;
-- f->h.f_lonE = history->lon;
-- f->h.u1.f_coslat = history->coslat;
-- }
-- if (!f->h.u3.numnames) return 0; /* cached lookup invalid.. */
--
-- lat1 = f->h.f_latN;
-- lon1 = f->h.f_lonE;
-- coslat1 = f->h.u1.f_coslat;
--
- lat2 = pb->lat;
- lon2 = pb->lng;
- coslat2 = pb->cos_lat;
-
-- r = maidenhead_km_distance(lat1, coslat1, lon1, lat2, coslat2, lon2);
-+ r = maidenhead_km_distance(myloc_lat, myloc_coslat, myloc_lon, lat2, coslat2, lon2);
- if (f->h.u2.f_dist < 0.0) {
- // Test for _outside_ the range
- if (r > -f->h.u2.f_dist) /* Range is more than given limit */
-@@ -1785,6 +1828,7 @@
- return 0;
- }
- #endif
-+
- static int filter_process_one_o(struct pbuf_t *pb, struct filter_t *f)
- {
- /* o/obj1/obj2... Object filter
-@@ -1801,17 +1845,22 @@
- int i;
- // const char *s;
-
-- if ( (pb->packettype & (T_OBJECT|T_ITEM)) == 0 ) /* not an Object NOR Item */
-+ if ( (pb->packettype & (T_OBJECT|T_ITEM)) == 0 ) { /* not an Object NOR Item */
-+ if (debug) printf("o-filter: packet type not OBJECT nor ITEM\n");
- return 0;
-+ }
-
- /* parse_aprs() has picked item/object name pointer and length.. */
- // s = pb->srcname;
- i = pb->srcname_len;
-- if (i < 1) return 0; /* Bad object/item name */
-+ if (i < 1) {
-+ if (debug) printf("o-filter: object/item name length < 1 at the packet\n");
-+ return 0; /* Bad object/item name */
-+ }
-
- /* object name */
-- memcpy( ref.callsign, pb->info_start+1, i);
-- memset( ref.callsign+i, 0, sizeof(ref)-i );
-+ memset( &ref, 0, sizeof(ref) ); // clear it all
-+ memcpy( ref.callsign, pb->srcname, i); // copy the interesting part
-
- return filter_match_on_callsignset(&ref, i, f, MatchWild);
- }
-@@ -1834,8 +1883,8 @@
- if (i > CALLSIGNLEN_MAX) i = CALLSIGNLEN_MAX;
-
- /* source address "addr">... */
-+ memset( &ref, 0, sizeof(ref) ); // clear it all
- memcpy( ref.callsign, pb->data, i);
-- memset( ref.callsign+i, 0, sizeof(ref)-i );
-
- return filter_match_on_callsignset(&ref, i, f, MatchPrefix);
- }
-@@ -2006,7 +2055,7 @@
- /* OK, no overlay... */
- if (f->h.u5.lens.len2 != 0) {
- /* Secondary table symbols */
-- if ( symtable != '\\' &&
-+ if ( symtable != '/' &&
- memchr(f->h.text+f->h.u5.lens.len2s, symcode, f->h.u5.lens.len2) != NULL )
- return f->h.negation ? 2 : 1;
- }
-@@ -2016,8 +2065,8 @@
-
- static int filter_process_one_t(struct pbuf_t *pb, struct filter_t *f, historydb_t *historydb)
- {
-- /* [-]t/poimntqsu
-- [-]t/poimntqsu/call/km
-+ /* [-]t/poimntqsu3*c
-+ [-]t/poimntqsu3*c/call/km
-
- Type filter Pass all traffic based on packet type.
- One or more types can be defined at the same time, t/otq
-@@ -2036,6 +2085,7 @@
- t = Telemetry
- u = User-defined
- w = Weather
-+ 3 = 3rd party frame
-
- Note: The weather type filter also passes positions packets
- for positionless weather packets.
-@@ -2100,7 +2150,7 @@
- .. 60-100 lookups per second. */
-
- #ifndef DISABLE_IGATE
-- if (f->h.hist_age < now.tv_sec) {
-+ if (f->h.hist_age < tick.tv_sec) {
- history = historydb_lookup( historydb, callsign, callsignlen );
-
- /* hlog( LOG_DEBUG, "Type filter with callsign range used! call='%s', range=%.1f position %sfound",
-@@ -2110,7 +2160,7 @@
-
- if (!history) return 0; /* no lookup result.. */
- f->h.u3.numnames = 1;
-- f->h.hist_age = now.tv_sec + hist_lookup_interval;
-+ f->h.hist_age = tick.tv_sec + hist_lookup_interval;
- f->h.f_latN = history->lat;
- f->h.f_lonE = history->lon;
- f->h.u1.f_coslat = history->coslat;
-@@ -2168,8 +2218,8 @@
- */
-
- /* destination address ">addr," */
-+ memset( &ref, 0, sizeof(ref) ); // clear it all
- memcpy( ref.callsign, d, i);
-- memset( ref.callsign+i, 0, sizeof(ref)-i );
-
- return filter_match_on_callsignset(&ref, i, f, MatchWild);
- }
-@@ -2191,12 +2241,12 @@
- case 'B':
- rc = filter_process_one_b(pb, f);
- break;
--#if 0
- case 'd':
- case 'D':
- rc = filter_process_one_d(pb, f);
- break;
-
-+#if 0
- case 'e':
- case 'E':
- rc = filter_process_one_e(pb, f);
-@@ -2209,7 +2259,12 @@
- rc = filter_process_one_f(pb, f, historydb);
- break;
- #endif
--#if 0
-+ case 'g':
-+ case 'G':
-+ rc = filter_process_one_g(pb, f);
-+ break;
-+
-+#if 0 // these are compiled as R filters, no M filters exist internally
- case 'm':
- case 'M':
- rc = filter_process_one_m(pb, f);
diff --git a/firmware/6pac2.zip b/firmware/6pac2.zip
new file mode 100644
index 0000000..431efbd
Binary files /dev/null and b/firmware/6pac2.zip differ
diff --git a/firmware/README b/firmware/README
new file mode 100644
index 0000000..a724de0
--- /dev/null
+++ b/firmware/README
@@ -0,0 +1,8 @@
+ KISS Firmwares for some TNCs
+
+
+smack.zip TNC2 clones, SMACK variation of KISS
+ Copied from: http://www.symek.com/g/tnc2firmware.html
+
+6pack2.zip TNC2 clones, 6PACK (not KISS)
+ Copied from: http://www.symek.com/g/tnc2firmware.html
diff --git a/firmware/smack.zip b/firmware/smack.zip
new file mode 100644
index 0000000..e795684
Binary files /dev/null and b/firmware/smack.zip differ
diff --git a/historydb.c b/historydb.c
index 9952863..04c2b23 100644
--- a/historydb.c
+++ b/historydb.c
@@ -1,5 +1,5 @@
/********************************************************************
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
@@ -367,7 +367,6 @@ history_cell_t *historydb_insert_heard(historydb_t *db, const struct pbuf_t *pb)
time_t expirytime = tick.tv_sec - lastposition_storetime;
char keybuf[CALLSIGNLEN_MAX+2];
- char *s;
/* NOTE: Parser does set on MESSAGES the RECIPIENTS
@@ -542,7 +541,7 @@ history_cell_t *historydb_lookup(historydb_t *db, const char *keybuf, const int
cp = db->hash[i];
- if (debug > 1) printf("historydb_lookup(%*s) -> i=%d", keylen, keybuf, i);
+ if (debug > 1) printf("historydb_lookup('%.*s') -> i=%d", keylen, keybuf, i);
for ( ; cp != NULL ; cp = cp->next ) {
if ( (cp->hash1 == h1) &&
diff --git a/historydb.h b/historydb.h
index e52d637..eee9a9b 100644
--- a/historydb.h
+++ b/historydb.h
@@ -1,5 +1,5 @@
/********************************************************************
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
diff --git a/hlog.c b/hlog.c
index 1966bb9..b305074 100644
--- a/hlog.c
+++ b/hlog.c
@@ -1,4 +1,14 @@
+/********************************************************************
+ * APRX -- 2nd generation APRS-i-gate with *
+ * minimal requirement of esoteric facilities or *
+ * libraries of any kind beyond UNIX system libc. *
+ * *
+ * (c) Matti Aarnio - OH2MQK, 2007-2014 *
+ * *
+ ********************************************************************/
/*
+ * Some parts of this code are copied from:
+ *
* aprsc
*
* (c) Heikki Hannikainen, OH7LZB <hessu at hes.iki.fi>
@@ -38,13 +48,13 @@ int log_level = LOG_INFO; /* Logging level */
int log_facility = LOG_DAEMON; /* Logging facility */
char *log_name = NULL; /* Logging name */
-char log_basename[] = "aprsc.log";
+char log_basename[] = "aprx.log";
char *log_dir = NULL; /* Access log directory */
char *log_fname = NULL; /* Access log file name */
int log_file = -1; /* If logging to a file, the file name */
rwlock_t log_file_lock = RWL_INITIALIZER;
-char accesslog_basename[] = "aprsc.access.log";
+char accesslog_basename[] = "aprx.access.log";
char *accesslog_dir = NULL; /* Access log directory */
char *accesslog_fname = NULL; /* Access log file name */
int accesslog_file = -1; /* Access log fd */
@@ -165,7 +175,7 @@ int open_log(char *name, int reopen)
hfree(log_name);
if (!(log_name = hstrdup(name))) {
- fprintf(stderr, "aprsc logger: out of memory!\n");
+ fprintf(stderr, "aprx logger: out of memory!\n");
exit(1);
}
@@ -181,7 +191,7 @@ int open_log(char *name, int reopen)
log_file = open(log_fname, O_WRONLY|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR|S_IRGRP);
if (log_file < 0) {
- fprintf(stderr, "aprsc logger: Could not open %s: %s\n", log_fname, strerror(errno));
+ fprintf(stderr, "aprx logger: Could not open %s: %s\n", log_fname, strerror(errno));
exit(1);
}
}
@@ -218,7 +228,7 @@ int close_log(int reopen)
} else if (log_dest == L_FILE) {
if (log_file >= 0) {
if (close(log_file))
- fprintf(stderr, "aprsc logger: Could not close log file %s: %s\n", log_fname, strerror(errno));
+ fprintf(stderr, "aprx logger: Could not close log file %s: %s\n", log_fname, strerror(errno));
log_file = -1;
}
if (log_fname) {
@@ -265,17 +275,17 @@ int rotate_log(void)
tmp = hmalloc(strlen(log_fname) + 6);
sprintf(tmp, "%s.tmp", log_fname);
if (rename(log_fname, tmp) != 0) {
- fprintf(stderr, "aprsc logger: Failed to rename %s to %s: %s\n", log_fname, tmp, strerror(errno));
+ fprintf(stderr, "aprx logger: Failed to rename %s to %s: %s\n", log_fname, tmp, strerror(errno));
// continue anyway, try to reopen
}
// reopen
if (close(log_file))
- fprintf(stderr, "aprsc logger: Could not close log file %s: %s\n", log_fname, strerror(errno));
+ fprintf(stderr, "aprx logger: Could not close log file %s: %s\n", log_fname, strerror(errno));
log_file = open(log_fname, O_WRONLY|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR|S_IRGRP);
if (log_file < 0) {
- fprintf(stderr, "aprsc logger: Could not open %s: %s\n", log_fname, strerror(errno));
+ fprintf(stderr, "aprx logger: Could not open %s: %s\n", log_fname, strerror(errno));
log_file = -1;
}
@@ -294,7 +304,7 @@ int rotate_log(void)
}
if (rename(tmp, r1) != 0) {
- fprintf(stderr, "aprsc logger: Failed to rename %s to %s: %s\n", tmp, r1, strerror(errno));
+ fprintf(stderr, "aprx logger: Failed to rename %s to %s: %s\n", tmp, r1, strerror(errno));
}
hfree(tmp);
@@ -319,7 +329,7 @@ static int hlog_write(int priority, const char *s)
rwl_rdlock(&log_file_lock);
fprintf(stderr, "%4d/%02d/%02d %02d:%02d:%02d.%06d %s[%d:%lx] %s: %s\n",
lt.tm_year + 1900, lt.tm_mon + 1, lt.tm_mday, lt.tm_hour, lt.tm_min, lt.tm_sec, (int)tv.tv_usec,
- (log_name) ? log_name : "aprsc", (int)getpid(), (unsigned long int)pthread_self(), log_levelnames[priority], s);
+ (log_name) ? log_name : "aprx", (int)getpid(), (unsigned long int)pthread_self(), log_levelnames[priority], s);
rwl_rdunlock(&log_file_lock);
}
@@ -327,11 +337,11 @@ static int hlog_write(int priority, const char *s)
if ((log_dest & L_FILE) && (log_file >= 0)) {
len = snprintf(wb, LOG_LEN, "%4d/%02d/%02d %02d:%02d:%02d.%06d %s[%d:%lx] %s: %s\n",
lt.tm_year + 1900, lt.tm_mon + 1, lt.tm_mday, lt.tm_hour, lt.tm_min, lt.tm_sec, (int)tv.tv_usec,
- (log_name) ? log_name : "aprsc", (int)getpid(), (unsigned long int)pthread_self(), log_levelnames[priority], s);
+ (log_name) ? log_name : "aprx", (int)getpid(), (unsigned long int)pthread_self(), log_levelnames[priority], s);
wb[LOG_LEN-1] = 0;
rwl_rdlock(&log_file_lock);
if ((w = write(log_file, wb, len)) != len)
- fprintf(stderr, "aprsc logger: Could not write to %s (fd %d): %s\n", log_fname, log_file, strerror(errno));
+ fprintf(stderr, "aprx logger: Could not write to %s (fd %d): %s\n", log_fname, log_file, strerror(errno));
rwl_rdunlock(&log_file_lock);
if (log_rotate_size) {
diff --git a/hlog.h b/hlog.h
index 486bee2..2d29f86 100644
--- a/hlog.h
+++ b/hlog.h
@@ -1,4 +1,14 @@
+/********************************************************************
+ * APRX -- 2nd generation APRS-i-gate with *
+ * minimal requirement of esoteric facilities or *
+ * libraries of any kind beyond UNIX system libc. *
+ * *
+ * (c) Matti Aarnio - OH2MQK, 2007-2014 *
+ * *
+ ********************************************************************/
/*
+ * Some parts of this code are copied from:
+ *
* aprsc
*
* (c) Heikki Hannikainen, OH7LZB <hessu at hes.iki.fi>
diff --git a/igate.c b/igate.c
index 32c36bd..6106165 100644
--- a/igate.c
+++ b/igate.c
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
@@ -185,9 +185,7 @@ void igate_to_aprsis(const char *portname, const int tncid, const char *tnc2buf,
ae = tp + tnc2addrlen; // 3rd-party recursion moves ae
e = tp + tnc2len; // stays the same all the time
- rflog(portname, 'R', discard, tp, tnc2len);
-
- redo_frame_filter:;
+ redo_frame_filter:;
t = tp;
t0 = NULL;
@@ -342,10 +340,6 @@ void igate_to_aprsis(const char *portname, const int tncid, const char *tnc2buf,
/* DEBUG OUTPUT TO STDOUT ! */
verblog(portname, 0, tp, tnc2len);
- // Log the innermost form of packet to be sent out..
- if (tp != tnc2buf || discard != discard0)
- rflog(portname, 'R', discard, tp, tnc2len);
-
if (0) {
discard:;
@@ -354,6 +348,9 @@ void igate_to_aprsis(const char *portname, const int tncid, const char *tnc2buf,
if (discard) {
erlang_add(portname, ERLANG_DROP, tnc2len, 1);
+ rflog(portname, 'd', discard, tp, tnc2len);
+ } else {
+ rflog(portname, 'R', discard, tp, tnc2len);
}
}
@@ -495,7 +492,7 @@ void igate_from_aprsis(const char *ax25, int ax25len)
{
// const char *p = ax25;
int colonidx;
- int ok_to_relay, i;
+ int i;
const char *b;
// const char *e = p + ax25len; /* string end pointer */
// char axbuf[3000]; /* enough and then some more.. */
@@ -504,8 +501,6 @@ void igate_from_aprsis(const char *ax25, int ax25len)
char *headsbuf;
int headscount = 0;
// char *s;
- char *fromcall = NULL;
- char *origtocall = NULL;
if (ax25[0] == '#') { // Comment line, timer tick, something such...
aprsis_commentframe(ax25, ax25len);
@@ -539,7 +534,6 @@ void igate_from_aprsis(const char *ax25, int ax25len)
headscount = 0;
pick_heads(headsbuf, colonidx, heads, &headscount);
- ok_to_relay = 0;
if (headscount < 4) {
// Less than 3 header fields coming from APRS-IS ?
if (debug)
@@ -553,39 +547,14 @@ void igate_from_aprsis(const char *ax25, int ax25len)
return;
}
- fromcall = heads[0];
- origtocall = heads[1];
for (i = 0; i < headscount; ++i) {
/* 3) */
if (forbidden_to_gate_addr(heads[i])) {
if (debug)
- printf("Not relayable packet! [3]\n");
+ printf("Not relayable packet! [3]: %s\n", heads[i]);
return;
}
-// FIXME: Hmm.. Really ?? q-construct analysis and "ok_to_relay" decission
- if (heads[i][0] == 'q' && heads[i][1] == 'A') {
- int qcode = heads[i][2];
- ok_to_relay = 1;
-
- // Depending on qA? value, following may
- // actually be fromcall, or some other..
- switch (qcode) {
- case 'X':
- ok_to_relay = 0;
- break;
- default:
- break;
- }
-
- heads[i] = NULL;
- break;
- }
- }
- if (!ok_to_relay) {
- if (debug)
- printf("Not relayable packet! [4]\n");
- return;
}
++b; /* Skip the ':' */
@@ -608,43 +577,8 @@ void igate_from_aprsis(const char *ax25, int ax25len)
if (debug) printf(".. igate from aprsis\n");
interface_receive_3rdparty( &aprsis_interface,
- fromcall, origtocall, "TCPIP",
+ heads, headscount, "TCPIP",
b, ax25len - (b-ax25) );
}
#endif
-
-/* ---------------------------------------------------------- */
-
-void rflog(const char *portname, char direction, int discard, const char *tnc2buf, int tnc2len)
-{
- if (rflogfile) {
- FILE *fp = NULL;
- if (strcmp("-",rflogfile)==0) {
- if (debug < 2) return;
- fp = stdout;
- } else {
- fp = fopen(rflogfile, "a");
- }
-
- if (fp) {
- char timebuf[60];
- printtime(timebuf, sizeof(timebuf));
-
- (void)fprintf(fp, "%s %-9s ", timebuf, portname);
- (void)fprintf(fp, "%c ", direction);
-
- if (discard < 0) {
- fprintf(fp, "*");
- }
- if (discard > 0) {
- fprintf(fp, "#");
- }
- (void)fwrite( tnc2buf, tnc2len, 1, fp);
- (void)fprintf( fp, "\n" );
-
- if (fp != stdout)
- fclose(fp);
- }
- }
-}
diff --git a/interface.c b/interface.c
index 0351de5..3e92965 100644
--- a/interface.c
+++ b/interface.c
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
@@ -542,7 +542,7 @@ int interface_config(struct configfile *cf)
}
#else
printf("%s:%d ERROR: AX25-DEVICE interfaces are not supported at this system!\n",
- cf->name, cf->linenum, param1);
+ cf->name, cf->linenum);
have_fault = 1;
#endif
@@ -795,9 +795,9 @@ int interface_config(struct configfile *cf)
} else if (strcmp(name,"timeout") == 0) {
if (config_parse_interval(param1, &(aif->timeout) ) ||
- (aif->timeout < 0) || (aif->timeout > 1200)) {
+ (aif->timeout < 0) || (aif->timeout > 14400)) {
aif->timeout = 0;
- printf("%s:%d ERROR: Bad TIMEOUT parameter value: '%s' accepted range: 0 to 1200 seconds.\n",
+ printf("%s:%d ERROR: Bad TIMEOUT parameter value: '%s' accepted range: 0s to 4h.\n",
cf->name, cf->linenum, param1);
have_fault = 1;
continue;
@@ -997,107 +997,120 @@ int interface_config(struct configfile *cf)
*/
void interface_receive_ax25(const struct aprx_interface *aif,
- const char *ifaddress, const int is_aprs, const int ui_pid,
- const uint8_t *axbuf, const int axaddrlen, const int axlen,
- const char *tnc2buf, const int tnc2addrlen, const int tnc2len)
+ const char *ifaddress, const int is_aprs, const int ui_pid,
+ const uint8_t *axbuf, const int axaddrlen, const int axlen,
+ const char *tnc2buf, const int tnc2addrlen, const int tnc2len)
{
int i;
int digi_like_aprs = is_aprs;
if (aif == NULL) return; // Not a real interface for digi use
if (aif->digisourcecount == 0) {
- if (debug>1) printf("interface_receive_ax25() no receivers for source %s\n",aif->callsign);
- return; // No receivers for this source
+ if (debug>1) printf("interface_receive_ax25() no receivers for source %s\n",aif->callsign);
+
+ if (!is_aprs) return;
+ if (debug > 1) printf(" Adding to histroydb anyways...");
+ struct digipeater *digi = digipeater_find_by_iface(aif);
+ if (digi == NULL) return;
+ historydb_t *historydb = digi->historydb;
+ struct pbuf_t *pb = pbuf_new(is_aprs, digi_like_aprs,
+ tnc2addrlen, tnc2buf, tnc2len,
+ axaddrlen, axbuf, axlen);
+ if (pb == NULL) return;
+ pb->source_if_group = aif->ifgroup;
+ parse_aprs(pb, historydb);
+ historydb_insert_heard(historydb, pb);
+ pbuf_put(pb);
+ return; // No receivers for this source
}
if (debug) printf("interface_receive_ax25() from %s axlen=%d tnc2len=%d\n",aif->callsign,axlen,tnc2len);
- if (axaddrlen <= 14) return; // SOURCE>DEST without any VIAs..
- // Note: Above one disables MICe destaddress-SSID embedded
- // extremely compressed WIDEn-N notation.
+ // AX.25 address length is missing at least a SRCADDR>DESTADDR
+ if (axaddrlen < 14) return;
-// FIXME: match ui_pid to list of UI PIDs that are treated with similar
-// digipeat rules as is APRS New-N.
+ // FIXME: match ui_pid to list of UI PIDs that are treated with similar
+ // digipeat rules as is APRS New-N.
// ui_pid < 0 means that this frame is not an UI frame at all.
if (ui_pid >= 0) digi_like_aprs = 1; // FIXME: more precise matching?
for (i = 0; i < aif->digisourcecount; ++i) {
- struct digipeater_source *digisource = aif->digisources[i];
+ struct digipeater_source *digisource = aif->digisources[i];
#ifndef DISABLE_IGATE
- // Transmitter's HistoryDB
- historydb_t *historydb = digisource->parent->historydb;
+ // Transmitter's HistoryDB
+ historydb_t *historydb = digisource->parent->historydb;
#endif
- // Allocate pbuf, it is born "gotten" (refcount == 1)
- struct pbuf_t *pb = pbuf_new(is_aprs, digi_like_aprs,
- tnc2addrlen, tnc2buf, tnc2len,
- axaddrlen, axbuf, axlen);
- if (pb == NULL) {
- // Urgh! Can't do a thing to this!
- // Likely reason: axlen+tnc2len > 2100 bytes!
- continue;
- }
+ // Allocate pbuf, it is born "gotten" (refcount == 1)
+ struct pbuf_t *pb = pbuf_new(is_aprs, digi_like_aprs,
+ tnc2addrlen, tnc2buf, tnc2len,
+ axaddrlen, axbuf, axlen);
+ if (pb == NULL) {
+ // Urgh! Can't do a thing to this!
+ // Likely reason: axlen+tnc2len > 2100 bytes!
+ continue;
+ }
- pb->source_if_group = aif->ifgroup;
+ pb->source_if_group = aif->ifgroup;
- // If APRS packet, then parse for APRS meaning ...
- if (is_aprs) {
- int rc = parse_aprs(pb,
+ // If APRS packet, then parse for APRS meaning ...
+ if (is_aprs) {
+ int rc = parse_aprs(pb,
#ifndef DISABLE_IGATE
- historydb
+ historydb
#else
- NULL
+ NULL
#endif
- ); // don't look inside 3rd party
- char *srcif = aif->callsign;
- if (debug)
- printf(".. parse_aprs() rc=%s type=0x%02x srcif=%s tnc2addr='%s' info_start='%s'\n",
- rc ? "OK":"FAIL", pb->packettype, srcif, pb->data, pb->info_start);
-
- // If there are no filters, permit all packets
- if (digisource->src_filters != NULL) {
- int filter_discard =
- filter_process(pb,
- digisource->src_filters,
+ ); // don't look inside 3rd party
+ char *srcif = aif->callsign;
+ if (debug)
+ printf(".. parse_aprs() rc=%s type=0x%02x srcif=%s tnc2addr='%s' info_start='%s'\n",
+ rc ? "OK":"FAIL", pb->packettype, srcif, pb->data, pb->info_start);
+
+ // If there are no filters, permit all packets
+ if (digisource->src_filters != NULL) {
+ int filter_discard =
+ filter_process(pb,
+ digisource->src_filters,
#ifndef DISABLE_IGATE
- historydb // Transmitter HistoryDB
+ historydb // Transmitter HistoryDB
#else
- NULL
+ NULL
#endif
- );
- // filter_discard > 0: accept
- // filter_discard = 0: indifferent (not reject, not accept), tx-igate rules as is.
- // filter_discard < 0: reject
- if (debug)
- printf("source filtering result: %s\n",
- (filter_discard < 0 ? "DISCARD" :
- (filter_discard > 0 ? "ACCEPT" : "no-match")));
-
- if (filter_discard <= 0) {
- pbuf_put(pb);
- continue; // allow only explicitly accepted
- }
- }
+ );
+ // filter_discard > 0: accept
+ // filter_discard = 0: indifferent (not reject, not accept), tx-igate rules as is.
+ // filter_discard < 0: reject
+ if (debug)
+ printf("source filtering result: %s\n",
+ (filter_discard < 0 ? "DISCARD" :
+ (filter_discard > 0 ? "ACCEPT" : "no-match")));
+
+ if (filter_discard <= 0) {
+ pbuf_put(pb);
+ continue; // allow only explicitly accepted
+ }
+ }
#ifndef DISABLE_IGATE
- // Find out IGATE callsign (if any), and record it on transmitter's historydb.
- if (pb->packettype & T_THIRDPARTY) {
- rx_analyze_3rdparty( historydb, pb );
- } else {
- // Everything else, feed to history-db
- historydb_insert_heard( historydb, pb );
- }
+ // Find out IGATE callsign (if any), and record it on transmitter's historydb.
+ if (pb->packettype & T_THIRDPARTY) {
+ rx_analyze_3rdparty( historydb, pb );
+ } else {
+ // Everything else, feed to history-db
+ historydb_insert_heard( historydb, pb );
+ }
#endif
- }
+ }
- // Feed it to digipeater ...
- digipeater_receive( digisource, pb);
+ // Feed it to digipeater ...
+ digipeater_receive( digisource, pb);
- // .. and finally free up the pbuf (if refcount goes to zero)
- pbuf_put(pb);
+ // .. and finally free up the pbuf (if refcount goes to zero)
+ pbuf_put(pb);
}
}
@@ -1231,14 +1244,17 @@ void interface_transmit_ax25(const struct aprx_interface *aif, uint8_t *axaddr,
static uint8_t toaprs[7] = { 'A'<<1,'P'<<1,'R'<<1,'S'<<1,' '<<1,' '<<1,0x60 };
void interface_receive_3rdparty( const struct aprx_interface *aif,
- const char *fromcall,
- const char *origtocall,
- const char *gwtype,
- const char *tnc2data,
- const int tnc2datalen )
+ char **heads,
+ const int headscount,
+ const char *gwtype,
+ const char *tnc2data,
+ const int tnc2datalen )
{
int d; // digipeater index
+ const char *fromcall = heads[0];
+ const char *origtocall = heads[1];
+
char tnc2buf1[2800];
uint8_t ax25buf1[2800];
@@ -1247,7 +1263,7 @@ void interface_receive_3rdparty( const struct aprx_interface *aif,
int ax25addrlen1;
int ax25len1;
int rc, tnc2addrlen1, tnc2len1;
- uint8_t *a;
+ uint8_t *a, *b;
char *t;
struct pbuf_t *pb;
@@ -1270,9 +1286,10 @@ void interface_receive_3rdparty( const struct aprx_interface *aif,
// that the filter can process:
// Incoming:
- // EI7IG-1>APRS,TCPIP*,qAC,T2IRELAND:@262231z5209.97N/00709.65W_238/019g019t049P006h95b10290.wview_5_19_0
+ // EI7IG-1>APRSX,TCPIP*,qAC,T2IRELAND:@262231z5209.97N/00709.65W_238/019g019t049P006h95b10290.wview_5_19_0
// Filtered:
- // EI7IG-1>APRS:@262231z5209.97N/00709.65W_238/019g019t049P006h95b10290.wview_5_19_0
+ // MYCALL>APRSX,VIA:}EI7IG-1>APRSX:@262231z5209.97N/00709.65W_238/019g019t049P006h95b10290.wview_5_19_0
+
a = ax25buf1;
parse_ax25addr( a, tocall, 0x60 );
@@ -1378,7 +1395,7 @@ void interface_receive_3rdparty( const struct aprx_interface *aif,
// Produced 3rd-party packet:
// IGATECALL>APRS,GATEPATH:}FROMCALL>TOCALL,TCPIP,IGATECALL*:original packet data
- if (debug) printf("## produce 3rd-party frame for transmit:\n");
+ if (debug) printf("## produce 3rd-party AX.25 frames for transmit, and original source one for filtering:\n");
// Parse the TNC2 format to AX.25 format
// using ax25buf[] storage area.
memcpy(ax25buf, toaprs, 7); // AX.25 DEST call
@@ -1412,6 +1429,8 @@ void interface_receive_3rdparty( const struct aprx_interface *aif,
*a++ = 0x03; // UI
*a++ = 0xF0; // PID = 0xF0
+ b = a; // AX.25 data body
+
a += sprintf((char*)a, "}%s>%s,%s,%s*:",
fromcall, origtocall, gwtype, tx_aif->callsign );
ax25len = a - ax25buf;
@@ -1423,10 +1442,40 @@ void interface_receive_3rdparty( const struct aprx_interface *aif,
}
memcpy(a, tnc2data, tnc2datalen);
ax25len += tnc2datalen;
+ a += tnc2datalen;
+
+ if (debug>1) {
+ printf("Formatted AX.25: %s>APRS", tx_aif->callsign);
+ if ((filter_packettype & T_MESSAGE) != 0 && digisrc->msg_path != NULL) {
+ if (digisrc->msg_path != NULL) {
+ printf(",%s", digisrc->msg_path);
+ }
+ } else {
+ if (digisrc->via_path != NULL) {
+ printf( ",%s", digisrc->via_path);
+ }
+ }
+ printf(":");
+ fwrite(b, 1, a-b, stdout);
+ printf("\n");
+ }
// AX.25 packet is built, now build TNC2 version of it
t = tnc2buf;
- t += sprintf(t, "%s>%s", tx_aif->callsign, tocall);
+
+ // NOTE: Building TNC2 form for filter purposes, that is the data
+ // has original source address, and not out interface specific one!
+ //
+ //t += sprintf(t, "%s>%s", tx_aif->callsign, tocall);
+ t += sprintf(t, "%s>%s", fromcall, origtocall);
+ {
+ int i;
+ for (i=2; i<headscount; i++) {
+ t += sprintf(t, ",%s", heads[i]);
+ }
+ }
+
+ /*
if ((filter_packettype & T_MESSAGE) != 0 && digisrc->msg_path != NULL) {
if (digisrc->msg_path != NULL) {
t += sprintf(t, ",%s", digisrc->msg_path);
@@ -1436,7 +1485,8 @@ void interface_receive_3rdparty( const struct aprx_interface *aif,
t += sprintf(t, ",%s", digisrc->via_path);
}
}
- if (debug>1)printf(" tnc2addr = %s\n", tnc2buf);
+ */
+ if (debug>1)printf(" filter tnc2addr = %s\n", tnc2buf);
tnc2addrlen = t - tnc2buf;
*t++ = ':';
@@ -1735,7 +1785,7 @@ int process_message_to_myself(const struct aprx_interface*const srcif, const str
}
// Whatever message, syslog it.
- syslog(LOG_INFO, "%*s", pb->packet_len, pb->data);
+ syslog(LOG_INFO, "%.*s", pb->packet_len, pb->data);
if (am.is_rej || am.is_ack) {
// A REJect or ACKnowledge received, drop.
@@ -1888,7 +1938,7 @@ int interface_transmit_beacon(const struct aprx_interface *aif, const char *src,
memcpy(a, txbuf+2, txlen-2); // forget control+pid bytes..
a += txlen -2; // final assembled message end pointer
- rflog(aif->callsign, 'T', 0, axbuf, a - axbuf);
+ rflog(aif->callsign, 'T', 0, axbuf, a - axbuf); // beacon
}
return 0;
diff --git a/keyhash.c b/keyhash.c
index 8230d1a..46dcd5e 100644
--- a/keyhash.c
+++ b/keyhash.c
@@ -1,5 +1,5 @@
/********************************************************************
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
diff --git a/keyhash.h b/keyhash.h
index d8f6377..3714a97 100644
--- a/keyhash.h
+++ b/keyhash.h
@@ -1,5 +1,5 @@
/********************************************************************
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
diff --git a/kiss.c b/kiss.c
index b6c5e7b..f4056ae 100644
--- a/kiss.c
+++ b/kiss.c
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
@@ -196,59 +196,63 @@ static int kissprocess(struct serialport *S)
than 0 coming from TNC to host! */
/* printf(" ..bad CMD byte\n"); */
if (debug) {
- printf("%ld\tTTY %s: Bad CMD byte on KISS frame: ", tick.tv_sec, S->ttyname);
- hexdumpfp(stdout, S->rdline, S->rdlinelen, 1);
- printf("\n");
+ printf("%ld\tTTY %s: Bad CMD byte on KISS frame: ", tick.tv_sec, S->ttyname);
+ hexdumpfp(stdout, S->rdline, S->rdlinelen, 1);
+ printf("\n");
}
+ rfloghex(S->ttyname, 'D', 1, S->rdline, S->rdlinelen);
erlang_add(S->ttycallsign[tncid], ERLANG_DROP, S->rdlinelen, 1); /* Account one packet */
return -1;
}
if (S->linetype == LINETYPE_KISS && (cmdbyte & 0x20)) {
- // Huh? Perhaps a FLEXNET packet?
- int crcflex = calc_crc_flex(S->rdline, S->rdlinelen);
- if (crcflex == 0x7070) {
- if (debug) printf("ALERT: Looks like received KISS frame is a FLEXNET with CRC!\n");
- S->linetype = LINETYPE_KISSFLEXNET;
- }
+ // Huh? Perhaps a FLEXNET packet?
+ int crcflex = calc_crc_flex(S->rdline, S->rdlinelen);
+ if (crcflex == 0x7070) {
+ if (debug) printf("ALERT: Looks like received KISS frame is a FLEXNET with CRC!\n");
+ S->linetype = LINETYPE_KISSFLEXNET;
+ }
}
if (S->linetype == LINETYPE_KISS && (cmdbyte & 0x80)) {
- // Huh? Perhaps a SMACK packet?
- int smack_ok = check_crc_16(S->rdline, S->rdlinelen);
- if (smack_ok == 0) {
- if (debug) printf("ALERT: Looks like received KISS frame is a SMACK with CRC!\n");
- S->linetype = LINETYPE_KISSSMACK;
- }
+ // Huh? Perhaps a SMACK packet?
+ int smack_ok = check_crc_16(S->rdline, S->rdlinelen);
+ if (smack_ok == 0) {
+ if (debug) printf("ALERT: Looks like received KISS frame is a SMACK with CRC!\n");
+ S->linetype = LINETYPE_KISSSMACK;
+ }
}
/* Are we expecting FLEXNET KISS ? */
if (S->linetype == LINETYPE_KISSFLEXNET && (cmdbyte & 0x20)) {
- int crc;
- tncid &= ~0x20; // FlexNet puts 0x20 as indication of CRC presence..
-
- if (S->ttycallsign[tncid] == NULL) {
- /* D'OH! received packet on multiplexer tncid without
- callsign definition! We discard this packet! */
- if (debug > 0) {
- printf("%ld\tTTY %s: Bad TNCID on CMD byte on a KISS frame: %02x No interface configured for it! ", tick.tv_sec, S->ttyname, cmdbyte);
- hexdumpfp(stdout, S->rdline, S->rdlinelen, 1);
- printf("\n");
- }
- erlang_add(S->ttycallsign[tncid], ERLANG_DROP, S->rdlinelen, 1); /* Account one packet */
- return -1;
- }
- crc = calc_crc_flex(S->rdline, S->rdlinelen);
- if (crc != 0x7070) {
- if (debug) {
- printf("%ld\tTTY %s tncid %d: Received FLEXNET frame with invalid CRC %04x: ",
- tick.tv_sec, S->ttyname, tncid, crc);
- hexdumpfp(stdout, S->rdline, S->rdlinelen, 1);
- printf("\n");
- }
- erlang_add(S->ttycallsign[tncid], ERLANG_DROP, S->rdlinelen, 1); // Account one packet
- return -1; // The CRC was invalid..
- }
- S->rdlinelen -= 2; // remove 2 bytes!
+ int crc;
+ tncid &= ~0x20; // FlexNet puts 0x20 as indication of CRC presence..
+
+ if (S->ttycallsign[tncid] == NULL) {
+ /* D'OH! received packet on multiplexer tncid without
+ callsign definition! We discard this packet! */
+ if (debug > 0) {
+ printf("%ld\tTTY %s: Bad TNCID on CMD byte on a KISS frame: %02x No interface configured for it! ", tick.tv_sec, S->ttyname, cmdbyte);
+ hexdumpfp(stdout, S->rdline, S->rdlinelen, 1);
+ printf("\n");
+ }
+ rfloghex(S->ttyname, 'D', 1, S->rdline, S->rdlinelen);
+ erlang_add(S->ttycallsign[tncid], ERLANG_DROP, S->rdlinelen, 1); /* Account one packet */
+ return -1;
+ }
+ crc = calc_crc_flex(S->rdline, S->rdlinelen);
+ if (crc != 0x7070) {
+ aprxlog("Received FLEXNET frame with invalid CRC TTY=%s tncid=%d",S->ttyname,tncid);
+ if (debug) {
+ printf("%ld\tTTY %s tncid %d: Received FLEXNET frame with invalid CRC %04x: ",
+ tick.tv_sec, S->ttyname, tncid, crc);
+ hexdumpfp(stdout, S->rdline, S->rdlinelen, 1);
+ printf("\n");
+ }
+ rfloghex(S->ttyname, 'D', 1, S->rdline, S->rdlinelen);
+ erlang_add(S->ttycallsign[tncid], ERLANG_DROP, S->rdlinelen, 1); // Account one packet
+ return -1; // The CRC was invalid..
+ }
+ S->rdlinelen -= 2; // remove 2 bytes!
}
/* Are we excepting BPQ "CRC" (XOR-sum of data) */
@@ -257,15 +261,16 @@ static int kissprocess(struct serialport *S)
int xorsum = 0;
if (S->ttycallsign[tncid] == NULL) {
- /* D'OH! received packet on multiplexer tncid without
- callsign definition! We discard this packet! */
- if (debug > 0) {
- printf("%ld\tTTY %s: Bad TNCID on CMD byte on a KISS frame: %02x No interface configured for it! ", tick.tv_sec, S->ttyname, cmdbyte);
- hexdumpfp(stdout, S->rdline, S->rdlinelen, 1);
- printf("\n");
- }
- erlang_add(S->ttycallsign[tncid], ERLANG_DROP, S->rdlinelen, 1); /* Account one packet */
- return -1;
+ /* D'OH! received packet on multiplexer tncid without
+ callsign definition! We discard this packet! */
+ if (debug > 0) {
+ printf("%ld\tTTY %s: Bad TNCID on CMD byte on a KISS frame: %02x No interface configured for it! ", tick.tv_sec, S->ttyname, cmdbyte);
+ hexdumpfp(stdout, S->rdline, S->rdlinelen, 1);
+ printf("\n");
+ }
+ rfloghex(S->ttyname, 'D', 1, S->rdline, S->rdlinelen);
+ erlang_add(S->ttycallsign[tncid], ERLANG_DROP, S->rdlinelen, 1); /* Account one packet */
+ return -1;
}
for (i = 1; i < S->rdlinelen; ++i)
@@ -273,10 +278,11 @@ static int kissprocess(struct serialport *S)
xorsum &= 0xFF;
if (xorsum != 0) {
if (debug) {
- printf("%ld\tTTY %s tncid %d: Received bad BPQCRC: %02x: ", tick.tv_sec, S->ttyname, tncid, xorsum);
- hexdumpfp(stdout, S->rdline, S->rdlinelen, 1);
- printf("\n");
+ printf("%ld\tTTY %s tncid %d: Received bad BPQCRC: %02x: ", tick.tv_sec, S->ttyname, tncid, xorsum);
+ hexdumpfp(stdout, S->rdline, S->rdlinelen, 1);
+ printf("\n");
}
+ rfloghex(S->ttyname, 'D', 1, S->rdline, S->rdlinelen);
erlang_add(S->ttycallsign[tncid], ERLANG_DROP, S->rdlinelen, 1); /* Account one packet */
return -1;
}
@@ -287,119 +293,126 @@ static int kissprocess(struct serialport *S)
/* Are we expecting SMACK ? */
if (S->linetype == LINETYPE_KISSSMACK) {
- tncid &= 0x07; /* Chop off top bit */
-
- if (S->ttycallsign[tncid] == NULL) {
- /* D'OH! received packet on multiplexer tncid without
- callsign definition! We discard this packet! */
- if (debug > 0) {
- printf("%ld\tTTY %s: Bad TNCID on CMD byte on a KISS frame: %02x No interface configured for it! ", tick.tv_sec, S->ttyname, cmdbyte);
- hexdumpfp(stdout, S->rdline, S->rdlinelen, 1);
- printf("\n");
- }
- erlang_add(S->ttycallsign[tncid], ERLANG_DROP, S->rdlinelen, 1); /* Account one packet */
- return -1;
- }
+ tncid &= 0x07; /* Chop off top bit */
- if ((cmdbyte & 0x8F) == 0x80) {
- /* SMACK data frame */
+ if (S->ttycallsign[tncid] == NULL) {
+ /* D'OH! received packet on multiplexer tncid without
+ callsign definition! We discard this packet! */
+ if (debug > 0) {
+ printf("%ld\tTTY %s: Bad TNCID on CMD byte on a KISS frame: %02x No interface configured for it! ", tick.tv_sec, S->ttyname, cmdbyte);
+ hexdumpfp(stdout, S->rdline, S->rdlinelen, 1);
+ printf("\n");
+ }
+ rfloghex(S->ttyname, 'D', 1, S->rdline, S->rdlinelen);
+ erlang_add(S->ttycallsign[tncid], ERLANG_DROP, S->rdlinelen, 1); /* Account one packet */
+ return -1;
+ }
- if (debug > 3)
- printf("%ld\tTTY %s tncid %d: Received SMACK frame\n", tick.tv_sec, S->ttyname, tncid);
+ if ((cmdbyte & 0x8F) == 0x80) {
+ /* SMACK data frame */
- if (!(S->smack_subids & (1 << tncid))) {
- if (debug)
- printf("%ld\t... marking received SMACK\n", tick.tv_sec);
- }
- S->smack_subids |= (1 << tncid);
+ if (debug > 3)
+ printf("%ld\tTTY %s tncid %d: Received SMACK frame\n", tick.tv_sec, S->ttyname, tncid);
- /* It is SMACK frame -- KISS with CRC16 at the tail.
- Now we ignore the TNC-id number field.
- Verify the CRC.. */
+ if (!(S->smack_subids & (1 << tncid))) {
+ aprxlog("Received SMACK frame TTY=%s tncid=%d",S->ttyname,tncid);
+ if (debug)
+ printf("%ld\t... marking received SMACK\n", tick.tv_sec);
+ }
+ S->smack_subids |= (1 << tncid);
- // Whole buffer including CMD-byte!
- if (check_crc_16(S->rdline, S->rdlinelen) != 0) {
- if (debug) {
- printf("%ld\tTTY %s tncid %d: Received SMACK frame with invalid CRC: ",
- tick.tv_sec, S->ttyname, tncid);
- hexdumpfp(stdout, S->rdline, S->rdlinelen, 1);
- printf("\n");
+ /* It is SMACK frame -- KISS with CRC16 at the tail.
+ Now we ignore the TNC-id number field.
+ Verify the CRC.. */
+
+ // Whole buffer including CMD-byte!
+ if (check_crc_16(S->rdline, S->rdlinelen) != 0) {
+ aprxlog("Received SMACK frame with invalid CTC TTY=%s tncid=%d",S->ttyname,tncid);
+ if (debug) {
+ printf("%ld\tTTY %s tncid %d: Received SMACK frame with invalid CRC: ",
+ tick.tv_sec, S->ttyname, tncid);
+ hexdumpfp(stdout, S->rdline, S->rdlinelen, 1);
+ printf("\n");
+ }
+ rfloghex(S->ttyname, 'D', 1, S->rdline, S->rdlinelen);
+ erlang_add(S->ttycallsign[tncid], ERLANG_DROP, S->rdlinelen, 1); // Account one packet
+ return -1; /* The CRC was invalid.. */
}
- erlang_add(S->ttycallsign[tncid], ERLANG_DROP, S->rdlinelen, 1); // Account one packet
- return -1; /* The CRC was invalid.. */
- }
- S->rdlinelen -= 2; /* Chop off the two CRC bytes */
+ S->rdlinelen -= 2; /* Chop off the two CRC bytes */
- } else if ((cmdbyte & 0x8F) == 0x00) {
- /*
- * Expecting SMACK data, but got plain KISS data.
- * Send a flow-rate limited probes to TNC to enable
- * SMACK -- lets use 30 minutes window...
- */
+ } else if ((cmdbyte & 0x8F) == 0x00) {
+ /*
+ * Expecting SMACK data, but got plain KISS data.
+ * Send a flow-rate limited probes to TNC to enable
+ * SMACK -- lets use 30 minutes window...
+ */
- S->smack_subids &= ~(1 << tncid); // Turn off the SMACK mode indication bit..
+ S->smack_subids &= ~(1 << tncid); // Turn off the SMACK mode indication bit..
- if (debug > 2)
- printf("%ld\tTTY %s tncid %d: Expected SMACK, got KISS.\n", tick.tv_sec, S->ttyname, tncid);
+ if (debug > 2)
+ printf("%ld\tTTY %s tncid %d: Expected SMACK, got KISS.\n", tick.tv_sec, S->ttyname, tncid);
- if (timecmp(S->smack_probe[tncid], tick.tv_sec) < 0) {
- uint8_t probe[4];
- uint8_t kissbuf[12];
- int kisslen;
+ if (timecmp(S->smack_probe[tncid], tick.tv_sec) < 0) {
+ uint8_t probe[4];
+ uint8_t kissbuf[12];
+ int kisslen;
- probe[0] = cmdbyte | 0x80; /* Make it into SMACK */
- probe[1] = 0;
+ probe[0] = cmdbyte | 0x80; /* Make it into SMACK */
+ probe[1] = 0;
- /* Convert the probe packet to KISS frame */
- kisslen = kissencoder( kissbuf, sizeof(kissbuf), S->linetype,
- &(probe[1]), 1, probe[0] );
+ /* Convert the probe packet to KISS frame */
+ kisslen = kissencoder( kissbuf, sizeof(kissbuf), S->linetype,
+ &(probe[1]), 1, probe[0] );
- /* Send probe message.. */
- if (S->wrlen + kisslen < sizeof(S->wrbuf)) {
- /* There is enough space in writebuf! */
+ /* Send probe message.. */
+ if (S->wrlen + kisslen < sizeof(S->wrbuf)) {
+ /* There is enough space in writebuf! */
- memcpy(S->wrbuf + S->wrlen, kissbuf, kisslen);
- S->wrlen += kisslen;
- /* Flush it out.. and if not successfull,
- poll(2) will take care of it soon enough.. */
- ttyreader_linewrite(S);
+ memcpy(S->wrbuf + S->wrlen, kissbuf, kisslen);
+ S->wrlen += kisslen;
+ /* Flush it out.. and if not successfull,
+ poll(2) will take care of it soon enough.. */
+ ttyreader_linewrite(S);
- S->smack_probe[tncid] = tick.tv_sec + 1800; /* 30 minutes */
+ S->smack_probe[tncid] = tick.tv_sec + 1800; /* 30 minutes */
- if (debug)
- printf("%ld\tTTY %s tncid %d: Sending SMACK activation probe packet\n", tick.tv_sec, S->ttyname, tncid);
+ aprxlog("Sent SMACK activation probe TTY=%s tncid=%d",S->ttyname,tncid);
+ if (debug)
+ printf("%ld\tTTY %s tncid %d: Sending SMACK activation probe packet\n", tick.tv_sec, S->ttyname, tncid);
- }
- /* Else no space to write ? Huh... */
- }
- } else {
- // Else... there should be no other kind data frames
- if (debug) {
- printf("%ld\tTTY %s: Bad CMD byte on expected SMACK frame: %02x, len=%d: ",
- tick.tv_sec, S->ttyname, cmdbyte, S->rdlinelen);
- hexdumpfp(stdout, S->rdline, S->rdlinelen, 1);
- printf("\n");
+ }
+ /* Else no space to write ? Huh... */
+ }
+ } else {
+ // Else... there should be no other kind data frames
+ if (debug) {
+ printf("%ld\tTTY %s: Bad CMD byte on expected SMACK frame: %02x, len=%d: ",
+ tick.tv_sec, S->ttyname, cmdbyte, S->rdlinelen);
+ hexdumpfp(stdout, S->rdline, S->rdlinelen, 1);
+ printf("\n");
+ }
+ rfloghex(S->ttyname, 'D', 1, S->rdline, S->rdlinelen);
+ erlang_add(S->ttycallsign[tncid], ERLANG_DROP, S->rdlinelen, 1); /* Account one packet */
+ return -1;
}
- erlang_add(S->ttycallsign[tncid], ERLANG_DROP, S->rdlinelen, 1); /* Account one packet */
- return -1;
- }
}
/* Are we expecting Basic KISS ? */
if (S->linetype == LINETYPE_KISS) {
- if (S->ttycallsign[tncid] == NULL) {
- /* D'OH! received packet on multiplexer tncid without
- callsign definition! We discard this packet! */
- if (debug > 0) {
- printf("%ld\tTTY %s: Bad TNCID on CMD byte on a KISS frame: %02x No interface configured for it! ", tick.tv_sec, S->ttyname, cmdbyte);
- hexdumpfp(stdout, S->rdline, S->rdlinelen, 1);
- printf("\n");
- }
- erlang_add(S->ttycallsign[tncid], ERLANG_DROP, S->rdlinelen, 1); /* Account one packet */
- return -1;
- }
+ if (S->ttycallsign[tncid] == NULL) {
+ /* D'OH! received packet on multiplexer tncid without
+ callsign definition! We discard this packet! */
+ if (debug > 0) {
+ printf("%ld\tTTY %s: Bad TNCID on CMD byte on a KISS frame: %02x No interface configured for it! ", tick.tv_sec, S->ttyname, cmdbyte);
+ hexdumpfp(stdout, S->rdline, S->rdlinelen, 1);
+ printf("\n");
+ }
+ rfloghex(S->ttyname, 'D', 1, S->rdline, S->rdlinelen);
+ erlang_add(S->ttycallsign[tncid], ERLANG_DROP, S->rdlinelen, 1); /* Account one packet */
+ return -1;
+ }
}
@@ -408,13 +421,14 @@ static int kissprocess(struct serialport *S)
/* Too short frame.. */
/* printf(" ..too short a frame for anything\n"); */
+ rfloghex(S->ttyname, 'D', 1, S->rdline, S->rdlinelen);
erlang_add(S->ttycallsign[tncid], ERLANG_DROP, S->rdlinelen, 1); /* Account one packet */
return -1;
}
/* Valid AX.25 HDLC frame byte sequence is now at
S->rdline[1..S->rdlinelen-1]
- */
+ */
/* Send the frame to APRS-IS, return 1 if valid AX.25 UI message, does not
validate against valid APRS message rules... (TODO: it could do that too) */
@@ -427,7 +441,7 @@ static int kissprocess(struct serialport *S)
erlang_add(S->ttycallsign[tncid], ERLANG_RX, S->rdlinelen, 1); /* Account one packet */
if (ax25_to_tnc2(S->interface[tncid], S->ttycallsign[tncid], tncid,
- cmdbyte, S->rdline + 1, S->rdlinelen - 1)) {
+ cmdbyte, S->rdline + 1, S->rdlinelen - 1)) {
// The packet is valid per AX.25 header bit rules.
#ifdef PF_AX25 /* PF_AX25 exists -- highly likely a Linux system ! */
@@ -437,23 +451,24 @@ static int kissprocess(struct serialport *S)
#endif
} else {
- // The packet is not valid per AX.25 header bit rules
- erlang_add(S->ttycallsign[tncid], ERLANG_DROP, S->rdlinelen, 1); /* Account one packet */
-
- if (aprxlogfile) {
- // NOT replaced with aprxlog() -- because this is a bit more complicated..
- FILE *fp = fopen(aprxlogfile, "a");
- if (fp) {
- char timebuf[60];
- printtime(timebuf, sizeof(timebuf));
- setlinebuf(fp);
-
- fprintf(fp, "%s ax25_to_tnc2(%s,len=%d) rejected the message: ", timebuf, S->ttycallsign[tncid], S->rdlinelen-1);
- hexdumpfp(fp, S->rdline, S->rdlinelen, 1);
- fprintf(fp, "\n");
- fclose(fp);
- }
- }
+ // The packet is not valid per AX.25 header bit rules
+ rfloghex(S->ttyname, 'D', 1, S->rdline, S->rdlinelen);
+ erlang_add(S->ttycallsign[tncid], ERLANG_DROP, S->rdlinelen, 1); /* Account one packet */
+
+ if (aprxlogfile) {
+ // NOT replaced with aprxlog() -- because this is a bit more complicated..
+ FILE *fp = fopen(aprxlogfile, "a");
+ if (fp) {
+ char timebuf[60];
+ printtime(timebuf, sizeof(timebuf));
+ setlinebuf(fp);
+
+ fprintf(fp, "%s ax25_to_tnc2(%s,len=%d) rejected the message: ", timebuf, S->ttycallsign[tncid], S->rdlinelen-1);
+ hexdumpfp(fp, S->rdline, S->rdlinelen, 1);
+ fprintf(fp, "\n");
+ fclose(fp);
+ }
+ }
}
return 0;
@@ -586,7 +601,7 @@ void kiss_kisswrite(struct serialport *S, const int tncid, const uint8_t *ax25ra
uint8_t kissbuf[2300];
if (debug) {
- printf("kiss_kisswrite(->%s, axlen=%d)", S->ttycallsign[tncid], ax25rawlen);
+ printf("kiss_kisswrite(->%s, axlen=%d)\n", S->ttycallsign[tncid], ax25rawlen);
}
if (S->fd < 0) {
if (debug)
@@ -626,12 +641,24 @@ void kiss_kisswrite(struct serialport *S, const int tncid, const uint8_t *ax25ra
}
}
- ssid = (tncid << 4) | ((S->linetype == LINETYPE_KISSSMACK) ? 0x80 : 0x00);
- if (S->linetype == LINETYPE_KISSFLEXNET) ssid |= 0x20; // CRC presence
-
- len = kissencoder( kissbuf, sizeof(kissbuf), S->linetype, ax25raw, ax25rawlen, ssid );
+ ssid = (tncid << 4);
+ switch (S->linetype) {
+ case LINETYPE_KISSFLEXNET:
+ len = kissencoder( kissbuf, sizeof(kissbuf), S->linetype, ax25raw, ax25rawlen, ssid |= 0x20 );
+ break;
+ case LINETYPE_KISSSMACK:
+ if (S->smack_subids & (1 << tncid)) //if SMACK currently active
+ len = kissencoder( kissbuf, sizeof(kissbuf), S->linetype, ax25raw, ax25rawlen, ssid |= 0x80 );
+ else
+ len = kissencoder( kissbuf, sizeof(kissbuf), LINETYPE_KISS, ax25raw, ax25rawlen, ssid );
+ break;
+ default:
+ len = kissencoder( kissbuf, sizeof(kissbuf), S->linetype, ax25raw, ax25rawlen, ssid );
+ break;
+ }
if (debug>2) {
+ printf("ssid=%0x S->smack_subids=%0x\n",ssid,S->smack_subids);
printf("kiss-encoded: ");
hexdumpfp(stdout, kissbuf, len, 1);
printf("\n");
diff --git a/netax25.c b/netax25.c
index 65867c9..08efba0 100644
--- a/netax25.c
+++ b/netax25.c
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
@@ -690,6 +690,7 @@ Leads with 00 byte, then AX.25 address..
;
} else {
// The packet is not valid per AX.25 header bit rules
+ rfloghex(netdev->callsign, 'D', 1, rxbuf, rcvlen);
erlang_add(netdev->callsign, ERLANG_DROP, rcvlen+10, 1); /* Account one packet */
if (aprxlogfile) {
diff --git a/netresolver.c b/netresolver.c
index 85960f2..6fa84fd 100644
--- a/netresolver.c
+++ b/netresolver.c
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
@@ -18,7 +18,6 @@ pthread_attr_t pthr_attrs;
static int nrcount;
static struct netresolver **nr;
-static int netresolv_die_now;
static int RE_RESOLVE_INTERVAL = 300; // 15 minutes ?
diff --git a/parse_aprs.c b/parse_aprs.c
index f8b0bd3..e86a218 100644
--- a/parse_aprs.c
+++ b/parse_aprs.c
@@ -1,4 +1,14 @@
+/********************************************************************
+ * APRX -- 2nd generation APRS-i-gate with *
+ * minimal requirement of esoteric facilities or *
+ * libraries of any kind beyond UNIX system libc. *
+ * *
+ * (c) Matti Aarnio - OH2MQK, 2007-2014 *
+ * *
+ ********************************************************************/
/*
+ * Some parts of this code are copied from:
+ *
* aprsc
*
* (c) Heikki Hannikainen, OH7LZB <hessu at hes.iki.fi>
@@ -9,7 +19,7 @@
*/
/*
- * A simple APRS parser for aprsc. Translated from Ham::APRS::FAP
+ * A simple APRS parser from aprsc. Translated from Ham::APRS::FAP
* perl module (by OH2KKU).
*
* Only needs to get lat/lng out of the packet, other features would
@@ -1101,7 +1111,7 @@ int parse_aprs(struct pbuf_t*const pb, historydb_t*const historydb)
*/
// ignore the CRLF in the end of the body
- body_end = pb->data + pb->packet_len; // NOTE! Difference from original aprsc code
+ body_end = pb->data + pb->packet_len;
do {
// body is right after the packet type character
diff --git a/pbuf.c b/pbuf.c
index baee971..cd85264 100644
--- a/pbuf.c
+++ b/pbuf.c
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
diff --git a/pbuf.h b/pbuf.h
index d386910..be92cad 100644
--- a/pbuf.h
+++ b/pbuf.h
@@ -1,4 +1,14 @@
+/********************************************************************
+ * APRX -- 2nd generation APRS-i-gate with *
+ * minimal requirement of esoteric facilities or *
+ * libraries of any kind beyond UNIX system libc. *
+ * *
+ * (c) Matti Aarnio - OH2MQK, 2007-2014 *
+ * *
+ ********************************************************************/
/*
+ * Some parts of this code are copied from:
+ *
* aprsc
*
* (c) Heikki Hannikainen, OH7LZB <hessu at hes.iki.fi>
diff --git a/aprx.spec b/rpm/aprx.spec.in
similarity index 96%
rename from aprx.spec
rename to rpm/aprx.spec.in
index f620b8e..752095d 100644
--- a/aprx.spec
+++ b/rpm/aprx.spec.in
@@ -1,5 +1,5 @@
Name: aprx
-Version: 2.08.svn593
+Version: @VERSION@
Release: 1%{?dist}
Summary: Hamradio APRS iGate / Digipeater
License: BSD
@@ -111,7 +111,7 @@ rm -rf $RPM_BUILD_ROOT
%changelog
-* Thu Oct 11 2012 Andrew Elwell <Andrew.Elwell at gmail.com> - 2.08.svn593
+* Thu Oct 11 2012 Andrew Elwell <Andrew.Elwell at gmail.com> - @VERSION@
- Packaging for Fedora
* Sat Jan 12 2008 Matti Aarnio - OH2MQK - KP20NG <oh2mqk at sral.fi> -
diff --git a/svnversion b/svnversion
deleted file mode 100755
index e6d3b81..0000000
--- a/svnversion
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-echo 523
diff --git a/svnversion-test.sh b/svnversion-test.sh
deleted file mode 100644
index fdbcca4..0000000
--- a/svnversion-test.sh
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/bin/sh
-
-#set -x
-echo "svnversion-test.sh: $*"
-
-SV="$1"
-shift
-
-SVNVERSION=undef
-
-for x in /bin/svnversion /usr/bin/svnversion
-do
- if [ -x $x ] ; then
- SVNVERSION="`$x`"
- fi
-done
-
-if [ "$SVNVERSION" = "undef" -o "$SVNVERSION" = "Unversioned directory" ] ; then
- if [ -f SVNVERSION ] ; then
- echo "Can't pull SVNVERSION value from svn storage, pulling from SVNVERSION file.."
- SVNVERSION="`cat SVNVERSION`"
- fi
-else
- echo "$SVNVERSION" > SVNVERSION
-fi
-
-if [ "$SVNVERSION" != "$SV" ] ; then
- echo "Miss-match of '$SVNVERSION' vs. '$SV' -- aborting now, please rerun the make command."
- exit 1
-fi
-
-X="`(echo -n $SVNVERSION | tr -d 0-9)`"
-if [ -n "$X" ] ; then
- echo "Mixed or modified tree: ($SVNVERSION), ARE YOU SURE ??." ; \
- echo -n "Y/^C ? "; read var ; \
-fi
diff --git a/telemetry.c b/telemetry.c
index b4951f6..ec160fe 100644
--- a/telemetry.c
+++ b/telemetry.c
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
@@ -376,6 +376,7 @@ static void telemetry_labeltx()
E->name);
break;
default:
+ s = buf+2;
break;
}
diff --git a/timercmp.c b/timercmp.c
index f03fdda..da556fb 100644
--- a/timercmp.c
+++ b/timercmp.c
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
diff --git a/tt.5383 b/tt.5383
deleted file mode 100644
index 06bfe3b..0000000
--- a/tt.5383
+++ /dev/null
@@ -1,3101 +0,0 @@
-execve("/bin/svn", ["svn", "--username", "oh2mqk", "commit", "doc/", "-m", "Add note about USB serial ports "...], [/* 59 vars */]) = 0
-brk(0) = 0x7fb0c4d8b000
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41f5000
-access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
-open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
-fstat(3, {st_mode=S_IFREG|0644, st_size=212134, ...}) = 0
-mmap(NULL, 212134, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fb0c41c1000
-close(3) = 0
-open("/lib64/libsvn_client-1.so.0", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\0a\2249\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=421472, ...}) = 0
-mmap(NULL, 2508008, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c3d72000
-mprotect(0x7fb0c3dd5000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0c3fd4000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x62000) = 0x7fb0c3fd4000
-close(3) = 0
-open("/lib64/libsvn_wc-1.so.0", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0Z\301f8\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=741088, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41c0000
-mmap(NULL, 2828136, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c3abf000
-mprotect(0x7fb0c3b6f000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0c3d6e000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xaf000) = 0x7fb0c3d6e000
-close(3) = 0
-open("/lib64/libsvn_ra-1.so.0", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260@ \2259\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=61752, ...}) = 0
-mmap(NULL, 2151568, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c38b1000
-mprotect(0x7fb0c38be000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0c3abd000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xc000) = 0x7fb0c3abd000
-close(3) = 0
-open("/lib64/libsvn_diff-1.so.0", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340=\200f8\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=89768, ...}) = 0
-mmap(NULL, 2180064, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c369c000
-mprotect(0x7fb0c36b0000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0c38af000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x13000) = 0x7fb0c38af000
-close(3) = 0
-open("/lib64/libsvn_ra_local-1.so.0", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p4\240l8\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=44720, ...}) = 0
-mmap(NULL, 2134952, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c3492000
-mprotect(0x7fb0c349a000, 2097152, PROT_NONE) = 0
-mmap(0x7fb0c369a000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x8000) = 0x7fb0c369a000
-close(3) = 0
-open("/lib64/libsvn_repos-1.so.0", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \227\300h8\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=223680, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41bf000
-mmap(NULL, 2313200, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c325d000
-mprotect(0x7fb0c3290000, 2097152, PROT_NONE) = 0
-mmap(0x7fb0c3490000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x33000) = 0x7fb0c3490000
-close(3) = 0
-open("/lib64/libsvn_fs-1.so.0", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p:\0h8\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=48168, ...}) = 0
-mmap(NULL, 2139032, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c3052000
-mprotect(0x7fb0c305c000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0c325b000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x9000) = 0x7fb0c325b000
-close(3) = 0
-open("/lib64/libsvn_fs_fs-1.so.0", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\240 at g8\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=233360, ...}) = 0
-mmap(NULL, 2322088, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c2e1b000
-mprotect(0x7fb0c2e51000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0c3050000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x35000) = 0x7fb0c3050000
-close(3) = 0
-open("/lib64/libsvn_fs_base-1.so.0", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360\226 m8\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=204032, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41be000
-mmap(NULL, 2293192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c2beb000
-mprotect(0x7fb0c2c1a000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0c2e19000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2e000) = 0x7fb0c2e19000
-close(3) = 0
-open("/lib64/libsvn_fs_util-1.so.0", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200\f\0g8\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=14064, ...}) = 0
-mmap(NULL, 2105520, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c29e8000
-mprotect(0x7fb0c29ea000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0c2be9000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1000) = 0x7fb0c2be9000
-close(3) = 0
-open("/lib64/libsvn_ra_svn-1.so.0", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360u at k8\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=132640, ...}) = 0
-mmap(NULL, 2222232, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c27c9000
-mprotect(0x7fb0c27e7000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0c29e6000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1d000) = 0x7fb0c29e6000
-close(3) = 0
-open("/lib64/libsasl2.so.3", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`K\30001\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=122848, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41bd000
-mmap(NULL, 2213960, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c25ac000
-mprotect(0x7fb0c25c8000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0c27c7000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b000) = 0x7fb0c27c7000
-close(3) = 0
-open("/lib64/libsvn_ra_serf-1.so.0", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\225`\2239\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=203848, ...}) = 0
-mmap(NULL, 2292144, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c237c000
-mprotect(0x7fb0c23a8000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0c25a7000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2b000) = 0x7fb0c25a7000
-close(3) = 0
-open("/lib64/libserf-1.so.0", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P{\240\2239\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=115968, ...}) = 0
-mmap(NULL, 2205248, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c2161000
-mprotect(0x7fb0c217b000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0c237a000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x19000) = 0x7fb0c237a000
-close(3) = 0
-open("/lib64/libsvn_delta-1.so.0", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300<\340k8\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=85944, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41bc000
-mmap(NULL, 2176072, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c1f4d000
-mprotect(0x7fb0c1f5f000, 2097152, PROT_NONE) = 0
-mmap(0x7fb0c215f000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x12000) = 0x7fb0c215f000
-close(3) = 0
-open("/lib64/libsvn_subr-1.so.0", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\266\341l8\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=523360, ...}) = 0
-mmap(NULL, 2611640, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c1ccf000
-mprotect(0x7fb0c1d48000, 2097152, PROT_NONE) = 0
-mmap(0x7fb0c1f48000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x79000) = 0x7fb0c1f48000
-close(3) = 0
-open("/lib64/libz.so.1", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\"@\r1\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=92560, ...}) = 0
-mmap(NULL, 2183688, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c1ab9000
-mprotect(0x7fb0c1ace000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0c1ccd000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14000) = 0x7fb0c1ccd000
-close(3) = 0
-open("/lib64/libsqlite3.so.0", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\260\0k8\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=792288, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41bb000
-mmap(NULL, 2873304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c17fb000
-mprotect(0x7fb0c18b4000, 2097152, PROT_NONE) = 0
-mmap(0x7fb0c1ab4000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xb9000) = 0x7fb0c1ab4000
-close(3) = 0
-open("/lib64/libmagic.so.1", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`D\340\0321\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=126128, ...}) = 0
-mmap(NULL, 2217848, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c15dd000
-mprotect(0x7fb0c15f9000, 2097152, PROT_NONE) = 0
-mmap(0x7fb0c17f9000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c000) = 0x7fb0c17f9000
-close(3) = 0
-open("/lib64/libaprutil-1.so.0", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@\232\340\0351\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=173416, ...}) = 0
-mmap(NULL, 2263848, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c13b4000
-mprotect(0x7fb0c13dc000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0c15db000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x27000) = 0x7fb0c15db000
-close(3) = 0
-open("/lib64/libcrypt.so.1", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\16\200(1\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=43848, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41ba000
-mmap(NULL, 2318912, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c117d000
-mprotect(0x7fb0c1185000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0c1384000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7000) = 0x7fb0c1384000
-mmap(0x7fb0c1386000, 184896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fb0c1386000
-close(3) = 0
-open("/lib64/libexpat.so.1", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0>@\0221\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=175384, ...}) = 0
-mmap(NULL, 2265312, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c0f53000
-mprotect(0x7fb0c0f7a000, 2097152, PROT_NONE) = 0
-mmap(0x7fb0c117a000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x27000) = 0x7fb0c117a000
-close(3) = 0
-open("/lib64/libdb-5.3.so", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220\362\"\0341\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=1840560, ...}) = 0
-mmap(NULL, 3927304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c0b94000
-mprotect(0x7fb0c0d49000, 2097152, PROT_NONE) = 0
-mmap(0x7fb0c0f49000, 40960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b5000) = 0x7fb0c0f49000
-close(3) = 0
-open("/lib64/libapr-1.so.0", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \316\240\0361\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=219224, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41b9000
-mmap(NULL, 2309880, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c0960000
-mprotect(0x7fb0c0992000, 2097152, PROT_NONE) = 0
-mmap(0x7fb0c0b92000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x32000) = 0x7fb0c0b92000
-close(3) = 0
-open("/lib64/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340m\0\r1\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=150800, ...}) = 0
-mmap(NULL, 2213104, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c0743000
-mprotect(0x7fb0c075b000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0c095a000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x17000) = 0x7fb0c095a000
-mmap(0x7fb0c095c000, 13552, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fb0c095c000
-close(3) = 0
-open("/lib64/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\16\300\f1\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=22440, ...}) = 0
-mmap(NULL, 2109744, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c053f000
-mprotect(0x7fb0c0542000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0c0741000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7fb0c0741000
-close(3) = 0
-open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p\36B\f1\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=2100672, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41b8000
-mmap(NULL, 3924576, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0c0180000
-mprotect(0x7fb0c0334000, 2097152, PROT_NONE) = 0
-mmap(0x7fb0c0534000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b4000) = 0x7fb0c0534000
-mmap(0x7fb0c053a000, 16992, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fb0c053a000
-close(3) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41b7000
-open("/lib64/libresolv.so.2", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@:\300\0161\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=113808, ...}) = 0
-mmap(NULL, 2202264, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0bff66000
-mprotect(0x7fb0bff7c000, 2097152, PROT_NONE) = 0
-mmap(0x7fb0c017c000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16000) = 0x7fb0c017c000
-mmap(0x7fb0c017e000, 6808, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fb0c017e000
-close(3) = 0
-open("/usr/lib64/tls/x86_64/libssl.so.10", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-stat("/usr/lib64/tls/x86_64", 0x7fff60105170) = -1 ENOENT (No such file or directory)
-open("/usr/lib64/tls/libssl.so.10", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-stat("/usr/lib64/tls", {st_mode=S_IFDIR|0555, st_size=4096, ...}) = 0
-open("/usr/lib64/x86_64/libssl.so.10", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-stat("/usr/lib64/x86_64", 0x7fff60105170) = -1 ENOENT (No such file or directory)
-open("/usr/lib64/libssl.so.10", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300\203\1\0271\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=446080, ...}) = 0
-mmap(NULL, 2536528, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0bfcfa000
-mprotect(0x7fb0bfd5c000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0bff5b000, 45056, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x61000) = 0x7fb0bff5b000
-close(3) = 0
-open("/usr/lib64/tls/libcrypto.so.10", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-open("/usr/lib64/libcrypto.so.10", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@\234F\0251\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=1993248, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41b6000
-mmap(NULL, 4091768, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0bf913000
-mprotect(0x7fb0bfad0000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0bfccf000, 159744, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1bc000) = 0x7fb0bfccf000
-mmap(0x7fb0bfcf6000, 16248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fb0bfcf6000
-close(3) = 0
-open("/usr/lib64/tls/libldap_r-2.4.so.2", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-open("/usr/lib64/libldap_r-2.4.so.2", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200\23\241\2229\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=365848, ...}) = 0
-mmap(NULL, 2465032, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0bf6b9000
-mprotect(0x7fb0bf70e000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0bf90d000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x54000) = 0x7fb0bf90d000
-mmap(0x7fb0bf911000, 7432, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fb0bf911000
-close(3) = 0
-open("/usr/lib64/tls/liblber-2.4.so.2", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-open("/usr/lib64/liblber-2.4.so.2", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\3206\30011\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=64280, ...}) = 0
-mmap(NULL, 2155848, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0bf4aa000
-mprotect(0x7fb0bf4b8000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0bf6b7000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xd000) = 0x7fb0bf6b7000
-close(3) = 0
-open("/usr/lib64/tls/libgssapi_krb5.so.2", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-open("/usr/lib64/libgssapi_krb5.so.2", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\275@\0261\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=310624, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41b5000
-mmap(NULL, 2398304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0bf260000
-mprotect(0x7fb0bf2a7000, 2097152, PROT_NONE) = 0
-mmap(0x7fb0bf4a7000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x47000) = 0x7fb0bf4a7000
-close(3) = 0
-open("/usr/lib64/tls/libkrb5.so.3", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-open("/usr/lib64/libkrb5.so.3", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240Q\202\0261\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=929904, ...}) = 0
-mmap(NULL, 3012704, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0bef80000
-mprotect(0x7fb0bf050000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0bf24f000, 69632, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xcf000) = 0x7fb0bf24f000
-close(3) = 0
-open("/usr/lib64/tls/libk5crypto.so.3", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-open("/usr/lib64/libk5crypto.so.3", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260H\0\0261\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=217248, ...}) = 0
-mmap(NULL, 2310640, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0bed4b000
-mprotect(0x7fb0bed7d000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0bef7c000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x31000) = 0x7fb0bef7c000
-mmap(0x7fb0bef7f000, 496, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fb0bef7f000
-close(3) = 0
-open("/usr/lib64/tls/libcom_err.so.2", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-open("/usr/lib64/libcom_err.so.2", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p\25\0\0251\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=18320, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41b4000
-mmap(NULL, 2109928, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0beb47000
-mprotect(0x7fb0beb4a000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0bed49000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7fb0bed49000
-close(3) = 0
-open("/lib64/libuuid.so.1", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\25\300\0201\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=22624, ...}) = 0
-mmap(NULL, 2113920, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0be942000
-mprotect(0x7fb0be946000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0beb45000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x7fb0beb45000
-close(3) = 0
-open("/lib64/libfreebl3.so", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200>\200'1\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=517384, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41b3000
-mmap(NULL, 2619232, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0be6c2000
-mprotect(0x7fb0be73c000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0be93b000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x79000) = 0x7fb0be93b000
-mmap(0x7fb0be93e000, 14176, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fb0be93e000
-close(3) = 0
-open("/usr/lib64/tls/libssl3.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-open("/usr/lib64/libssl3.so", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220\260`\2219\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=262984, ...}) = 0
-mmap(NULL, 2351976, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0be483000
-mprotect(0x7fb0be4be000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0be6bd000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3a000) = 0x7fb0be6bd000
-mmap(0x7fb0be6c1000, 872, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fb0be6c1000
-close(3) = 0
-open("/usr/lib64/tls/libsmime3.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-open("/usr/lib64/libsmime3.so", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`\236\240\2219\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=192376, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41b2000
-mmap(NULL, 2280576, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0be256000
-mprotect(0x7fb0be27f000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0be47e000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x28000) = 0x7fb0be47e000
-close(3) = 0
-open("/usr/lib64/tls/libnss3.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-open("/usr/lib64/libnss3.so", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\232\341\2209\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=1360352, ...}) = 0
-mmap(NULL, 3434440, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0bdf0f000
-mprotect(0x7fb0be04e000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0be24d000, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x13e000) = 0x7fb0be24d000
-mmap(0x7fb0be255000, 1992, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fb0be255000
-close(3) = 0
-open("/usr/lib64/tls/libnssutil3.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-open("/usr/lib64/libnssutil3.so", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\276 \2219\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=184296, ...}) = 0
-mmap(NULL, 2275936, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0bdce3000
-mprotect(0x7fb0bdd08000, 2097152, PROT_NONE) = 0
-mmap(0x7fb0bdf08000, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x25000) = 0x7fb0bdf08000
-close(3) = 0
-open("/usr/lib64/tls/libplds4.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-open("/usr/lib64/libplds4.so", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220\20`\2209\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=18168, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41b1000
-mmap(NULL, 2109800, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0bdadf000
-mprotect(0x7fb0bdae2000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0bdce1000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7fb0bdce1000
-close(3) = 0
-open("/usr/lib64/tls/libplc4.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-open("/usr/lib64/libplc4.so", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\25\240\2209\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=22272, ...}) = 0
-mmap(NULL, 2113936, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0bd8da000
-mprotect(0x7fb0bd8de000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0bdadd000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x7fb0bdadd000
-close(3) = 0
-open("/usr/lib64/tls/libnspr4.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-open("/usr/lib64/libnspr4.so", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\321 \2209\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=251552, ...}) = 0
-mmap(NULL, 2350496, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0bd69c000
-mprotect(0x7fb0bd6d6000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0bd8d5000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x39000) = 0x7fb0bd8d5000
-mmap(0x7fb0bd8d8000, 7584, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fb0bd8d8000
-close(3) = 0
-open("/usr/lib64/tls/libkrb5support.so.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-open("/usr/lib64/libkrb5support.so.0", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 6\300\0261\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=60896, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41b0000
-mmap(NULL, 2152008, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0bd48e000
-mprotect(0x7fb0bd49b000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0bd69a000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xc000) = 0x7fb0bd69a000
-close(3) = 0
-open("/usr/lib64/tls/libkeyutils.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-open("/usr/lib64/libkeyutils.so.1", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p\25\200\0251\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=17984, ...}) = 0
-mmap(NULL, 2109712, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0bd28a000
-mprotect(0x7fb0bd28d000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0bd48c000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7fb0bd48c000
-close(3) = 0
-open("/usr/lib64/tls/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-open("/usr/lib64/librt.so.1", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\"\200\0161\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=47400, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41af000
-mmap(NULL, 2128952, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0bd082000
-mprotect(0x7fb0bd089000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0bd288000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7fb0bd288000
-close(3) = 0
-open("/usr/lib64/tls/libselinux.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-open("/usr/lib64/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240d@\0161\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=144952, ...}) = 0
-mmap(NULL, 2242712, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0bce5e000
-mprotect(0x7fb0bce7f000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0bd07e000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x20000) = 0x7fb0bd07e000
-mmap(0x7fb0bd080000, 6296, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fb0bd080000
-close(3) = 0
-open("/usr/lib64/tls/libpcre.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-open("/usr/lib64/libpcre.so.1", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p\27\0\0161\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=421144, ...}) = 0
-mmap(NULL, 2511368, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0bcbf8000
-mprotect(0x7fb0bcc5d000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0bce5c000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x64000) = 0x7fb0bce5c000
-close(3) = 0
-open("/usr/lib64/tls/liblzma.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-open("/usr/lib64/liblzma.so.5", O_RDONLY|O_CLOEXEC) = 3
-read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\3400\300\r1\0\0\0"..., 832) = 832
-fstat(3, {st_mode=S_IFREG|0755, st_size=155400, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41ae000
-mmap(NULL, 2245240, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb0bc9d3000
-mprotect(0x7fb0bc9f7000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0bcbf6000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x23000) = 0x7fb0bcbf6000
-close(3) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41ad000
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41ac000
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41ab000
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41aa000
-mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41a8000
-arch_prctl(ARCH_SET_FS, 0x7fb0c41a8880) = 0
-mprotect(0x7fb0c0534000, 16384, PROT_READ) = 0
-mprotect(0x7fb0c095a000, 4096, PROT_READ) = 0
-mprotect(0x7fb0bcbf6000, 4096, PROT_READ) = 0
-mprotect(0x7fb0bce5c000, 4096, PROT_READ) = 0
-mprotect(0x7fb0c0741000, 4096, PROT_READ) = 0
-mprotect(0x7fb0bd07e000, 4096, PROT_READ) = 0
-mprotect(0x7fb0bd288000, 4096, PROT_READ) = 0
-mprotect(0x7fb0bd48c000, 4096, PROT_READ) = 0
-mprotect(0x7fb0c017c000, 4096, PROT_READ) = 0
-mprotect(0x7fb0bd69a000, 4096, PROT_READ) = 0
-mprotect(0x7fb0bd8d5000, 4096, PROT_READ) = 0
-mprotect(0x7fb0bdadd000, 4096, PROT_READ) = 0
-mprotect(0x7fb0bdce1000, 4096, PROT_READ) = 0
-mprotect(0x7fb0bdf08000, 24576, PROT_READ) = 0
-mprotect(0x7fb0be24d000, 20480, PROT_READ) = 0
-mprotect(0x7fb0be47e000, 16384, PROT_READ) = 0
-mprotect(0x7fb0c1ccd000, 4096, PROT_READ) = 0
-mprotect(0x7fb0be6bd000, 12288, PROT_READ) = 0
-mprotect(0x7fb0be93b000, 8192, PROT_READ) = 0
-mprotect(0x7fb0beb45000, 4096, PROT_READ) = 0
-mprotect(0x7fb0bed49000, 4096, PROT_READ) = 0
-mprotect(0x7fb0bef7c000, 8192, PROT_READ) = 0
-mprotect(0x7fb0bf24f000, 57344, PROT_READ) = 0
-mprotect(0x7fb0bf4a7000, 4096, PROT_READ) = 0
-mprotect(0x7fb0bf6b7000, 4096, PROT_READ) = 0
-mprotect(0x7fb0c1384000, 4096, PROT_READ) = 0
-mprotect(0x7fb0c27c7000, 4096, PROT_READ) = 0
-mprotect(0x7fb0bf90d000, 8192, PROT_READ) = 0
-mprotect(0x7fb0bfccf000, 110592, PROT_READ) = 0
-mprotect(0x7fb0bff5b000, 16384, PROT_READ) = 0
-mprotect(0x7fb0c0b92000, 4096, PROT_READ) = 0
-mprotect(0x7fb0c0f49000, 28672, PROT_READ) = 0
-mprotect(0x7fb0c117a000, 8192, PROT_READ) = 0
-mprotect(0x7fb0c15db000, 4096, PROT_READ) = 0
-mprotect(0x7fb0c17f9000, 4096, PROT_READ) = 0
-mprotect(0x7fb0c1ab4000, 8192, PROT_READ) = 0
-mprotect(0x7fb0c1f48000, 12288, PROT_READ) = 0
-mprotect(0x7fb0c215f000, 4096, PROT_READ) = 0
-mprotect(0x7fb0c237a000, 4096, PROT_READ) = 0
-mprotect(0x7fb0c25a7000, 16384, PROT_READ) = 0
-mprotect(0x7fb0c29e6000, 4096, PROT_READ) = 0
-mprotect(0x7fb0c2be9000, 4096, PROT_READ) = 0
-mprotect(0x7fb0c2e19000, 4096, PROT_READ) = 0
-mprotect(0x7fb0c3050000, 4096, PROT_READ) = 0
-mprotect(0x7fb0c325b000, 4096, PROT_READ) = 0
-mprotect(0x7fb0c3490000, 4096, PROT_READ) = 0
-mprotect(0x7fb0c369a000, 4096, PROT_READ) = 0
-mprotect(0x7fb0c38af000, 4096, PROT_READ) = 0
-mprotect(0x7fb0c3abd000, 4096, PROT_READ) = 0
-mprotect(0x7fb0c3d6e000, 8192, PROT_READ) = 0
-mprotect(0x7fb0c3fd4000, 4096, PROT_READ) = 0
-mprotect(0x7fb0c4431000, 49152, PROT_READ) = 0
-mprotect(0x7fb0c41f6000, 4096, PROT_READ) = 0
-munmap(0x7fb0c41c1000, 212134) = 0
-set_tid_address(0x7fb0c41a8b50) = 5383
-set_robust_list(0x7fb0c41a8b60, 24) = 0
-rt_sigaction(SIGRTMIN, {0x7fb0c07498c0, [], SA_RESTORER|SA_SIGINFO, 0x7fb0c0752750}, NULL, 8) = 0
-rt_sigaction(SIGRT_1, {0x7fb0c0749950, [], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x7fb0c0752750}, NULL, 8) = 0
-rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
-getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
-statfs("/sys/fs/selinux", 0x7fff60106060) = -1 ENOENT (No such file or directory)
-statfs("/selinux", 0x7fff60106060) = -1 ENOENT (No such file or directory)
-brk(0) = 0x7fb0c4d8b000
-brk(0x7fb0c4dac000) = 0x7fb0c4dac000
-open("/proc/filesystems", O_RDONLY) = 3
-fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41f4000
-read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tr"..., 1024) = 384
-read(3, "", 1024) = 0
-close(3) = 0
-munmap(0x7fb0c41f4000, 4096) = 0
-access("/etc/system-fips", F_OK) = -1 ENOENT (No such file or directory)
-fstat(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
-fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
-fstat(2, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
-open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
-fstat(3, {st_mode=S_IFREG|0644, st_size=106070960, ...}) = 0
-mmap(NULL, 106070960, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fb0b64aa000
-close(3) = 0
-open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
-fstat(3, {st_mode=S_IFREG|0644, st_size=2492, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41f4000
-read(3, "# Locale name alias data base.\n#"..., 4096) = 2492
-read(3, "", 4096) = 0
-close(3) = 0
-munmap(0x7fb0c41f4000, 4096) = 0
-open("/usr/lib/locale/A4/LC_PAPER", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
-stat("/localhome/mea/.subversion", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
-lstat("/localhome/mea/.subversion/auth", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0
-lstat("/localhome/mea/.subversion/auth/svn.simple", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
-lstat("/localhome/mea/.subversion/auth/svn.username", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
-lstat("/localhome/mea/.subversion/auth/svn.ssl.server", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
-lstat("/localhome/mea/.subversion/auth/svn.ssl.client-passphrase", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
-lstat("/localhome/mea/.subversion/README.txt", {st_mode=S_IFREG|0644, st_size=4277, ...}) = 0
-lstat("/localhome/mea/.subversion/servers", {st_mode=S_IFREG|0644, st_size=3270, ...}) = 0
-lstat("/localhome/mea/.subversion/config", {st_mode=S_IFREG|0664, st_size=4749, ...}) = 0
-open("/etc/subversion/servers", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-open("/localhome/mea/.subversion/servers", O_RDONLY|O_CLOEXEC) = 3
-fcntl(3, F_GETFD) = 0x1 (flags FD_CLOEXEC)
-brk(0) = 0x7fb0c4dac000
-brk(0x7fb0c4ddc000) = 0x7fb0c4ddc000
-read(3, "### This file specifies server-s"..., 4096) = 3270
-read(3, "", 4096) = 0
-read(3, "", 4096) = 0
-read(3, "", 4096) = 0
-close(3) = 0
-open("/etc/subversion/config", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
-open("/localhome/mea/.subversion/config", O_RDONLY|O_CLOEXEC) = 3
-read(3, "### This file configures various"..., 4096) = 4096
-read(3, " is:\n### file-name-pattern = p"..., 4096) = 653
-read(3, "", 4096) = 0
-read(3, "", 4096) = 0
-read(3, "", 4096) = 0
-close(3) = 0
-stat("Add note about USB serial ports benefitting of interface timeout parameter.", 0x7fff60105ca0) = -1 ENOENT (No such file or directory)
-getcwd("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk", 4096) = 77
-rt_sigaction(SIGINT, {0x7fb0c4216ad0, [], SA_RESTORER|SA_INTERRUPT, 0x7fb0c0752750}, {SIG_DFL, [], 0}, 8) = 0
-rt_sigaction(SIGHUP, {0x7fb0c4216ad0, [], SA_RESTORER|SA_INTERRUPT, 0x7fb0c0752750}, {SIG_DFL, [], 0}, 8) = 0
-rt_sigaction(SIGTERM, {0x7fb0c4216ad0, [], SA_RESTORER|SA_INTERRUPT, 0x7fb0c0752750}, {SIG_DFL, [], 0}, 8) = 0
-rt_sigaction(SIGPIPE, {SIG_IGN, [], SA_RESTORER|SA_INTERRUPT, 0x7fb0c0752750}, {SIG_DFL, [], 0}, 8) = 0
-rt_sigaction(SIGXFSZ, {SIG_IGN, [], SA_RESTORER|SA_INTERRUPT, 0x7fb0c0752750}, {SIG_DFL, [], 0}, 8) = 0
-getcwd("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk", 4096) = 77
-getcwd("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk", 4096) = 77
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/.svn", 0x7fff60105720) = -1 ENOENT (No such file or directory)
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn", {st_mode=S_IFDIR|0755, st_size=43, ...}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-open("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", O_RDWR|O_CLOEXEC) = 3
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 0, SEEK_SET) = 0
-read(3, "SQLite format 3\0\4\0\1\1\0@ \0\0\5\237\0\0\0\241"..., 100) = 100
-brk(0) = 0x7fb0c4ddc000
-brk(0x7fb0c4e09000) = 0x7fb0c4e09000
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 0, SEEK_SET) = 0
-read(3, "SQLite format 3\0\4\0\1\1\0@ \0\0\5\237\0\0\0\241"..., 1024) = 1024
-lseek(3, 11264, SEEK_SET) = 11264
-read(3, "\r\0\0\0\t\0x\0\0x\1\25\1J\1\234\1\342\2(\2\242\2\317\0030\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 14336, SEEK_SET) = 14336
-read(3, "\r\3+\0\3\0\204\0\0\204\0\265\2\364\3+\3\227\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 19456, SEEK_SET) = 19456
-read(3, "\r\0\0\0\5\0017\0\0017\2D\2m\2\354\3\321\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 25600, SEEK_SET) = 25600
-read(3, "\r\3\230\0\2\0\233\0\0\233\3m\3\230\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 27648, SEEK_SET) = 27648
-read(3, "\r\0\0\0\4\0\335\0\0\335\1\347\2L\3&\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 28672, SEEK_SET) = 28672
-read(3, "\r\0\0\0\2\0\330\0\0\330\2'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 33792, SEEK_SET) = 33792
-read(3, "\r\2\234\0\6\0E\0\2i\3\n\2\2\1\250\0\374\0E\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\237\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 8192, SEEK_SET) = 8192
-read(3, "\n\0\0\0\1\3\374\0\3\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\237\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\237\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 20480, SEEK_SET) = 20480
-read(3, "\r\0\0\0\0\4\0\0\2\230\2\230\2\230\2\230\2\230\2\230\2\230\2\230\2\230\1\232\1\232\1\232"..., 1024) = 1024
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\237\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24576, SEEK_SET) = 24576
-read(3, "\2\0\0\0\2\3\315\0\0\0\0y\3\342\3\315\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 53248, SEEK_SET) = 53248
-read(3, "\n\3\226\0\35\0012\2\1d\1|\1\233\0012\1\304\1\333\1\356\2\0\2\33\1\260\2B\2M"..., 1024) = 1024
-lseek(3, 23552, SEEK_SET) = 23552
-read(3, "\5\3~\0$\3\25\f\0\0\0\241\3\265\3\260\3L\3X\3\246\3\241\3\234\3\227\3\222\3\210"..., 1024) = 1024
-lseek(3, 148480, SEEK_SET) = 148480
-read(3, "\r\0\0\0\2\2\202\0\2\202\3\17\3\17\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 52224, SEEK_SET) = 52224
-read(3, "\n\2\240\0%\1+\0\1G\1O\1`\1o\1~\1\221\1\241\1\257\1\275\1\327\1\343\1\362"..., 1024) = 1024
-lseek(3, 163840, SEEK_SET) = 163840
-read(3, "\r\3(\0\2\1\301\0\1\301\2\244\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-getcwd("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk", 4096) = 77
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\237\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 22528, SEEK_SET) = 22528
-read(3, "\n\0\0\0\0\4\0\0\3\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741825, len=1}) = 0
-lseek(3, 21504, SEEK_SET) = 21504
-read(3, "\r\0\0\0\0\4\0\0\3\371\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-open("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", O_RDWR|O_CREAT|O_CLOEXEC, 0644) = 4
-fstat(4, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
-geteuid() = 530
-fstat(4, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
-open("/dev/urandom", O_RDONLY|O_CLOEXEC) = 5
-read(5, "!?\\6X$\260\376\v\3335\213\17H\267\303\0076eP\206\3N\264\320\311K\335\241vF\331"..., 256) = 256
-close(5) = 0
-lseek(4, 0, SEEK_SET) = 0
-write(4, "\331\325\5\371 \241c\327\377\377\377\377\224\337\311\2\0\0\0\241\0\0\2\0\0\0\4\0\0\0\0\0"..., 512) = 512
-lseek(4, 512, SEEK_SET) = 512
-write(4, "\0\0\0\27", 4) = 4
-lseek(4, 516, SEEK_SET) = 516
-write(4, "\n\0\0\0\0\4\0\0\3\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(4, 1540, SEEK_SET) = 1540
-write(4, "\224\337\311\2", 4) = 4
-lseek(4, 1544, SEEK_SET) = 1544
-write(4, "\0\0\0\26", 4) = 4
-lseek(4, 1548, SEEK_SET) = 1548
-write(4, "\r\0\0\0\0\4\0\0\3\371\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(4, 2572, SEEK_SET) = 2572
-write(4, "\224\337\311\2", 4) = 4
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-lseek(4, 2576, SEEK_SET) = 2576
-write(4, "\0\0\0\1", 4) = 4
-lseek(4, 2580, SEEK_SET) = 2580
-write(4, "SQLite format 3\0\4\0\1\1\0@ \0\0\5\237\0\0\0\241"..., 1024) = 1024
-lseek(4, 3604, SEEK_SET) = 3604
-write(4, "\224\337\311\2", 4) = 4
-lseek(3, 0, SEEK_SET) = 0
-write(3, "SQLite format 3\0\4\0\1\1\0@ \0\0\5\240\0\0\0\241"..., 1024) = 1024
-lseek(3, 21504, SEEK_SET) = 21504
-write(3, "\r\0\0\0\1\3\371\0\3\371\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 22528, SEEK_SET) = 22528
-write(3, "\n\0\0\0\1\3\373\0\3\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-close(4) = 0
-unlink("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal") = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=2}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-getcwd("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk", 4096) = 77
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 13312, SEEK_SET) = 13312
-read(3, "\n\0\0\0\0\4\0\0\3\365\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 18432, SEEK_SET) = 18432
-read(3, "\n\0\0\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 1024, SEEK_SET) = 1024
-read(3, "\r\0\0\0\1\3\273\0\3\273\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-brk(0) = 0x7fb0c4e09000
-brk(0x7fb0c4e2a000) = 0x7fb0c4e2a000
-brk(0) = 0x7fb0c4e2a000
-brk(0) = 0x7fb0c4e2a000
-brk(0x7fb0c4e29000) = 0x7fb0c4e29000
-brk(0) = 0x7fb0c4e29000
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 32768, SEEK_SET) = 32768
-read(3, "\n\0\0\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
-openat(AT_FDCWD, "/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4
-getdents(4, /* 8 entries */, 32768) = 328
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/.", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/..", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual-pics.odp", {st_mode=S_IFREG|0664, st_size=12644, ...}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual.odt", {st_mode=S_IFREG|0664, st_size=197896, ...}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-requirement-specification.odt", {st_mode=S_IFREG|0644, st_size=34162, ...}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual.pdf", {st_mode=S_IFREG|0664, st_size=438348, ...}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-requirement-specification.pdf", {st_mode=S_IFREG|0644, st_size=175248, ...}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/.~lock.aprx-manual.odt#", {st_mode=S_IFREG|0664, st_size=95, ...}) = 0
-getdents(4, /* 0 entries */, 32768) = 0
-close(4) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 26624, SEEK_SET) = 26624
-read(3, "\2\3\360\0\2\3\277\0\0\0\0t\3\277\3\322\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 117760, SEEK_SET) = 117760
-read(3, "\n\0\0\0\21\1\265\0\1\265\1\316\1\360\2\n\2-\2L\2k\2\234\2\315\2\357\3\16\0030"..., 1024) = 1024
-lseek(3, 68608, SEEK_SET) = 68608
-read(3, "\r\0\0\0\4\0\23\0\2\273\2\"\1\2\0\23\0\0\0\201lO\31\t+\10\35\t7\2\31\0"..., 1024) = 1024
-lseek(3, 105472, SEEK_SET) = 105472
-read(3, "\r\0\0\0\3\0\311\0\0\311\1\341\2\350\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 64512, SEEK_SET) = 64512
-read(3, "\r\0\0\0\3\0e\0\0e\2\250\1P\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 15360, SEEK_SET) = 15360
-read(3, "\n\0\0\0\0\4\0\0\3\364\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual.odt", {st_mode=S_IFREG|0664, st_size=197896, ...}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual.odt", {st_mode=S_IFREG|0664, st_size=197896, ...}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 10240, SEEK_SET) = 10240
-read(3, "\2\0\0\0\1\3\310\0\0\0\0\213\3\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 140288, SEEK_SET) = 140288
-read(3, "\2\1\325\0\f\1-\2\0\0\0|\2B\2\n\2\352\1-\2z\1e\2\263\3\311\3X\3!"..., 1024) = 1024
-lseek(3, 88064, SEEK_SET) = 88064
-read(3, "\n\0\0\0\16\1/\0\1/\1b\1\225\1\311\1\375\0020\2c\2\227\2\312\2\376\0031\3e"..., 1024) = 1024
-lseek(3, 9216, SEEK_SET) = 9216
-read(3, "\5\0\0\0&\3(\0\0\0\0\240\3\373\3\366\3\361\3\354\3\347\3\342\3\335\3\330\3\323\3\316"..., 1024) = 1024
-lseek(3, 150528, SEEK_SET) = 150528
-read(3, "\r\0\0\0\n\0F\0\3\241\3A\2\341\2\202\2\"\1\303\1d\1\5\0\245\0F\0\0\0\0"..., 1024) = 1024
-open("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/pristine/5b/5b78dd1d69e60a7ae82aec254bcc346289c7895d.svn-base", O_RDONLY|O_CLOEXEC) = 4
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-close(4) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual.pdf", {st_mode=S_IFREG|0664, st_size=438348, ...}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual.pdf", {st_mode=S_IFREG|0664, st_size=438348, ...}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 98304, SEEK_SET) = 98304
-read(3, "\n\0\0\0\17\0\367\0\1+\1_\1\223\1\307\1\373\2.\2b\2\226\2\311\2\374\0\367\0030"..., 1024) = 1024
-lseek(3, 145408, SEEK_SET) = 145408
-read(3, "\r\0\0\0\n\0F\0\3\241\3A\2\342\2\203\2#\1\303\1d\1\5\0\246\0F\0\0\0\0"..., 1024) = 1024
-open("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/pristine/80/801e13de8f6f628e0af791392a3cdbe991e46277.svn-base", O_RDONLY|O_CLOEXEC) = 4
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-close(4) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-epoll_create1(EPOLL_CLOEXEC) = 4
-socket(PF_NETLINK, SOCK_RAW, 0) = 5
-bind(5, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 0
-getsockname(5, {sa_family=AF_NETLINK, pid=5383, groups=00000000}, [12]) = 0
-sendto(5, "\24\0\0\0\26\0\1\3(#0S\0\0\0\0\0\0\0\0", 20, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 20
-recvmsg(5, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"D\0\0\0\24\0\2\0(#0S\7\25\0\0\2\10\200\376\1\0\0\0\10\0\1\0\177\0\0\1"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 148
-recvmsg(5, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"H\0\0\0\24\0\2\0(#0S\7\25\0\0\n\200\200\376\1\0\0\0\24\0\1\0\0\0\0\0"..., 4096}], msg_controllen=0, msg_flags=0}, 0) = 216
-recvmsg(5, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\24\0\0\0\3\0\2\0(#0S\7\25\0\0\0\0\0\0", 4096}], msg_controllen=0, msg_flags=0}, 0) = 20
-socket(PF_LOCAL, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 6
-connect(6, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
-close(6) = 0
-close(5) = 0
-socket(PF_LOCAL, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 5
-connect(5, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
-close(5) = 0
-open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 5
-fstat(5, {st_mode=S_IFREG|0644, st_size=1751, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41f4000
-read(5, "#\n# /etc/nsswitch.conf\n#\n# An ex"..., 4096) = 1751
-read(5, "", 4096) = 0
-close(5) = 0
-munmap(0x7fb0c41f4000, 4096) = 0
-open("/etc/host.conf", O_RDONLY|O_CLOEXEC) = 5
-fstat(5, {st_mode=S_IFREG|0644, st_size=9, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41f4000
-read(5, "multi on\n", 4096) = 9
-read(5, "", 4096) = 0
-close(5) = 0
-munmap(0x7fb0c41f4000, 4096) = 0
-futex(0x7fb0c053d3d0, FUTEX_WAKE_PRIVATE, 2147483647) = 0
-open("/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = 5
-fstat(5, {st_mode=S_IFREG|0644, st_size=94, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41f4000
-read(5, "# Generated by NetworkManager\nse"..., 4096) = 94
-read(5, "", 4096) = 0
-close(5) = 0
-munmap(0x7fb0c41f4000, 4096) = 0
-open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 5
-fstat(5, {st_mode=S_IFREG|0644, st_size=212134, ...}) = 0
-mmap(NULL, 212134, PROT_READ, MAP_PRIVATE, 5, 0) = 0x7fb0c41c1000
-close(5) = 0
-open("/lib64/libnss_files.so.2", O_RDONLY|O_CLOEXEC) = 5
-read(5, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@\"\0\0\0\0\0\0"..., 832) = 832
-fstat(5, {st_mode=S_IFREG|0755, st_size=57976, ...}) = 0
-mmap(NULL, 2144360, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 5, 0) = 0x7fb0b629e000
-mprotect(0x7fb0b62a9000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0b64a8000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 5, 0xa000) = 0x7fb0b64a8000
-close(5) = 0
-mprotect(0x7fb0b64a8000, 4096, PROT_READ) = 0
-munmap(0x7fb0c41c1000, 212134) = 0
-open("/etc/hosts", O_RDONLY|O_CLOEXEC) = 5
-fstat(5, {st_mode=S_IFREG|0644, st_size=210, ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41f4000
-read(5, "127.0.0.1 localhost localhost."..., 4096) = 210
-read(5, "", 4096) = 0
-close(5) = 0
-munmap(0x7fb0c41f4000, 4096) = 0
-open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 5
-fstat(5, {st_mode=S_IFREG|0644, st_size=212134, ...}) = 0
-mmap(NULL, 212134, PROT_READ, MAP_PRIVATE, 5, 0) = 0x7fb0c41c1000
-close(5) = 0
-open("/lib64/libnss_dns.so.2", O_RDONLY|O_CLOEXEC) = 5
-read(5, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\21\0\0\0\0\0\0"..., 832) = 832
-fstat(5, {st_mode=S_IFREG|0755, st_size=27512, ...}) = 0
-mmap(NULL, 2117888, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 5, 0) = 0x7fb0b6098000
-mprotect(0x7fb0b609d000, 2093056, PROT_NONE) = 0
-mmap(0x7fb0b629c000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 5, 0x4000) = 0x7fb0b629c000
-close(5) = 0
-mprotect(0x7fb0b629c000, 4096, PROT_READ) = 0
-munmap(0x7fb0c41c1000, 212134) = 0
-socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 5
-connect(5, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.10.10.53")}, 16) = 0
-poll([{fd=5, events=POLLOUT}], 1, 0) = 1 ([{fd=5, revents=POLLOUT}])
-sendmmsg(5, {{{msg_name(0)=NULL, msg_iov(1)=[{"\36\326\1\0\0\1\0\0\0\0\0\0\4repo\3ham\2fi\0\0\1\0\1", 29}], msg_controllen=0, msg_flags=0}, 29}, {{msg_name(0)=NULL, msg_iov(1)=[{"\2125\1\0\0\1\0\0\0\0\0\0\4repo\3ham\2fi\0\0\34\0\1", 29}], msg_controllen=0, msg_flags=0}, 29}}, 2, MSG_NOSIGNAL) = 2
-poll([{fd=5, events=POLLIN}], 1, 5000) = 1 ([{fd=5, revents=POLLIN}])
-ioctl(5, FIONREAD, [508]) = 0
-recvfrom(5, "\36\326\201\200\0\1\0\1\0\r\0\f\4repo\3ham\2fi\0\0\1\0\1\300\f\0"..., 2048, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.10.10.53")}, [16]) = 508
-poll([{fd=5, events=POLLIN}], 1, 4998) = 1 ([{fd=5, revents=POLLIN}])
-ioctl(5, FIONREAD, [99]) = 0
-recvfrom(5, "\2125\201\200\0\1\0\0\0\1\0\0\4repo\3ham\2fi\0\0\34\0\1\300\21\0"..., 1540, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.10.10.53")}, [16]) = 99
-close(5) = 0
-brk(0) = 0x7fb0c4e29000
-brk(0x7fb0c4e4b000) = 0x7fb0c4e4b000
-socket(PF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_TCP) = 5
-fcntl(5, F_GETFL) = 0x2 (flags O_RDWR)
-fcntl(5, F_SETFL, O_RDWR|O_NONBLOCK) = 0
-setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
-connect(5, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("193.19.136.46")}, 16) = -1 EINPROGRESS (Operation now in progress)
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = -1 ENOENT (No such file or directory)
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN|EPOLLOUT, {u32=3303153608, u64=140397194125256}}) = 0
-epoll_wait(4, {{EPOLLOUT, {u32=3303153608, u64=140397194125256}}}, 16, 500) = 1
-writev(5, [{"OPTIONS /svn/aprx/trunk/doc HTTP"..., 38}, {"Host", 4}, {": ", 2}, {"repo.ham.fi", 11}, {"\r\n", 2}, {"User-Agent", 10}, {": ", 2}, {"SVN/1.8.8 (x86_64-redhat-linux-g"..., 46}, {"\r\n", 2}, {"Content-Type", 12}, {": ", 2}, {"text/xml", 8}, {"\r\n", 2}, {"Connection", 10}, {": ", 2}, {"keep-alive", 10}, {"\r\n", 2}, {"Accept-Encoding", 15}, {": ", 2}, {"gzip", 4}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"..., 48}, {"\r\n", 2}, {"DAV", 3}, {": ", [...]
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN, {u32=3303153656, u64=140397194125304}}) = 0
-epoll_wait(4, {{EPOLLIN, {u32=3303153656, u64=140397194125304}}}, 16, 500) = 1
-read(5, "HTTP/1.1 200 OK\r\nDate: Mon, 24 M"..., 8000) = 860
-brk(0) = 0x7fb0c4e4b000
-brk(0x7fb0c4e6c000) = 0x7fb0c4e6c000
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN|EPOLLOUT, {u32=3303153608, u64=140397194125256}}) = 0
-epoll_wait(4, {{EPOLLOUT, {u32=3303153608, u64=140397194125256}}}, 16, 500) = 1
-writev(5, [{"OPTIONS /svn/aprx/trunk/doc HTTP"..., 38}, {"Host", 4}, {": ", 2}, {"repo.ham.fi", 11}, {"\r\n", 2}, {"User-Agent", 10}, {": ", 2}, {"SVN/1.8.8 (x86_64-redhat-linux-g"..., 46}, {"\r\n", 2}, {"Accept-Encoding", 15}, {": ", 2}, {"gzip", 4}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"..., 48}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"..., 52}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"..., 55 [...]
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN, {u32=3303153656, u64=140397194125304}}) = 0
-epoll_wait(4, {{EPOLLIN, {u32=3303153656, u64=140397194125304}}}, 16, 500) = 1
-read(5, "HTTP/1.1 200 OK\r\nDate: Mon, 24 M"..., 8000) = 754
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN|EPOLLOUT, {u32=3303153608, u64=140397194125256}}) = 0
-epoll_wait(4, {{EPOLLOUT, {u32=3303153608, u64=140397194125256}}}, 16, 500) = 1
-writev(5, [{"PROPFIND /svn/aprx/trunk/doc HTT"..., 39}, {"Host", 4}, {": ", 2}, {"repo.ham.fi", 11}, {"\r\n", 2}, {"User-Agent", 10}, {": ", 2}, {"SVN/1.8.8 (x86_64-redhat-linux-g"..., 46}, {"\r\n", 2}, {"Content-Type", 12}, {": ", 2}, {"text/xml", 8}, {"\r\n", 2}, {"Accept-Encoding", 15}, {": ", 2}, {"gzip", 4}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"..., 48}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"..., 52}, {"\r\n", 2}, {" [...]
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN, {u32=3303153656, u64=140397194125304}}) = 0
-epoll_wait(4, {{EPOLLIN, {u32=3303153656, u64=140397194125304}}}, 16, 500) = 1
-read(5, "HTTP/1.1 207 Multi-Status\r\nDate:"..., 8000) = 554
-stat("/dev/random", {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 8), ...}) = 0
-open("/dev/urandom", O_RDONLY|O_CLOEXEC) = 6
-fcntl(6, F_GETFD) = 0x1 (flags FD_CLOEXEC)
-fcntl(6, F_SETFD, FD_CLOEXEC) = 0
-getuid() = 530
-getppid() = 5378
-read(6, "\264C8\327\255\304#\352\0163g\0\370\27\351\255", 16) = 16
-close(6) = 0
-gettid() = 5383
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN|EPOLLOUT, {u32=3303153608, u64=140397194125256}}) = 0
-epoll_wait(4, {{EPOLLOUT, {u32=3303153608, u64=140397194125256}}}, 16, 500) = 1
-writev(5, [{"MKACTIVITY /svn/aprx/!svn/act/9c"..., 77}, {"Host", 4}, {": ", 2}, {"repo.ham.fi", 11}, {"\r\n", 2}, {"User-Agent", 10}, {": ", 2}, {"SVN/1.8.8 (x86_64-redhat-linux-g"..., 46}, {"\r\n", 2}, {"Accept-Encoding", 15}, {": ", 2}, {"gzip", 4}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"..., 48}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"..., 52}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"..., 55 [...]
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN, {u32=3303153656, u64=140397194125304}}) = 0
-epoll_wait(4, {{EPOLLIN, {u32=3303153656, u64=140397194125304}}}, 16, 500) = 1
-read(5, "HTTP/1.1 401 Authorization Requi"..., 8000) = 600
-lstat("/localhome/mea/.subversion/auth/svn.simple/5ab2e05495eafc7b602c32da117c5d46", 0x7fff601051f0) = -1 ENOENT (No such file or directory)
-open("/dev/tty", O_RDWR|O_CLOEXEC) = 6
-ioctl(6, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
-ioctl(6, SNDCTL_TMR_CONTINUE or SNDRV_TIMER_IOCTL_GPARAMS or TCSETSF, {B38400 opost -isig -icanon -echo ...}) = 0
-write(6, "Authentication realm: <http://re"..., 68) = 68
-ioctl(6, SNDCTL_TMR_START or SNDRV_TIMER_IOCTL_TREAD or TCSETS, {B38400 opost isig icanon echo ...}) = 0
-ioctl(6, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
-close(6) = 0
-open("/dev/tty", O_RDWR|O_CLOEXEC) = 6
-ioctl(6, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
-ioctl(6, SNDCTL_TMR_CONTINUE or SNDRV_TIMER_IOCTL_GPARAMS or TCSETSF, {B38400 opost -isig -icanon -echo ...}) = 0
-write(6, "Password for 'oh2mqk': ", 23) = 23
-read(6, "r", 1) = 1
-write(6, "*", 1) = 1
-read(6, "i", 1) = 1
-write(6, "*", 1) = 1
-read(6, "f", 1) = 1
-write(6, "*", 1) = 1
-read(6, "r", 1) = 1
-write(6, "*", 1) = 1
-read(6, "a", 1) = 1
-write(6, "*", 1) = 1
-read(6, "f", 1) = 1
-write(6, "*", 1) = 1
-read(6, "2", 1) = 1
-write(6, "*", 1) = 1
-read(6, "2", 1) = 1
-write(6, "*", 1) = 1
-read(6, "\n", 1) = 1
-write(6, "\n", 1) = 1
-write(6, "\n", 1) = 1
-ioctl(6, SNDCTL_TMR_START or SNDRV_TIMER_IOCTL_TREAD or TCSETS, {B38400 opost isig icanon echo ...}) = 0
-ioctl(6, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
-close(6) = 0
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN|EPOLLOUT, {u32=3303153608, u64=140397194125256}}) = 0
-epoll_wait(4, {{EPOLLIN|EPOLLOUT, {u32=3303153608, u64=140397194125256}}}, 16, 500) = 1
-read(5, "", 8000) = 0
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-close(5) = 0
-socket(PF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_TCP) = 5
-fcntl(5, F_GETFL) = 0x2 (flags O_RDWR)
-fcntl(5, F_SETFL, O_RDWR|O_NONBLOCK) = 0
-setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
-connect(5, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("193.19.136.46")}, 16) = -1 EINPROGRESS (Operation now in progress)
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = -1 ENOENT (No such file or directory)
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN|EPOLLOUT, {u32=3303153656, u64=140397194125304}}) = 0
-epoll_wait(4, {{EPOLLOUT, {u32=3303153656, u64=140397194125304}}}, 16, 500) = 1
-writev(5, [{"MKACTIVITY /svn/aprx/!svn/act/9c"..., 77}, {"Host", 4}, {": ", 2}, {"repo.ham.fi", 11}, {"\r\n", 2}, {"Authorization", 13}, {": ", 2}, {"Basic b2gybXFrOnJpZnJhZjIy", 26}, {"\r\n", 2}, {"User-Agent", 10}, {": ", 2}, {"SVN/1.8.8 (x86_64-redhat-linux-g"..., 46}, {"\r\n", 2}, {"Accept-Encoding", 15}, {": ", 2}, {"gzip", 4}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"..., 48}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"..., [...]
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN, {u32=3303153608, u64=140397194125256}}) = 0
-epoll_wait(4, {{EPOLLIN, {u32=3303153608, u64=140397194125256}}}, 16, 500) = 1
-read(5, "HTTP/1.1 201 Created\r\nDate: Mon,"..., 8000) = 550
-open("/dev/tty", O_RDWR|O_CLOEXEC) = 6
-ioctl(6, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
-ioctl(6, SNDCTL_TMR_CONTINUE or SNDRV_TIMER_IOCTL_GPARAMS or TCSETSF, {B38400 opost -isig -icanon -echo ...}) = 0
-write(6, "\n-------------------------------"..., 607) = 607
-ioctl(6, SNDCTL_TMR_START or SNDRV_TIMER_IOCTL_TREAD or TCSETS, {B38400 opost isig icanon echo ...}) = 0
-ioctl(6, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
-close(6) = 0
-open("/dev/tty", O_RDWR|O_CLOEXEC) = 6
-ioctl(6, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
-ioctl(6, SNDCTL_TMR_CONTINUE or SNDRV_TIMER_IOCTL_GPARAMS or TCSETSF, {B38400 opost -isig -icanon -echo ...}) = 0
-write(6, "Store password unencrypted (yes/"..., 37) = 37
-read(6, "r", 1) = 1
-write(6, "r", 1) = 1
-read(6, "a", 1) = 1
-write(6, "a", 1) = 1
-read(6, "\27", 1) = 1
-write(6, "\7", 1) = 1
-read(6, "\25", 1) = 1
-write(6, "\7", 1) = 1
-read(6, "\177", 1) = 1
-write(6, "\10", 1) = 1
-write(6, " ", 1) = 1
-write(6, "\10", 1) = 1
-read(6, "\177", 1) = 1
-write(6, "\10", 1) = 1
-write(6, " ", 1) = 1
-write(6, "\10", 1) = 1
-read(6, "\177", 1) = 1
-read(6, "\177", 1) = 1
-read(6, "e", 1) = 1
-write(6, "e", 1) = 1
-read(6, "\177", 1) = 1
-write(6, "\10", 1) = 1
-write(6, " ", 1) = 1
-write(6, "\10", 1) = 1
-read(6, "\177", 1) = 1
-read(6, "y", 1) = 1
-write(6, "y", 1) = 1
-read(6, "e", 1) = 1
-write(6, "e", 1) = 1
-read(6, "s", 1) = 1
-write(6, "s", 1) = 1
-read(6, "\177", 1) = 1
-write(6, "\10", 1) = 1
-write(6, " ", 1) = 1
-write(6, "\10", 1) = 1
-read(6, "\177", 1) = 1
-write(6, "\10", 1) = 1
-write(6, " ", 1) = 1
-write(6, "\10", 1) = 1
-read(6, "\177", 1) = 1
-write(6, "\10", 1) = 1
-write(6, " ", 1) = 1
-write(6, "\10", 1) = 1
-read(6, "\177", 1) = 1
-read(6, "\177", 1) = 1
-read(6, "n", 1) = 1
-write(6, "n", 1) = 1
-read(6, "o", 1) = 1
-write(6, "o", 1) = 1
-read(6, "\177", 1) = 1
-write(6, "\10", 1) = 1
-write(6, " ", 1) = 1
-write(6, "\10", 1) = 1
-read(6, "\177", 1) = 1
-write(6, "\10", 1) = 1
-write(6, " ", 1) = 1
-write(6, "\10", 1) = 1
-read(6, "\177", 1) = 1
-read(6, "\177", 1) = 1
-read(6, "y", 1) = 1
-write(6, "y", 1) = 1
-read(6, "e", 1) = 1
-write(6, "e", 1) = 1
-read(6, "s", 1) = 1
-write(6, "s", 1) = 1
-read(6, "\n", 1) = 1
-write(6, "\n", 1) = 1
-ioctl(6, SNDCTL_TMR_START or SNDRV_TIMER_IOCTL_TREAD or TCSETS, {B38400 opost isig icanon echo ...}) = 0
-ioctl(6, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
-close(6) = 0
-open("/localhome/mea/.subversion/auth/svn.simple/5ab2e05495eafc7b602c32da117c5d46", O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC, 0666) = 6
-write(6, "K 8\npasstype\nV 6\nsimple\nK 8\npass"..., 150) = 150
-close(6) = 0
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN|EPOLLOUT, {u32=3303153656, u64=140397194125304}}) = 0
-epoll_wait(4, {{EPOLLIN|EPOLLOUT, {u32=3303153656, u64=140397194125304}}}, 16, 500) = 1
-read(5, "", 8000) = 0
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-close(5) = 0
-socket(PF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_TCP) = 5
-fcntl(5, F_GETFL) = 0x2 (flags O_RDWR)
-fcntl(5, F_SETFL, O_RDWR|O_NONBLOCK) = 0
-setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
-connect(5, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("193.19.136.46")}, 16) = -1 EINPROGRESS (Operation now in progress)
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = -1 ENOENT (No such file or directory)
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN|EPOLLOUT, {u32=3303153608, u64=140397194125256}}) = 0
-epoll_wait(4, {{EPOLLOUT, {u32=3303153608, u64=140397194125256}}}, 16, 500) = 1
-writev(5, [{"PROPFIND /svn/aprx/trunk/doc HTT"..., 39}, {"Host", 4}, {": ", 2}, {"repo.ham.fi", 11}, {"\r\n", 2}, {"Authorization", 13}, {": ", 2}, {"Basic b2gybXFrOnJpZnJhZjIy", 26}, {"\r\n", 2}, {"User-Agent", 10}, {": ", 2}, {"SVN/1.8.8 (x86_64-redhat-linux-g"..., 46}, {"\r\n", 2}, {"Content-Type", 12}, {": ", 2}, {"text/xml", 8}, {"\r\n", 2}, {"Accept-Encoding", 15}, {": ", 2}, {"gzip", 4}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"..., 48}, {"\r\n", 2}, [...]
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN, {u32=3303153656, u64=140397194125304}}) = 0
-epoll_wait(4, {{EPOLLIN, {u32=3303153656, u64=140397194125304}}}, 16, 500) = 1
-read(5, "HTTP/1.1 207 Multi-Status\r\nDate:"..., 8000) = 443
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN|EPOLLOUT, {u32=3303153608, u64=140397194125256}}) = 0
-epoll_wait(4, {{EPOLLOUT, {u32=3303153608, u64=140397194125256}}}, 16, 500) = 1
-writev(5, [{"CHECKOUT /svn/aprx/!svn/vcc/defa"..., 46}, {"Host", 4}, {": ", 2}, {"repo.ham.fi", 11}, {"\r\n", 2}, {"Authorization", 13}, {": ", 2}, {"Basic b2gybXFrOnJpZnJhZjIy", 26}, {"\r\n", 2}, {"User-Agent", 10}, {": ", 2}, {"SVN/1.8.8 (x86_64-redhat-linux-g"..., 46}, {"\r\n", 2}, {"Content-Type", 12}, {": ", 2}, {"text/xml", 8}, {"\r\n", 2}, {"Accept-Encoding", 15}, {": ", 2}, {"gzip", 4}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"..., 48}, {"\r\n", 2}, [...]
-epoll_wait(4, {{EPOLLOUT, {u32=3303153608, u64=140397194125256}}}, 16, 500) = 1
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN, {u32=3303153656, u64=140397194125304}}) = 0
-epoll_wait(4, {{EPOLLIN, {u32=3303153656, u64=140397194125304}}}, 16, 500) = 1
-read(5, "HTTP/1.1 201 Created\r\nDate: Mon,"..., 8000) = 566
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN|EPOLLOUT, {u32=3303153608, u64=140397194125256}}) = 0
-epoll_wait(4, {{EPOLLOUT, {u32=3303153608, u64=140397194125256}}}, 16, 500) = 1
-writev(5, [{"PROPPATCH /svn/aprx/!svn/wbl/9ce"..., 80}, {"Host", 4}, {": ", 2}, {"repo.ham.fi", 11}, {"\r\n", 2}, {"Authorization", 13}, {": ", 2}, {"Basic b2gybXFrOnJpZnJhZjIy", 26}, {"\r\n", 2}, {"User-Agent", 10}, {": ", 2}, {"SVN/1.8.8 (x86_64-redhat-linux-g"..., 46}, {"\r\n", 2}, {"Accept-Encoding", 15}, {": ", 2}, {"gzip", 4}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"..., 48}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"..., [...]
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN, {u32=3303153656, u64=140397194125304}}) = 0
-epoll_wait(4, {{EPOLLIN, {u32=3303153656, u64=140397194125304}}}, 16, 500) = 1
-read(5, "HTTP/1.1 207 Multi-Status\r\nDate:"..., 8000) = 464
-fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
-mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41f4000
-write(1, "Sending doc/aprx-manual.o"..., 35) = 35
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual.odt", {st_mode=S_IFREG|0664, st_size=197896, ...}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN|EPOLLOUT, {u32=3303153608, u64=140397194125256}}) = 0
-epoll_wait(4, {{EPOLLOUT, {u32=3303153608, u64=140397194125256}}}, 16, 500) = 1
-writev(5, [{"CHECKOUT /svn/aprx/!svn/ver/574/"..., 68}, {"Host", 4}, {": ", 2}, {"repo.ham.fi", 11}, {"\r\n", 2}, {"Authorization", 13}, {": ", 2}, {"Basic b2gybXFrOnJpZnJhZjIy", 26}, {"\r\n", 2}, {"User-Agent", 10}, {": ", 2}, {"SVN/1.8.8 (x86_64-redhat-linux-g"..., 46}, {"\r\n", 2}, {"Content-Type", 12}, {": ", 2}, {"text/xml", 8}, {"\r\n", 2}, {"Accept-Encoding", 15}, {": ", 2}, {"gzip", 4}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"..., 48}, {"\r\n", 2}, [...]
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN, {u32=3303153656, u64=140397194125304}}) = 0
-epoll_wait(4, {{EPOLLIN, {u32=3303153656, u64=140397194125304}}}, 16, 500) = 1
-read(5, "HTTP/1.1 201 Created\r\nDate: Mon,"..., 8000) = 602
-write(1, "Sending doc/aprx-manual.p"..., 35) = 35
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual.pdf", {st_mode=S_IFREG|0664, st_size=438348, ...}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN|EPOLLOUT, {u32=3303153608, u64=140397194125256}}) = 0
-epoll_wait(4, {{EPOLLOUT, {u32=3303153608, u64=140397194125256}}}, 16, 500) = 1
-writev(5, [{"CHECKOUT /svn/aprx/!svn/ver/569/"..., 68}, {"Host", 4}, {": ", 2}, {"repo.ham.fi", 11}, {"\r\n", 2}, {"Authorization", 13}, {": ", 2}, {"Basic b2gybXFrOnJpZnJhZjIy", 26}, {"\r\n", 2}, {"User-Agent", 10}, {": ", 2}, {"SVN/1.8.8 (x86_64-redhat-linux-g"..., 46}, {"\r\n", 2}, {"Content-Type", 12}, {": ", 2}, {"text/xml", 8}, {"\r\n", 2}, {"Accept-Encoding", 15}, {": ", 2}, {"gzip", 4}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"..., 48}, {"\r\n", 2}, [...]
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN, {u32=3303153656, u64=140397194125304}}) = 0
-epoll_wait(4, {{EPOLLIN, {u32=3303153656, u64=140397194125304}}}, 16, 500) = 1
-read(5, "HTTP/1.1 201 Created\r\nDate: Mon,"..., 8000) = 602
-write(1, "Transmitting file data .", 24) = 24
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual.odt", {st_mode=S_IFREG|0664, st_size=197896, ...}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-open("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual.odt", O_RDONLY|O_CLOEXEC) = 6
-open("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/tmp/svn-VYI0r2", O_RDWR|O_CREAT|O_EXCL, 0600) = 7
-fcntl(7, F_GETFD) = 0
-fcntl(7, F_SETFD, FD_CLOEXEC) = 0
-open("/tmp/apr-tmp.fOowVz", O_RDWR|O_CREAT|O_EXCL, 0600) = 8
-fcntl(8, F_GETFD) = 0
-fcntl(8, F_SETFD, FD_CLOEXEC) = 0
-write(8, "!", 1) = 1
-close(8) = 0
-unlink("/tmp/apr-tmp.fOowVz") = 0
-open("/tmp/svn-0c067acf.tmp", O_RDWR|O_CREAT|O_EXCL|O_CLOEXEC, 0666) = 8
-fstat(8, {st_mode=S_IFREG|0664, st_size=0, ...}) = 0
-close(8) = 0
-unlink("/tmp/svn-0c067acf.tmp") = 0
-fstat(7, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
-chmod("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/tmp/svn-VYI0r2", 0664) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-open("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/pristine/5b/5b78dd1d69e60a7ae82aec254bcc346289c7895d.svn-base", O_RDONLY|O_CLOEXEC) = 8
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-open("/tmp/svn-4fJ8w7", O_RDWR|O_CREAT|O_EXCL, 0600) = 9
-fcntl(9, F_GETFD) = 0
-fcntl(9, F_SETFD, FD_CLOEXEC) = 0
-mmap(NULL, 212992, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c4174000
-read(8, "PK\3\4\24\0\0\10\0\0\271dhD^\3062\f'\0\0\0'\0\0\0\10\0\0\0mi"..., 4096) = 4096
-read(8, "\26\256\3365\36\v\34\303:\343=\342\234x j\204\33Vt\21yb\202X\n\353\242#\377\177\34"..., 4096) = 4096
-read(8, "5\270\233\351M\206\346\245\324\370\374\271\277s-v_U\236:\331\3044\345\312-'\263W\35O\235"..., 4096) = 4096
-read(8, "\272\263\245\347\367\302\2075\374\202\374N?\247\25\300\1&\302\200\250\231_iM\337\343 E\317\264\320"..., 4096) = 4096
-read(8, ";\222\352\271\212.\22\3657\17h\233\27\317\267y\227\v\243n\260\34\315\260\370\353\306!\270\240B\316"..., 4096) = 4096
-read(8, "\357\253}U\35\250\3728+\354nxh]dk\364j|s\242\222\2609\336\236\343\315*k\355\220"..., 4096) = 4096
-read(8, "} \362]Ws\33\25{\372\23z\t\201\4\237~\370\362\356g\205'\325\346\"\30/\277&Rl"..., 4096) = 4096
-read(8, "^]\251]GY\313=a\240\277\31\277\350\232\256\16\6\23]-\350\10\23\267\300\2o\266\364=\27"..., 4096) = 4096
-read(8, "\203\224\4\362E9\225\264g\257\245K\253\204\21~\320\r\204\356\233X\235\341b\\\0\5^R3\6"..., 4096) = 4096
-read(8, "\330\3734\273\326`\213m7M\215\331\334R\313\203\272\237\344\224\273\233\336\356\203j\236D\320\276fr"..., 4096) = 4096
-read(8, "\212\302Y\345\3216Lcd\230#k`\33p)\230\243\241Y\26h\374\336\264\32\35m4\271\362\335"..., 4096) = 4096
-read(8, "G\200\342K\240\245\316%\326{U~f4<%%\333\336<\225\351\360\224\325\251\353*\335\221\266\32"..., 4096) = 4096
-read(8, "\27\362\254U\345\232\212\340L\241\31'\361&\232+\366S\265\204\345,D^\222\325\261\341\2439\221~"..., 4096) = 4096
-read(8, "i\301\363\16\213\304\23\nm\251'Y\372\322\0u\364\247<\301U\267\325A\35(\260\22i3\16\225"..., 4096) = 4096
-read(8, "A\343F\35\324 at 7\352P\220Ckj\177\261\350\356\222?\334\342\244a\277\4}\215\213\211\24\232q"..., 4096) = 4096
-read(8, "*l\243\263\7\222v\314\33\3\364\264\251)\0074\313-\243\316<\31\357\223-y\16\300\2353}\225"..., 4096) = 4096
-read(8, "\314\365\1\374\222\316L\326\315\0\373\374\3\355\200\317\255[[\3047\7\230<\6\16p\213\2q\377\313"..., 4096) = 4096
-read(8, "\253\5\f\23hE\255\361\246v)O\316\336\207l\36\367\257\3237\\\235\206.\10\212\"\227\363\343\311"..., 4096) = 4096
-read(8, "\326\237\320\354\332\377\325\24\374\316\25\2473\205\234\206\267\341\252\261\332\241\354\321\341\365\370\233\352\315\315\344"..., 4096) = 4096
-read(8, "\214\316\307\346\364d\223N\225\343\227\365\31$m0\307\310(T\355S\342\27\246\2$\211.k\245n"..., 4096) = 4096
-read(8, "\301\30w+\246\257\227ivVF\233\374v'\5\201d\345\237bZ\323N.C\226=\252f&p"..., 4096) = 4096
-read(8, "V\246A\366\6\206\v\323\325\362\267\254(\377u\\\334\210$\216\330\212;\240\231\21/A\313\375#~"..., 4096) = 4096
-read(8, "&\177\325\232\357X\204\223H\237(Jy\347\274\27T\275\355\27i\257b\35\33\27\217\277g\266\347\274"..., 4096) = 4096
-read(8, "Eg\264[\\<?<\266R\311\244\305J\246\215\"\374y\372\0\216\233\270Dt\355\301\377\346\211!"..., 4096) = 4096
-read(8, "\6C#\260!\343\34\344l\257\304\263E\16\326\27\205?\242d\240\275\261B\17Ik\330\0!\f@"..., 4096) = 4096
-read(6, "PK\3\4\24\0\0\10\0\0\360axD^\3062\f'\0\0\0'\0\0\0\10\0\0\0mi"..., 4096) = 4096
-read(6, "\350\305\345\33_GTU\377|\203\225\344\344\344\204B\373A\21\233\364\330\244\322J\360\206t\302\237v"..., 4096) = 4096
-read(6, "\34\316f\263\234U\304\337Q\230\3019\317d\261K+\336\311\347<\223\v\315 at y'\237\363L\26\32"..., 4096) = 4096
-read(6, "\27\17\321\36\314\242\213\207h\23\222\321\305C\264\7\337\350\342!Z\205z\224\214\207\230u\361\20\r\303"..., 4096) = 4096
-read(6, "\326\252\234\370@\373#{\274\367\3\233\364\365\264;\35U\327C^\346\20\357\207\37\t=\310\216\256\34"..., 4096) = 4096
-read(6, "Qx\320\26<\260E\264\200\2\364\302\335# \346h>\24\200\223\260\26\336#!\266\4\360\347\24\330"..., 4096) = 4096
-read(6, "Y\16f\211\1\362\242\364\v(\361\274\370\261G\"\27}\3006\337\234(l\235\3057*\177+T~"..., 4096) = 4096
-read(6, "\201\205\37\340\265\245Dm \3366b\323\0025\346,?%\376\262\372]PJXSN\356t\34{"..., 4096) = 4096
-read(6, "\35\204T\20\4\377\366\351z\306\334\217n3<\334\34\351\241\207\252C\221\f\213\3618AG\"\256\4"..., 4096) = 4096
-read(6, "\0103\\\275s\304\274C\5s0\366\7\327\224\20\3k\310\224\220\365%r\356F,3I\237'\211"..., 4096) = 4096
-read(6, "p\256\24\230\203\354\275\306\1b0\201\202\251\23\35f\333\216\341\7\2V2\305\352\310!E\347\211\327"..., 4096) = 4096
-read(6, "\204\311\212\307^\"2\2752\310\255AO\337\304\370\262\232H\336et\343\23q\300\375\220\0027\30\212"..., 4096) = 4096
-read(6, "N\260\372\330<ez\31#\366\225\337\30D\323Y\200\364r\211X\202\201\317Yw\357\375\313\0\r\265"..., 4096) = 4096
-read(6, "w\27p\16=<\305\21*_i5A\357\340\361\f\205\16\230\352'U\302/\223W\200t\301\373\224"..., 4096) = 4096
-read(6, "x\224)\247d\260\261\351aW'J\234F&\26\345.\236\237\237\377\376m\332\365?\317\371\36t\223"..., 4096) = 4096
-read(6, "\3639\314~\213\353\0\243\321\22\305g\246\373\34\330\25\377\374iz\332k\332T\351t\354<\302\314\252"..., 4096) = 4096
-read(6, "kjs?\374P\234\25T\270\6\303*\351ur\2\335\3161\37Q\352\263\37\370\246\215J\253\304\366"..., 4096) = 4096
-read(6, "\377yDq\265{\23\233i.k\226^\216\f\243\211)QQk\341r\364\204\247\2333\275\334\207v"..., 4096) = 4096
-read(6, ".\270\327\327\320\210\302eb\3543\236r\346g\302Zm\333\227\272\324pS\213\336\203\206*5U\346"..., 4096) = 4096
-read(6, "V9l\344\370\247\3217\220)\1\200\t\347\3412\275\255\274\345\242e\235O\334\242\251gH\302eF"..., 4096) = 4096
-read(6, "\226\16\267\33\275m\347\356\334\267o1A\3.\351erJ\252\357\266\35\356\256\263B.]puv"..., 4096) = 4096
-read(6, "/\300\0160\5\354\0S\300\16\365\2\366c\1\0\0\0\350%\0\0\0\0\275\4\0\0\0\240\227\0"..., 4096) = 4096
-read(6, "\341CmF\30\231[\f\263\265\213\210\214\244n\363q\2342\315\310\334\302q\3124\352\306\37\372\n\266"..., 4096) = 4096
-read(6, "\311\272\215>\3222RQQ\271\34x~\213\317\206\305\313V\304F\204\23B\250\377\377\265\320\236]b"..., 4096) = 4096
-read(6, "\214\355\321\313\214\376\312\312nd\350\275{eee\1\27\2\355\306\214Ul;\260\233b\357\201\203\273"..., 4096) = 4096
-write(7, "PK\3\4\24\0\0\10\0\0\360axD^\3062\f'\0\0\0'\0\0\0\10\0\0\0mi"..., 4096) = 4096
-write(7, "\350\305\345\33_GTU\377|\203\225\344\344\344\204B\373A\21\233\364\330\244\322J\360\206t\302\237v"..., 4096) = 4096
-write(7, "\34\316f\263\234U\304\337Q\230\3019\317d\261K+\336\311\347<\223\v\315 at y'\237\363L\26\32"..., 4096) = 4096
-write(7, "\27\17\321\36\314\242\213\207h\23\222\321\305C\264\7\337\350\342!Z\205z\224\214\207\230u\361\20\r\303"..., 4096) = 4096
-write(7, "\326\252\234\370@\373#{\274\367\3\233\364\365\264;\35U\327C^\346\20\357\207\37\t=\310\216\256\34"..., 4096) = 4096
-write(7, "Qx\320\26<\260E\264\200\2\364\302\335# \346h>\24\200\223\260\26\336#!\266\4\360\347\24\330"..., 4096) = 4096
-write(7, "Y\16f\211\1\362\242\364\v(\361\274\370\261G\"\27}\3006\337\234(l\235\3057*\177+T~"..., 4096) = 4096
-write(7, "\201\205\37\340\265\245Dm \3366b\323\0025\346,?%\376\262\372]PJXSN\356t\34{"..., 4096) = 4096
-write(7, "\35\204T\20\4\377\366\351z\306\334\217n3<\334\34\351\241\207\252C\221\f\213\3618AG\"\256\4"..., 4096) = 4096
-write(7, "\0103\\\275s\304\274C\5s0\366\7\327\224\20\3k\310\224\220\365%r\356F,3I\237'\211"..., 4096) = 4096
-write(7, "p\256\24\230\203\354\275\306\1b0\201\202\251\23\35f\333\216\341\7\2V2\305\352\310!E\347\211\327"..., 4096) = 4096
-write(7, "\204\311\212\307^\"2\2752\310\255AO\337\304\370\262\232H\336et\343\23q\300\375\220\0027\30\212"..., 4096) = 4096
-write(7, "N\260\372\330<ez\31#\366\225\337\30D\323Y\200\364r\211X\202\201\317Yw\357\375\313\0\r\265"..., 4096) = 4096
-write(7, "w\27p\16=<\305\21*_i5A\357\340\361\f\205\16\230\352'U\302/\223W\200t\301\373\224"..., 4096) = 4096
-write(7, "x\224)\247d\260\261\351aW'J\234F&\26\345.\236\237\237\377\376m\332\365?\317\371\36t\223"..., 4096) = 4096
-write(7, "\3639\314~\213\353\0\243\321\22\305g\246\373\34\330\25\377\374iz\332k\332T\351t\354<\302\314\252"..., 4096) = 4096
-write(7, "kjs?\374P\234\25T\270\6\303*\351ur\2\335\3161\37Q\352\263\37\370\246\215J\253\304\366"..., 4096) = 4096
-write(7, "\377yDq\265{\23\233i.k\226^\216\f\243\211)QQk\341r\364\204\247\2333\275\334\207v"..., 4096) = 4096
-write(7, ".\270\327\327\320\210\302eb\3543\236r\346g\302Zm\333\227\272\324pS\213\336\203\206*5U\346"..., 4096) = 4096
-write(7, "V9l\344\370\247\3217\220)\1\200\t\347\3412\275\255\274\345\242e\235O\334\242\251gH\302eF"..., 4096) = 4096
-write(7, "\226\16\267\33\275m\347\356\334\267o1A\3.\351erJ\252\357\266\35\356\256\263B.]puv"..., 4096) = 4096
-write(7, "/\300\0160\5\354\0S\300\16\365\2\366c\1\0\0\0\350%\0\0\0\0\275\4\0\0\0\240\227\0"..., 4096) = 4096
-write(7, "\341CmF\30\231[\f\263\265\213\210\214\244n\363q\2342\315\310\334\302q\3124\352\306\37\372\n\266"..., 4096) = 4096
-write(7, "\311\272\215>\3222RQQ\271\34x~\213\317\206\305\313V\304F\204\23B\250\377\377\265\320\236]b"..., 4096) = 4096
-mmap(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c41d2000
-write(9, "SVN\0\0\206\240\0\206\240\0\6\206\237v\n\0\200\206\237v\360axD^\3062\f'\0\0"..., 4096) = 4096
-write(9, "a\200\267{e\231\231\231\330c\205\350\305\345\33_GTU\377|\203\225\344\344\344\204B\373A\21\233"..., 4096) = 4096
-write(9, "\216f'\336Q\230\3019\317d\323\34\316f\263\234U\304\337Q\230\3019\317d\261K+\336\311\347<"..., 4096) = 4096
-write(9, "<D{p\210.\36\242M\350D\27\17\321\36\314\242\213\207h\23\222\321\305C\264\7\337\350\342!Z"..., 4096) = 4096
-write(9, "32@\232\33\23}`\216M0\326\252\234\370@\373#{\274\367\3\233\364\365\264;\35U\327C^"..., 4096) = 4096
-write(9, "\370\22\210\4v\204\30\214pY\335Qx\320\26<\260E\264\200\2\364\302\335# \346h>\24\200\223"..., 4096) = 4096
-write(9, "+\v\343\220\365Dh\341\212\257lY\16f\211\1\362\242\364\v(\361\274\370\261G\"\27}\3006\337"..., 4096) = 4096
-write(9, "\0234\34C\326\310\256\245\353\254\251\201\205\37\340\265\245Dm \3366b\323\0025\346,?%\376\262"..., 4096) = 4096
-write(9, "L\365\312\221/\214\310\273$Pl\35\204T\20\4\377\366\351z\306\334\217n3<\334\34\351\241\207\252"..., 4096) = 4096
-write(9, "\276y\v\270\267\204%\253c7\24\0103\\\275s\304\274C\5s0\366\7\327\224\20\3k\310\224\220"..., 4096) = 4096
-write(9, "l\35y\24\224\207\301\223o\323\270p\256\24\230\203\354\275\306\1b0\201\202\251\23\35f\333\216\341\7"..., 4096) = 4096
-write(9, "\315\22\27\24\362!\235\307\341D\324\204\311\212\307^\"2\2752\310\255AO\337\304\370\262\232H\336e"..., 4096) = 4096
-write(9, "\244\2\217\337|P8\212\2517\271N\260\372\330<ez\31#\366\225\337\30D\323Y\200\364r\211X"..., 4096) = 4096
-write(9, "\362\374\20\371.9?\7\23\337\vw\27p\16=<\305\21*_i5A\357\340\361\f\205\16\230\352"..., 4096) = 4096
-write(9, "-\321\245\314k\27\317f\177\373:x\224)\247d\260\261\351aW'J\234F&\26\345.\236\237\237"..., 4096) = 4096
-write(9, "?3\333IOwO7\27\346>\3639\314~\213\353\0\243\321\22\305g\246\373\34\330\25\377\374iz"..., 4096) = 4096
-write(9, "PkQ\364m8\347\0g%\250kjs?\374P\234\25T\270\6\303*\351ur\2\335\3161\37"..., 4096) = 4096
-write(9, "\355\362\350\356m\17WG\232$\212\377yDq\265{\23\233i.k\226^\216\f\243\211)QQk"..., 4096) = 4096
-write(9, "\301\262\364\0364\214\302er|\5.\270\327\327\320\210\302eb\3543\236r\346g\302Zm\333\227\272"..., 4096) = 4096
-write(9, "\221\325\226\346\226\310\243~\251g\342V9l\344\370\247\3217\220)\1\200\t\347\3412\275\255\274\345\242"..., 4096) = 4096
-write(9, "\24!\32E,n\342\323\244\5\213\226\16\267\33\275m\347\356\334\267o1A\3.\351erJ\252\357"..., 4096) = 4096
-write(9, "\205\220a?6!9[\336lW/\300\0160\5\354\0S\300\16\365\2\366c\1\0\0\0\350%\0"..., 4096) = 4096
-write(9, "V\346Y\242*p\356~\237Ga\341CmF\30\231[\f\263\265\213\210\214\244n\363q\2342\315\310"..., 4096) = 4096
-write(9, "\333\350\323\333\334,\354^\250\251\211\311\272\215>\3222RQQ\271\34x~\213\317\206\305\313V\304F"..., 4096) = 4096
-write(9, "K\206p\v\332\16\217\302\302\355\306\214\355\321\313\214\376\312\312nd\350\275{eee\1\27\2\355\306"..., 4096) = 4096
-read(8, "\237\225\0323\353\223\331j\271H~\220\343\355\232\334>\335h&\270\240 v\21\26s)\274\250\270X"..., 4096) = 4096
-read(8, "\5\2I\224\264\21\374\355B2\312\243\363\vY1Fqh\30-nL\257\214\250\322\236\5\277\315\252"..., 4096) = 4096
-read(8, "G\255\333\6\376\322\333i_\330d\252\22\23\36|\214\326\267\31\321\267\262l\323\214\277\220\272m\211\24"..., 4096) = 4096
-read(8, "\222\2403\212\347-\315\201\371tr\277\315\3275pn\356W\24C\351+\210\327h\365\16\21G\321V"..., 4096) = 4096
-read(8, "_K\212?\373;\277T\244\325\370\312w\265A)gQ:h\31\265_:\"|T\251\276\343\n!"..., 4096) = 4096
-read(8, "\256I\362d\264\352\t\266_\247i0n\222\1&\2253\261p\374,g+2\0\325\7{\322*r"..., 4096) = 4096
-read(8, "\252\361\324\2248\336\240Gf%\246\360&\312\266\t\230\377\273\215\216n\2\206\254\251\201\301\322\3104\225"..., 4096) = 4096
-read(8, "M\264\26\266\216 \344\21\16~\216\205Q\317\361\313;\316\36\2428\2711\27c\235K\240\213b\337s"..., 4096) = 4096
-read(8, "\340\v\277\334R<\312:\231h\347Ru\234\247E\214sl\343\207\307j\253\274\323/\233\255{X\213"..., 4096) = 4096
-read(8, "\310\235?\254\306\365\254.~\275\337\224V\2777\300\312\n\250{\330\203#\277\243\35\341\227H\244\215H"..., 4096) = 4096
-read(8, "\263\353\311\306\351%\341\275\317\312\337X\255hZP\246\22P\200\343\354\3\241e\266\24\322\376\251\225?"..., 4096) = 4096
-read(8, "4\331\313\37\263\265J\233\303!2\242\336D\\&\337\331f\373\213`\264\324\215\304\v6'\353^^"..., 4096) = 4096
-read(8, "t\216\276\245P\224c\333 at J<\17\313O\26\23\22\366\0W\307\271\24\313n*\345k\254\246\211\216"..., 4096) = 4096
-read(8, "\265\205d\267\263\324{\354\362\273\v71\251\342\247\367\376&\215,\275\7\216:\317\276z\362I\362g"..., 4096) = 4096
-read(8, "s?{\2731\315?\37\221\224\2220c\215Y\25\362O\240%wl\365\375\262cx\10;\f\3550"..., 4096) = 4096
-read(8, "\0314MiT\374z\3127z:C\317\356\200\36 \353\231\254D|\353\210\260\360\240G\330\373d="..., 4096) = 4096
-read(8, "\335RR\337\"r\342x\220\221U\375H\315J\213\303k-\2518\244\4\vcZ\207\234\327q\270,"..., 4096) = 4096
-read(8, "\223\315x8=?\377\325\374\321>\16\16\316G\v\213\1}\264C\321\354\274<\361\233\344\314\202\2I"..., 4096) = 4096
-read(8, "o\275\226\201\201\301\24\243h\24\317\1\17U\220\2\333\373\344\203G\r\350J\3\32\275\335\17\214C?"..., 4096) = 4096
-read(8, "\355]X\10\313\3qc\2}K\310\235\35\236\266'W\322\341\334$.\322\332y.~w\33\306\26"..., 4096) = 4096
-read(8, "7.pngPK\1\2\24\0\24\0\10\10\10\0\271dhD\306\266\377\31\220.\0\0R2\0"..., 4096) = 1052
-read(8, "", 4096) = 0
-read(8, "", 4096) = 0
-read(6, "\270\3g\2\351\3\352\177\316\333\274\243\1\227\3o\334)*\376(\346\225\346\274\315\353\360\177m\350\203"..., 4096) = 4096
-read(6, "a\320M\275\344x(}\24K.\226C/\215p\374\22?\241\20\7\203\35\277\274u\373\266\320{4"..., 4096) = 4096
-read(6, "\364Je\345\33\201\301\314\275\344+\313\227\350\27t\34~\316?\27\366V\204\273\227\17\375Q`\330\244"..., 4096) = 4096
-read(6, "\26\316\5r\2632<]\34:w\356l}\304QH$\27\tU\27\302:\325U\225\17n\335P\36"..., 4096) = 4096
-read(6, "\245\254\305\334\"\341\376\227\317\333\37\22\222?p[\304\304\304\244\345B\374\305x\235\345\313\247\261\237s"..., 4096) = 4096
-read(6, "\227\16\222\2\350\350ke-\356]\241\242\243\224DG\251vdG\201 \10\302%\2654\332\327\312:"..., 4096) = 4096
-read(6, "~~\376\314\2313e[\376T,\322\3668w\356\\\247N\235\f\r\r\tc\fq\200i\246\350\326"..., 4096) = 4096
-read(6, ")Q{\301?\223\3736Kg\240>\257\326\231\372\3441,7\355\365\3537`\20\275\222U\16\367T"..., 4096) = 4096
-read(6, "f\326\223\307\260\335\177\324k\304\330\361\344J\272A\356\0iY\220\332\302\274w\f\244\226\33\36\"\210"..., 4096) = 4096
-read(6, "\355+7\234G\272\2<\220Z\30\02200\342#\303\26,3\254\251\372\331Wr\300\322\225\246\0205"..., 4096) = 4096
-read(6, "\266\251\273/\236=!KR\\\324\322\r\333\7\217\32\313\254\360s\301\247%\366\26d\200g\226\274L"..., 4096) = 4096
-read(6, "\23\35f\325u\247\324\t\0\305EE'\217\36\214\16\373\317L}\261\341\301\373\267\271\221\277Y\352."..., 4096) = 4096
-read(6, "\230\233\363\232\272\\\302\262i\223\236=\274O=\312<\7\213\363\311X'\374}\375}<Y7q\331"..., 4096) = 4096
-read(6, "\323\fM%\353\32\242\262\3615\0\0\360\27\302%\0\10\30\27\237\220:\227\351\247\245\3156\352Pc"..., 4096) = 4096
-read(6, "\306\326\265\226/\315UzV\365\234\234\317\377\271|\331\323\7QU\333\2326\213\265\220\364\242\240\273/"..., 4096) = 4096
-read(6, ">\351,,,L^5\326\317T\315\2773\363\356\375\260Y\355t\4%\355\360\341\310e\250\337\331\223"..., 4096) = 4096
-read(6, "\245\327\t\247\313\27\375M\226\256\"\205\302\325\227\322\316\375\222\243;w\276\276\331b\266JH\16 \253"..., 4096) = 4096
-read(6, "\222\226\362\356o\207}\302\302m\26X\256\33=iZ\273v\355\237>\210:w\362HB\354K?\367"..., 4096) = 4096
-read(6, "\321\262\231dC\267\2\0@\264\224\224U|\377Q\336\320\255h\202\204\2267\3304\373s\317v\341\257"..., 4096) = 4096
-read(6, "`\324\255\372\361 \352_\3\0\324\37\217+\371\230\352\177\372\243\250\335\307/)\361\266\327\276\235\2572"..., 4096) = 4096
-read(6, "s\363\332\3A\221\324\10P\2]5s\25\202x\343>\346\276ep\234\260\341\177\304\235:\233\205\271"..., 4096) = 4096
-read(6, "K\0h:\250H1c\336R\353\371\313\204\263\306\327Y/\311\343B3\3\256\257\346\345\262\337\377W"..., 4096) = 4096
-read(6, "\251\276\300\332\326O\1K{O2\262\16/\331 \235\16!?;\360A.UNe\210$ZB%"..., 4096) = 4096
-read(6, "\0\0\0\0\0\0\0\0\0\0\17\263\1\0Pictures/100000000"..., 4096) = 1288
-read(6, "", 4096) = 0
-read(6, "", 4096) = 0
-write(7, "\214\355\321\313\214\376\312\312nd\350\275{eee\1\27\2\355\306\214Ul;\260\233b\357\201\203\273"..., 4096) = 4096
-write(7, "\270\3g\2\351\3\352\177\316\333\274\243\1\227\3o\334)*\376(\346\225\346\274\315\353\360\177m\350\203"..., 4096) = 4096
-write(7, "a\320M\275\344x(}\24K.\226C/\215p\374\22?\241\20\7\203\35\277\274u\373\266\320{4"..., 4096) = 4096
-write(7, "\364Je\345\33\201\301\314\275\344+\313\227\350\27t\34~\316?\27\366V\204\273\227\17\375Q`\330\244"..., 4096) = 4096
-write(7, "\26\316\5r\2632<]\34:w\356l}\304QH$\27\tU\27\302:\325U\225\17n\335P\36"..., 4096) = 4096
-write(7, "\245\254\305\334\"\341\376\227\317\333\37\22\222?p[\304\304\304\244\345B\374\305x\235\345\313\247\261\237s"..., 4096) = 4096
-write(7, "\227\16\222\2\350\350ke-\356]\241\242\243\224DG\251vdG\201 \10\302%\2654\332\327\312:"..., 4096) = 4096
-write(7, "~~\376\314\2313e[\376T,\322\3668w\356\\\247N\235\f\r\r\tc\fq\200i\246\350\326"..., 4096) = 4096
-write(7, ")Q{\301?\223\3736Kg\240>\257\326\231\372\3441,7\355\365\3537`\20\275\222U\16\367T"..., 4096) = 4096
-write(7, "f\326\223\307\260\335\177\324k\304\330\361\344J\272A\356\0iY\220\332\302\274w\f\244\226\33\36\"\210"..., 4096) = 4096
-write(7, "\355+7\234G\272\2<\220Z\30\02200\342#\303\26,3\254\251\372\331Wr\300\322\225\246\0205"..., 4096) = 4096
-write(7, "\266\251\273/\236=!KR\\\324\322\r\333\7\217\32\313\254\360s\301\247%\366\26d\200g\226\274L"..., 4096) = 4096
-write(7, "\23\35f\325u\247\324\t\0\305EE'\217\36\214\16\373\317L}\261\341\301\373\267\271\221\277Y\352."..., 4096) = 4096
-write(7, "\230\233\363\232\272\\\302\262i\223\236=\274O=\312<\7\213\363\311X'\374}\375}<Y7q\331"..., 4096) = 4096
-write(7, "\323\fM%\353\32\242\262\3615\0\0\360\27\302%\0\10\30\27\237\220:\227\351\247\245\3156\352Pc"..., 4096) = 4096
-write(7, "\306\326\265\226/\315UzV\365\234\234\317\377\271|\331\323\7QU\333\2326\213\265\220\364\242\240\273/"..., 4096) = 4096
-write(7, ">\351,,,L^5\326\317T\315\2773\363\356\375\260Y\355t\4%\355\360\341\310e\250\337\331\223"..., 4096) = 4096
-write(7, "\245\327\t\247\313\27\375M\226\256\"\205\302\325\227\322\316\375\222\243;w\276\276\331b\266JH\16 \253"..., 4096) = 4096
-write(7, "\222\226\362\356o\207}\302\302m\26X\256\33=iZ\273v\355\237>\210:w\362HB\354K?\367"..., 4096) = 4096
-write(7, "\321\262\231dC\267\2\0@\264\224\224U|\377Q\336\320\255h\202\204\2267\3304\373s\317v\341\257"..., 4096) = 4096
-write(7, "`\324\255\372\361 \352_\3\0\324\37\217+\371\230\352\177\372\243\250\335\307/)\361\266\327\276\235\2572"..., 4096) = 4096
-write(7, "s\363\332\3A\221\324\10P\2]5s\25\202x\343>\346\276ep\234\260\341\177\304\235:\233\205\271"..., 4096) = 4096
-write(7, "K\0h:\250H1c\336R\353\371\313\204\263\306\327Y/\311\343B3\3\256\257\346\345\262\337\377W"..., 4096) = 4096
-write(7, "\251\276\300\332\326O\1K{O2\262\16/\331 \235\16!?;\360A.UNe\210$ZB%"..., 4096) = 4096
-write(9, "\277+7\17\371\5e\275\310\241\334\206\240\0\205\210\34\205\352\10\r\205\347N\200\205\321\30\0\202:\204"..., 4096) = 4096
-write(9, "\35\277\223\21hkk[\266l\331\363\317?oee\365\312+\257\344\347\347\313D\240c\16\352DC"..., 4096) = 4096
-write(9, "\205\32U\273\21.f\320u>Z\260p\377\201\203\255\255\255\337n\337\21\277p\261T*\365\237\370f"..., 4096) = 4096
-write(9, "d\232\307\320\242\202\32\275\32Y\271\205\220\303H;\0m\0\341: \247v\35>\371\373\32\3\217S"..., 4096) = 4096
-write(9, "\v\261%Tc8\215\323\21tw\232\205M\325\205\21\221\371\37\21y\327\256]|n\221mjkk"..., 4096) = 4096
-write(9, " \10\202 \10\371\240&C\20\4A\20\4!\37\324d\10\202 \10\202 \344#UZQ\213\223\306"..., 4096) = 4096
-write(9, "\230:{\36UM\343BLd\372\213\224\342\242\2\325\336\32\377\2318y\336\202%\304\2114\2\221\366"..., 4096) = 4096
-write(9, "\330Bg\27(y9\331\311\367n\335\276r\1\4\250\357\16\327\352\252*\3026\33A\20\4\21$b"..., 4096) = 4096
-write(9, "\260\277\224\264\333\331\10KS\375\350\260\240\351\32\363\225&N\341\225\267\10-2\244A d\205\371\271"..., 4096) = 4096
-write(9, "\343\270\235\365\311\360X\362\31\3478\34\354N\356\266V\377\273\177g\343\236?\377\363\373?W{g-"..., 4096) = 4096
-write(9, "\241j\267\242\312\213\v\v\311\250\274q\351\334\237?\177R\345w\257_&K\372\223G\314\17\220\310P"..., 4096) = 4096
-write(9, "\264g\231i\317.\236\213\361<\34\306\374\236%.<\304\327sS\351\217\37\324\335W\31\351d\271\236"..., 4096) = 4096
-write(9, "`<JZZ\242\3374\n\f[7`\240'\210\25d\217\372\21\211_\340\2\0\360\317\267\257_\316"..., 4096) = 4096
-write(9, "-vG\230\345\332#\307\234\275\34u\353r\310\375[\327\263>e|\371\234UYY\321EAIN"..., 4096) = 4096
-write(9, "\255g\37\241\252a\325\330\257\t\306*\361M\325\0\302\343\246\316d+\37?u&\211nO\356\336\256"..., 4096) = 4096
-write(9, "\267\356!\371i\371\246?\355\266\254\371k\327\226\243~\241\324\230S\274\336:\265\25^t\225\354\254\217"..., 4096) = 4096
-write(9, "\214P\365\230\300z\363\26M\236eH\357\317\310X\5\235u\377\226\373u\356\342\25\346\253\326S%d"..., 4096) = 4096
-write(9, "\257S\236G\35~\2338EA\271k\2756**Z\365FZT\370=,\340\334\322u[\307O\233"..., 4096) = 4096
-write(9, "6\10\227\0\0\0\0@\233f\371Ee\25\r\335\10q#%\301h\323BJ\10+\372R\\\206w"..., 4096) = 4096
-write(9, "r\232\355o\177\307\236\177\371\354\211\247\313v\207-{Y_\212\16\t\270s\355\312\3737\331\16[\367"..., 4096) = 4096
-write(9, "\324\357\330\360\361\223\250\221eD\220\3603%\245\270\250\320m\363\332\212\362\362%\353\266\222\10\265`\365"..., 4096) = 4096
-write(9, "m\247\230['\304\305\204\371\35{\226\374h\357\206\225\307\335\367\370F_\23D\313\2330\341w\3\6"..., 4096) = 4096
-write(9, "\262\342\35u\0344\266\3444\276\313\203\0f\7\307\241d\255\203h\37\5\25\257:\253\237\2U\\\322"..., 4096) = 4096
-read(6, "", 4096) = 0
-close(8) = 0
-write(7, "\0\0\0\0\0\0\0\0\0\0\17\263\1\0Pictures/100000000"..., 1288) = 1288
-close(7) = 0
-close(6) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\240\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741825, len=1}) = 0
-lseek(3, 125952, SEEK_SET) = 125952
-read(3, "\n\0\0\0\20\0\303\0\1\307\1\373\2.\2b\2\226\1\223\0\367\0\303\2\312\2\375\0031\1+"..., 1024) = 1024
-rename("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/tmp/svn-VYI0r2", "/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/pristine/89/89fca0c3d11ef3e57ccef84637945108c9785928.svn-base") = 0
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/pristine/89/89fca0c3d11ef3e57ccef84637945108c9785928.svn-base", {st_mode=S_IFREG|0664, st_size=197896, ...}) = 0
-lseek(3, 162816, SEEK_SET) = 162816
-read(3, "\r\0\0\0\3\2\342\0\3\241\3B\2\342\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 54272, SEEK_SET) = 54272
-read(3, "\2\1\370\0\21\0L\3\0\0\0\215\2S\0\253\0|\1\311\1\231\3p\1j\3\320\0\333\3A"..., 1024) = 1024
-lseek(3, 102400, SEEK_SET) = 102400
-read(3, "\n\0\0\0\23\0\302\0\0\302\0\356\1\32\1E\1q\1\235\1\311\1\365\2 \2L\2x\2\244"..., 1024) = 1024
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-open("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", O_RDWR|O_CREAT|O_CLOEXEC, 0644) = 6
-fstat(6, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
-geteuid() = 530
-fstat(6, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
-lseek(6, 0, SEEK_SET) = 0
-write(6, "\331\325\5\371 \241c\327\377\377\377\377\0265o\343\0\0\0\241\0\0\2\0\0\0\4\0\0\0\0\0"..., 512) = 512
-lseek(6, 512, SEEK_SET) = 512
-write(6, "\0\0\0e", 4) = 4
-lseek(6, 516, SEEK_SET) = 516
-write(6, "\n\0\0\0\23\0\302\0\0\302\0\356\1\32\1E\1q\1\235\1\311\1\365\2 \2L\2x\2\244"..., 1024) = 1024
-lseek(6, 1540, SEEK_SET) = 1540
-write(6, "\0265p\344", 4) = 4
-lseek(6, 1544, SEEK_SET) = 1544
-write(6, "\0\0\0|", 4) = 4
-lseek(6, 1548, SEEK_SET) = 1548
-write(6, "\n\0\0\0\20\0\303\0\1\307\1\373\2.\2b\2\226\1\223\0\367\0\303\2\312\2\375\0031\1+"..., 1024) = 1024
-lseek(6, 2572, SEEK_SET) = 2572
-write(6, "\0265p\353", 4) = 4
-lseek(6, 2576, SEEK_SET) = 2576
-write(6, "\0\0\0\240", 4) = 4
-lseek(6, 2580, SEEK_SET) = 2580
-write(6, "\r\0\0\0\3\2\342\0\3\241\3B\2\342\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(6, 3604, SEEK_SET) = 3604
-write(6, "\0265p\27", 4) = 4
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-lseek(6, 3608, SEEK_SET) = 3608
-write(6, "\0\0\0\1", 4) = 4
-lseek(6, 3612, SEEK_SET) = 3612
-write(6, "SQLite format 3\0\4\0\1\1\0@ \0\0\5\240\0\0\0\241"..., 1024) = 1024
-lseek(6, 4636, SEEK_SET) = 4636
-write(6, "\0265o\343", 4) = 4
-lseek(3, 0, SEEK_SET) = 0
-write(3, "SQLite format 3\0\4\0\1\1\0@ \0\0\5\241\0\0\0\241"..., 1024) = 1024
-lseek(3, 102400, SEEK_SET) = 102400
-write(3, "\n\0\0\0\24\0\226\0\0\302\0\356\1\32\1E\1q\1\235\1\311\1\365\2 \2L\0\226\2x"..., 1024) = 1024
-lseek(3, 125952, SEEK_SET) = 125952
-write(3, "\n\0\0\0\21\0\217\0\0\217\1\307\1\373\2.\2b\2\226\1\223\0\367\0\303\2\312\2\375\0031"..., 1024) = 1024
-lseek(3, 162816, SEEK_SET) = 162816
-write(3, "\r\0\0\0\4\2\202\0\3\241\3B\2\342\2\202\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-close(6) = 0
-unlink("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal") = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=2}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN|EPOLLOUT, {u32=3303153608, u64=140397194125256}}) = 0
-epoll_wait(4, {{EPOLLOUT, {u32=3303153608, u64=140397194125256}}}, 16, 500) = 1
-write(9, "\0\0\0\0\0\0005#\2\0Pictures/1000000000000"..., 1011) = 1011
-lseek(9, 0, SEEK_SET) = 0
-stat("/tmp/svn-4fJ8w7", {st_mode=S_IFREG|0600, st_size=197619, ...}) = 0
-mmap(NULL, 197619, PROT_READ, MAP_SHARED, 9, 0) = 0x7fb0c4143000
-writev(5, [{"PUT /svn/aprx/!svn/wrk/9ce1e70b-"..., 96}, {"Host", 4}, {": ", 2}, {"repo.ham.fi", 11}, {"\r\n", 2}, {"Authorization", 13}, {": ", 2}, {"Basic b2gybXFrOnJpZnJhZjIy", 26}, {"\r\n", 2}, {"User-Agent", 10}, {": ", 2}, {"SVN/1.8.8 (x86_64-redhat-linux-g"..., 46}, {"\r\n", 2}, {"Content-Type", 12}, {": ", 2}, {"application/vnd.svn-svndiff", 27}, {"\r\n", 2}, {"Accept-Encoding", 15}, {": ", 2}, {"gzip", 4}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"... [...]
-writev(5, [{"\206\7\3553V\314\234\370\370\336\235\372r\362%\223%\243W\361W\311\237>d\320\355\317}\373WU"..., 128757}, {"\r\n", 2}, {"0\r\n\r\n", 5}], 3) = -1 EAGAIN (Resource temporarily unavailable)
-epoll_wait(4, {{EPOLLOUT, {u32=3303153608, u64=140397194125256}}}, 16, 500) = 1
-writev(5, [{"\206\7\3553V\314\234\370\370\336\235\372r\362%\223%\243W\361W\311\237>d\320\355\317}\373WU"..., 128757}, {"\r\n", 2}, {"0\r\n\r\n", 5}], 3) = 128764
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN, {u32=3303153656, u64=140397194125304}}) = 0
-epoll_wait(4, {}, 16, 500) = 0
-epoll_wait(4, {{EPOLLIN, {u32=3303153656, u64=140397194125304}}}, 16, 500) = 1
-read(5, "HTTP/1.1 204 No Content\r\nDate: M"..., 8000) = 106
-munmap(0x7fb0c4143000, 197619) = 0
-close(9) = 0
-write(1, ".", 1) = 1
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual.pdf", {st_mode=S_IFREG|0664, st_size=438348, ...}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\241\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-open("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual.pdf", O_RDONLY|O_CLOEXEC) = 6
-open("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/tmp/svn-2LgtUH", O_RDWR|O_CREAT|O_EXCL, 0600) = 7
-fcntl(7, F_GETFD) = 0
-fcntl(7, F_SETFD, FD_CLOEXEC) = 0
-fstat(7, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
-chmod("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/tmp/svn-2LgtUH", 0664) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\241\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\241\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-open("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/pristine/80/801e13de8f6f628e0af791392a3cdbe991e46277.svn-base", O_RDONLY|O_CLOEXEC) = 8
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\241\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\241\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-open("/tmp/svn-S2P1pi", O_RDWR|O_CREAT|O_EXCL, 0600) = 9
-fcntl(9, F_GETFD) = 0
-fcntl(9, F_SETFD, FD_CLOEXEC) = 0
-read(8, "%PDF-1.4\n%\303\244\303\274\303\266\303\237\n2 0 obj\n<</Le"..., 4096) = 4096
-read(8, "0\223\34\366\25\351NH\7\365\275?\371O(o\231\375\305PiNo\300\\[qBR *\34"..., 4096) = 4096
-read(8, "A\222S\1M&\325\32\21\240\33!\223\3115\23\22\4o\2624>\203\20\253\311\371\0004\305\320\31"..., 4096) = 4096
-read(8, "BB\345\326U\33wX\266o(\376\\9vPf\367^\371o\257+\252>S\361\305W5\327\276"..., 4096) = 4096
-read(8, "\273\310\226\224\27\26\331R-#\357/\274<\355xy\266\264l9z\353'\345\250\263\331\271\223\32\232"..., 4096) = 4096
-read(8, "\31\335z\312\0263\266i\234\fu\345'g\312\17\325\324\315\245\316\320]\277\253|\330\263\317I\177Y"..., 4096) = 4096
-read(8, "\266\37<\361\366\226\242'G\215\r\16\t\221\233RZ\267\251\274|\307\343\201\320\304\32>:\227l\t"..., 4096) = 4096
-read(8, "\277\277\243\304E\217\f\331\22\0\0\370+W\37\337rg\325\351Q\23\246FEGKf\213\210\214\32"..., 4096) = 4096
-read(8, "O]\3\322\206S\n\215Y\36\2579\23\274\245q\344\243\336r\375\266\342\266Sf\355\233B\312\362\202"..., 4096) = 4096
-read(8, "\351ZC\313\217\24\27\36|G\337\fe\330\272\357h\243u\26G\372\177|\217\4Jw\241X\247\274"..., 4096) = 4096
-read(8, "\22r(xK\0\0\0\n\201\267\204\340-!\207\202\267\4\0\0\240\20xK\10\336\22r(xK"..., 4096) = 4096
-read(8, "\265\214\10$\256\305 U\305\324R\263\4>b\325\24\"6\346\230\222\324\2\373\345\303\327\224!\21\5"..., 4096) = 4096
-read(8, "\370\211\354\316\212\212\211\315\330\224\235_Y_v\371n\365\315\207\205g\256c\16\360\336\324Y\255\221\334"..., 4096) = 4096
-read(8, "^i\356\331\246\277Z\221\325X\256\244\225\306X\t=\311`D& \fLD`:\2&\256\245\273"..., 4096) = 4096
-read(8, "@\17XK\210d\234h\220\214qH\260\26\222\201\310\222\10Q1m\304\223\346\326\222\343^\336\336\21"..., 4096) = 4096
-read(8, "p0\224\10\26|\33>*\235,-Ru\343+R2u\301R\207(K#\271(=!\271\217\273"..., 4096) = 4096
-read(8, "-o\225/I\324M\364\345PJ\225o\202YJ\"Y\342(y?\0342\340\374\374\265\356x\203'"..., 4096) = 4096
-read(8, "\245\342\345;(\306\365\305\263{\256\353q\t\3725\343eZ&J\246\207P\223\205>5\213\246\1~"..., 4096) = 4096
-read(8, "\202\202\203\333'\245d<?2{\326\202\375\225\347\34\365wc\277\270=\2417\306\353L\17e\240}"..., 4096) = 4096
-read(8, "ELXx8\255[fv.\367\2133\r\352\312s\323\223*DP\371`z*\5\246\247\357\226w"..., 4096) = 4096
-read(8, "\347\32-0=\16\305K4.\241\25;9\322Y~\325'\333\345\277\337\256\310\371\275\357\340a\324\262"..., 4096) = 4096
-read(8, "^\267Q\357\236x4ta\f\270A\10]F\22B\27\27!t\231V\6\200.\341e\365\235\357\17"..., 4096) = 4096
-read(8, "\21\22\232@\227`J\350K\253+]*S\fK[\256\275\373\203\305~QB6l\300\331\300\204."..., 4096) = 4096
-read(8, "]i\332\\J\320m\350\274\300\f\360\241\264\r\t\303C\227\336a -\240>u\262\233c\200-\204"..., 4096) = 4096
-read(8, "\17u?\37\354\210[\213\5K\200[\2\0\0\0\300V\250\352\226G\217\36\225\251\224\2\226\271\345\371"..., 4096) = 4096
-read(6, "%PDF-1.4\n%\303\244\303\274\303\266\303\237\n2 0 obj\n<</Le"..., 4096) = 4096
-read(6, "\344\226\5r\10\344]\362\367#\225VK%\331~\231\261\372y\314@\341\356\351E\313W\245\252\222\324"..., 4096) = 4096
-read(6, "\334\267l\331\270\361F\f-\345\233ap\254\2279\222\375H\36\322Y u\34\337\254<\316\212ep"..., 4096) = 4096
-read(6, "=~\307\375\262\310\226\36)\262e\300\26\331R\203!\352\376\"[R^XdK\177*\262\245G\212"..., 4096) = 4096
-read(6, "\215\221\214\241\351\246\374c\312\255^r\206M\265\34{m\377\341\207\37<\362\217c\375\\\30L}R"..., 4096) = 4096
-read(6, "\361\3253X~\220-\345]\325\366\203'\236\177q\201\262C\204<b\352M\362O\321\275\357\300\240\372"..., 4096) = 4096
-read(6, "\34\233\375%\277\311\325\232\353?h\246\252\272\362\255\301ly\270\356\236fZe7\37\231\263\\\216\210"..., 4096) = 4096
-read(6, "\314B\266\4\0\0\200Y\310\226\0\0\0000\v\331\22\0\0\0f![\2\0\0\300,dK\0\0"..., 4096) = 4096
-read(6, ";\246\247';\342\216\342B\tn\n\336\222\303;G\23\377\226\27zK\231\337D\4\334\377\340j\225"..., 4096) = 4096
-read(6, "W^\32;qJ\367^\211!\241\226\204\244~\354f\221d\2014F'\17L\243a:\274C\304\340"..., 4096) = 4096
-read(6, "Q$<\350\245/\264\20E\273\240b\216\221\31/\275\370\361\205.E\266\263\304\27\376\20I\244\265B"..., 4096) = 4096
-read(6, "\255\2640\355\322\317\277\264/KW\337z\324\321\317\237\33\6\272w\245Z0\246\245\20\256\317\264\2a"..., 4096) = 4096
-read(6, "aZ\262MN\374R\263\302z-\312'L\231aj\231\300|\276u\327\341\332K\230iW\337|H"..., 4096) = 4096
-read(6, "\310\v\221\314\223\204Hf\212\20\311l+\17F2P\306\354EPa\372\342\34\231&\31s\26\v&"..., 4096) = 4096
-read(6, "\213\342\213 \331\337\376\3667\375F\2372\270\3\354\327_\177M\16\316z \31L\240dE\21/o"..., 4096) = 4096
-read(6, "D2\333\312\236HFTTs)}\312\254\300\240\347\251\353\374\3\2\3233g\26\237\276\302=\253\6"..., 4096) = 4096
-read(6, "\330\f\327\311~\326\25:\"\224w=S\263\5n1\236\213\"\353,\376\217W\27\0254y\217\352?"..., 4096) = 4096
-read(6, "\262m\227Rw\357\361\313\23\247\312L\365\312\364\327\344M\317\3259\300\364\0\0\0\0`L\0241\275"..., 4096) = 4096
-read(6, "\v\275\246\310\2344\255mb\22\271A\277!\303\227\257^\317-\264\344\354\2151\223s\273\244\367\244E"..., 4096) = 4096
-read(6, "\305\27\307\33\356\221E\364\31\364\34\275\0a\37\305.\\\361W\366\215D\r\352\312\303\nq\343\231A"..., 4096) = 4096
-read(6, "\355\211I\2063\367\244H\223\31\244'\33/]8\365\203\355\251\213\327f8\233\236.\203\357i\2147"..., 4096) = 4096
-read(6, "\360\227\24\226\7\275\265\352}x\267\377\213#(\377\312\277\177B*\216\34;\376\243\375\205\324\35\274J"..., 4096) = 4096
-read(6, "\241\v\305\226\7AW\355\335\37,\366_\226e\307^p6\3503\332;\202\256\262\353-$\3638e"..., 4096) = 4096
-read(6, "h 57 0 R\n/Filter/FlateDecode/Col"..., 4096) = 4096
-read(6, "aC18h\\\307-Wn\330\254\354\233\242\376\341\217A!\241\16\372vk\202[\32`\256[\322"..., 4096) = 4096
-write(7, "%PDF-1.4\n%\303\244\303\274\303\266\303\237\n2 0 obj\n<</Le"..., 4096) = 4096
-write(7, "\344\226\5r\10\344]\362\367#\225VK%\331~\231\261\372y\314@\341\356\351E\313W\245\252\222\324"..., 4096) = 4096
-write(7, "\334\267l\331\270\361F\f-\345\233ap\254\2279\222\375H\36\322Y u\34\337\254<\316\212ep"..., 4096) = 4096
-write(7, "=~\307\375\262\310\226\36)\262e\300\26\331R\203!\352\376\"[R^XdK\177*\262\245G\212"..., 4096) = 4096
-write(7, "\215\221\214\241\351\246\374c\312\255^r\206M\265\34{m\377\341\207\37<\362\217c\375\\\30L}R"..., 4096) = 4096
-write(7, "\361\3253X~\220-\345]\325\366\203'\236\177q\201\262C\204<b\352M\362O\321\275\357\300\240\372"..., 4096) = 4096
-write(7, "\34\233\375%\277\311\325\232\353?h\246\252\272\362\255\301ly\270\356\236fZe7\37\231\263\\\216\210"..., 4096) = 4096
-write(7, "\314B\266\4\0\0\200Y\310\226\0\0\0000\v\331\22\0\0\0f![\2\0\0\300,dK\0\0"..., 4096) = 4096
-write(7, ";\246\247';\342\216\342B\tn\n\336\222\303;G\23\377\226\27zK\231\337D\4\334\377\340j\225"..., 4096) = 4096
-write(7, "W^\32;qJ\367^\211!\241\226\204\244~\354f\221d\2014F'\17L\243a:\274C\304\340"..., 4096) = 4096
-write(7, "Q$<\350\245/\264\20E\273\240b\216\221\31/\275\370\361\205.E\266\263\304\27\376\20I\244\265B"..., 4096) = 4096
-write(7, "\255\2640\355\322\317\277\264/KW\337z\324\321\317\237\33\6\272w\245Z0\246\245\20\256\317\264\2a"..., 4096) = 4096
-write(7, "aZ\262MN\374R\263\302z-\312'L\231aj\231\300|\276u\327\341\332K\230iW\337|H"..., 4096) = 4096
-write(7, "\310\v\221\314\223\204Hf\212\20\311l+\17F2P\306\354EPa\372\342\34\231&\31s\26\v&"..., 4096) = 4096
-write(7, "\213\342\213 \331\337\376\3667\375F\2372\270\3\354\327_\177M\16\316z \31L\240dE\21/o"..., 4096) = 4096
-write(7, "D2\333\312\236HFTTs)}\312\254\300\240\347\251\353\374\3\2\3233g\26\237\276\302=\253\6"..., 4096) = 4096
-write(7, "\330\f\327\311~\326\25:\"\224w=S\263\5n1\236\213\"\353,\376\217W\27\0254y\217\352?"..., 4096) = 4096
-write(7, "\262m\227Rw\357\361\313\23\247\312L\365\312\364\327\344M\317\3259\300\364\0\0\0\0`L\0241\275"..., 4096) = 4096
-write(7, "\v\275\246\310\2344\255mb\22\271A\277!\303\227\257^\317-\264\344\354\2151\223s\273\244\367\244E"..., 4096) = 4096
-write(7, "\305\27\307\33\356\221E\364\31\364\34\275\0a\37\305.\\\361W\366\215D\r\352\312\303\nq\343\231A"..., 4096) = 4096
-write(7, "\355\211I\2063\367\244H\223\31\244'\33/]8\365\203\355\251\213\327f8\233\236.\203\357i\2147"..., 4096) = 4096
-write(7, "\360\227\24\226\7\275\265\352}x\267\377\213#(\377\312\277\177B*\216\34;\376\243\375\205\324\35\274J"..., 4096) = 4096
-write(7, "\241\v\305\226\7AW\355\335\37,\366_\226e\307^p6\3503\332;\202\256\262\353-$\3638e"..., 4096) = 4096
-write(7, "h 57 0 R\n/Filter/FlateDecode/Col"..., 4096) = 4096
-write(9, "SVN\0\0\206\240\0\206\240\0H\201\3418\0I\0\200\312\n\0\201\362`\321\0\200\236}\0\253"..., 4096) = 4096
-write(9, "\330\321\336\335`\f\343\245\17\271=\30\310!\344\226\5r\10\344]\362\367#\225VK%\331~\231\261"..., 4096) = 4096
-write(9, "\205j\324\250\234\244Ug\344\240PR-4\334\267l\331\270\361F\f-\345\233ap\254\2279\222\375"..., 4096) = 4096
-write(9, "\253\260\10\354\344%\261\220$\0014#\250\321\0\2157\32m5\242\334\234\245q\26;m\177\"\0r"..., 4096) = 4096
-write(9, "u\302\214k<7f\206=,\247f(\320\354\251\263\21c;\233\325\315\233\347\216r\1774\246\330\17"..., 4096) = 4096
-write(9, "\37\31S\246cp\324\36yN\325\2315n\244\344H\250%\242}\352\1\324\377\345\251=l\334W\235"..., 4096) = 4096
-write(9, "W\357\3705\\\266\200\225\267\3[\207\2723h\2\3068\277\347\377\0\3{\6\264\213\231\201\375\2023"..., 4096) = 4096
-read(8, "\267\34?i\332\276\323\225F\347*\330}X\250\366\341\336?\330\374Y\230\212s\270%7\n\207DM"..., 4096) = 4096
-read(8, "\270\364\312\275I\2632c\23\222h\233C\302\302\373'\17]U\260\215\33:I\251h\351\226\302\17\342"..., 4096) = 4096
-read(8, "\240\37N\334\267c\347\332[\340\226\34f\271\245\30\17\17\217\311\351s\313\232[\r\353[\260_\354\307"..., 4096) = 4096
-read(8, "\2520\\\232\251\376A\\^y\353)\375\3373\272w\303\243\27\251\31YA!\241\264L\241\346\316\23"..., 4096) = 4096
-read(8, "<\261\200B\35\r\2616\302I\321\232cF^\220\22%\371\353\270$I\0\376\305$\254j&/`"..., 4096) = 4096
-read(8, "G\21\340r)Y2\207U\21_v,\255\307\362\254\351\307Ku\237yd\\6\207{1Y\272#"..., 4096) = 4096
-read(8, "\272H\325\337^\243\313\"\365\202Z\271\357Vo/\265\241p\r\224\32\206\263\213\353s`\265\tX\326"..., 4096) = 4096
-read(8, "\343\303-\216DC\"]\271\261\25T\4\23\250\341\30\276\222 \205\355,\6\251a$h\4\225;u"..., 4096) = 4096
-read(8, "S;q4\307\221c\227\243^\272\200\205gB\326G\n\262r\234\351NG\222\242\357H+\227\240T"..., 4096) = 4096
-read(8, "5\277\353\225\264h\216\311-5\212U\n1\226E\1\2232\277j\v\204$\320\253\4\204!Of\221"..., 4096) = 4096
-read(8, "p\0T\331\307\271\325\3715\31\247\323\353\31x]h\1\303\215\0007`w\301 B\351\361\215\366\212"..., 4096) = 4096
-read(8, "|\r\334\222\6\314\2?\274\315\"\264\224o\6\307\225\335\332p\315cQ<\224\21\20\225\24\327\22\232"..., 4096) = 4096
-read(8, ":\202\262ERV\272~\2\362\241\310\306L\324\312\222gf\242\1\26o\234\252\02169\236\355O\301"..., 4096) = 4096
-read(8, "$\374Y\334\333\225\371 $\17N\336(\242\37E\357\376\220]\\\336\262\236\314-\254\31`\226\332\t"..., 4096) = 4096
-read(8, "\341S\t\31/K\265ms\261N{\20\215\201\16f\331r\310sk\213T\325n&\224m\224\305+"..., 4096) = 4096
-read(8, "\275\17\321T/\t\320\373\275\35\322\373:g\262\306w\220\265\245\367\25~\244\352\251\32\250\37\227A\347"..., 4096) = 4096
-read(8, "n\332vrj3?\v6qM\274\24\4f?(\324o\301M\351@\334\213\343&:\276\242\315\245"..., 4096) = 4096
-read(8, "\324\230\330I\233\315\256\357\244M\244\361mw\216\264\\H\336\3033\313A\244R\211Xb\266\21\3678"..., 4096) = 4096
-read(8, "u\231\211*\3671\322\361\261\215\200\344z<CI\243f\361\305\2S\337\260\26z\326\366\235\331\n\32"..., 4096) = 4096
-read(8, " obj\n<</Length 2233 0 R/Filter/F"..., 4096) = 4096
-read(8, "\260\3648\222\203\33\246fw\370\n\311\323\r\346@\324C\236\270\10\275\02227\345\360\217\vy\n\213"..., 4096) = 4096
-read(8, "y%?\310\20\334\265\252'T\233\333\203\331C\303\355\201\212\351[\326\4\364@\33\253\20&\373^\227"..., 4096) = 4096
-read(8, "Q\311\242\302J\32\243v\321\367\250~\274\347Bh\372\210\340\361U\320\206\235\245P>\264\252\37\253\7"..., 4096) = 4096
-read(8, "\302g\vrTu9bh0\v9\252\23\362\303\322\vG\314e\264\4D1\212\205N\2\2\221\302"..., 4096) = 4096
-read(8, "\227+\323\204[\374\2563\276\t\353\5:X\320\201ut\0F\25U\301\206\211\337\205\365\255\337B)"..., 4096) = 4096
-read(6, "\337U\270N\274`\367aa\277|\270\367\17\26/\231\225\10?R\267[\323\262\246b\264A\32]\313"..., 4096) = 4096
-read(6, "\242\34*\241\00347cVn>\225/\310}\227\23375#\313\324\306\323v\322\326Ft\375\3070"..., 4096) = 4096
-read(6, "\272~QM3\0335}\373\321\22\v6{\317\251\n\2327\274sW\213\267\312p\tV\6n\311\241"..., 4096) = 4096
-read(6, "\346F%q\375\7p#S5\265\367\233\370\2425\353\271Y6\356< T;Y\177c\374\244i="..., 4096) = 4096
-read(6, "c\34\205\2234\276J\37e\230\376\4\316)\2\370\374\"\257\257o\213\277Z\227\36=\223xl\322\352"..., 4096) = 4096
-read(6, "\204\263\262\240\266\230\22\327\234@\1\262\0\202\365\33\267\326\3!l\5\371\n\236\16\200\2248\24\334\263"..., 4096) = 4096
-read(6, "\365y\1\201\357^\377a*\f\254C\36PU\3407\241TBGZ\305\322\250A\n\3l\325=\\"..., 4096) = 4096
-read(6, "\1T>\220\360\304\4Fh\372\363\250X\336G=*R\327=\253\217\v\307KA\315e\10\334\274O"..., 4096) = 4096
-read(6, ":\351\303\257_\377=\250\203J\237\374\352O\346\2608}Z\16\277\374\370\365\227\337\35\376\363\245N\253"..., 4096) = 4096
-read(6, "9\346\tA>/y\262w\210\310\321\336J\341\247\257\254\374\240\355 \3\310\7\235\341\233}1\200,"..., 4096) = 4096
-read(6, "R\371*\333\217L\377f?M\365\25\246\321\266\362n\270s\321q\342x\317P\353QB\21%\30\266"..., 4096) = 4096
-read(6, "ter/FlateDecode>>\nstream\nx\234\255ZM\2173"..., 4096) = 4096
-read(6, "\353\t\231\220\376\2\10D\217\337\206\300\16\215\37\f\1\303\361\213\20\330\221\21\221\323\214\357q\22%\303"..., 4096) = 4096
-read(6, "\327\364'6\274\326\322\347\276!\212\217=\277u\276\357\231:\257\3452G\323Hb\203\324\24+\241\256"..., 4096) = 4096
-read(6, "\36GT\315SA\341\362\320<\215\3356\327r\2\303\300\230\207\f\322\4i\306fu\250\1\n\tz"..., 4096) = 4096
-read(6, "+\315\222\2715Z\177\250\2\27\323Ac\243\202!\5\325\347\356\221bcS}*\207\25\337\263\266\323"..., 4096) = 4096
-read(6, "Fz\356\202\254s\27\331n&\24\317\331\323\212C\n\215\313\350\25&9\4\20/\310s\302\342v\265"..., 4096) = 4096
-read(6, "\260\333\3714MZ\273]x\303\361\10\20\2029\0341\344\216\303-\333\312I\265\33\265%\252\315y\31"..., 4096) = 4096
-read(6, "\351\224\255\306\252\234\255\353Y\204~Q5t\277\177d\206\315)hc\0262\301\37\6\262\r\205\367\341"..., 4096) = 4096
-read(6, "\243\374&\245\255\342\342d\323\353\225\30\335\327\251Z\311\36\264\5q6\321\352'\212\203\23\256\224\233\344"..., 4096) = 4096
-read(6, "\26\315\333?e\21\33\4\340\323\177\"^*\334\227\351?^\221\350\343\nendstream"..., 4096) = 4096
-read(6, "Filter/FlateDecode>>\nstream\nx\234\255Y"..., 4096) = 4096
-read(6, "\277\276|Z\251\326\312\36\355\206j\346$3)\225\33 \252\2e\">\333\23\231F\223-\235{J"..., 4096) = 4096
-read(6, "lter/FlateDecode>>\nstream\nx\234\255X\313\252"..., 4096) = 4096
-read(6, "5\nendobj\n\n158 0 obj\n<</Length 15"..., 4096) = 4096
-write(7, "aC18h\\\307-Wn\330\254\354\233\242\376\341\217A!\241\16\372vk\202[\32`\256[\322"..., 4096) = 4096
-write(7, "\337U\270N\274`\367aa\277|\270\367\17\26/\231\225\10?R\267[\323\262\246b\264A\32]\313"..., 4096) = 4096
-write(7, "\242\34*\241\00347cVn>\225/\310}\227\23375#\313\324\306\323v\322\326Ft\375\3070"..., 4096) = 4096
-write(7, "\272~QM3\0335}\373\321\22\v6{\317\251\n\2327\274sW\213\267\312p\tV\6n\311\241"..., 4096) = 4096
-write(7, "\346F%q\375\7p#S5\265\367\233\370\2425\353\271Y6\356< T;Y\177c\374\244i="..., 4096) = 4096
-write(7, "c\34\205\2234\276J\37e\230\376\4\316)\2\370\374\"\257\257o\213\277Z\227\36=\223xl\322\352"..., 4096) = 4096
-write(7, "\204\263\262\240\266\230\22\327\234@\1\262\0\202\365\33\267\326\3!l\5\371\n\236\16\200\2248\24\334\263"..., 4096) = 4096
-write(7, "\365y\1\201\357^\377a*\f\254C\36PU\3407\241TBGZ\305\322\250A\n\3l\325=\\"..., 4096) = 4096
-write(7, "\1T>\220\360\304\4Fh\372\363\250X\336G=*R\327=\253\217\v\307KA\315e\10\334\274O"..., 4096) = 4096
-write(7, ":\351\303\257_\377=\250\203J\237\374\352O\346\2608}Z\16\277\374\370\365\227\337\35\376\363\245N\253"..., 4096) = 4096
-write(7, "9\346\tA>/y\262w\210\310\321\336J\341\247\257\254\374\240\355 \3\310\7\235\341\233}1\200,"..., 4096) = 4096
-write(7, "R\371*\333\217L\377f?M\365\25\246\321\266\362n\270s\321q\342x\317P\353QB\21%\30\266"..., 4096) = 4096
-write(7, "ter/FlateDecode>>\nstream\nx\234\255ZM\2173"..., 4096) = 4096
-write(7, "\353\t\231\220\376\2\10D\217\337\206\300\16\215\37\f\1\303\361\213\20\330\221\21\221\323\214\357q\22%\303"..., 4096) = 4096
-write(7, "\327\364'6\274\326\322\347\276!\212\217=\277u\276\357\231:\257\3452G\323Hb\203\324\24+\241\256"..., 4096) = 4096
-write(7, "\36GT\315SA\341\362\320<\215\3356\327r\2\303\300\230\207\f\322\4i\306fu\250\1\n\tz"..., 4096) = 4096
-write(7, "+\315\222\2715Z\177\250\2\27\323Ac\243\202!\5\325\347\356\221bcS}*\207\25\337\263\266\323"..., 4096) = 4096
-write(7, "Fz\356\202\254s\27\331n&\24\317\331\323\212C\n\215\313\350\25&9\4\20/\310s\302\342v\265"..., 4096) = 4096
-write(7, "\260\333\3714MZ\273]x\303\361\10\20\2029\0341\344\216\303-\333\312I\265\33\265%\252\315y\31"..., 4096) = 4096
-write(7, "\351\224\255\306\252\234\255\353Y\204~Q5t\277\177d\206\315)hc\0262\301\37\6\262\r\205\367\341"..., 4096) = 4096
-write(7, "\243\374&\245\255\342\342d\323\353\225\30\335\327\251Z\311\36\264\5q6\321\352'\212\203\23\256\224\233\344"..., 4096) = 4096
-write(7, "\26\315\333?e\21\33\4\340\323\177\"^*\334\227\351?^\221\350\343\nendstream"..., 4096) = 4096
-write(7, "Filter/FlateDecode>>\nstream\nx\234\255Y"..., 4096) = 4096
-write(7, "\277\276|Z\251\326\312\36\355\206j\346$3)\225\33 \252\2e\">\333\23\231F\223-\235{J"..., 4096) = 4096
-write(7, "lter/FlateDecode>>\nstream\nx\234\255X\313\252"..., 4096) = 4096
-write(9, "\336\370\244A\2127B\r\372\0371\277\372\325\257V\256\\\231\233\233\253\331\32\t\362\207\213\327Z\24\274"..., 4096) = 4096
-write(9, "%\vB\253\363\324\325`\300Q\3\215;\21m\244\365\203\210\346\226e\3\23\22\201,\347_\333\262C"..., 4096) = 4096
-write(9, "&\27\23\273\v\2\335\5\223\36Lg\25\3\301\357\347\35\\Nc\5\207\\\316\17~T9B\v;"..., 4096) = 4096
-write(9, "]\333kU\376`\227e\261\313\222\26\261u\2\36\232z\255\241\225\24\254\36\253$\325=N\353j\275"..., 4096) = 4096
-write(9, "\35i\37\254\307\264&\214\337\303\2\177\234s\242d\207\305\325^\366'\305\325\314\201\376\266lw\202\241"..., 4096) = 4096
-write(9, "\0\202\3525\n\212\10\325-\334X\371\306\35\347L\300UG\234\307\23\231\205gc\250\302\224\v\216\0"..., 4096) = 4096
-write(9, "A\356\214\21\215\316\r\32yld%\30\3322\"\23\224\205\22\31%\310!GK\333\306\20Q\205;"..., 4096) = 4096
-write(9, "\31\373lQ\365\234\274z\366\206\365b\323y\336\305\234{\244\331A\367\255m\272z\244\365\226v`\207"..., 4096) = 4096
-write(9, "\3~\216;\373\217+\0K\334\24\301\362\371\310*a\3008\251Zb\364\227\26\270Hh\311\266\351e"..., 4096) = 4096
-write(9, "@\362Z\273i+!\274\215\324\v$\231[s\300\235\230\303\333\222f%\35?\307\226\207l\34h\267"..., 4096) = 4096
-write(9, "5\370\325Wo\304\275Y\216\203ra\177\23F\r\377\262}!\212\202\3508\177\rPb\303\2366C"..., 4096) = 4096
-write(9, "/\346q3dw\342*?nAA\303\263\363\202d\271\326L|r\36E\271\254\315#\231\250\"5"..., 4096) = 4096
-write(9, "a<\246\327T\372\223\352IR?yi\334\273\327%\3330\356_\32w\372/M\337_\2326;\207"..., 4096) = 4096
-write(9, "\316\5\205E\7\271b\267\344\25l\365x\254\6m*\246,\236\26\212\320\365\365\254eW\223-4\344"..., 4096) = 4096
-write(9, "{\3\227\313\32\276P\301\210\232\33F\32\350\214\252\305Q8\36\267\35\215\225\342\242\25~\267\"\333u"..., 4096) = 4096
-write(9, "l\321\275n/\277\375\372\355\317\177x\371\27}\7\377~\373\307\267\373\367o\336\271\327\370\262\256\361\345"..., 4096) = 4096
-write(9, "\316\310\207#\315\265\257\273\235\304\375\361\31\2221\354\214s%(\222\373\334[rg\331\25w0;\343"..., 4096) = 4096
-write(9, "\324\236\304\0-\343T&\275&\371B\206\203\34>;\201\223{\23WzV\205\262\f\234\315Y\21o"..., 4096) = 4096
-write(9, "U3\3525\311R\262\304\5\ntYX\244\354\364\334\330(\233>\232\322\324\230\315\236El\355-M"..., 4096) = 4096
-write(9, "m\24<\2671:\305\323\250\"K\232\16\222O0\343\34r3\346H\227\221l\v\207\270\222\205Z\22"..., 4096) = 4096
-write(9, "\311A\2250St\232\\\n\25Uc,Q\311U\202\271TJ\214\33\372z\232\n\226$L_Hm"..., 4096) = 4096
-read(8, "\256\272$\244g\214.5aa\320/-Z\247F~z\f\7\264\2329\v\237\f\304\270J\214\340\313"..., 4096) = 4096
-read(8, "\317\257r\1T\272\332J8\264\3203\230u\241E9\303i`c\341a\200\200\6\235y\200\20\"\216"..., 4096) = 4096
-read(8, "\343\220\261B9%\316r\364t\234\310\306z\301\33\317\246\313\302\2426\352\212\3613\217\312\262b\271r"..., 4096) = 4096
-read(8, "\26\217(\373\231\360\2707{T\254\200\202\240\21\234\25\353\206{\245\viq\356\226\34\v\34\370\212\34"..., 4096) = 4096
-read(8, "\34\343Wz\304\364\323sS\30\307\243\t\372bt\260\300\350c\26\320'C!\351!b\245]\243\246"..., 4096) = 4096
-read(8, "\333+B\306+%\177\313\263U(\301)\244h\ng\215\302\r\334|\324m\240\205\3\21E\30\274\231"..., 4096) = 4096
-read(8, "\257\335\235\211\26v\222\314\23X\332\4\231,\33K\260\351\237\315\265\234\212k\234\21\216\255\370\177\235\354"..., 4096) = 4096
-read(8, "|\361\366\326\362\251s\26\272UODr\352\306\245q\372\275\f\30\34\274\354\346\376\3\30439kJ"..., 4096) = 4096
-read(8, "\216\213\362\232_YSS\223\271j\371\306r1\366\310\321\177=\375UUU\205\270c\212A\273L\7"..., 4096) = 4096
-read(8, "xS\226F\10!\361\0026\264\356\355-'?\377\\\330\226\3414\273D\244\244l3\362 \247\375\n"..., 4096) = 4096
-read(8, "L\267X?\4k\227\321<aun\374E\277o\244]\6^\10\3552g\241]\352\254%\26)t"..., 4096) = 4096
-read(8, "200000d>\320.\31\30\30\30\30\30R\6M\273\314\26\365\352\325\313v\25\10!\204\220"..., 4096) = 4096
-read(8, "\332`Vu\365\325W\243&\35:tx\374\361\307\341\5w\335u\27\246\264b\251x\215\342\234s\316"..., 4096) = 4096
-read(8, "\320\236\276X\241\255u\215\253\344u;\17&'\353_~En\362\307e_\272?{\371\212|z\365"..., 4096) = 4096
-read(8, "\v\356\222\336'<\371\336K\353\241\301G\17\35\341\361\342\36\243\303\212\315\257\371\310-\237\34\342\302."..., 4096) = 4096
-read(8, "\264\\\276S\371P*\226\305\"\210Sc\361\344\202\6\321E\364\215\270\20\2\6 at G\36&|#\332"..., 4096) = 4096
-read(8, "\261\376wMg1\301{\325&\265\305\2446uP\334\232\31\237Y\233e\206\377\357\v\35\2427\311\301"..., 4096) = 4096
-read(8, "GU)q7=JS\215\30\377\235\v\277\342\2\237\363\271\250o{\360_z\260\313\343\362\224\25\314"..., 4096) = 4096
-read(8, "\320q\374N\177\177\354o\313\210\5\6\260\347d\207\203\356(\352\333:\303B=\24\204\201\30\216\374\247"..., 4096) = 4096
-read(8, "\225\314$\355M\"[\23\367'\222m\232;5d\207zNM\352I\33\31$L:h5e\303\7"..., 4096) = 4096
-read(8, "\16\263<\346yf\213r\37pH\267\2362B\261\311\22\334\245?\254'H\217\365\372\244\270\250\221x"..., 4096) = 4096
-read(8, "`H'[W\241D>\221$\322m\225\214\34j\37]\20\344\226\344`\242\304dJJ\2455\25x"..., 4096) = 4096
-read(8, "m\323m\250\2334\326\3759e\313\262\\\345\313\335n\225\245\276\375\357\336K\305\226\343\251\371Y\217s"..., 4096) = 4096
-read(8, "$\360+\326\360+\337b\345j\177\200u}\371\261g_\317\232\37{\366\261g\327-kY\325\322\261"..., 4096) = 4096
-read(8, "\322\6\337\237\206\357\331\360\335V\370\316>\370\366a\370g\33\276\205\340\337\332\7\217?6\240<\276\17"..., 4096) = 4096
-read(6, "/\31`}8\272\327\f\340\344s\232\301g\256\332-\1sY6z&\32\245\252$\300UI\234J"..., 4096) = 4096
-read(6, ":\0\360%\0\232\306\366\307\341?\233s\2705\nendstream\nendobj"..., 4096) = 4096
-read(6, "\24[O\31\177F\335\222\262\361\210\24\2067L\360\210O\3E\256,7\250G\213\224\271L\360\223\372"..., 4096) = 4096
-read(6, "\231\213 \215N\213Yfi_\224)N.\272P\253w\315j\"\364<\314\n\r\351\212T^\274U"..., 4096) = 4096
-read(6, "\326>\20\25\21\234\21\210\210\263\306\\\302\262\345\257\2127\3130\205\304\271\217\277\216[\2319g\366}"..., 4096) = 4096
-read(6, "\21\251\252\252B\3341\305\240]\272\340\330Ek\376'\273\\h\201\31\370b\203\332t\"\"\262\317\17"..., 4096) = 4096
-read(6, "\25\2112`\342\257\330\234\375~\231\242(\267Z\2515q+\23\22=?\363\5\375}W\357\221\343\305"..., 4096) = 4096
-read(6, "\250`\355R\7\235y\267\316\322\240\210\224]\6\270b\272y\24:x#\303v\31\257\336,p\326\224"..., 4096) = 4096
-read(6, "M5Ep,*e\255\324z*\312|\370\221G\314\327\333\325[I\271G\350\237-\27\0o\270\271"..., 4096) = 4096
-read(6, "c\335\307\36{\314\242C\343\306\215\277\365\255oa_\314\265\322,?\20\5\314)\370i\236\23\245\265"..., 4096) = 4096
-read(6, "$\20)\34\277\5\341\255\34\377\225q+V\375\365\3320\232D\6.\360\232\323\203\262\313&\371\3150"..., 4096) = 4096
-read(6, "\17\260i\17\266\273\t\350\7X\215\1x^\334\362\212|\360\331{\377E|\317\205kK}w\213\201"..., 4096) = 4096
-read(6, "\213\233~*,\374\307\241^\237\7B<\331!\4;<\177\37~\232q@\32\236\337\177\235\0\201\316"..., 4096) = 4096
-read(6, "f\252pD+\233\231\257]\360\207\317u\310Q\373R\314\342\2341\271*\254\242\252\3519\265\270[\30"..., 4096) = 4096
-read(6, "6l\2164+\233\227Ade\223\22i\206MM0`\303\306i\10OC\277\r}\376\265J\337\f"..., 4096) = 4096
-read(6, "4\211n\225\325\340\255@\325\373\321\0264I\212Q;\372#\32\303?\2079\324pz\374T\250\266\263"..., 4096) = 4096
-read(6, "\373\237\34\335y:\231\341tZ5y\232(\265:\371\267r\26\320o\4O\371\232\234\352m\255\313-"..., 4096) = 4096
-read(6, "\203\r\32\203&\205\373\204\7Ts\2117 ..R\245q\221\202\236\23B%\5u\2450X|c"..., 4096) = 4096
-read(6, "\343\23\235\207\357\272\vU9\32\243\5\255\35\321^Ggct\0\22!\232\230\206\204\340\270`AU"..., 4096) = 4096
-read(6, "\327\272k\273\203\301\241x\213]\257c\276\374\331\324\273O\217\327\317~v\327C\357=>^\273\347\241"..., 4096) = 4096
-read(6, "\3057=\344\235L\375\3623j\203^\313\202\201Uk\264,W\320\332\331\0371\344\34595\350\374\352"..., 4096) = 4096
-read(6, "\340,\327\302\334\203\322qZ\356A\f3|\234\207\263Hx\231\223\2\257\20^K\310\327ip17"..., 4096) = 4096
-read(6, "\375\1L,\4\10\246\26\346\347\3+\305\3630O\346\367+\357\225w\363\201\364\v\4Q\312\260p>"..., 4096) = 4096
-read(6, "\321\232\307\326{z\2264&3\23\227\206/q\2\332,x\361\336\343\233\6\16\365\26\206?\3300\342"..., 4096) = 4096
-read(6, "w\274(Y\23\274Lce\262\225Y\35\214\345\321P\34\223\253\306\335\270\206\343M5\2475,\240\301"..., 4096) = 4096
-write(7, "5\nendobj\n\n158 0 obj\n<</Length 15"..., 4096) = 4096
-write(7, "/\31`}8\272\327\f\340\344s\232\301g\256\332-\1sY6z&\32\245\252$\300UI\234J"..., 4096) = 4096
-write(7, ":\0\360%\0\232\306\366\307\341?\233s\2705\nendstream\nendobj"..., 4096) = 4096
-write(7, "\24[O\31\177F\335\222\262\361\210\24\2067L\360\210O\3E\256,7\250G\213\224\271L\360\223\372"..., 4096) = 4096
-write(7, "\231\213 \215N\213Yfi_\224)N.\272P\253w\315j\"\364<\314\n\r\351\212T^\274U"..., 4096) = 4096
-write(7, "\326>\20\25\21\234\21\210\210\263\306\\\302\262\345\257\2127\3130\205\304\271\217\277\216[\2319g\366}"..., 4096) = 4096
-write(7, "\21\251\252\252B\3341\305\240]\272\340\330Ek\376'\273\\h\201\31\370b\203\332t\"\"\262\317\17"..., 4096) = 4096
-write(7, "\25\2112`\342\257\330\234\375~\231\242(\267Z\2515q+\23\22=?\363\5\375}W\357\221\343\305"..., 4096) = 4096
-write(7, "\250`\355R\7\235y\267\316\322\240\210\224]\6\270b\272y\24:x#\303v\31\257\336,p\326\224"..., 4096) = 4096
-write(7, "M5Ep,*e\255\324z*\312|\370\221G\314\327\333\325[I\271G\350\237-\27\0o\270\271"..., 4096) = 4096
-write(7, "c\335\307\36{\314\242C\343\306\215\277\365\255oa_\314\265\322,?\20\5\314)\370i\236\23\245\265"..., 4096) = 4096
-write(7, "$\20)\34\277\5\341\255\34\377\225q+V\375\365\3320\232D\6.\360\232\323\203\262\313&\371\3150"..., 4096) = 4096
-write(7, "\17\260i\17\266\273\t\350\7X\215\1x^\334\362\212|\360\331{\377E|\317\205kK}w\213\201"..., 4096) = 4096
-write(7, "\213\233~*,\374\307\241^\237\7B<\331!\4;<\177\37~\232q@\32\236\337\177\235\0\201\316"..., 4096) = 4096
-write(7, "f\252pD+\233\231\257]\360\207\317u\310Q\373R\314\342\2341\271*\254\242\252\3519\265\270[\30"..., 4096) = 4096
-write(7, "6l\2164+\233\227Ade\223\22i\206MM0`\303\306i\10OC\277\r}\376\265J\337\f"..., 4096) = 4096
-write(7, "4\211n\225\325\340\255@\325\373\321\0264I\212Q;\372#\32\303?\2079\324pz\374T\250\266\263"..., 4096) = 4096
-write(7, "\373\237\34\335y:\231\341tZ5y\232(\265:\371\267r\26\320o\4O\371\232\234\352m\255\313-"..., 4096) = 4096
-write(7, "\203\r\32\203&\205\373\204\7Ts\2117 ..R\245q\221\202\236\23B%\5u\2450X|c"..., 4096) = 4096
-write(7, "\343\23\235\207\357\272\vU9\32\243\5\255\35\321^Ggct\0\22!\232\230\206\204\340\270`AU"..., 4096) = 4096
-write(7, "\327\272k\273\203\301\241x\213]\257c\276\374\331\324\273O\217\327\317~v\327C\357=>^\273\347\241"..., 4096) = 4096
-write(7, "\3057=\344\235L\375\3623j\203^\313\202\201Uk\264,W\320\332\331\0371\344\34595\350\374\352"..., 4096) = 4096
-write(7, "\340,\327\302\334\203\322qZ\356A\f3|\234\207\263Hx\231\223\2\257\20^K\310\327ip17"..., 4096) = 4096
-write(7, "\375\1L,\4\10\246\26\346\347\3+\305\3630O\346\367+\357\225w\363\201\364\v\4Q\312\260p>"..., 4096) = 4096
-write(7, "\321\232\307\326{z\2264&3\23\227\206/q\2\332,x\361\336\343\233\6\16\365\26\206?\3300\342"..., 4096) = 4096
-mmap(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb0c4152000
-write(9, "*\343:\347\363\222\313SJx'\27\215\247FY\323\273\214Z\263\342\227\21\235\373\0o\246\377\254\36"..., 4096) = 4096
-write(9, "\320\333\302\v=\224\336\272\273\320C\241{\351\337\257\244\371\360\330\361\204\335\22H\34\217Fz$=#"..., 4096) = 4096
-write(9, "3e\367\262\357V\323\236X\2301\346hSUL&\v\207\246\340\36\26\203\177\336\3\f\354V\232\226"..., 4096) = 4096
-write(9, "6\341\25\225\274\212\212WlM\230\345\31o\213A\305$G\325\362\20\271\367\31}\331\231\233E\366="..., 4096) = 4096
-write(9, "\323\201)\320E\341\314d\36\303Le\2\277\3601\214\344\334\361\350\325\326\3640\360\223g\300|fs"..., 4096) = 4096
-write(9, "\302\322\307u}A\331\210\303\7\243\331\224`\215\225v\1&r\3370\260\243\304\222\242\255\2056._"..., 4096) = 4096
-write(9, "j\n\n209 0 obj\n1357\nendobj\n\n211 0 "..., 4096) = 4096
-write(9, "\341%\353\225\270\223\260'\324+\361\223\330+\361J\257$\216\263W\3425}\301q\364J|\276^I"..., 4096) = 4096
-write(9, "\303\366\1\334\231\234P\223#P\333<\343\264\225\334k\3109\354\3375\317\210\2B\310\211\234\266sz"..., 4096) = 4096
-write(9, "tc\\Ib?e\202\252L\243`0T\3755\23\314\200F\324c\312\6 at K\20p_\367R\31"..., 4096) = 4096
-write(9, "uTo\1\223Q\231\247j\30X\223F\222\204\337\274\373\275\31\326'`\351\374\206t\265\305Q\210\261"..., 4096) = 4096
-write(9, "e[C\363\32qdR\354\23\247&\372\6\6w\364Ml\23\307\206n~\276id\363\340D\337\324"..., 4096) = 4096
-write(9, "W\277\267\253w\363Pmf \351\27\2649\256\260\375\252f\274C\256t3HrIM\241F\32b"..., 4096) = 4096
-write(9, "\255\3\225\375EE\346\nKQsc\203;\3675\360\256g\324j\r\272\377vw\201;G\5,\224"..., 4096) = 4096
-write(9, "N\306\351,\312\236\327\251\213\346\2113C\332T4S\203\372b$}\242\343\365\304\312\361\36^\ta"..., 4096) = 4096
-write(9, "\256\233\234(\227\272;[\332\373\232\7:c\33\245\251yi\\Z\230\33\237\230\334;>w\2554\275"..., 4096) = 4096
-write(9, "sq\\e\325\357\355\354[\23\262\365X\373p\246\255\261wZ\35!\3372\354\340e\316\316\376el"..., 4096) = 4096
-write(9, "\266\356\260\3626+\230\325]v\215GC5\252\200\33\25H\237\336\321h6\253\343\3\"\247V\274&"..., 4096) = 4096
-read(8, "\264A\270\204\374\252\312\17_\10{f9T\351W\253\241\210/\r\3664\207\214\327\247~s\23\253\342"..., 4096) = 4096
-read(8, "/a\37\210>\360!\277Cps\216M\5*\201\17\361M|\214_\340q\332A\342\37ss\372\21"..., 4096) = 4096
-read(8, "\211\213\257_\314J+\307Ka\374\214:\244\201\375K\341|OFuz\240\232\351\270\365\205[V\227"..., 4096) = 4096
-read(8, "\3265%[\353\266vne\267\254u\271\23\303K\356\315\303Q\3670vl\1\271\331<\220\0351\17"..., 4096) = 4096
-read(8, "#\306\327ew\267\361\242,\27y\\x\t\351\205\264\244x\26\255\205\222\342B\352L\327Su\346,"..., 4096) = 4096
-read(8, "D\213\305\266\335v\330F\317\332\300m\v\330\216\332\270\230T\377Y,\26U\375\330\333\27\213\200$\251"..., 4096) = 4096
-read(8, "\3660/\177\221\31\7$\327\223\353\313\355\311\35\316\335\221{$We\317\275\234K\323\226\237\326\202G"..., 4096) = 4096
-read(8, "xX\317\2627+;M\375X\224\3765J=\21\256\r\3433\210|\357W\270]\250\244\256U\3328"..., 4096) = 4096
-read(8, "$\272\300\320b\216\26_\224\361\331_V\\\304\264<\250w\353\323\335zw\r\21ci\370\301\3300"..., 4096) = 4096
-read(8, "\302H\203\214\204\3210 l\220\334)\343M2\31\317\341\26(\332I\31\201\5^\325\320\370\221F\303"..., 4096) = 4096
-read(8, "SnZ.\323\340\35\361\222}\342\254H\312E\274/\t\317\332\360*}\227\236\34R\343\260zH\275"..., 4096) = 4096
-read(8, "00 600 600 600 600 600 600 600 6"..., 4096) = 4096
-read(8, "\312\355\315:\222E}\26599\26\347\"U\270\326\350\6\267{A\355}*\230Q\1Q\201J\265\272"..., 4096) = 4096
-read(8, "8\17\177\204m\367\220i\371\376^\327N\327\235.n\255\rZ\235\220CA\225`M\240\32'\323\311"..., 4096) = 4096
-read(8, "\30\357\33\214h\2356\220A\302v\301\21+\211D\320\347*\v\226\241p\24\321\274\35\243\27\36\231Z"..., 4096) = 4096
-read(8, "\247c>\355\n<e\306\277\253\265\\\326\274\0p\n\236\204\330\242F\226\305\26=E\236$\224{\330"..., 4096) = 4096
-read(8, "\264\254\274\242rb\244\252Z\2354yJMm\335\324h\375\264\206[\246\317\230\3318k\366\234\246\346"..., 4096) = 4096
-read(8, "*qm\246\306\0249\30nD1L~\221i!f&O\250\334\3653\335\204\306\3705\261B\361\371"..., 4096) = 4096
-read(8, "\3529\250\344 \333\10\rh>\302\254\213p\rn\3028\33\227`,R\274\231G\310,\3\33\223a"..., 4096) = 4096
-read(8, "P\36V\236RN)\\\267\2\271J\231\322\242\20'#\201?)\360\276\2O)?S\360\1\5\6"..., 4096) = 4096
-read(8, "\303e\226\215\271\215:9\255\360\312\353U\330\331\275\33\235\333\2569\304\27_\225xv\204\317\242)\4"..., 4096) = 4096
-read(8, "\2778\320q\177\320\327\326\256\311\231\315\263\345\34\207#_\256\366\266\310\236&m\256\\\356o\266\311\305"..., 4096) = 4096
-read(8, "\203\0258\262\263\202\365\356\360\320wt\5\305\32\f\210\3\2211\252=\235\343\305\22\3\3758Dc5"..., 4096) = 4096
-read(8, "\254\252n\3277\314-G^\333\275\357\255\7V\256\30\330\273R\327>\370\322\351\320\334\360\220\266\351\276"..., 4096) = 4096
-read(8, "oX\327\323\247\v\375VU1\375\324\255S\301[+V\337\366\340\201\351x\372\331\3576\337\273c\250"..., 4096) = 4096
-read(6, "\316\304WX\324\250\340\267\211\300\200\350A\366M@\255\330\354+\301j8F\244]\344\16Gjag"..., 4096) = 4096
-read(6, "G\217<w\3669\345\24\200\3769\235\336o8\0368N\217q\21\232\223H-\336\315xs\344\0>"..., 4096) = 4096
-read(6, "]\374\226\2576s8w\366\224\2\236\17\326\314\316\35\235@\353\262ut\36\227\306MG\331\264\206{"..., 4096) = 4096
-read(6, "\"\240$y\221\362\10vE@\214\300\317?\211|\35\301\335\24\300\35\210\274\34y3\302\323\344\351W"..., 4096) = 4096
-read(6, "\3467\327\16\236\333\35\232\26v\325\336yl\305m\303\375\223G\217\36\2331\270\2642\330\334\3270\265"..., 4096) = 4096
-read(6, "\3469\273\327\314M\33\235\217\233C\233\37{u\305\363\243_\34o\305oh]\24\234\333?\275\244\250"..., 4096) = 4096
-read(6, "A\337\3002\277\246)\3124\7\305\275\24S\266k\207p\360\305T\272\300\354\266.\260\347gL\f6"..., 4096) = 4096
-read(6, "\216\277\3025\364s\232'\353u\332\206\363\322\347s=~\251\257!\263\252\347C\273\274\356\346\307\363R"..., 4096) = 4096
-read(6, "\32\247\344\3620\317\214\37C9,#\273\237G\326\26xa\36\22D\203\214\230eD\220\241\214i\347"..., 4096) = 4096
-read(6, "%\222m\352\00147b\"\3768\332v\314Y\205=\7\357\317m*\317E\225`\357\233\375\207\321\343"..., 4096) = 4096
-read(6, "\374\340\343\317\36\376\333\373\277\230\234\371\315\7\37\355?\360\321\7\277\336\211c\373p\354\235\322\330+\304"..., 4096) = 4096
-read(6, "W\311:\371\36y\355\352x\201\207j(\2\31\371'\330F~L\336#o\220W\310\303\357\233W\20"..., 4096) = 4096
-read(6, "z\347\342\227N\356Y\253]\30s%\376J\373o\377\206Z\356C\271\\F;\253$~\362T \272"..., 4096) = 4096
-read(6, "\201\35\364\215\355>\312\306\215\233\2731_0\202^X\24\24\5S\320\273u\236Z\363\334\216\20\372\252"..., 4096) = 4096
-read(6, "^\22\341q\225F\303s\327\370\342\272A\347V\244\327W\27\210Bny\205e\16c(\201\tF\v"..., 4096) = 4096
-read(6, "\364\334:\26]\300\203ES\233\211\236t\210*\213(\2524\372d}\216\276\217-#\361{D\10\210"..., 4096) = 4096
-read(6, "\0\275!\351y?|I\251\364\200\37v\372a\243\37j\375P\344\207\17\375\360\242\37\36S*\210\345"..., 4096) = 4096
-read(6, "+\271\323\10\235\306\1#5\32u#\211b\354\275\205!\26\337\34R\2\234CW\313g\277\315\21_"..., 4096) = 4096
-read(6, "48>>\nstream\nx\234\325\274\7x\33\307\2650:3\273\213^\26\215\0\t\202"..., 4096) = 4096
-read(6, "G\36\31\34<>Z\261~\223\252\376\326U\345\313\217\276\17\263\337\7\374\264R\344c\237\220$\223Q"..., 4096) = 4096
-read(6, "*\225\354\10\r\335p2\213\270G)\306e6\323\355t\300\230\207\356\276\350\304\220\r/n\31P<"..., 4096) = 4096
-read(6, "\244\362\254\330\323\25\330\262<\277a\342\276\245\366\232\206\305\331\331~\343=I+\n<\3\231I\371&"..., 4096) = 4096
-read(6, "M>{\337;c\357\354z\207\351{k\354\255]o1\347\277\205\277\31N\267\217\237\303\216s\371\347"..., 4096) = 4096
-read(6, "0 0 595 842]/Annots[\n304 0 R 324"..., 4096) = 4096
-read(6, "0 R/MediaBox[0 0 595 842]/Group<"..., 4096) = 4096
-write(7, "w\274(Y\23\274Lce\262\225Y\35\214\345\321P\34\223\253\306\335\270\206\343M5\2475,\240\301"..., 4096) = 4096
-write(7, "\316\304WX\324\250\340\267\211\300\200\350A\366M@\255\330\354+\301j8F\244]\344\16Gjag"..., 4096) = 4096
-write(7, "G\217<w\3669\345\24\200\3769\235\336o8\0368N\217q\21\232\223H-\336\315xs\344\0>"..., 4096) = 4096
-write(7, "]\374\226\2576s8w\366\224\2\236\17\326\314\316\35\235@\353\262ut\36\227\306MG\331\264\206{"..., 4096) = 4096
-write(7, "\"\240$y\221\362\10vE@\214\300\317?\211|\35\301\335\24\300\35\210\274\34y3\302\323\344\351W"..., 4096) = 4096
-write(7, "\3467\327\16\236\333\35\232\26v\325\336yl\305m\303\375\223G\217\36\2331\270\2642\330\334\3270\265"..., 4096) = 4096
-write(7, "\3469\273\327\314M\33\235\217\233C\233\37{u\305\363\243_\34o\305oh]\24\234\333?\275\244\250"..., 4096) = 4096
-write(7, "A\337\3002\277\246)\3124\7\305\275\24S\266k\207p\360\305T\272\300\354\266.\260\347gL\f6"..., 4096) = 4096
-write(7, "\216\277\3025\364s\232'\353u\332\206\363\322\347s=~\251\257!\263\252\347C\273\274\356\346\307\363R"..., 4096) = 4096
-write(7, "\32\247\344\3620\317\214\37C9,#\273\237G\326\26xa\36\22D\203\214\230eD\220\241\214i\347"..., 4096) = 4096
-write(7, "%\222m\352\00147b\"\3768\332v\314Y\205=\7\357\317m*\317E\225`\357\233\375\207\321\343"..., 4096) = 4096
-write(7, "\374\340\343\317\36\376\333\373\277\230\234\371\315\7\37\355?\360\321\7\277\336\211c\373p\354\235\322\330+\304"..., 4096) = 4096
-write(7, "W\311:\371\36y\355\352x\201\207j(\2\31\371'\330F~L\336#o\220W\310\303\357\233W\20"..., 4096) = 4096
-write(7, "z\347\342\227N\356Y\253]\30s%\376J\373o\377\206Z\356C\271\\F;\253$~\362T \272"..., 4096) = 4096
-write(7, "\201\35\364\215\355>\312\306\215\233\2731_0\202^X\24\24\5S\320\273u\236Z\363\334\216\20\372\252"..., 4096) = 4096
-write(7, "^\22\341q\225F\303s\327\370\342\272A\347V\244\327W\27\210Bny\205e\16c(\201\tF\v"..., 4096) = 4096
-write(7, "\364\334:\26]\300\203ES\233\211\236t\210*\213(\2524\372d}\216\276\217-#\361{D\10\210"..., 4096) = 4096
-write(7, "\0\275!\351y?|I\251\364\200\37v\372a\243\37j\375P\344\207\17\375\360\242\37\36S*\210\345"..., 4096) = 4096
-write(7, "+\271\323\10\235\306\1#5\32u#\211b\354\275\205!\26\337\34R\2\234CW\313g\277\315\21_"..., 4096) = 4096
-write(7, "48>>\nstream\nx\234\325\274\7x\33\307\2650:3\273\213^\26\215\0\t\202"..., 4096) = 4096
-write(7, "G\36\31\34<>Z\261~\223\252\376\326U\345\313\217\276\17\263\337\7\374\264R\344c\237\220$\223Q"..., 4096) = 4096
-write(7, "*\225\354\10\r\335p2\213\270G)\306e6\323\355t\300\230\207\356\276\350\304\220\r/n\31P<"..., 4096) = 4096
-write(7, "\244\362\254\330\323\25\330\262<\277a\342\276\245\366\232\206\305\331\331~\343=I+\n<\3\231I\371&"..., 4096) = 4096
-write(7, "M>{\337;c\357\354z\207\351{k\354\255]o1\347\277\205\277\31N\267\217\237\303\216s\371\347"..., 4096) = 4096
-write(7, "0 0 595 842]/Annots[\n304 0 R 324"..., 4096) = 4096
-write(9, "M\347B\24\0278\264\10\31[\200\360<\25jU\240\342\2\24\354\24\f\24(Q\230\302\350\232f\214"..., 4096) = 4096
-write(9, "4<\355Q\253\305\353\17KG6\36\345i\327|\221G\361\250E\177\2744\371\r\305\242Y\203\367\212"..., 4096) = 4096
-write(9, "W\254:\314\264\244\35t\200\356\340f 7\252Rse\273b\307v\2737\301]w\206\351O2R"..., 4096) = 4096
-write(9, "C\v\257\304\306\224t\n\230\374\377\4\30:\222\256\340C\337U\"\202(\32*-_0\311\367\302U"..., 4096) = 4096
-write(9, "\226x\353\274K\275\33\275\333\275OzOz_\367~\344\375\302\233\360\6\273b/\33\261c\357\177\34"..., 4096) = 4096
-write(9, "\3704\315U\370\230f\214?\20\341i\21\366\211PNiq\201\10`\24a\377\n\261_\334%>+"..., 4096) = 4096
-write(9, "\2161\313\243\333\f\373\242\331D:e\334\367\257\227\6'\255\373.\221A\6r0J!g\310\30\337"..., 4096) = 4096
-write(9, "\32@\364\316\315\5\\\216\300\334\300\334\340\374\342\336\215.\207\3015wZ\243\231\233\252G\f\223\326n"..., 4096) = 4096
-write(9, "\246I\37\303?s~\373J\231\17\274\337\300D)\363\255$\211\n78\313BD\351\24E\204\203\37"..., 4096) = 4096
-write(9, "\27\4X\2\361\232\375p\3l\350\336;1\320\256'\240>\374\203\205;\245\27\267!\2\331\302\203\330"..., 4096) = 4096
-write(9, "A\367l \323\216\244\326\210[\324\272 at S \321~\245q\261\221\2666Bc at m\367\7[\2024"..., 4096) = 4096
-write(9, "/aP\22\355\25]|\22\265\206\26\10v\27\325\351\202\263\357\275'm\22H\347\306/d\7\321\336"..., 4096) = 4096
-write(9, "\312\231,\254%G\345?\352H,\335\272\26207\237\344+f*y\257\333]\317\17\305c|w4"..., 4096) = 4096
-write(9, "\225\345\343\312g\200\345\207\315\36s\246\307\354YD\335S\31\360\340\324fa\345\337\236X\304\277\311\214"..., 4096) = 4096
-write(9, "\323`\214\315\27\223\331b2\233M\354`\203d\252h\364\2332\235\6\31\302\5f\247H4\215\351&"..., 4096) = 4096
-write(9, "\6\266\205\332\2501.3\21\213\211\271B\315\234\206\253\247\200.\7H\32\7\316B7\372v\32\r5"..., 4096) = 4096
-write(9, "\375\223m--\326 at 1k\353\32l\353o>w\2\6\240\377sS\35\3127Q\246\337B{_\305"..., 4096) = 4096
-write(9, "\32]\326\266\354g\313\376\260\354?\227\t\17.\3\373\322\214\274Z\373\322T\367\377\323\262\331\3534\f"..., 4096) = 4096
-write(9, "jS}\276\224\313*.3f,*\261\367\17z\33\v\223\342\266\202\330\357\231g\250\245\200Q\35\350"..., 4096) = 4096
-write(9, "\267\271\300\261/\376x\354\30\253\216\307\264\243\235l\n\333\204\n\300:?&\324\354\310\237\315'\303~"..., 4096) = 4096
-write(9, "\331tj\223\4\316R\236\307\22\205J\262\356M|\207\241\250\322\237\22l^\22L\361W\372\f\321\333"..., 4096) = 4096
-write(9, "\271\320^\0003\242\20\313C\276\277y\347?\36\365\377\f\0221\230\257\25G\231\22\307\216\365\34\21\307"..., 4096) = 4096
-write(9, "aBox[0 0 595 842]/Group<</S/Tran"..., 4096) = 4096
-write(9, "[\n293 0 R 294 0 R 295 0 R ]\n/Gro"..., 4096) = 4096
-read(8, "\331\261c\7\260\4\26\331\201\3570\204a\314\311\252\16\347\303k\32\360\225[J\306\342\250ZX\315\204"..., 4096) = 4096
-read(8, "S/Transparency/CS/DeviceRGB/I tr"..., 4096) = 4096
-read(8, "32\n/Group<</S/Transparency/CS/De"..., 4096) = 4096
-read(8, "ources 3772 0 R/MediaBox[0 0 595"..., 4096) = 4096
-read(8, "ructElem\n/S/Standard\n/P 4 0 R\n/P"..., 4096) = 4096
-read(8, "lem\n/S/Standard\n/P 4 0 R\n/Pg 34 "..., 4096) = 4096
-read(8, "</Type/StructElem\n/S/Span\n/P 84 "..., 4096) = 4096
-read(8, "ctElem\n/S/TOCI\n/P 91 0 R\n/Pg 86 "..., 4096) = 4096
-read(8, "bj\n<</Type/StructElem\n/S/Content"..., 4096) = 4096
-read(8, "tructElem\n/S/Link\n/P 181 0 R\n/Pg"..., 4096) = 4096
-read(8, "\n<</Type/StructElem\n/S/Link\n/P 2"..., 4096) = 4096
-read(8, "dobj\n\n240 0 obj\n<</Type/StructEl"..., 4096) = 4096
-read(8, "ent/Block\n/StartIndent 56.6\n>>\ne"..., 4096) = 4096
-read(8, "ype/OBJR/Obj 3665 0 R>>\nendobj\n\n"..., 4096) = 4096
-read(8, "endobj\n\n4035 0 obj\n<</Type/OBJR/"..., 4096) = 4096
-read(8, " 367 0 R\n/Pg 272 0 R\n/A 4058 0 R"..., 4096) = 4096
-read(8, "ign/Justify\n>>\nendobj\n\n398 0 obj"..., 4096) = 4096
-read(8, "93 0 R\n/A 4098 0 R\n>>\nendobj\n\n40"..., 4096) = 4096
-read(8, " R\n/A 4121 0 R\n/K[5 ]\n>>\nendobj\n"..., 4096) = 4096
-read(8, "\n>>\nendobj\n\n4137 0 obj\n<</O/Layo"..., 4096) = 4096
-read(8, "nt/Block\n/SpaceBefore 11.3\n/Text"..., 4096) = 4096
-read(8, "xt#20body\n/P 4 0 R\n/Pg 493 0 R\n/"..., 4096) = 4096
-read(8, "/SpaceBefore 11.3\n/TextAlign/Jus"..., 4096) = 4096
-read(8, "ctElem\n/S/Text#20body\n/P 4 0 R\n/"..., 4096) = 4096
-read(8, "obj\n<</Type/StructElem\n/S/Span\n/"..., 4096) = 4096
-read(6, "95 842]/Group<</S/Transparency/C"..., 4096) = 4096
-read(6, "0 R/XYZ 103.4 255.9 0]\n/5F5FRefH"..., 4096) = 4096
-read(6, "st[178 0 R/XYZ 99.3 459.2 0]>>\ne"..., 4096) = 4096
-read(6, "293.1 538.8 306.9]/Dest[97 0 R/X"..., 4096) = 4096
-read(6, "<</Type/Action/S/URI/URI(http://"..., 4096) = 4096
-read(6, "ype/Catalog/Pages 327 0 R\n/Dests"..., 4096) = 4096
-read(6, "9380 00000 n \n0000215587 00000 n"..., 4096) = 4096
-read(6, " ]\n/DocChecksum /A9128BDB763FCCD"..., 4096) = 76
-read(6, "", 4096) = 0
-read(6, "", 4096) = 0
-write(7, "0 R/MediaBox[0 0 595 842]/Group<"..., 4096) = 4096
-write(7, "95 842]/Group<</S/Transparency/C"..., 4096) = 4096
-write(7, "0 R/XYZ 103.4 255.9 0]\n/5F5FRefH"..., 4096) = 4096
-write(7, "st[178 0 R/XYZ 99.3 459.2 0]>>\ne"..., 4096) = 4096
-write(7, "293.1 538.8 306.9]/Dest[97 0 R/X"..., 4096) = 4096
-write(7, "<</Type/Action/S/URI/URI(http://"..., 4096) = 4096
-write(7, "ype/Catalog/Pages 327 0 R\n/Dests"..., 4096) = 4096
-write(7, "9380 00000 n \n0000215587 00000 n"..., 4096) = 4096
-write(9, "0 595 842]/Group<</S/Transparenc"..., 4096) = 4096
-write(9, "0]\n/5F5FRefHeading5F5F154955F187"..., 4096) = 4096
-write(9, "ink/Border[0 0 0]/Rect[70.2 481."..., 4096) = 4096
-write(9, "/Type/Annot/Subtype/Link/Border["..., 4096) = 4096
-write(9, "419.2]/A<</Type/Action/S/URI/URI"..., 4096) = 4096
-write(9, "t[64 0 R/XYZ 73.7 96.6 0]>>\nendo"..., 4096) = 4096
-write(9, " n \n0000210521 00000 n \n00002124"..., 4096) = 4096
-read(8, "an\n/P 674 0 R\n/Pg 611 0 R\n/Lang("..., 4096) = 4096
-read(8, "t/Block\n/SpaceBefore 11.3\n/Start"..., 4096) = 4096
-read(8, "/Span\n/P 735 0 R\n/Pg 683 0 R\n/La"..., 4096) = 4096
-read(8, "\n>>\nendobj\n\n770 0 obj\n<</Type/St"..., 4096) = 4096
-read(8, "8 0 R ]\n>>\nendobj\n\n800 0 obj\n<</"..., 4096) = 4096
-read(8, "<</Type/StructElem\n/S/verbatim\n/"..., 4096) = 4096
-read(8, ")\n/K[18 ]\n>>\nendobj\n\n869 0 obj\n<"..., 4096) = 4096
-read(8, "m\n/P 4 0 R\n/Pg 889 0 R\n/A 4358 0"..., 4096) = 4096
-read(8, "batim\n/P 4 0 R\n/Pg 889 0 R\n/A 43"..., 4096) = 4096
-read(8, "72 0 R ]\n>>\nendobj\n\n970 0 obj\n<<"..., 4096) = 4096
-read(8, "obj\n\n1004 0 obj\n<</Type/StructEl"..., 4096) = 4096
-read(8, "19 0 obj\n<</O/Layout\n/Placement/"..., 4096) = 4096
-read(8, "t 36\n/TextAlign/Justify\n>>\nendob"..., 4096) = 4096
-read(8, "ype/StructElem\n/S/Span\n/P 1097 0"..., 4096) = 4096
-read(8, "\n/Placement/Block\n/TextAlign/Jus"..., 4096) = 4096
-read(8, "7 0 R\n>>\nendobj\n\n4478 0 obj\n<</O"..., 4096) = 4096
-read(8, "ctElem\n/S/Text#20body\n/P 4 0 R\n/"..., 4096) = 4096
-read(8, "86 0 R\n/K[1222 0 R ]\n>>\nendobj\n\n"..., 4096) = 4096
-read(8, "bj\n\n4521 0 obj\n<</O/Layout\n/Plac"..., 4096) = 4096
-read(8, "3 0 R\n/A 4536 0 R\n/K[21 1284 0 R"..., 4096) = 4096
-read(8, " 1311 0 R 1312 0 R 1313 0 R 1314"..., 4096) = 4096
-read(8, "\n>>\nendobj\n\n4570 0 obj\n<</O/Layo"..., 4096) = 4096
-read(8, "\n1383 0 obj\n<</Type/StructElem\n/"..., 4096) = 4096
-read(8, "Type/StructElem\n/S/Text#20body\n/"..., 4096) = 4096
-read(8, "e 11.3\n>>\nendobj\n\n1444 0 obj\n<</"..., 4096) = 4096
-read(6, "", 4096) = 0
-read(8, "/Layout\n/Placement/Block\n/SpaceB"..., 4096) = 4096
-read(8, "obj\n<</Type/StructElem\n/S/Span\n/"..., 4096) = 4096
-read(8, "1483 0 R\n/A 4649 0 R\n/K[38 ]\n>>\n"..., 4096) = 4096
-read(8, "tructElem\n/S/Span\n/P 1577 0 R\n/P"..., 4096) = 4096
-read(8, "\n1607 0 obj\n<</Type/StructElem\n/"..., 4096) = 4096
-read(8, "ore 11.3\n/TextAlign/Justify\n>>\ne"..., 4096) = 4096
-read(8, "673 0 obj\n<</Type/StructElem\n/S/"..., 4096) = 4096
-read(8, "0 R\n/Pg 1699 0 R\n/A 4723 0 R\n/K["..., 4096) = 4096
-read(8, "/S/Span\n/P 1736 0 R\n/Pg 1699 0 R"..., 4096) = 4096
-read(8, " 0 R ]\n>>\nendobj\n\n1769 0 obj\n<</"..., 4096) = 4096
-read(8, " R\n/K[4 ]\n>>\nendobj\n\n4772 0 obj\n"..., 4096) = 4096
-read(8, "tElem\n/S/LBody\n/P 1829 0 R\n/Pg 1"..., 4096) = 4096
-read(8, "0 R\n/K[1860 0 R ]\n>>\nendobj\n\n186"..., 4096) = 4096
-read(8, "R\n/Lang(zxx)\n/K[28 ]\n>>\nendobj\n\n"..., 4096) = 4096
-read(8, "lem\n/S/Span\n/P 1931 0 R\n/Pg 1846"..., 4096) = 4096
-read(8, "stify\n>>\nendobj\n\n1964 0 obj\n<</T"..., 4096) = 4096
-read(8, "R 1980 0 R 1983 0 R 1986 0 R 198"..., 4096) = 4096
-read(8, "/Block\n>>\nendobj\n\n2020 0 obj\n<</"..., 4096) = 4096
-read(8, "uctElem\n/S/Span\n/P 2055 0 R\n/Pg "..., 4096) = 4096
-read(8, "\n/S/verbatim\n/P 4 0 R\n/Pg 2078 0"..., 4096) = 4096
-read(8, "</O/Layout\n/Placement/Block\n/Spa"..., 4096) = 4096
-read(8, "Align/Justify\n>>\nendobj\n\n2145 0 "..., 4096) = 4096
-read(8, "ent/Block\n/SpaceBefore 11.3\n>>\ne"..., 4096) = 4096
-read(8, " 0 R\n/A 4972 0 R\n/K[29 2207 0 R "..., 4096) = 4096
-read(8, "Elem\n/S/verbatim\n/P 4 0 R\n/Pg 22"..., 4096) = 4096
-read(8, "\n\n2274 0 obj\n<</Type/StructElem\n"..., 4096) = 4096
-read(8, "Pg 2231 0 R\n/A 5017 0 R\n/K[45 23"..., 4096) = 4096
-read(8, "lem\n/S/LBody\n/P 2334 0 R\n/Pg 232"..., 4096) = 4096
-read(8, "/K[2371 0 R ]\n>>\nendobj\n\n2377 0 "..., 4096) = 4096
-read(8, "/A 5060 0 R\n/K[37 ]\n>>\nendobj\n\n2"..., 4096) = 4096
-read(8, "endobj\n\n2442 0 obj\n<</Type/Struc"..., 4096) = 4096
-read(8, " 0 R ]\n>>\nendobj\n\n2468 0 obj\n<</"..., 4096) = 4096
-read(8, "n/Justify\n>>\nendobj\n\n2504 0 obj\n"..., 4096) = 4096
-read(8, "gn/Justify\n>>\nendobj\n\n2527 0 obj"..., 4096) = 4096
-read(8, "ify\n>>\nendobj\n\n2553 0 obj\n<</Typ"..., 4096) = 4096
-read(8, "0body\n/P 2584 0 R\n/Pg 2565 0 R\n/"..., 4096) = 4096
-read(8, "Indent 36\n/TextAlign/Justify\n>>\n"..., 4096) = 4096
-read(8, "obj\n\n2648 0 obj\n<</Type/StructEl"..., 4096) = 4096
-read(8, "t/Block\n/SpaceBefore 11.3\n/TextA"..., 4096) = 4096
-read(8, "\n>>\nendobj\n\n5233 0 obj\n<</O/Layo"..., 4096) = 4096
-read(8, ">>\nendobj\n\n2741 0 obj\n<</Type/St"..., 4096) = 4096
-read(8, "j\n<</Type/StructElem\n/S/Text#20b"..., 4096) = 4096
-read(8, "/verbatim\n/P 4 0 R\n/Pg 2796 0 R\n"..., 4096) = 4096
-read(8, "R\n/A 5297 0 R\n>>\nendobj\n\n5298 0 "..., 4096) = 4096
-read(8, " 2830 0 R\n/A 5313 0 R\n/K[2865 0 "..., 4096) = 4096
-read(8, "g 2830 0 R\n/A 5325 0 R\n/K[24 ]\n>"..., 4096) = 4096
-read(8, "\n/Pg 2897 0 R\n/Lang(zxx)\n/K[16 ]"..., 4096) = 4096
-read(8, "\nendobj\n\n2965 0 obj\n<</Type/Stru"..., 4096) = 4096
-read(8, "endobj\n\n5374 0 obj\n<</O/Layout\n/"..., 4096) = 4096
-read(8, "lem\n/S/Text#20body\n/P 4 0 R\n/Pg "..., 4096) = 4096
-read(8, "R\n/Pg 3024 0 R\n/A 5414 0 R\n/K[30"..., 4096) = 4096
-read(8, "\nendobj\n\n5433 0 obj\n<</O/Layout\n"..., 4096) = 4096
-read(8, "\n\n5454 0 obj\n<</O/Layout\n/Placem"..., 4096) = 4096
-read(8, " obj\n<</O/Layout\n/Placement/Bloc"..., 4096) = 4096
-read(8, " 5485 0 R\n/K[3176 0 R 3177 0 R ]"..., 4096) = 4096
-read(8, "21 0 R\n/A 5499 0 R\n/K[3209 0 R ]"..., 4096) = 4096
-read(8, "<</O/Layout\n/Placement/Block\n/Te"..., 4096) = 4096
-read(8, "ify\n>>\nendobj\n\n3268 0 obj\n<</Typ"..., 4096) = 4096
-read(8, "ructElem\n/S/Text#20body\n/P 4 0 R"..., 4096) = 4096
-read(8, "Justify\n>>\nendobj\n\n3332 0 obj\n<<"..., 4096) = 4096
-read(8, "t/Block\n/SpaceBefore 11.3\n>>\nend"..., 4096) = 4096
-read(8, "/Text#20body\n/P 4 0 R\n/Pg 3388 0"..., 4096) = 4096
-read(8, "33 0 obj\n<</O/Layout\n/Placement/"..., 4096) = 4096
-read(8, "\n\n3453 0 obj\n<</Type/StructElem\n"..., 4096) = 4096
-read(8, "<</O/Layout\n/Placement/Block\n/Sp"..., 4096) = 4096
-read(8, "pe/StructElem\n/S/Text#20body\n/P "..., 4096) = 4096
-read(8, "ut\n/Placement/Block\n/TextAlign/J"..., 4096) = 4096
-read(8, "<</Type/StructElem\n/S/Span\n/P 35"..., 4096) = 4096
-read(8, "ck\n/SpaceBefore 11.3\n/TextAlign/"..., 4096) = 4096
-read(8, "R 1078 0 R 1081 0 R 1082 0 R 108"..., 4096) = 4096
-read(8, " 2228 0 R 2230 0 R 2234 0 R 2236"..., 4096) = 4096
-read(8, "3220 0 R 3221 0 R 3222 0 R 3223 "..., 4096) = 4096
-read(8, " 434 0 R 433 0 R 439 0 R 447 0 R"..., 4096) = 4096
-read(8, " 0 R 1403 0 R 1405 0 R\n1406 0 R "..., 4096) = 4096
-read(8, "47 0 R 2149 0 R 2151 0 R 2153 0 "..., 4096) = 4096
-read(8, " R 2965 0 R 2967 0 R 2969 0 R\n29"..., 4096) = 4096
-read(8, "76 314 0 R\n177 317 0 R\n178 318 0"..., 4096) = 4096
-read(8, " obj\n<</Type/Annot/Subtype/Link/"..., 4096) = 4096
-read(8, "ink/Border[0 0 0]/Rect[56 715.9 "..., 4096) = 4096
-read(8, "8 0 obj\n<</Type/Annot/Subtype/Li"..., 4096) = 4096
-read(8, "ndobj\n\n3715 0 obj\n<</Type/Annot/"..., 4096) = 4096
-read(8, "0441541 00000 n \n0000441675 0000"..., 4096) = 4096
-read(8, "\n0000469005 00000 n \n0000468893 "..., 4096) = 4096
-read(8, "0 n \n0000496829 00000 n \n0000497"..., 4096) = 4096
-read(8, "00000 n \n0000522719 00000 n \n000"..., 4096) = 4096
-read(8, "766 00000 n \n0000548419 00000 n "..., 4096) = 4096
-read(8, "0574989 00000 n \n0000574733 0000"..., 4096) = 4096
-read(8, "\n0000601375 00000 n \n0000601467 "..., 4096) = 4096
-read(8, "0 n \n0000627289 00000 n \n0000627"..., 4096) = 4096
-read(8, "00000 n \n0000653206 00000 n \n000"..., 4096) = 4096
-read(8, "783 00000 n \n0000679694 00000 n "..., 4096) = 4096
-read(8, "0706504 00000 n \n0000706341 0000"..., 4096) = 4096
-read(8, "\n0000732171 00000 n \n0000732561 "..., 4096) = 4096
-read(8, "0 n \n0000760566 00000 n \n0000760"..., 4096) = 4096
-read(8, "00000 n \n0000787452 00000 n \n000"..., 4096) = 4096
-read(8, "753 00000 n \n0000813918 00000 n "..., 4096) = 4096
-read(8, "0840635 00000 n \n0000840820 0000"..., 4096) = 4096
-read(8, "\n0000867968 00000 n \n0000868263 "..., 4096) = 4096
-read(8, "0 n \n0000929507 00000 n \n0000929"..., 4096) = 4096
-read(8, "00000 n \n0000432015 00000 n \n000"..., 4096) = 4096
-read(8, "222 00000 n \n0000467486 00000 n "..., 4096) = 4096
-read(8, "0512314 00000 n \n0000512564 0000"..., 4096) = 4096
-read(8, "\n0000565053 00000 n \n0000565326 "..., 4096) = 4096
-read(8, "0 n \n0000623533 00000 n \n0000623"..., 4096) = 4096
-read(8, "00000 n \n0000682257 00000 n \n000"..., 4096) = 4096
-read(8, "308 00000 n \n0000733768 00000 n "..., 4096) = 4096
-read(8, "0782730 00000 n \n0000782993 0000"..., 4096) = 4096
-read(8, "\n0000830956 00000 n \n0000831219 "..., 4096) = 4096
-read(8, "0 n \n0000876188 00000 n \n0000876"..., 4096) = 1946
-read(8, "", 4096) = 0
-read(8, "", 4096) = 0
-close(8) = 0
-write(7, " ]\n/DocChecksum /A9128BDB763FCCD"..., 76) = 76
-close(7) = 0
-close(6) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\241\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741825, len=1}) = 0
-lseek(3, 141312, SEEK_SET) = 141312
-read(3, "\2\0\0\0\n\1\322\0\0\0\0b\2y\2A\2\t\2\260\2\350\3X\1\322\3 \3\220\3\310"..., 1024) = 1024
-lseek(3, 103424, SEEK_SET) = 103424
-read(3, "\n\0\0\0\22\0]\0\0\371\1-\1a\1\224\1\310\1\373\2/\0]\2c\2\227\2\313\2\377"..., 1024) = 1024
-rename("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/tmp/svn-2LgtUH", "/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/pristine/e9/e98ce4d859b08fcc744bd1f50aef6dd6f418493f.svn-base") = 0
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/pristine/e9/e98ce4d859b08fcc744bd1f50aef6dd6f418493f.svn-base", {st_mode=S_IFREG|0664, st_size=438348, ...}) = 0
-lseek(3, 114688, SEEK_SET) = 114688
-read(3, "\n\0\0\0\26\0>\0\0>\0i\0\225\0\301\0\355\1\31\1D\1o\1\233\1\307\1\363\2\37"..., 1024) = 1024
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-open("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", O_RDWR|O_CREAT|O_CLOEXEC, 0644) = 6
-fstat(6, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
-geteuid() = 530
-fstat(6, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
-lseek(6, 0, SEEK_SET) = 0
-write(6, "\331\325\5\371 \241c\327\377\377\377\377\267[\205\232\0\0\0\241\0\0\2\0\0\0\4\0\0\0\0\0"..., 512) = 512
-lseek(6, 512, SEEK_SET) = 512
-write(6, "\0\0\0006", 4) = 4
-lseek(6, 516, SEEK_SET) = 516
-write(6, "\2\1\370\0\21\0L\3\0\0\0\215\2S\0\253\0|\1\311\1\231\3p\1j\3\320\0\333\3A"..., 1024) = 1024
-lseek(6, 1540, SEEK_SET) = 1540
-write(6, "\267[\206g", 4) = 4
-lseek(3, 115712, SEEK_SET) = 115712
-read(3, "\n\0\0\0\25\0l\0\0l\0\230\0\303\0\357\1\33\1G\1s\1\237\1\312\1\366\2!\2M"..., 1024) = 1024
-lseek(3, 113664, SEEK_SET) = 113664
-read(3, "\n\0\0\0\26\0D\0\0D\0p\0\234\0\310\0\363\1\37\1J\1v\1\241\1\314\1\370\2$"..., 1024) = 1024
-lseek(6, 1544, SEEK_SET) = 1544
-write(6, "\0\0\0p", 4) = 4
-lseek(6, 1548, SEEK_SET) = 1548
-write(6, "\n\0\0\0\26\0D\0\0D\0p\0\234\0\310\0\363\1\37\1J\1v\1\241\1\314\1\370\2$"..., 1024) = 1024
-lseek(6, 2572, SEEK_SET) = 2572
-write(6, "\267[\206\315", 4) = 4
-lseek(6, 2576, SEEK_SET) = 2576
-write(6, "\0\0\0q", 4) = 4
-lseek(6, 2580, SEEK_SET) = 2580
-write(6, "\n\0\0\0\26\0>\0\0>\0i\0\225\0\301\0\355\1\31\1D\1o\1\233\1\307\1\363\2\37"..., 1024) = 1024
-lseek(6, 3604, SEEK_SET) = 3604
-write(6, "\267[\206\250", 4) = 4
-lseek(6, 3608, SEEK_SET) = 3608
-write(6, "\0\0\0r", 4) = 4
-lseek(6, 3612, SEEK_SET) = 3612
-write(6, "\n\0\0\0\25\0l\0\0l\0\230\0\303\0\357\1\33\1G\1s\1\237\1\312\1\366\2!\2M"..., 1024) = 1024
-lseek(6, 4636, SEEK_SET) = 4636
-write(6, "\267[\206\203", 4) = 4
-lseek(6, 4640, SEEK_SET) = 4640
-write(6, "\0\0\0\213", 4) = 4
-lseek(6, 4644, SEEK_SET) = 4644
-write(6, "\2\0\0\0\n\1\322\0\0\0\0b\2y\2A\2\t\2\260\2\350\3X\1\322\3 \3\220\3\310"..., 1024) = 1024
-lseek(6, 5668, SEEK_SET) = 5668
-write(6, "\267[\206\2", 4) = 4
-lseek(3, 136192, SEEK_SET) = 136192
-read(3, "\n\0\0\0\f\1\222\0\2.\2b\1\372\2\226\2\311\1\222\1\306\2\375\0031\3e\3\231\3\315"..., 1024) = 1024
-lseek(3, 160768, SEEK_SET) = 160768
-read(3, "\n\0\0\0\n\1\374\0\0020\2c\2\226\2\312\2\375\1\374\0030\3d\3\230\3\314\0\0\0\0"..., 1024) = 1024
-lseek(6, 5672, SEEK_SET) = 5672
-write(6, "\0\0\0\236", 4) = 4
-lseek(6, 5676, SEEK_SET) = 5676
-write(6, "\n\0\0\0\n\1\374\0\0020\2c\2\226\2\312\2\375\1\374\0030\3d\3\230\3\314\0\0\0\0"..., 1024) = 1024
-lseek(6, 6700, SEEK_SET) = 6700
-write(6, "\267[\206\1", 4) = 4
-lseek(6, 6704, SEEK_SET) = 6704
-write(6, "\0\0\0f", 4) = 4
-lseek(6, 6708, SEEK_SET) = 6708
-write(6, "\n\0\0\0\22\0]\0\0\371\1-\1a\1\224\1\310\1\373\2/\0]\2c\2\227\2\313\2\377"..., 1024) = 1024
-lseek(6, 7732, SEEK_SET) = 7732
-write(6, "\267[\207\5", 4) = 4
-lseek(6, 7736, SEEK_SET) = 7736
-write(6, "\0\0\0\206", 4) = 4
-lseek(6, 7740, SEEK_SET) = 7740
-write(6, "\n\0\0\0\f\1\222\0\2.\2b\1\372\2\226\2\311\1\222\1\306\2\375\0031\3e\3\231\3\315"..., 1024) = 1024
-lseek(6, 8764, SEEK_SET) = 8764
-write(6, "\267[\206\230", 4) = 4
-lseek(6, 8768, SEEK_SET) = 8768
-write(6, "\0\0\0\240", 4) = 4
-lseek(6, 8772, SEEK_SET) = 8772
-write(6, "\r\0\0\0\4\2\202\0\3\241\3B\2\342\2\202\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(6, 9796, SEEK_SET) = 9796
-write(6, "\267[\205\316", 4) = 4
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-lseek(6, 9800, SEEK_SET) = 9800
-write(6, "\0\0\0\1", 4) = 4
-lseek(6, 9804, SEEK_SET) = 9804
-write(6, "SQLite format 3\0\4\0\1\1\0@ \0\0\5\241\0\0\0\241"..., 1024) = 1024
-lseek(6, 10828, SEEK_SET) = 10828
-write(6, "\267[\205\232", 4) = 4
-lseek(3, 0, SEEK_SET) = 0
-write(3, "SQLite format 3\0\4\0\1\1\0@ \0\0\5\242\0\0\0\241"..., 1024) = 1024
-lseek(3, 54272, SEEK_SET) = 54272
-write(3, "\2\1\370\0\21\0L\3\0\0\0\215\2S\0\253\0|\1\311\1\231\3p\1j\3\320\0\333\3A"..., 1024) = 1024
-lseek(3, 103424, SEEK_SET) = 103424
-write(3, "\n\0\0\0\20\0\306\0\0\306\0\371\1,\1`\1\223\1\306\1\372\2.\2b\2\226\2\312\2\376"..., 1024) = 1024
-lseek(3, 113664, SEEK_SET) = 113664
-write(3, "\n\0\0\0\26\0D\0\0D\0p\0\234\0\310\0\363\1\37\1J\1v\1\241\1\314\1\370\2$"..., 1024) = 1024
-lseek(3, 114688, SEEK_SET) = 114688
-write(3, "\n\0\0\0\26\0>\0\0>\0i\0\225\0\301\0\355\1\31\1D\1o\1\233\1\307\1\363\2\37"..., 1024) = 1024
-lseek(3, 115712, SEEK_SET) = 115712
-write(3, "\n\0\0\0\26\0@\0\0@\0l\0\230\0\303\0\357\1\33\1G\1s\1\237\1\312\1\366\2!"..., 1024) = 1024
-lseek(3, 136192, SEEK_SET) = 136192
-write(3, "\n\0\0\0\16\1+\0\1+\1_\1\223\1\307\1\373\2/\2b\2\225\2\311\2\374\0030\3d"..., 1024) = 1024
-lseek(3, 141312, SEEK_SET) = 141312
-write(3, "\2\0\0\0\n\1\322\0\0\0\0b\2y\2A\2\t\2\260\2\350\3X\1\322\3 \3\220\3\310"..., 1024) = 1024
-lseek(3, 160768, SEEK_SET) = 160768
-write(3, "\n\0\0\0\v\1\306\0\1\306\1\372\2.\2a\2\225\2\311\2\375\0031\3e\3\231\3\315\0\0"..., 1024) = 1024
-lseek(3, 162816, SEEK_SET) = 162816
-write(3, "\r\0\0\0\5\2\"\0\3\241\3B\2\342\2\202\2\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-close(6) = 0
-unlink("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal") = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=2}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN|EPOLLOUT, {u32=3303153608, u64=140397194125256}}) = 0
-epoll_wait(4, {{EPOLLOUT, {u32=3303153608, u64=140397194125256}}}, 16, 500) = 1
-write(9, "0000 n \n0000430066 00000 n \n0000"..., 246) = 246
-lseek(9, 0, SEEK_SET) = 0
-stat("/tmp/svn-S2P1pi", {st_mode=S_IFREG|0600, st_size=315638, ...}) = 0
-mmap(NULL, 315638, PROT_READ, MAP_SHARED, 9, 0) = 0x7fb0c4104000
-writev(5, [{"PUT /svn/aprx/!svn/wrk/9ce1e70b-"..., 96}, {"Host", 4}, {": ", 2}, {"repo.ham.fi", 11}, {"\r\n", 2}, {"Authorization", 13}, {": ", 2}, {"Basic b2gybXFrOnJpZnJhZjIy", 26}, {"\r\n", 2}, {"User-Agent", 10}, {": ", 2}, {"SVN/1.8.8 (x86_64-redhat-linux-g"..., 46}, {"\r\n", 2}, {"Content-Type", 12}, {": ", 2}, {"application/vnd.svn-svndiff", 27}, {"\r\n", 2}, {"Accept-Encoding", 15}, {": ", 2}, {"gzip", 4}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"... [...]
-writev(5, [{"\242\5\36\341\313\222\"\237\0053\204\364\f\243\265\0\271\22\2304D\376dVK\206\261\n\370\275+v"..., 94736}, {"\r\n", 2}, {"0\r\n\r\n", 5}], 3) = -1 EAGAIN (Resource temporarily unavailable)
-epoll_wait(4, {{EPOLLOUT, {u32=3303153608, u64=140397194125256}}}, 16, 500) = 1
-writev(5, [{"\242\5\36\341\313\222\"\237\0053\204\364\f\243\265\0\271\22\2304D\376dVK\206\261\n\370\275+v"..., 94736}, {"\r\n", 2}, {"0\r\n\r\n", 5}], 3) = 86880
-writev(5, [{"00000000 65535 f \n0000399797 000"..., 7856}, {"\r\n", 2}, {"0\r\n\r\n", 5}], 3) = -1 EAGAIN (Resource temporarily unavailable)
-epoll_wait(4, {{EPOLLOUT, {u32=3303153608, u64=140397194125256}}}, 16, 500) = 1
-writev(5, [{"00000000 65535 f \n0000399797 000"..., 7856}, {"\r\n", 2}, {"0\r\n\r\n", 5}], 3) = 7863
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN, {u32=3303153656, u64=140397194125304}}) = 0
-epoll_wait(4, {{EPOLLIN, {u32=3303153656, u64=140397194125304}}}, 16, 500) = 1
-read(5, "HTTP/1.1 204 No Content\r\nDate: M"..., 8000) = 106
-munmap(0x7fb0c4104000, 315638) = 0
-close(9) = 0
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN|EPOLLOUT, {u32=3303153608, u64=140397194125256}}) = 0
-epoll_wait(4, {{EPOLLOUT, {u32=3303153608, u64=140397194125256}}}, 16, 500) = 1
-writev(5, [{"MERGE /svn/aprx/trunk/doc HTTP/1"..., 36}, {"Host", 4}, {": ", 2}, {"repo.ham.fi", 11}, {"\r\n", 2}, {"Authorization", 13}, {": ", 2}, {"Basic b2gybXFrOnJpZnJhZjIy", 26}, {"\r\n", 2}, {"User-Agent", 10}, {": ", 2}, {"SVN/1.8.8 (x86_64-redhat-linux-g"..., 46}, {"\r\n", 2}, {"Accept-Encoding", 15}, {": ", 2}, {"gzip", 4}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"..., 48}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"..., [...]
-writev(5, [{"2b\r\n", 4}, {"</", 2}, {"D:creator-displayname", 21}, {">", 1}, {"</", 2}, {"D:prop", 6}, {">", 1}, {"</", 2}, {"D:merge", 7}, {">", 1}, {"\r\n", 2}, {"0\r\n\r\n", 5}], 12) = 54
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN, {u32=3303153656, u64=140397194125304}}) = 0
-epoll_wait(4, {{EPOLLIN, {u32=3303153656, u64=140397194125304}}}, 16, 500) = 1
-read(5, "HTTP/1.1 200 OK\r\nDate: Mon, 24 M"..., 8000) = 542
-brk(0) = 0x7fb0c4e6c000
-brk(0x7fb0c4e8d000) = 0x7fb0c4e8d000
-brk(0) = 0x7fb0c4e8d000
-brk(0) = 0x7fb0c4e8d000
-brk(0x7fb0c4e85000) = 0x7fb0c4e85000
-brk(0) = 0x7fb0c4e85000
-write(1, "\nCommitted revision 590.\n", 25) = 25
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN|EPOLLOUT, {u32=3303153608, u64=140397194125256}}) = 0
-epoll_wait(4, {{EPOLLOUT, {u32=3303153608, u64=140397194125256}}}, 16, 500) = 1
-writev(5, [{"DELETE /svn/aprx/!svn/act/9ce1e7"..., 73}, {"Host", 4}, {": ", 2}, {"repo.ham.fi", 11}, {"\r\n", 2}, {"Authorization", 13}, {": ", 2}, {"Basic b2gybXFrOnJpZnJhZjIy", 26}, {"\r\n", 2}, {"User-Agent", 10}, {": ", 2}, {"SVN/1.8.8 (x86_64-redhat-linux-g"..., 46}, {"\r\n", 2}, {"Accept-Encoding", 15}, {": ", 2}, {"gzip", 4}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"..., 48}, {"\r\n", 2}, {"DAV", 3}, {": ", 2}, {"http://subversion.tigris.org/xml"..., [...]
-epoll_ctl(4, EPOLL_CTL_DEL, 5, {0, {u32=0, u64=0}}) = 0
-epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN, {u32=3303153656, u64=140397194125304}}) = 0
-epoll_wait(4, {{EPOLLIN, {u32=3303153656, u64=140397194125304}}}, 16, 500) = 1
-read(5, "HTTP/1.1 204 No Content\r\nDate: M"..., 8000) = 106
-unlink("/tmp/svn-S2P1pi") = 0
-unlink("/tmp/svn-4fJ8w7") = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual.odt", {st_mode=S_IFREG|0664, st_size=197896, ...}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\242\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\242\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741825, len=1}) = 0
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-open("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", O_RDWR|O_CREAT|O_CLOEXEC, 0644) = 6
-fstat(6, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
-geteuid() = 530
-fstat(6, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
-lseek(6, 0, SEEK_SET) = 0
-write(6, "\331\325\5\371 \241c\327\377\377\377\377\3200\257Y\0\0\0\241\0\0\2\0\0\0\4\0\0\0\0\0"..., 512) = 512
-lseek(6, 512, SEEK_SET) = 512
-write(6, "\0\0\0t", 4) = 4
-lseek(6, 516, SEEK_SET) = 516
-write(6, "\n\0\0\0\21\1\265\0\1\265\1\316\1\360\2\n\2-\2L\2k\2\234\2\315\2\357\3\16\0030"..., 1024) = 1024
-lseek(6, 1540, SEEK_SET) = 1540
-write(6, "\3200\257\323", 4) = 4
-lseek(3, 101376, SEEK_SET) = 101376
-read(3, "\n\0035\0`\1\30\0\3\371\3\362\3\353\3\344\3\335\3\326\3\317\3\310\3\301\3\272\3\263\3\254"..., 1024) = 1024
-lseek(6, 1544, SEEK_SET) = 1544
-write(6, "\0\0\0d", 4) = 4
-lseek(6, 1548, SEEK_SET) = 1548
-write(6, "\n\0035\0`\1\30\0\3\371\3\362\3\353\3\344\3\335\3\326\3\317\3\310\3\301\3\272\3\263\3\254"..., 1024) = 1024
-lseek(6, 2572, SEEK_SET) = 2572
-write(6, "\3200\257p", 4) = 4
-lseek(6, 2576, SEEK_SET) = 2576
-write(6, "\0\0\0005", 4) = 4
-lseek(6, 2580, SEEK_SET) = 2580
-write(6, "\n\3\226\0\35\0012\2\1d\1|\1\233\0012\1\304\1\333\1\356\2\0\2\33\1\260\2B\2M"..., 1024) = 1024
-lseek(6, 3604, SEEK_SET) = 3604
-write(6, "\3200\260:", 4) = 4
-lseek(6, 3608, SEEK_SET) = 3608
-write(6, "\0\0\0h", 4) = 4
-lseek(6, 3612, SEEK_SET) = 3612
-write(6, "\r\0\0\0\3\0\311\0\0\311\1\341\2\350\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(6, 4636, SEEK_SET) = 4636
-write(6, "\3200\2602", 4) = 4
-lseek(6, 4640, SEEK_SET) = 4640
-write(6, "\0\0\0\224", 4) = 4
-lseek(6, 4644, SEEK_SET) = 4644
-write(6, "\r\0\0\0\n\0F\0\3\241\3A\2\341\2\202\2\"\1\303\1d\1\5\0\245\0F\0\0\0\0"..., 1024) = 1024
-lseek(6, 5668, SEEK_SET) = 5668
-write(6, "\3200\260h", 4) = 4
-lseek(6, 5672, SEEK_SET) = 5672
-write(6, "\0\0\0\241", 4) = 4
-lseek(6, 5676, SEEK_SET) = 5676
-write(6, "\r\3(\0\2\1\301\0\1\301\2\244\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(6, 6700, SEEK_SET) = 6700
-write(6, "\3200\257\313", 4) = 4
-lseek(6, 6704, SEEK_SET) = 6704
-write(6, "\0\0\0\240", 4) = 4
-lseek(6, 6708, SEEK_SET) = 6708
-write(6, "\r\0\0\0\5\2\"\0\3\241\3B\2\342\2\202\2\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(6, 7732, SEEK_SET) = 7732
-write(6, "\3200\257\304", 4) = 4
-lseek(3, 3072, SEEK_SET) = 3072
-read(3, "\r\0\0\0\3\3\325\0\3\361\3\346\3\325\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(6, 7736, SEEK_SET) = 7736
-write(6, "\0\0\0\25", 4) = 4
-lseek(6, 7740, SEEK_SET) = 7740
-write(6, "\r\0\0\0\0\4\0\0\2\230\2\230\2\230\2\230\2\230\2\230\2\230\2\230\2\230\1\232\1\232\1\232"..., 1024) = 1024
-lseek(6, 8764, SEEK_SET) = 8764
-write(6, "\3200\257[", 4) = 4
-lseek(6, 8768, SEEK_SET) = 8768
-write(6, "\0\0\0\4", 4) = 4
-lseek(6, 8772, SEEK_SET) = 8772
-write(6, "\r\0\0\0\3\3\325\0\3\361\3\346\3\325\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(6, 9796, SEEK_SET) = 9796
-write(6, "\3200\257Y", 4) = 4
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-lseek(6, 9800, SEEK_SET) = 9800
-write(6, "\0\0\0\1", 4) = 4
-lseek(6, 9804, SEEK_SET) = 9804
-write(6, "SQLite format 3\0\4\0\1\1\0@ \0\0\5\242\0\0\0\241"..., 1024) = 1024
-lseek(6, 10828, SEEK_SET) = 10828
-write(6, "\3200\257Y", 4) = 4
-lseek(3, 0, SEEK_SET) = 0
-write(3, "SQLite format 3\0\4\0\1\1\0@ \0\0\5\243\0\0\0\241"..., 1024) = 1024
-lseek(3, 3072, SEEK_SET) = 3072
-write(3, "\r\0\0\0\3\3\325\0\3\361\3\346\3\325\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 20480, SEEK_SET) = 20480
-write(3, "\r\0\0\0\1\3\331\0\3\331\2\230\2\230\2\230\2\230\2\230\2\230\2\230\2\230\1\232\1\232\1\232"..., 1024) = 1024
-lseek(3, 53248, SEEK_SET) = 53248
-write(3, "\n\3\226\0\35\0012\2\1d\1|\1\233\0012\1\304\1\333\1\356\2\0\2\33\1\260\2B\2M"..., 1024) = 1024
-lseek(3, 101376, SEEK_SET) = 101376
-write(3, "\n\0035\0`\1\30\0\3\371\3\362\3\353\3\344\3\335\3\326\3\317\3\310\3\301\3\272\3\263\3\254"..., 1024) = 1024
-lseek(3, 105472, SEEK_SET) = 105472
-write(3, "\r\2\350\0\2\0\311\0\0\311\1\341\2\350\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 117760, SEEK_SET) = 117760
-write(3, "\n\0\0\0\21\1\265\0\1\265\1\316\1\360\2\n\2-\2L\2k\2\234\2\315\2\357\3\16\0030"..., 1024) = 1024
-lseek(3, 150528, SEEK_SET) = 150528
-write(3, "\r\0\0\0\n\0F\0\3\241\3A\2\341\2\202\2\"\1\303\1d\1\5\0\245\0F\0\0\0\0"..., 1024) = 1024
-lseek(3, 162816, SEEK_SET) = 162816
-write(3, "\r\0\0\0\5\2\"\0\3\241\3B\2\342\2\202\2\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 163840, SEEK_SET) = 163840
-write(3, "\r\3(\0\3\0\264\0\1\301\2\244\0\264\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-close(6) = 0
-unlink("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal") = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=2}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual.pdf", {st_mode=S_IFREG|0664, st_size=438348, ...}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\243\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\243\0\0\0\241\0\0\0v\0\0\0\1", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741825, len=1}) = 0
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-open("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", O_RDWR|O_CREAT|O_CLOEXEC, 0644) = 6
-fstat(6, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
-geteuid() = 530
-fstat(6, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
-lseek(6, 0, SEEK_SET) = 0
-write(6, "\331\325\5\371 \241c\327\377\377\377\377{)\253\354\0\0\0\241\0\0\2\0\0\0\4\0\0\0\0\0"..., 512) = 512
-lseek(6, 512, SEEK_SET) = 512
-write(6, "\0\0\0t", 4) = 4
-lseek(6, 516, SEEK_SET) = 516
-write(6, "\n\0\0\0\21\1\265\0\1\265\1\316\1\360\2\n\2-\2L\2k\2\234\2\315\2\357\3\16\0030"..., 1024) = 1024
-lseek(6, 1540, SEEK_SET) = 1540
-write(6, "{)\254f", 4) = 4
-lseek(6, 1544, SEEK_SET) = 1544
-write(6, "\0\0\0d", 4) = 4
-lseek(6, 1548, SEEK_SET) = 1548
-write(6, "\n\0035\0`\1\30\0\3\371\3\362\3\353\3\344\3\335\3\326\3\317\3\310\3\301\3\272\3\263\3\254"..., 1024) = 1024
-lseek(6, 2572, SEEK_SET) = 2572
-write(6, "{)\254\3", 4) = 4
-lseek(6, 2576, SEEK_SET) = 2576
-write(6, "\0\0\0005", 4) = 4
-lseek(6, 2580, SEEK_SET) = 2580
-write(6, "\n\3\226\0\35\0012\2\1d\1|\1\233\0012\1\304\1\333\1\356\2\0\2\33\1\260\2B\2M"..., 1024) = 1024
-lseek(6, 3604, SEEK_SET) = 3604
-write(6, "{)\254\315", 4) = 4
-lseek(6, 3608, SEEK_SET) = 3608
-write(6, "\0\0\0h", 4) = 4
-lseek(6, 3612, SEEK_SET) = 3612
-write(6, "\r\2\350\0\2\0\311\0\0\311\1\341\2\350\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(6, 4636, SEEK_SET) = 4636
-write(6, "{)\254S", 4) = 4
-lseek(6, 4640, SEEK_SET) = 4640
-write(6, "\0\0\0\30", 4) = 4
-lseek(6, 4644, SEEK_SET) = 4644
-write(6, "\5\3~\0$\3\25\f\0\0\0\241\3\265\3\260\3L\3X\3\246\3\241\3\234\3\227\3\222\3\210"..., 1024) = 1024
-lseek(6, 5668, SEEK_SET) = 5668
-write(6, "{)\254\26", 4) = 4
-lseek(3, 139264, SEEK_SET) = 139264
-read(3, "\r\2i\0\2\1\237\0\1\237\0030\0039\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(6, 5672, SEEK_SET) = 5672
-write(6, "\0\0\0\211", 4) = 4
-lseek(6, 5676, SEEK_SET) = 5676
-write(6, "\r\2i\0\2\1\237\0\1\237\0030\0039\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(6, 6700, SEEK_SET) = 6700
-write(6, "{)\254\2", 4) = 4
-lseek(6, 6704, SEEK_SET) = 6704
-write(6, "\0\0\0\1", 4) = 4
-lseek(6, 6708, SEEK_SET) = 6708
-write(6, "SQLite format 3\0\4\0\1\1\0@ \0\0\5\243\0\0\0\241"..., 1024) = 1024
-lseek(6, 7732, SEEK_SET) = 7732
-write(6, "{)\253\354", 4) = 4
-lseek(6, 7736, SEEK_SET) = 7736
-write(6, "\0\0\0\222", 4) = 4
-lseek(6, 7740, SEEK_SET) = 7740
-write(6, "\r\0\0\0\2\2\202\0\2\202\3\17\3\17\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(6, 8764, SEEK_SET) = 8764
-write(6, "{)\254\32", 4) = 4
-lseek(3, 119808, SEEK_SET) = 119808
-read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(6, 8768, SEEK_SET) = 8768
-write(6, "\0\0\0v", 4) = 4
-lseek(6, 8772, SEEK_SET) = 8772
-write(6, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(6, 9796, SEEK_SET) = 9796
-write(6, "{)\253\354", 4) = 4
-lseek(6, 9800, SEEK_SET) = 9800
-write(6, "\0\0\0\217", 4) = 4
-lseek(6, 9804, SEEK_SET) = 9804
-write(6, "\r\0\0\0\n\0F\0\3\241\3A\2\342\2\203\2#\1\303\1d\1\5\0\246\0F\0\0\0\0"..., 1024) = 1024
-lseek(6, 10828, SEEK_SET) = 10828
-write(6, "{)\254\372", 4) = 4
-lseek(6, 10832, SEEK_SET) = 10832
-write(6, "\0\0\0\241", 4) = 4
-lseek(6, 10836, SEEK_SET) = 10836
-write(6, "\r\3(\0\3\0\264\0\1\301\2\244\0\264\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(6, 11860, SEEK_SET) = 11860
-write(6, "{)\254\376", 4) = 4
-lseek(6, 11864, SEEK_SET) = 11864
-write(6, "\0\0\0\240", 4) = 4
-lseek(6, 11868, SEEK_SET) = 11868
-write(6, "\r\0\0\0\5\2\"\0\3\241\3B\2\342\2\202\2\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(6, 12892, SEEK_SET) = 12892
-write(6, "{)\254W", 4) = 4
-lseek(6, 12896, SEEK_SET) = 12896
-write(6, "\0\0\0\25", 4) = 4
-lseek(6, 12900, SEEK_SET) = 12900
-write(6, "\r\0\0\0\1\3\331\0\3\331\2\230\2\230\2\230\2\230\2\230\2\230\2\230\2\230\1\232\1\232\1\232"..., 1024) = 1024
-lseek(6, 13924, SEEK_SET) = 13924
-write(6, "{)\253\356", 4) = 4
-lseek(6, 13928, SEEK_SET) = 13928
-write(6, "\0\0\0\4", 4) = 4
-lseek(6, 13932, SEEK_SET) = 13932
-write(6, "\r\0\0\0\3\3\325\0\3\361\3\346\3\325\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(6, 14956, SEEK_SET) = 14956
-write(6, "{)\253\354", 4) = 4
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-lseek(3, 0, SEEK_SET) = 0
-write(3, "SQLite format 3\0\4\0\1\1\0@ \0\0\5\244\0\0\0\241"..., 1024) = 1024
-lseek(3, 3072, SEEK_SET) = 3072
-write(3, "\r\0\0\0\3\3\325\0\3\361\3\346\3\325\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 20480, SEEK_SET) = 20480
-write(3, "\r\0\0\0\2\3\262\0\3\331\3\262\2\230\2\230\2\230\2\230\2\230\2\230\2\230\1\232\1\232\1\232"..., 1024) = 1024
-lseek(3, 23552, SEEK_SET) = 23552
-write(3, "\5\3~\0#\3\25\f\0\0\0\241\3\265\3\260\3L\3X\3\246\3\241\3\234\3\227\3\222\3\210"..., 1024) = 1024
-lseek(3, 53248, SEEK_SET) = 53248
-write(3, "\n\3\226\0\35\0012\2\1d\1|\1\233\0012\1\304\1\333\1\356\2\0\2\33\1\260\2B\2M"..., 1024) = 1024
-lseek(3, 101376, SEEK_SET) = 101376
-write(3, "\n\0035\0`\1\30\0\3\371\3\362\3\353\3\344\3\335\3\326\3\317\3\310\3\301\3\272\3\263\3\254"..., 1024) = 1024
-lseek(3, 105472, SEEK_SET) = 105472
-write(3, "\r\0\0\0\3\1_\0\1_\2)\2\371\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 117760, SEEK_SET) = 117760
-write(3, "\n\0\0\0\21\1\265\0\1\265\1\316\1\360\2\n\2-\2L\2k\2\234\2\315\2\357\3\16\0030"..., 1024) = 1024
-lseek(3, 119808, SEEK_SET) = 119808
-write(3, "\0\0\0\0\0\0\0\1\0\0\0\222\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 139264, SEEK_SET) = 139264
-write(3, "\r\0\0\0\2\2\202\0\2\202\3\17\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 145408, SEEK_SET) = 145408
-write(3, "\r\0\0\0\n\0F\0\3\241\3A\2\342\2\203\2#\1\303\1d\1\5\0\246\0F\0\0\0\0"..., 1024) = 1024
-lseek(3, 148480, SEEK_SET) = 148480
-write(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 162816, SEEK_SET) = 162816
-write(3, "\r\0\0\0\5\2\"\0\3\241\3B\2\342\2\202\2\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 163840, SEEK_SET) = 163840
-write(3, "\r\0\0\0\4\0\177\0\3\35\2\231\1\214\0\177\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-close(6) = 0
-unlink("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal") = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=2}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\244\0\0\0\241\0\0\0v\0\0\0\2", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual.odt", {st_mode=S_IFREG|0664, st_size=197896, ...}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\244\0\0\0\241\0\0\0v\0\0\0\2", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\244\0\0\0\241\0\0\0v\0\0\0\2", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\244\0\0\0\241\0\0\0v\0\0\0\2", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\244\0\0\0\241\0\0\0v\0\0\0\2", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual.odt", {st_mode=S_IFREG|0664, st_size=197896, ...}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual.odt", {st_mode=S_IFREG|0664, st_size=197896, ...}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual.odt", {st_mode=S_IFREG|0664, st_size=197896, ...}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\244\0\0\0\241\0\0\0v\0\0\0\2", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741825, len=1}) = 0
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-open("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", O_RDWR|O_CREAT|O_CLOEXEC, 0644) = 6
-fstat(6, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
-geteuid() = 530
-fstat(6, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
-lseek(6, 0, SEEK_SET) = 0
-write(6, "\331\325\5\371 \241c\327\377\377\377\377h\201\256\326\0\0\0\241\0\0\2\0\0\0\4\0\0\0\0\0"..., 512) = 512
-lseek(6, 512, SEEK_SET) = 512
-write(6, "\0\0\0\241", 4) = 4
-lseek(6, 516, SEEK_SET) = 516
-write(6, "\r\0\0\0\4\0\177\0\3\35\2\231\1\214\0\177\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(6, 1540, SEEK_SET) = 1540
-write(6, "h\201\257{", 4) = 4
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-lseek(6, 1544, SEEK_SET) = 1544
-write(6, "\0\0\0\1", 4) = 4
-lseek(6, 1548, SEEK_SET) = 1548
-write(6, "SQLite format 3\0\4\0\1\1\0@ \0\0\5\244\0\0\0\241"..., 1024) = 1024
-lseek(6, 2572, SEEK_SET) = 2572
-write(6, "h\201\256\326", 4) = 4
-lseek(3, 0, SEEK_SET) = 0
-write(3, "SQLite format 3\0\4\0\1\1\0@ \0\0\5\245\0\0\0\241"..., 1024) = 1024
-lseek(3, 163840, SEEK_SET) = 163840
-write(3, "\r\0\0\0\4\0t\0\3\35\2\231\0t\1\214\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-close(6) = 0
-unlink("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal") = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=2}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\245\0\0\0\241\0\0\0v\0\0\0\2", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741825, len=1}) = 0
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-open("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", O_RDWR|O_CREAT|O_CLOEXEC, 0644) = 6
-fstat(6, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
-geteuid() = 530
-fstat(6, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
-lseek(6, 0, SEEK_SET) = 0
-write(6, "\331\325\5\371 \241c\327\377\377\377\377\360IZ\206\0\0\0\241\0\0\2\0\0\0\4\0\0\0\0\0"..., 512) = 512
-lseek(6, 512, SEEK_SET) = 512
-write(6, "\0\0\0\25", 4) = 4
-lseek(6, 516, SEEK_SET) = 516
-write(6, "\r\0\0\0\2\3\262\0\3\331\3\262\2\230\2\230\2\230\2\230\2\230\2\230\2\230\1\232\1\232\1\232"..., 1024) = 1024
-lseek(6, 1540, SEEK_SET) = 1540
-write(6, "\360IZ\210", 4) = 4
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-lseek(6, 1544, SEEK_SET) = 1544
-write(6, "\0\0\0\1", 4) = 4
-lseek(6, 1548, SEEK_SET) = 1548
-write(6, "SQLite format 3\0\4\0\1\1\0@ \0\0\5\245\0\0\0\241"..., 1024) = 1024
-lseek(6, 2572, SEEK_SET) = 2572
-write(6, "\360IZ\206", 4) = 4
-lseek(3, 0, SEEK_SET) = 0
-write(3, "SQLite format 3\0\4\0\1\1\0@ \0\0\5\246\0\0\0\241"..., 1024) = 1024
-lseek(3, 20480, SEEK_SET) = 20480
-write(3, "\r\3\331\0\1\3\262\0\3\262\3\262\2\230\2\230\2\230\2\230\2\230\2\230\2\230\1\232\1\232\1\232"..., 1024) = 1024
-close(6) = 0
-unlink("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal") = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=2}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual.pdf", {st_mode=S_IFREG|0664, st_size=438348, ...}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\246\0\0\0\241\0\0\0v\0\0\0\2", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\246\0\0\0\241\0\0\0v\0\0\0\2", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\246\0\0\0\241\0\0\0v\0\0\0\2", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\246\0\0\0\241\0\0\0v\0\0\0\2", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual.pdf", {st_mode=S_IFREG|0664, st_size=438348, ...}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual.pdf", {st_mode=S_IFREG|0664, st_size=438348, ...}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/doc/aprx-manual.pdf", {st_mode=S_IFREG|0664, st_size=438348, ...}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\246\0\0\0\241\0\0\0v\0\0\0\2", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741825, len=1}) = 0
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-open("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", O_RDWR|O_CREAT|O_CLOEXEC, 0644) = 6
-fstat(6, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
-geteuid() = 530
-fstat(6, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
-lseek(6, 0, SEEK_SET) = 0
-write(6, "\331\325\5\371 \241c\327\377\377\377\377\314\357S\363\0\0\0\241\0\0\2\0\0\0\4\0\0\0\0\0"..., 512) = 512
-lseek(6, 512, SEEK_SET) = 512
-write(6, "\0\0\0\241", 4) = 4
-lseek(6, 516, SEEK_SET) = 516
-write(6, "\r\0\0\0\4\0t\0\3\35\2\231\0t\1\214\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(6, 1540, SEEK_SET) = 1540
-write(6, "\314\357T\316", 4) = 4
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-lseek(6, 1544, SEEK_SET) = 1544
-write(6, "\0\0\0\1", 4) = 4
-lseek(6, 1548, SEEK_SET) = 1548
-write(6, "SQLite format 3\0\4\0\1\1\0@ \0\0\5\246\0\0\0\241"..., 1024) = 1024
-lseek(6, 2572, SEEK_SET) = 2572
-write(6, "\314\357S\363", 4) = 4
-lseek(3, 0, SEEK_SET) = 0
-write(3, "SQLite format 3\0\4\0\1\1\0@ \0\0\5\247\0\0\0\241"..., 1024) = 1024
-lseek(3, 163840, SEEK_SET) = 163840
-write(3, "\r\0\0\0\4\0i\0\3\35\2\231\1\201\0i\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-close(6) = 0
-unlink("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal") = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=2}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\247\0\0\0\241\0\0\0v\0\0\0\2", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741825, len=1}) = 0
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-open("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", O_RDWR|O_CREAT|O_CLOEXEC, 0644) = 6
-fstat(6, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
-geteuid() = 530
-fstat(6, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
-lseek(6, 0, SEEK_SET) = 0
-write(6, "\331\325\5\371 \241c\327\377\377\377\377\345u\251\254\0\0\0\241\0\0\2\0\0\0\4\0\0\0\0\0"..., 512) = 512
-lseek(6, 512, SEEK_SET) = 512
-write(6, "\0\0\0\25", 4) = 4
-lseek(6, 516, SEEK_SET) = 516
-write(6, "\r\3\331\0\1\3\262\0\3\262\3\262\2\230\2\230\2\230\2\230\2\230\2\230\2\230\1\232\1\232\1\232"..., 1024) = 1024
-lseek(6, 1540, SEEK_SET) = 1540
-write(6, "\345u\251\256", 4) = 4
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-lseek(6, 1544, SEEK_SET) = 1544
-write(6, "\0\0\0\1", 4) = 4
-lseek(6, 1548, SEEK_SET) = 1548
-write(6, "SQLite format 3\0\4\0\1\1\0@ \0\0\5\247\0\0\0\241"..., 1024) = 1024
-lseek(6, 2572, SEEK_SET) = 2572
-write(6, "\345u\251\254", 4) = 4
-lseek(3, 0, SEEK_SET) = 0
-write(3, "SQLite format 3\0\4\0\1\1\0@ \0\0\5\250\0\0\0\241"..., 1024) = 1024
-lseek(3, 20480, SEEK_SET) = 20480
-write(3, "\r\0\0\0\0\4\0\0\3\262\3\262\2\230\2\230\2\230\2\230\2\230\2\230\2\230\1\232\1\232\1\232"..., 1024) = 1024
-close(6) = 0
-unlink("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal") = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=2}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-lstat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
-select(0, NULL, NULL, NULL, {0, 1000}) = 0 (Timeout)
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\250\0\0\0\241\0\0\0v\0\0\0\2", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-lseek(3, 24, SEEK_SET) = 24
-read(3, "\0\0\5\250\0\0\0\241\0\0\0v\0\0\0\2", 16) = 16
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-access("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-wal", F_OK) = -1 ENOENT (No such file or directory)
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741825, len=1}) = 0
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-open("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal", O_RDWR|O_CREAT|O_CLOEXEC, 0644) = 6
-fstat(6, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
-geteuid() = 530
-fstat(6, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
-lseek(6, 0, SEEK_SET) = 0
-write(6, "\331\325\5\371 \241c\327\377\377\377\377m)H%\0\0\0\241\0\0\2\0\0\0\4\0\0\0\0\0"..., 512) = 512
-lseek(6, 512, SEEK_SET) = 512
-write(6, "\0\0\0\27", 4) = 4
-lseek(6, 516, SEEK_SET) = 516
-write(6, "\n\0\0\0\1\3\373\0\3\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(6, 1540, SEEK_SET) = 1540
-write(6, "m)H%", 4) = 4
-lseek(6, 1544, SEEK_SET) = 1544
-write(6, "\0\0\0\26", 4) = 4
-lseek(6, 1548, SEEK_SET) = 1548
-write(6, "\r\0\0\0\1\3\371\0\3\371\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(6, 2572, SEEK_SET) = 2572
-write(6, "m)H%", 4) = 4
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
-fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-lseek(6, 2576, SEEK_SET) = 2576
-write(6, "\0\0\0\1", 4) = 4
-lseek(6, 2580, SEEK_SET) = 2580
-write(6, "SQLite format 3\0\4\0\1\1\0@ \0\0\5\250\0\0\0\241"..., 1024) = 1024
-lseek(6, 3604, SEEK_SET) = 3604
-write(6, "m)H%", 4) = 4
-lseek(3, 0, SEEK_SET) = 0
-write(3, "SQLite format 3\0\4\0\1\1\0@ \0\0\5\251\0\0\0\241"..., 1024) = 1024
-lseek(3, 21504, SEEK_SET) = 21504
-write(3, "\r\0\0\0\0\4\0\0\3\371\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-lseek(3, 22528, SEEK_SET) = 22528
-write(3, "\n\0\0\0\0\4\0\0\3\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1024) = 1024
-close(6) = 0
-unlink("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db-journal") = 0
-fcntl(3, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=1073741824, len=2}) = 0
-fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
-close(5) = 0
-close(-1) = -1 EBADF (Bad file descriptor)
-close(4) = 0
-fstat(3, {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-stat("/net/fileserver.methics.fi/mnt/mirror/common/scratch/mea/ham/aprx/aprx-trunk/.svn/wc.db", {st_mode=S_IFREG|0644, st_size=164864, ...}) = 0
-close(3) = 0
-munmap(0x7fb0c4174000, 212992) = 0
-munmap(0x7fb0c41d2000, 139264) = 0
-munmap(0x7fb0c4152000, 139264) = 0
-exit_group(0) = ?
-+++ exited with 0 +++
diff --git a/ttyreader.c b/ttyreader.c
index 888a5d9..c77b91d 100644
--- a/ttyreader.c
+++ b/ttyreader.c
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
@@ -407,7 +407,7 @@ static void ttyreader_linesetup(struct serialport *S)
if (debug)
printf("OK\n");
- aprxlog("TTY %s Opened.\n", S->ttyname);
+ aprxlog("TTY %s opened", S->ttyname);
/* Set attributes */
diff --git a/valgrind.c b/valgrind.c
index e23506f..7723ac4 100644
--- a/valgrind.c
+++ b/valgrind.c
@@ -1,6 +1,6 @@
/* **************************************************************** *
* *
- * APRX -- 2nd generation receive-only APRS-i-gate with *
+ * APRX -- 2nd generation APRS iGate and digi with *
* minimal requirement of esoteric facilities or *
* libraries of any kind beyond UNIX system libc. *
* *
diff --git a/windows/MemoryStatus.cpp b/windows/MemoryStatus.cpp
new file mode 100644
index 0000000..1863f18
--- /dev/null
+++ b/windows/MemoryStatus.cpp
@@ -0,0 +1,131 @@
+#include <windows.h>
+#include <stdio.h>
+
+#define SLEEP_TIME 5000
+#define LOGFILE "C:\\MyServices\\memstatus.txt"
+
+SERVICE_STATUS ServiceStatus;
+SERVICE_STATUS_HANDLE hStatus;
+
+void ServiceMain(int argc, char** argv);
+void ControlHandler(DWORD request);
+int InitService();
+
+int WriteToLog(char* str)
+{
+ FILE* log;
+ log = fopen(LOGFILE, "a+");
+ if (log == NULL)
+ return -1;
+ fprintf(log, "%s\n", str);
+ fclose(log);
+ return 0;
+}
+
+void main()
+{
+ SERVICE_TABLE_ENTRY ServiceTable[2];
+ ServiceTable[0].lpServiceName = "MemoryStatus";
+ ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
+
+ ServiceTable[1].lpServiceName = NULL;
+ ServiceTable[1].lpServiceProc = NULL;
+ // Start the control dispatcher thread for our service
+ StartServiceCtrlDispatcher(ServiceTable);
+}
+
+
+void ServiceMain(int argc, char** argv)
+{
+ int error;
+
+ ServiceStatus.dwServiceType = SERVICE_WIN32;
+ ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
+ ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
+ ServiceStatus.dwWin32ExitCode = 0;
+ ServiceStatus.dwServiceSpecificExitCode = 0;
+ ServiceStatus.dwCheckPoint = 0;
+ ServiceStatus.dwWaitHint = 0;
+
+ hStatus = RegisterServiceCtrlHandler(
+ "MemoryStatus",
+ (LPHANDLER_FUNCTION)ControlHandler);
+ if (hStatus == (SERVICE_STATUS_HANDLE)0)
+ {
+ // Registering Control Handler failed
+ return;
+ }
+ // Initialize Service
+ error = InitService();
+ if (error)
+ {
+ // Initialization failed
+ ServiceStatus.dwCurrentState = SERVICE_STOPPED;
+ ServiceStatus.dwWin32ExitCode = -1;
+ SetServiceStatus(hStatus, &ServiceStatus);
+ return;
+ }
+ // We report the running status to SCM.
+ ServiceStatus.dwCurrentState = SERVICE_RUNNING;
+ SetServiceStatus (hStatus, &ServiceStatus);
+
+ MEMORYSTATUS memory;
+ // The worker loop of a service
+ while (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
+ {
+ char buffer[16];
+ GlobalMemoryStatus(&memory);
+ sprintf(buffer, "%d", memory.dwAvailPhys);
+ int result = WriteToLog(buffer);
+ if (result)
+ {
+ ServiceStatus.dwCurrentState = SERVICE_STOPPED;
+ ServiceStatus.dwWin32ExitCode = -1;
+ SetServiceStatus(hStatus, &ServiceStatus);
+ return;
+ }
+
+ Sleep(SLEEP_TIME);
+ }
+ return;
+}
+
+// Service initialization
+int InitService()
+{
+ int result;
+ result = WriteToLog("Monitoring started.");
+ return(result);
+}
+
+// Control handler function
+void ControlHandler(DWORD request)
+{
+ switch(request)
+ {
+ case SERVICE_CONTROL_STOP:
+ WriteToLog("Monitoring stopped.");
+
+ ServiceStatus.dwWin32ExitCode = 0;
+ ServiceStatus.dwCurrentState = SERVICE_STOPPED;
+ SetServiceStatus (hStatus, &ServiceStatus);
+ return;
+
+ case SERVICE_CONTROL_SHUTDOWN:
+ WriteToLog("Monitoring stopped.");
+
+ ServiceStatus.dwWin32ExitCode = 0;
+ ServiceStatus.dwCurrentState = SERVICE_STOPPED;
+ SetServiceStatus (hStatus, &ServiceStatus);
+ return;
+
+ default:
+ break;
+ }
+
+ // Report current status
+ SetServiceStatus (hStatus, &ServiceStatus);
+
+ return;
+}
+
diff --git a/windows/windows-services-in-c-example-4154.zip b/windows/windows-services-in-c-example-4154.zip
new file mode 100644
index 0000000..ac46a51
Binary files /dev/null and b/windows/windows-services-in-c-example-4154.zip differ
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-hamradio/aprx.git
More information about the pkg-hamradio-commits
mailing list