[hamradio-commits] [uronode] 07/10: Imported Upstream version 2.5.1

Dave Hibberd hibby-guest at moszumanska.debian.org
Fri Apr 1 15:32:58 UTC 2016


This is an automated email from the git hooks/post-receive script.

hibby-guest pushed a commit to branch master
in repository uronode.

commit 5752427e73adbb5e6d39f00a24e681c30ba8755d
Author: Dave Hibberd <dave.hibberd at gmail.com>
Date:   Fri Apr 1 16:06:32 2016 +0100

    Imported Upstream version 2.5.1
---
 CHANGES.2                |  35 +-------
 CHANGES.3                | 224 +++++++++++++++++++++++++++++++++++++++++++++++
 Makefile.in              |  56 +++++++-----
 README.flexd             |  30 +++++++
 axdigi.c                 |  45 +++++-----
 calibrate                | Bin 590605 -> 0 bytes
 calibrate.c              | 130 +++++++++++++++++++++++++++
 command.c                |  38 +++++---
 config.c                 |   8 +-
 configure                |  26 ++++++
 etc/help/ping.hlp        |   5 +-
 flexd.c                  |  29 +++---
 gateway.c                |  27 +++---
 man/calibrate.8          |  29 ++++++
 man/flexd.8              |   5 +-
 man/uronode.8            |   2 +-
 mheard.c                 |   2 +-
 node.c                   |  14 +--
 node.h                   |   4 +-
 sysinfo.c                |  81 +++++++++++------
 sysinfo.h                |  11 ++-
 system.c                 |   4 +-
 systemd/README.systemd   |  14 +++
 systemd/ax25.system      |  13 +++
 systemd/uronode.service  |  17 ++++
 systemd/uronode.socket   |   9 ++
 systemd/uronode at .service |  15 ++++
 util.c                   |   8 +-
 28 files changed, 716 insertions(+), 165 deletions(-)

diff --git a/CHANGES.2 b/CHANGES.2
index 08bdb06..4499cc4 100644
--- a/CHANGES.2
+++ b/CHANGES.2
@@ -695,39 +695,6 @@ Fortunatey I maintain monthly backups and restored from that. For me this
 meant minimum recreations of work lost. As for URONode, I only lost the
 suggestion by VE1JOT and other clean ups.
 
-
 ---
+see CHANGES.1 for prior changes, or CHANGES.3 for the latest changes.
 
-Known NON-Critical Bugs:
-Status memory/swap reporting fix
-
-Wish-list:
-Who file sorter
-pactor - requested by sv1uy
------------
-
-Original Development Information (aka Disclaimer):
-URONode was developed on an IBM eSeries 330 eServer with dual 1.2GHz CPUs
-The OS is Debian Linux 4 using kernel 2.4.27, libax25 v0.0.11,
-ax25-tools v0.0.8 and ax25-apps v0.0.6. This software comes with
-absolutely NO guarantees so crash n burn at your own risk. We all may
-be surprised and find out that it actually DOES something useful!
-URONode may not run 100% depending on environmental conditions specific
-to your system.
-
-URONode is GLPv2 code, and tested by it's main author on the following
-platforms: Raspberry Pi ver. B, Debian 7.7 on a Core-i3, Ubuntu 12.0.4LTS
-on a Core-i3, Fedora ver. 19
-
-------------
-
-Comments/suggestions? email: n1uro at n1uro.ampr.org
-Gripes??? cat gripes > /dev/null Smile just kidding!
-
-This version will get you going for now. I'll post any changes to:
-ftp://ftp.n1uro.net/packet
-
-Join our support mail list graciously donated by TAPR!
-http://www.tapr.org/mailman/listinfo/uronode
-
-73 de Brian N1URO
diff --git a/CHANGES.3 b/CHANGES.3
new file mode 100644
index 0000000..c8da290
--- /dev/null
+++ b/CHANGES.3
@@ -0,0 +1,224 @@
+27/03/2016 - v2.5 YO2LOJ reports 2 warnings with regards to system.c and 
+the date/time stamp function. While I do not get one, I also do not get 
+one with his supplied patch... so I included it. The patch affects the 
+differences between 32 and 64 bit OS timestamps. Now the OS bit 
+shouldn't matter. Thanks Marius! (That's why we have ya on the team)
+
+Ported the calibrate tool from F1OAT to the URONode suite. I could have 
+rewritten the whole thing from scratch but why the need to reinvent the 
+wheel? There was some recoding I had to do so that it'd compile under 
+URONode but that was somewhat minor. Usage is the same: 
+calibrate -t [ms] interface. 
+This port is similar in theory to what I did with Craig Small's axdigi package.
+
+Cleaned up routines in Makefile. I'll probably have several and 
+hopefully they will go unnoticed. One critical thing I did notice and 
+I'm surprised no one reported this was if flexnet wasn't selected, and 
+one ran a "make install" or "make upgrade" - it would exit as soon as it 
+tried to install a non-existant binary (FlexD). This left the axdigi 
+module to go un-installed/upgraded. This is a very important module to 
+install as it allows for interface to multi-interface digipeating. 
+Anyway, I got off my butt and fixed this amongst other things.
+
+Fixed the way the system handled parsing of the info file that carried 
+the stats for Memory and Swap usage: /proc/meminfo.  In some cases, the 
+node couldn't properly parse the swap statistics in the "Status" 
+command. Now, regardless of which kernel is being used, the proper stats 
+will be parsed and the percentage arithmetic will be properly applied to 
+show final percentage used. An example of the output:
+
+Memory:            Available  Used       Free       perc. Used
+------------------ ---------- ---------- ---------- ----------
+Physical:          4048024 kB 3206552 kB 841472  kB  79 %
+    Swap:          1881084 kB 0       kB 1881084 kB   0 %
+
+I really don't know why this was such a difficult thing for me to fix 
+but I got it after months of pondering. This fixes a known non-critial 
+bug :D After fixing this bug however I created another one that would 
+cause a divide-by-zero segfault. Someone asked me to configure a box 
+remotely for them and they didn't add a swap partition at all! Now if 
+there's none or it's simply not activated, the node's 'STatus' report 
+will reflect such. Thanks to the NY EOC folks for creating this error so 
+I could find this bug before relase xD
+
+Fixing texts in gateway.c and mheard.c where it still referenced the 
+word "port(s)" instead of "interface(s)" as it should. Also cleaned up 
+some minor error reporting. Also made some changes in how some aborts 
+are displayed, and also invalid callsign error reporting. For example, 
+an aborted connect will now show: 
+c n1uro-3 
+UNIVLE:N1URO-5} link setup (ax2)... 
+
+UNIVLE:N1URO-5} Connection aborted. 
+The same as with an aborted telnet session.
+
+Pings now will show: ping www.comcast.com 
+ICMP Echo request sent to: 68.87.29.59
+
+UNIVLE:N1URO-5} Ping aborted.
+
+and a connect attempt that doesn't exist in any tables or links: 
+c g4apl 
+UNIVLE:N1URO-5} G4APL not found, please retry your entry. 
+I'm sure I'll figure out some more as time goes on. Always a little something 
+to do :)
+
+One thing I noticed was an error in the Ping routine. The "Maximum size" 
+of a ping was preset to 248 bytes. On an ax25 link, this doesn't even 
+leave room for the IP headers, nevermind the ax25 headers! In thinking 
+this over, and not knowing if the IP path would be over vanilla ax25 OR 
+perhaps via NetRom, I decided to make the Maximum content per ping at 
+128 bytes. This should also be just large enough to allow ALL ascii 
+characters a chance to be included in 1 ping frame. Ex: 
+
+n1uro-15 at n1uro.ampr.org:/uronode$ ping k1yon 129 
+Maximum size is 128 
+n1uro-15 at n1uro.ampr.org:/uronode$ ping k1yon 128 
+ICMP Echo request sent to: 44.88.4.1 
+ICMP Echo reply received from: 44.88.4.1 
+Ping completed in: 151ms (ttl=63) 
+n1uro-15 at n1uro.ampr.org:/uronode$
+
+While at it, I made changes to the online help file for ping and to 
+uronode.8 man page. 
+
+Also I noticed while working on a new site for EastNet, I somehow omitted an 
+install line in the Makefile for flexd.8. This not only is fixed but I also 
+expanded a bit on the limited text that was inside.
+
+Cleaned up a text display bug in the Status report. Swap: was not right 
+column justified with the rest of the memory stats. This was handled in 
+command.c
+
+Added a routine in configure to check for "make" as I've seen new 
+installs where make is not installed but gcc is. Needless to say you 
+can't "make" a binary if "make" does not exist ;->
+
+Also added a notification in flexd where when started to inform you that 
+the poll cycle has started. You may see it connect to test the existance 
+of an ax25 socket for the remote end when you first start flexd. This 
+starts the timer for your poll sequence in flexd.conf.
+
+While I was at it (and with a decent nudge from Tomasz SP2L) I did some 
+further digging and found (with the aid of Thomas DL9SAU) that the 
+getsockopt routine itself was showing failure because the socket wasn't 
+initially established prior to the polling loop. In adjusting it's 
+settings this appears to help relieve the initial error getsockopt() was 
+showing upon start of flexd. Now flexd should login to the remote 
+immediately upon start and pull down the desti table of the remote node. 
+Thanks Thomas and Tomasz :)
+
+In digging through the flexd source some more, and enjoying the fact 
+that the configs can be changed "on the fly" without having to restart 
+the system in most cases, or disrupt activity that's in session on or 
+through the node, I added a call to update the destinations upon a 
+"killall -HUP flexd". This allows the node sysop to change the flex-gate 
+they wish to poll without having to stop and restart flexd, and grab an 
+immediate destinations list. Remember to do the following: 
+- add the route in uronode.routes 
+- change the flex gateway in flexd.conf 
+- killall -HUP flexd 
+... and your new config and destination will instantly be live. Also, you can 
+-HUP your flexd to force an update as well. 
+
+Fixed a non-critical bug in axdigi where killing the daemon would NOT 
+clear the pidfile in /var/run. Always a stale pidfile was left over, and 
+as a quick fix I had the daemon delete the pidfile through a system call upon
+start. A hack but worked. NOW, the daemon will remove the pidfile upon 
+exit as it should.
+
+Wrote a set of SystemD files since xinetd/inet will soon be eliminated in
+favor of SystemD. I've tested the files on both a Pi running Raspbian
+wheezy and on my Fedora testbed. Important Note:
+IF you spawn your incoming telnet connects with SystemD, it's very possible
+that SystemD *will* convert your incoming IPv4 to internal IPv6 sockets. 
+You may handle this by forcing IPv4 in your SystemD uronode.socket file.
+While as of this version URONode will handle *incoming* IPv6, I haven't
+written any outbound routines for IPv6. To my knowledge, there's no need
+for it and I don't know if we'll ever have such a need on ham-based
+networks for IPv6. URONode *is* the first packet node however, to support
+IPv6... a historical milestone I do believe.
+
+While I was testing SystemD and finally realizing that the above IPv6
+conversions were true, I created a menu system for IPv6 to make it a lot
+cleaner than it already was... actually it had none. Since it's also
+spawned by SystemD, I made that the prompt for IPv6...
+SystemD - n1uro at fedora.n1uro.ampr.org:
+I was going to dupe the IPv4 prompt but decided it should have it's own
+to follow with the scope of how I maintain this project. So far everything
+in regards to both SystemD and IPv6 seem to be working fine.
+
+31/03/2016 - v2.5.1 (Maintenance release)
+Added better error handling output to FlexD and axDigi. Now they tell you
+when they've properly received your -HUP, your -TERM or your start. This 
+should help you all in better debugging your backend engines (FlexD, axDigi,
+etc.)
+
+Added a -b flag to the installer routines by suggestion of Marius YO2LOJ
+so one with an existing install won't have their files totally overwritten
+however they'll be backed up with a *~ flag instead during "make install".
+The preferred method for upgrading an existing node as always is by using
+"make upgrade" which only copies over the files required for that version.
+Once in a while a new field will be added or one deleted from the file
+uronode.conf, or one of the others and I've noticed sysops don't pay
+any attention to the new field requirements (ex: RoseId is the latest
+add). Compare the fields in files before just copying them back over!
+
+Gus I0OJJ and our own Bob VE3TOK reported strangeness in certain ALIAS
+commands. I tried like heck to reproduce it here and on machines I take
+care of. I knew where the issue layed but not fully being able to get
+it to reproduce was a royal "b". After sending Bob code to test, he
+was able to get positive results and checked it in for me.
+
+While at it Bob increased the buffer for the reader within FlexD. Seems
+Xnet may require a larger buffer than FlexNet for some reason? Bob also
+checked that in. Thanks Bob.
+
+----------- Note on SystemD --------
+In uronode.socket, you'll notice the line:
+ListenStream=0.0.0.0:3694
+This tells SystemD to listen on TCP socket 3694 for any IPv4 ONLY incoming
+connection. If you wish to filter JUST your amprnet and IPv4 localhost
+IPs make a line for each changing 0.0.0.0 to 127.0.0.1 and another for
+your amprnet IP. This will by default filter any commercial IP requests
+to URONode. If you want SystemD to try IPv6 *first*, don't enter in any
+IP schemas and just list the port number. SystemD by default appears to
+use IPv6 prior to IPv4.
+
+You can verify the above by running systemctl status uronode.socket:
+ystemctl status uronode.socket
+● uronode.socket - URONode Server Activation Socket
+   Loaded: loaded (/usr/lib/systemd/system/uronode.socket; enabled)
+   Active: active (listening) since Mon 2016-03-07 15:30:39 EST; 6min ago
+   Listen: 0.0.0.0:3694 (Stream)
+ Accepted: 3; Connected: 1
+
+----------- Wish-list: -----------
+----------------------------------
+Original Development Information (aka Disclaimer): URONode was developed 
+on an IBM eSeries 330 eServer with dual 1.2GHz CPUs The OS is Debian 
+Linux 4 using kernel 2.4.27, libax25 v0.0.11, ax25-tools v0.0.8 and 
+ax25-apps v0.0.6. This software comes with absolutely NO guarantees so 
+crash n burn at your own risk. We all may be surprised and find out that 
+it actually DOES something useful! URONode may not run 100% depending on 
+environmental conditions specific to your system.
+
+URONode is GLPv2 code, and tested by it's main author on the following 
+platforms: Raspberry Pi ver. B, Debian 7.7 on a Core-i3, Ubuntu 
+12.0.4LTS on a Core-i3, Fedora ver. 21
+
+------------
+
+Comments/suggestions? email: n1uro at n1uro.ampr.org Gripes??? cat gripes > 
+/dev/null :D just kidding!
+
+This version will get you going for now. I'll post any changes to: 
+ftp://ftp.n1uro.net/packet and https://uronode.sourceforge.net. You may 
+also find URONode in your distro's repositories. <dnf/yum or apt-cache> 
+search uronode
+
+Join our support mail list graciously donated by TAPR! 
+http://www.tapr.org/mailman/listinfo/uronode
+
+73 de Brian N1URO
+
diff --git a/Makefile.in b/Makefile.in
index 14efeb9..daebe36 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,4 +1,4 @@
-all: nodeusers uronode axdigi @FLEXNET@
+all: nodeusers uronode axdigi calibrate @FLEXNET@
 
 CC = gcc
 LD = gcc
@@ -15,43 +15,46 @@ NODE_SRC =		node.c cmdparse.c config.c command.c mheard.c axcalluser.c \
 NODEUSERS_SRC =		nodeusers.c
 FLEXD_SRC = 		flexd.c procinfo.c
 DIGI_SRC =		axdigi.c
+CALIBRATE_SRC =		calibrate.c
 
 COMMON_OBJS =		$(COMMON_SRC:.c=.o)
 NODE_OBJS =		$(NODE_SRC:.c=.o)
 NODEUSERS_OBJS =	$(NODEUSERS_SRC:.c=.o)
 FLEXD_OBJS =		$(FLEXD_SRC:.c=.o)
 DIGI_OBJS =		$(DIGI_SRC:.c=.o)
+CALIBRATE_OBJS =	$(CALIBRATE_SRC:.c=.o)
 .c.o:
 	$(CC) $(CFLAGS) -c $<
 
 install: installbin installman installhelp installconf
-	install -m 755    -D -d	$(VAR_DIR)
-	install -m 755    -D -d	$(VAR_DIR)/node
-	install -m 644    -p etc/loggedin	$(VAR_DIR)/node
-	install -m 644    -p etc/lastlog	$(VAR_DIR)/node
-	install -m 755    -D -d	$(VAR_DIR)/flex
-	install -m 644    -p etc/gateways	 $(VAR_DIR)/flex
+	install -b -m 755    -D -d	$(VAR_DIR)
+	install -b -m 755    -D -d	$(VAR_DIR)/node
+	install -b -m 644    -p etc/loggedin	$(VAR_DIR)/node
+	install -b -m 644    -p etc/lastlog	$(VAR_DIR)/node
+	install -b -m 755    -D -d	$(VAR_DIR)/flex
+	install -b -m 644    -p etc/gateways	 $(VAR_DIR)/flex
 	
 installbin: all
 	install -m 755 	-s -p	uronode		$(SBIN_DIR)
 	install -m 755  -s -p	nodeusers	$(SBIN_DIR)
 	install -m 755  -s -p	axdigi		$(SBIN_DIR)
+	install -m 755	-s -p	calibrate	$(SBIN_DIR)
 @IN@	install -m 755  -s -p	flexd		$(SBIN_DIR)
 
 installhelp:
-	install -m 755    -D -d		 $(VAR_DIR)
-	install -m 755    -D -d		 $(VAR_DIR)/node/help
-	install -m 644    -p etc/help/*.hlp $(VAR_DIR)/node/help
+	install -b -m 755    -D -d		 $(VAR_DIR)
+	install -b -m 755    -D -d		 $(VAR_DIR)/node/help
+	install -b -m 644    -p etc/help/*.hlp $(VAR_DIR)/node/help
 
 installconf: installhelp
-	install -m 755    -D -d		 $(ETC_DIR)
-	install -m 600    -p etc/uronode.conf  $(ETC_DIR)
-	install -m 600    -p etc/uronode.perms $(ETC_DIR)
-	install -m 600    -p etc/uronode.info  $(ETC_DIR)
-	install -m 600    -p etc/uronode.motd  $(ETC_DIR)
-	install -m 600    -p etc/uronode.users $(ETC_DIR)
-	install -m 600    -p etc/uronode.routes   $(ETC_DIR)
-	install -m 600    -p etc/flexd.conf  $(ETC_DIR)
+	install -b -m 755    -D -d		 $(ETC_DIR)
+	install -b -m 600    -p etc/uronode.conf  $(ETC_DIR)
+	install -b -m 600    -p etc/uronode.perms $(ETC_DIR)
+	install -b -m 600    -p etc/uronode.info  $(ETC_DIR)
+	install -b -m 600    -p etc/uronode.motd  $(ETC_DIR)
+	install -b -m 600    -p etc/uronode.users $(ETC_DIR)
+	install -b -m 600    -p etc/uronode.routes   $(ETC_DIR)
+	install -b -m 600    -p etc/flexd.conf  $(ETC_DIR)
 
 installman:
 	install -m 755	  -D -d $(MAN_DIR)/man1 $(MAN_DIR)/man5 $(MAN_DIR)/man8
@@ -60,27 +63,29 @@ installman:
 	install -m 644    -p man/uronode.perms.5 $(MAN_DIR)/man5
 	install -m 644    -p man/flexd.conf.5 $(MAN_DIR)/man5
 	install -m 644    -p man/uronode.8       $(MAN_DIR)/man8
+	install -m 644	  -p man/calibrate.8	 $(MAN_DIR)/man8
 	install -m 644	  -p man/axdigi.8	 $(MAN_DIR)/man8
 	install -m 644	  -p man/flexd.8	 $(MAN_DIR)/man8
 
-upgrade: installman
+upgrade: installman installhelp
 	install -m 755 -p uronode       $(SBIN_DIR)
 	install -m 755 -p nodeusers     $(SBIN_DIR)
-	install -m 755 -p flexd		$(SBIN_DIR)
+	install -m 755 -p calibrate	$(SBIN_DIR)
+ at IN@	install -m 755 -p flexd		$(SBIN_DIR)
 	install -m 755 -p axdigi	$(SBIN_DIR)
  
 clean:
-	rm -f *.o *~ *.bak *.orig make.debug nodeusers uronode flexd axdigi
+	rm -f *.o *~ *.bak *.orig make.debug nodeusers uronode flexd axdigi calibrate
 	rm -f etc/*~ etc/*.bak etc/*.orig
 	rm -f etc/help/*~ etc/help/*.bak etc/help/*.orig
 
 distclean: clean
 	rm -f .depend Makefile.include config.h
-	rm -f uronode nodeusers axdigi @FLEXNET@
+	rm -f uronode nodeusers axdigi calibrate @FLEXNET@
 	rm -f Makefile make.debug
 
 depend:
-	$(CC) $(CFLAGS) -M $(COMMON_SRC) $(NODE_SRC) $(NODEUSERS_SRC) $(FLEXD_SRC) > .depend
+	$(CC) $(CFLAGS) -M $(COMMON_SRC) $(NODE_SRC) $(NODEUSERS_SRC) $(FLEXD_SRC) $(CALIBRATE_SRC) > .depend
 
 uronode: $(COMMON_OBJS) $(NODE_OBJS)
 	$(LD) $(LDFLAGS) -o uronode $(COMMON_OBJS) $(NODE_OBJS) $(LIBS) $(ZLIB)
@@ -91,8 +96,11 @@ nodeusers: $(COMMON_OBJS) $(NODEUSERS_OBJS)
 flexd: $(FLEXD_OBJS)
 	$(LD) $(LDFLAGS) -o flexd $(FLEXD_OBJS) $(LIBS) $(ZLIB)
 
+calibrate: $(CALIBRATE_OBJS)
+	 $(LD) $(LDFLAGS) -o calibrate $(CALIBRATE_OBJS) $(LIBS) $(ZLIB)
+
 axdigi: $(DIGI_OBJS)
-	$(LD) $(LDFLAGS) -o axdigi $(DIGI_OBJS) $(LIBS)
+	$(LD) $(LDFLAGS) -o axdigi $(DIGI_OBJS) $(LIBS) $(ZLIB)
 
 ifeq (.depend,$(wildcard .depend))
 include .depend
diff --git a/README.flexd b/README.flexd
new file mode 100644
index 0000000..be26838
--- /dev/null
+++ b/README.flexd
@@ -0,0 +1,30 @@
+If you find that your flexd isn't properly working, scroll down to line 120
+where it says:
+char  buffer[256], port[14], path[AX25_MAX_DIGIS*10]
+and adjust the buffer per your neighbor's screens. The formula is:
+2 data frames: 256
+3 data frames: 512
+4 data frames: 1024
+
+Unfortunately the configure script can't autosense this because in some
+cases, flexd doesn't already exist yet. To determine how many frames you're
+receiving, use the (ax)listen tool and count the frames after making a manual
+connect. Ex:
+ax2: fm N1URO-15 to N1URO-1 ctl SABM+ 
+ax2: fm N1URO-1 to N1URO-15 ctl UA- 
+ax2: fm N1URO-1 to N1URO-15 ctl I00^ pid=F0(Text) len 256 
+0000  PC/FlexNet V3.3g - Welcome to the N1URO FlexNet-Digi. This node 
+0040  is located at .Unionville, Hartford County, Connecticut [FN31ns]
+0080  . This version of pc/Flexnet.and all related services are hosted
+00C0   under the Linux operating system. Enjoy!..Basic commands are:.<
+ax2: fm N1URO-1 to N1URO-15 ctl I01^ pid=F0(Text) len 176 
+0000  A>rea destinations file.<C>onnect <desti>.<D>estinations list..<
+0040  H>elp (more detailed command list).<L>inks.list...<M>ailBox (BBS
+0080  URO:N1URO-4).<Q>uit this node..<T>alk <call>..=>
+
+Here I made a manual connect from my URONode to my pc/FlexNet node.
+After the protocol handshakes there's 2 frames prior to the => prompt.
+So using the formula above, my line needs to be 256 for the buffer size.
+
+Hope this may help those with flexd errors.
+73 de Brian N1URO
diff --git a/axdigi.c b/axdigi.c
index e82a553..928d67c 100644
--- a/axdigi.c
+++ b/axdigi.c
@@ -33,6 +33,8 @@
 /* below added by N1URO */
 #include <string.h>
 #include <unistd.h>
+#include <fcntl.h>
+#include <error.h>
 #include <signal.h>
 #include <linux/ax25.h>
 /* added by N1URO */
@@ -51,7 +53,7 @@ void get_interfaces(int skt);
 #define E_BIT 0x01	/* Address extension bit */
 #define REPEATED 0x80	/* Has-been-repeated bit */
 #define MAX_PORTS 16
-#define VERSION "0.2"
+#define VERSION "0.3"
 #define AXDIGI_PID_FILE  "/var/run/axdigi.pid"
 int port_count = 0;
 unsigned char portname[MAX_PORTS][20];
@@ -59,20 +61,24 @@ unsigned char portcall[MAX_PORTS][8];
 
 void(*sigterm_defhnd)(int);
 
-static void quit_handler(int sig)
+void quit_handler(int sig)
 {
-  signal(SIGTERM, SIG_IGN);
-
   unlink(AXDIGI_PID_FILE);
-
-//  signal(SIGTERM, sigterm_defhnd);
-  signal(SIGTERM, quit_handler);
+  signal(SIGTERM, SIG_IGN);
+  fprintf(stderr, "axDigi quitting.\n\r");
+  signal(SIGTERM, sigterm_defhnd);
   raise(SIGTERM);
-  unlink(AXDIGI_PID_FILE);
-  system("rm -f /var/run/axdigi.pid");
   return;
 }
 
+void hup_handler(int sig)
+{
+  signal(SIGHUP, SIG_IGN);
+  fprintf(stderr, "SIGHUP caught by axDigi.\n\r");
+  signal(SIGHUP, hup_handler); /* Restore hangup handler */
+}
+
+
 int main(int argc, char *argv[])
 {
   int skt;
@@ -80,28 +86,17 @@ int main(int argc, char *argv[])
   unsigned char buf[4096];
   struct sockaddr sa;
   int asize;
-	
 
-  system("rm -f /var/run/axdigi.pid");
 
   FILE *pidfile;
 
-//  signal(SIGALRM, alarm_handler);
-//  signal(SIGTERM, term_handler);
-//  signal(SIGPIPE, quit_handler);
-//  signal(SIGQUIT, quit_handler);
-
-//  pidfile = fopen(AXDIGI_PID_FILE, "w");
-//  fprintf(pidfile, "%d\n", (int)getpid());
-//  fclose(pidfile);
-
   /* Check our huge range of flags */
   if (argc > 1)
     {
       if (strcmp(argv[1], "-v") == 0 || strcmp(argv[1], "-h") ==0)
 	{
 	  printf("axdigi version %s. Copyright (C) 1995 Craig Small VK2XLZ\n", VERSION);
-	  printf("modificatiions 2012-present by Brian N1URO\n\n");
+	  printf("modificatiions Copyright (C) 2012-present by Brian N1URO\n\n");
 	  printf("axdigi comes with ABSOLUTELY NO WARRANTY.\n");
 	  printf("This is free software, and you are welcome to redistribute it\n");
 	  printf("under the terms of GNU General Public Licence as published\n");
@@ -112,6 +107,7 @@ int main(int argc, char *argv[])
     }
 
 /* Routine to daemonize - added by N1URO */
+
 if (!daemon_start(TRUE)) {
    fprintf(stderr, "Sorry, axdigi cannot become a daemon\n");
    return 1;
@@ -126,8 +122,12 @@ if (!daemon_start(TRUE)) {
 
   pidfile = fopen(AXDIGI_PID_FILE, "w");
   fprintf(pidfile, "%d\n", (int)getpid());
+  fprintf(stderr, "axDigi started. \n\r");
   fclose(pidfile);
 
+  signal(SIGHUP, hup_handler);
+  sigterm_defhnd = signal(SIGTERM, quit_handler);
+
   get_interfaces(skt);
 	
   while(1)
@@ -154,7 +154,6 @@ if (!daemon_start(TRUE)) {
     } /* while(1) */
 
   close(skt);
-//  system("rm -f /var/run/axdigi.pid");
 }
 
 int recv_packet(unsigned char *buf, int size, unsigned char *port)
@@ -299,3 +298,5 @@ void get_interfaces(int skt)
 	}
     } /* for */
 }	
+
+void(*sigterm_defhnd)(int);
diff --git a/calibrate b/calibrate
deleted file mode 100755
index f6d3ace..0000000
Binary files a/calibrate and /dev/null differ
diff --git a/calibrate.c b/calibrate.c
new file mode 100644
index 0000000..2b4412d
--- /dev/null
+++ b/calibrate.c
@@ -0,0 +1,130 @@
+/*
+ * calibrate : Modem calibration utility
+ * Most code is portion of beacon.c of the standard ax25-utils package
+ * F1OAT 980321
+ * mods by N1URO 151123
+ */
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <syslog.h>
+#include <signal.h>
+
+#include <time.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+
+#include <netax25/axlib.h>
+#include <netax25/axconfig.h>
+#include <netax25/nrconfig.h>
+#include <netax25/rsconfig.h>
+#include <netax25/procutils.h>
+#include <netax25/mheard.h>
+#include <netax25/daemon.h>
+
+#define BUFLEN 256
+#define NBFRAMES 100
+#define TEMPO 1000
+
+
+static void Usage(void)
+{
+	fprintf(stderr, "Usage : calibrate [-t ms] interface\n");
+	exit(1);
+}
+
+int main(int argc, char *argv[])
+{
+	struct full_sockaddr_ax25 dest;
+	struct full_sockaddr_ax25 src;
+	int i, s, dlen, len, tempo = TEMPO;
+	char *port;
+	char *srccall = NULL, *destcall = "CAL";
+	char buffer[BUFLEN];
+	fd_set rfds;
+	struct timeval tv;
+
+	if (argc < 2) Usage();
+	
+	while ((s = getopt(argc, argv, "t:")) != -1) {
+		switch (s) {
+			case 't':
+				tempo = atoi(optarg);
+				break;
+			case ':':
+				fprintf(stderr, "calibrate: option -t needs a duration in ms\n");
+				return 1;
+			case '?':
+				Usage();
+				return 1;
+		}
+	}
+
+    if (optind == argc) {
+		Usage();
+		return 1;
+    }
+	
+    port = argv[optind];
+	
+	if (ax25_config_load_ports() == 0) {
+		fprintf(stderr, "calibrate: no AX.25 interfaces defined\n");
+		return 1;
+	}
+
+	if ((srccall = ax25_config_get_addr(port)) == NULL) {
+		fprintf(stderr, "calibrate: invalid AX.25 interface setting - %s\n", port);
+		return 1;
+	}
+
+	if ((dlen = ax25_aton(destcall, &dest)) == -1) {
+		fprintf(stderr, "calibrate: unable to convert callsign '%s'\n", destcall);
+		return 1;
+	}
+
+	if ((len = ax25_aton(srccall, &src)) == -1) {
+		fprintf(stderr, "calibrate: unable to convert callsign '%s'\n", srccall);
+		return 1;
+	}
+
+	if ((s = socket(AF_AX25, SOCK_DGRAM, 0)) == -1) {
+		perror("socket");
+		return 1;
+	}
+
+	if (bind(s, (struct sockaddr *)&src, len) == -1) {
+		perror("bind");
+		return 1;
+	}
+	
+	printf("Press return to stop calibrate\n");
+	
+	for (i = 0 ; i < BUFLEN ; i++)
+		buffer[i] = 0x55;
+		
+	for (i = 0 ; i < NBFRAMES ; i++) {
+/*		fd_set rfds;
+		struct timeval tv;
+*/		
+		tv.tv_sec = tempo / 1000;
+		tv.tv_usec = (tempo % 1000) * 1000;
+		
+		FD_ZERO(&rfds);
+		FD_SET(0, &rfds);
+
+		if (select(1, &rfds, NULL, NULL, &tv) == 1) break;	
+		
+		buffer[0] = (i / 100) + '0';
+		buffer[1] = ((i % 100) / 10) + '0';
+		buffer[2] = (i % 10) + '0';
+		
+		if (sendto(s, buffer, BUFLEN, 0, (struct sockaddr *)&dest, dlen) == -1) {
+			perror("sendto");
+		}
+	}
+	
+	close(s);
+
+	return 0;
+}
diff --git a/command.c b/command.c
index 457522d..e793c36 100644
--- a/command.c
+++ b/command.c
@@ -96,6 +96,12 @@ void node_prompt(const char *fmt, ...)
   if ((User.ul_type == AF_ROSE) && (check_perms(PERM_ANSI, 0L) != -1)) {
    axio_printf(NodeIo,"\r\e[01;35m-=>\e[0m  \b");
   }
+  if ((User.ul_type ==AF_INET6)  && (check_perms(PERM_ANSI, 0L) == -1)) {
+    axio_printf(NodeIo, "\nSystemD - %s@%s: ",User.call, HostName);
+  }
+  if ((User.ul_type ==AF_INET6)  && (check_perms(PERM_ANSI, 0L) != -1)) {
+    axio_printf(NodeIo, "\n\e[01;31mSystemD \e[0m- \e[01;34m%s@\e[0m%s: ",User.call, HostName);
+  }
 /*  axio_flush(NodeIo); */
 }
 
@@ -784,26 +790,27 @@ int do_status(int argc, char **argv)
   axio_printf(NodeIo,"Load average:      %.2f, %.2f, %.2f\n", av[0], av[1], av[2]);
   axio_printf(NodeIo,"Users:             %d node, %d system\n", user_count(), system_user_count());
 
-  if (!(mem = meminfo()) || mem[meminfo_main][meminfo_total] == 0) {
+//  if (!(mem = meminfo()) || meminfo("memtotal") == 0) {
     /* cannot normalize mem usage */
-    axio_printf(NodeIo,"Cannot get memory information!\n"); 
-  } else  {
-    ma = mem[meminfo_main][meminfo_total];
-    mu = (mem[meminfo_main][meminfo_total] - mem[meminfo_free][meminfo_total]);
-    mf = mem[meminfo_free][meminfo_total];
+//    axio_printf(NodeIo,"Cannot get memory information!\n"); 
+//  } else  
+  if (load_meminfo()) {
+    ma = meminfo("memtotal");
+    mu = (meminfo("memtotal") - meminfo("memfree"));
+    mf = meminfo("memfree");
     axio_printf(NodeIo,"Memory:            Available  Used       Free       perc. Used\n");
     axio_printf(NodeIo,"------------------ ---------- ---------- ---------- ----------\n");
     axio_printf(NodeIo,"Physical:          %-7d kB %-7d kB %-7d kB %3d %%\n", ma, mu, mf, (mu*100)/ma);
     
-    if  (!(mem = meminfo()) || mem[meminfo_stotal][meminfo_total] != 0)  
-{ 
-    sa = mem[meminfo_stotal][meminfo_total]; 
-    su = (mem[meminfo_stotal][meminfo_total] - mem[meminfo_sfree][meminfo_total]);
-    sf = mem[meminfo_sfree][meminfo_total];
-    axio_printf(NodeIo,"Swap:              %-7d kB %-7d kB %-7d kB %3d %%\n",sa,su,sf,(su*100)/sa);   
+    if  (meminfo("swaptotal") != 0)  
+ { 
+    sa = meminfo("swaptotal"); 
+    su = (meminfo("swaptotal") - meminfo("swapfree"));
+    sf = meminfo("swapfree");
+    axio_printf(NodeIo,"    Swap:          %-7d kB %-7d kB %-7d kB %3d %%\n",sa,su,sf,(su*100)/sa);   
     } 
     else 
-    axio_printf(NodeIo,"Cannot get swap information!\n"); 
+    axio_printf(NodeIo,"Cannot get swap information or swap not active!\n"); 
       axio_printf(NodeIo," ");
     
   }
@@ -958,6 +965,11 @@ int nuser_list(int argc, char **argv)
       sprintf(buf, "\nTelnet (%.9s @ %.16s)",
 	      u.call, u.ul_name);
       break;
+
+    case AF_INET6:
+       sprintf(buf, "\nTelnet6 (%.9s @ SystemD)", u.call);
+       break;
+
     case AF_UNSPEC:
       sprintf(buf, "\nHost (%.9s on local)",
 	      u.call);
diff --git a/config.c b/config.c
index f222db6..8feb4e4 100644
--- a/config.c
+++ b/config.c
@@ -150,7 +150,8 @@ char *read_perms(struct user *up, unsigned long peer)
       if (!strcasecmp(argv[1], "rose"))
 	break;
       continue;
-#endif			
+#endif	
+    case AF_INET6:		
     case AF_INET:
       if (!strcmp(argv[1], "*"))
 	break;
@@ -191,7 +192,8 @@ static int do_alias(int argc, char **argv)
     return -1;
   if ((new = calloc(1, sizeof(struct cmd))) == NULL) {
     node_perror("do_alias: malloc", errno);
-    return -2;
+ // return -2;
+    return -1;       /* ve3tok 31 Mar,2016 - tnx Brian */
   }
   new->name = strdup(argv[1]);
   while (isupper(new->name[len]))
@@ -402,7 +404,7 @@ static int do_roseid(int argc, char **argv)
 
 static int do_prompt(int argc, char **argv)
 {
-  if ((User.ul_type != AF_NETROM) || (User.ul_type != AF_INET)) {
+  if ((User.ul_type != AF_NETROM) || (User.ul_type != AF_INET) || (User.ul_type != AF_INET6)) {
     if (argc < 2) {
       return -1;
       Prompt = strdup(argv[1]);
diff --git a/configure b/configure
index c238a02..2911fa0 100755
--- a/configure
+++ b/configure
@@ -48,6 +48,25 @@ else
    echo "and rerun ./configure to continue."
    exit 1
 fi
+_sleep 1
+echo -n "you need make to make URONode: "
+MAKE=`which make`
+_sleep 2
+if [ -e "$MAKE" ]
+   then
+   echo -n "saw $MAKE... "
+   _sleep 1
+   echo "MAKE found! Congratulations!!"
+else
+   echo "make not found!"
+   echo " "
+   echo "You need this utility to make URONode."
+   echo "Please install make, and rerun this ./configure script."
+   echo "If you have a copy of make installed, please insure you have"
+   echo "it in your path and rerun ./configure to continue."
+   exit 1
+fi
+
 echo -n "Your machine architecture is: "
 _sleep 1
 ARCH=`uname -m`
@@ -290,6 +309,13 @@ echo ""
 		if [ -x ./axdigi ]; then
 			echo "SUCCESS!"
 		fi
+		 _sleep 1
+                echo -n "calibrate: "
+                _sleep 1
+                if [ -x ./calibrate ]; then
+                        echo "SUCCESS!"
+                fi
+
 		_sleep 1
 		echo -n "flexd:     "
 		_sleep 1
diff --git a/etc/help/ping.hlp b/etc/help/ping.hlp
index 30eb4ac..fdd5020 100644
--- a/etc/help/ping.hlp
+++ b/etc/help/ping.hlp
@@ -9,7 +9,8 @@ DESCRIPTION
         between the local and remote hosts is shown.
 
         If an optional length is specified the data portion of the
-        packet is filled with length number of bytes.
+        packet is filled with length number of bytes up to 128.
 
-EXAMPLE
+EXAMPLES
         ping aripisa.ampr.org
+	ping n1uro.ampr.org 128
diff --git a/flexd.c b/flexd.c
index 663307a..3d677b2 100644
--- a/flexd.c
+++ b/flexd.c
@@ -31,6 +31,8 @@
 int poll_time=DEFAULT_POLL_TIME;
 char flexgate[10]="\0";
 char mycall[10]="\0";
+char prompt1[1]="\0";
+char prompt2[1]="\0";
 struct ax_routes *gw;
 int s;
 void (*sigterm_defhnd)(int);
@@ -64,7 +66,7 @@ void read_conf(void)
     if(strcasecmp(cp,"pollinterval")==0) { /* set poll interval */
       cp=strtok(NULL, " \t\n\r");
       if(cp==NULL) {
-	fprintf(stderr, "flexd config: PollInterval needs an argument\n");
+	fprintf(stderr, "flexd config: Poll Interval needs an argument\n");
 	fclose(fp);
 	fclose(fgt);
 	exit(1);        
@@ -109,7 +111,7 @@ void read_conf(void)
       }
     }
   }	 
-
+  fprintf(stderr,"FlexD started.\n\r");
   fclose(fgt);
   fclose(fp);
 }
@@ -117,7 +119,7 @@ void read_conf(void)
 int download_dest(char *gateway, char *fname)
 {
   FILE *tmp;
-  char buffer[256], port[14], path[AX25_MAX_DIGIS*10];
+  char buffer[512], port[14], path[AX25_MAX_DIGIS*10];  /* Increased buffer to 512 from 256 - ve3tok 31 Mar, 2016 */
   char *addr, *commands[10], *dlist[9]; /* Destination + 8 digipeaters */
   fd_set read_fd;
   int n, addrlen, cmd_send=0, cmd_ack=0, c, k;
@@ -223,7 +225,9 @@ int download_dest(char *gateway, char *fname)
       break;
     }
     if (FD_ISSET(s, &read_fd)) {
-      int ret, retlen;
+//      int ret, retlen;
+	int ret = 0;
+	int retlen = 0;
       char *cp;
       
       /* See if we got connected or if this was an error */
@@ -231,12 +235,12 @@ int download_dest(char *gateway, char *fname)
       if (ret != 0) {
 	cp = strdup(strerror(ret));
 	strlwr(cp);
-	sprintf(buffer, "flexd connect: Failure with %s: %sr\r\n", gateway, cp);
+	sprintf(buffer, "flexd connect: Failure with %s\r\nError: %s\r\n", gateway, cp);
 	write(STDOUT_FILENO, buffer, strlen(buffer));
 	free(cp);
 	close(s);
 	return 1;
-      }
+      } 
      break;
     }
   }
@@ -270,10 +274,12 @@ int download_dest(char *gateway, char *fname)
     
     if (FD_ISSET(s, &read_fd)) {
       if ((n = read(s, buffer, 512)) == -1) break;
+//	if ((n = read(s, buffer, 256)) == -1) break;
       for(c=0;c<n;c++) { 
 	if (buffer[c]=='\r') buffer[c]='\n';
 	if (buffer[c]=='=' && c<n-1 && buffer[c+1]=='>') {
-	  /* fprintf(stderr, "flex interact: ack[%d]\n", cmd_ack); */
+//	if (buffer[c]=='%s' && c<n-1 && buffer [c+1]=='%s', prompt1, prompt2) {
+// 	  fprintf(stderr, "flex interact: ack[%d]\n", cmd_ack);
 	  cmd_ack++;
 	}
       }
@@ -283,7 +289,7 @@ int download_dest(char *gateway, char *fname)
     if (cmd_ack!=0) {
       if (commands[cmd_send]!=NULL) {
 	write(s, commands[cmd_send], 2);
-	/* fprintf(stderr, "flexd interact: send[%d]: %s\n", cmd_send, commands[cmd_send]); */
+//	fprintf(stderr, "flexd interact: send[%d]: %s\n", cmd_send, commands[cmd_send]); 
 	cmd_send++;
       }
       cmd_ack=0;
@@ -367,7 +373,9 @@ void hup_handler(int sig)
 {
   signal(SIGHUP, SIG_IGN);
   
+  fprintf(stderr, "SIGHUP caught by FlexD, restarting... \n\r");
   read_conf();
+  update_flex();
   
   signal(SIGHUP, hup_handler); /* Restore hangup handler */
 }
@@ -387,7 +395,7 @@ void quit_handler(int sig)
   signal(SIGTERM, SIG_IGN);
 
   unlink(FLEXD_PID_FILE);
-  
+  fprintf(stderr, "FlexD quitting.\n\r");
   signal(SIGTERM, sigterm_defhnd);
   raise(SIGTERM);
   return;
@@ -411,11 +419,9 @@ int main(int argc, char *argv[])
     return 1;
   }
 
-//  signal(SIGTERM, quit_handler);
   pidfile = fopen(FLEXD_PID_FILE, "w");
   fprintf(pidfile, "%d\n", (int)getpid());
   fclose(pidfile);
-
   update_flex();
   
   signal(SIGHUP, hup_handler);
@@ -429,4 +435,3 @@ int main(int argc, char *argv[])
 
   return 0;
 }
-
diff --git a/gateway.c b/gateway.c
index 5ee97a8..e10f23a 100644
--- a/gateway.c
+++ b/gateway.c
@@ -104,6 +104,9 @@ static ax25io *connect_to(char **addr, int family, int escape, int compr)
     salen = strlen(addr[1]);
     if ((salen != 6) && (salen != 10))
       {
+	if (User.ul_type == AF_NETROM) {
+		axio_printf(NodeIo,"%s} ", NodeId);
+	}
 	axio_printf(NodeIo,"Invalid ROSE address");
 	if (User.ul_type == AF_NETROM) {
 	  node_msg("");
@@ -208,7 +211,7 @@ static ax25io *connect_to(char **addr, int family, int escape, int compr)
       if (User.ul_type == AF_NETROM) {
 	axio_printf(NodeIo,"%s} ", NodeId);
       }
-      axio_printf(NodeIo,"Invalid port");
+      axio_printf(NodeIo,"Invalid interface: %s", addr[0]);
       if (User.ul_type == AF_NETROM) {
       	node_msg("");
       }
@@ -316,11 +319,11 @@ static ax25io *connect_to(char **addr, int family, int escape, int compr)
 	if (User.ul_type == AF_NETROM) {
 	  axio_printf(NodeIo,"%s} ", NodeId);
 	}	 
-	axio_printf(NodeIo,"Permission denied");
+	axio_printf(NodeIo,"Permission denied.");
 	if (User.ul_type == AF_NETROM) {
 	  node_msg("");
 	}
-	node_log(LOGLVL_GW, "Permission denied: telnet %s", User.dl_name);
+	node_log(LOGLVL_GW, "Permission denied: telnet %s.", User.dl_name);
 	close(fd);
 	return NULL;
       }
@@ -334,7 +337,10 @@ static ax25io *connect_to(char **addr, int family, int escape, int compr)
 	  } */
     break;
   default:
-    axio_printf(NodeIo,"%s Unsupported address family", NodeId);
+    if (User.ul_type == AF_NETROM) {
+          axio_printf(NodeIo,"%s} ", NodeId);
+        }
+    axio_printf(NodeIo,"Unsupported protocol.");
     if (User.ul_type == AF_NETROM) {
       node_msg("");
     }
@@ -421,7 +427,7 @@ static ax25io *connect_to(char **addr, int family, int escape, int compr)
 	if (check_perms(PERM_ANSI, 0L) != -1) {
 	  axio_printf(NodeIo, "\e[05;31m");
 	}
-	axio_printf(NodeIo,"Aborted");
+	axio_printf(NodeIo,"Connection aborted.");
 	if (check_perms(PERM_ANSI, 0L) != -1) {
 	  axio_printf(NodeIo, "\e[0;m");
 	}
@@ -684,7 +690,7 @@ int do_connect(int argc, char **argv)
       if (User.ul_type == AF_NETROM) {
 	axio_printf(NodeIo,"%s} ", NodeId);
       }
-      axio_printf(NodeIo,"Remote not found, please retry your entry.");
+      axio_printf(NodeIo,"%s not found, please retry your entry.", argv[1]);
       family = AF_UNSPEC;
       //      free_flex_dst(flx);
       //      free_ax_routes(ax);
@@ -977,11 +983,12 @@ int do_ping(int argc, char **argv)
   }
   if (argc > 2) {
     len = atoi(argv[2]) + sizeof(struct icmphdr);
-    if (len > 256) {
+//    if (len > 256) {
+      if (len > 136) {
       if (User.ul_type == AF_NETROM) {
 	axio_printf(NodeIo,"%s} ", NodeId);
       }
-      axio_printf(NodeIo,"Maximum size is %d", 256 - sizeof(struct icmphdr));
+      axio_printf(NodeIo,"Maximum ping size is %d", 136 - sizeof(struct icmphdr));
       if (User.ul_type == AF_NETROM) {
 	node_msg("");
       }
@@ -1118,10 +1125,10 @@ int do_ping(int argc, char **argv)
 	}
 	if (User.ul_type == AF_INET) {
 	  if (check_perms(PERM_ANSI, 0L) != -1) {
-	    axio_printf(NodeIo, "\e[05;38m");
+	    axio_printf(NodeIo, "\e[05;31m");
 	  }
 	}
-	axio_printf(NodeIo,"Aborted");
+	axio_printf(NodeIo,"Ping aborted.");
 	if (User.ul_type == AF_INET) {
 	  if (check_perms(PERM_ANSI, 0L) != -1) {
 	    axio_printf(NodeIo, "\e[0;m");
diff --git a/man/calibrate.8 b/man/calibrate.8
new file mode 100644
index 0000000..157a02e
--- /dev/null
+++ b/man/calibrate.8
@@ -0,0 +1,29 @@
+.TH CALIBRATE 8 "28 April 1998" Linux "Linux Programmer's Manual"
+.SH NAME
+calibrate \- URONode user information lookup program
+.SH SYNOPSIS
+.B calibrate
+.SH DESCRIPTION
+.LP
+.B calibrate \-t ## interface
+tool by F1OAT ported for compile and use with URONode to calibrate radios.
+.SH OPTIONS
+.TP 10
+.BI \-t
+Time in ms to engage the calibration of an interface (often mislabeled port).
+.TP 10
+.BI interface
+This is the interface you wish to calibrate. 
+.SH FILES
+.LP
+.TP 5
+.B /etc/ax25/axports
+List of ax25 interfaces.
+.SH "SEE ALSO"
+.BR uronode (8)
+.SH AUTHOR
+Brian Rogers N1URO <n1uro at n1uro.com>
+.br
+Stefano Noferi IZ5AWZ <iz5awz at radio-ge.cnuce.cnr.it>
+.br
+Tomi Manninen OH2BNS <tpmannin at cc.hut.fi>
diff --git a/man/flexd.8 b/man/flexd.8
index 0186d6a..b58ef89 100644
--- a/man/flexd.8
+++ b/man/flexd.8
@@ -7,7 +7,10 @@ flexd \- flexnet routing daemon backend for URONode.
 .LP
 .B Flexd
 is a simple flexnet routing daemon back end. The purpose of this daemon is to
-import pc/FlexNet destinations into URONode for auto-ax25 routing.
+import pc/FlexNet destinations into URONode for auto-ax25 routing. It's
+quite normal sometimes for flexd to generate an error upon bootup if it
+can't make a connect to the neighbor flex node in flexd.conf. When it 
+can connect, it will do so automatically.
 .SH COMMANDS
 There are no commands for flexd. The runtime parameters are in flexd.conf
 .SH FILES
diff --git a/man/uronode.8 b/man/uronode.8
index a6a7f08..48d2649 100644
--- a/man/uronode.8
+++ b/man/uronode.8
@@ -136,7 +136,7 @@ reply. If a reply is received the round-trip-time (RTT)
 between the local and remote hosts is shown.
 .sp
 If an optional length is specified the data portion of the
-packet is filled with length number of bytes.
+packet is filled with length number of bytes up to 128.
 .TP 14
 .BI Routes
 Shows the NET/ROM route table of the local host (eg. the nodes
diff --git a/mheard.c b/mheard.c
index 9c2ed9a..ee46b7b 100644
--- a/mheard.c
+++ b/mheard.c
@@ -39,7 +39,7 @@ int do_mheard (int argc,char **argv) {
     if(ax25_config_get_dev(argv[1]) == NULL
        || (check_perms(PERM_HIDDEN, 0) == -1
 	   && is_hidden(argv[1]))) {
-      axio_printf(NodeIo,"Invalid port: %s",argv[1]);
+      axio_printf(NodeIo,"Invalid interface: %s", argv[1]);
 
       if(User.ul_type == AF_NETROM)
 	node_msg("");
diff --git a/node.c b/node.c
index be6ff87..53c4e73 100644
--- a/node.c
+++ b/node.c
@@ -69,10 +69,10 @@ static void alarm_handler(int sig)
   if ((User.ul_type == AF_AX25) || (User.ul_type == AF_ROSE)) {
     node_msg("Inactivity timeout! Disconnecting you... ");
   }
-  if (User.ul_type ==  AF_INET) {
+  if ((User.ul_type ==  AF_INET) || (User.ul_type == AF_INET6)) {
     node_msg("Inactivity timeout! Disconnecting you...");
   }
-  if (User.ul_type == AF_INET) {
+  if ((User.ul_type == AF_INET) || (User.ul_type == AF_INET6)) {
     if (check_perms(PERM_ANSI, 0L) != -1) {
       axio_printf(NodeIo,"\e[0;m");
     }
@@ -219,7 +219,7 @@ int main(int argc, char *argv[])
     axio_compr(NodeIo, 1);
   }
 #endif
-  if (User.ul_type == AF_INET) {
+  if ((User.ul_type == AF_INET) || (User.ul_type == AF_INET6)) {
     axio_tnmode(NodeIo, 1);
     axio_tn_do_linemode(NodeIo);
   }
@@ -261,13 +261,13 @@ int main(int argc, char *argv[])
   } else if (strcmp(pw, "*") != 0) {
     axio_printf(NodeIo,"*** Password required! If you don't have a password please email\n%s for a password you wish to use.", Email);
     axio_printf(NodeIo,"\nPassword: ");
-    if (User.ul_type == AF_INET) {
+    if ((User.ul_type == AF_INET) || (User.ul_type == AF_INET6)) {
       axio_tn_will_echo(NodeIo);
       axio_eolmode(NodeIo, EOLMODE_BINARY);
     }
     axio_flush(NodeIo);
     p = axio_getline(NodeIo);
-    if (User.ul_type == AF_INET) {
+    if ((User.ul_type == AF_INET) || (User.ul_type == AF_INET6)) {
       axio_tn_wont_echo(NodeIo);
       axio_eolmode(NodeIo, EOLMODE_TEXT);
       /*			axio_puts("\n",NodeIo); */
@@ -295,7 +295,7 @@ int main(int argc, char *argv[])
   if (User.ul_type == AF_NETROM) {
     /*		axio_printf(NodeIo, "%s} Welcome.\n", NodeId);  */
   } else 
-    if (User.ul_type == AF_INET) {
+    if ((User.ul_type == AF_INET) || (User.ul_type == AF_INET6)) {
       if (check_perms(PERM_ANSI, 0L) != -1) { 
 	node_msg("\n\e[01;34m[\e[01;37m%s\e[01;34m]\e[0m\nWelcome %s to the %s packet shell.", VERSION, User.call, HostName);
       } else if (check_perms(PERM_ANSI, 0L) == -1) {
@@ -389,7 +389,7 @@ int main(int argc, char *argv[])
 	    node_msg("What?\007"); 
 	  } else if (User.ul_type == AF_ROSE) {
 	    axio_printf(NodeIo,"Que?\007");
-	  } else if (User.ul_type == AF_INET) {
+	  } else if ((User.ul_type == AF_INET) || (User.ul_type == AF_INET6)) {
 	    axio_printf(NodeIo, "Huh?\007");
 	  } else {
 	    axio_printf(NodeIo,"Eh?\007");
diff --git a/node.h b/node.h
index e2d5375..9fb30cb 100644
--- a/node.h
+++ b/node.h
@@ -1,5 +1,5 @@
-#define VERSION                "URONode v2.4"
-#define COMPILING	       "November 21, 2015"
+#define VERSION                "URONode v2.5.1"
+#define COMPILING	       "March 31, 2016"
 
 #define STATE_IDLE	0
 #define STATE_TRYING	1
diff --git a/sysinfo.c b/sysinfo.c
index 884eaca..1ac4caa 100644
--- a/sysinfo.c
+++ b/sysinfo.c
@@ -47,7 +47,7 @@ static STRUCT_UTMP *utmp_contents;
 #define S_IWGRP 020
 #endif
 
-static char buf[300];
+static char buf[800];
 
 /* This macro opens FILE only if necessary and seeks to 0 so that successive
    calls to the functions are more efficient.  It also reads the current
@@ -110,36 +110,36 @@ int loadavg(double *av1, double *av5, double *av15) {
    labels which do not *begin* with digits, though.
 */
 
-#define MAX_ROW 22	/* these are a little liberal for flexibility */
+#define MAX_ROW 20	/* these are a little liberal for flexibility */
 #define MAX_COL 2
 
-unsigned** meminfo(void) {
-  static unsigned *row[MAX_ROW + 1];		/* row pointers */
-  static unsigned num[MAX_ROW * MAX_COL];	/* number storage */
-  char *p;
-  int i, j, k, l;
+//unsigned** meminfo(void) {
+//  static unsigned *row[MAX_ROW + 1];		/* row pointers */
+//  static unsigned num[MAX_ROW * MAX_COL];	/* number storage */
+//  char *p;
+//  int i, j, k, l;
     
-  FILE_TO_BUF(MEMINFO_FILE)
-    if (!row[0])				/* init ptrs 1st time through */
-      for (i=0; i < MAX_ROW; i++)		/* std column major order: */
-	row[i] = num + MAX_COL*i;		/* A[i][j] = A + COLS*i + j */
-  p = buf;
-  for (i=0; i < MAX_ROW; i++)			/* zero unassigned fields */
-    for (j=0; j < MAX_COL; j++)
-      row[i][j] = 0;
-  for (i=0; i < MAX_ROW && *p; i++) {		/* loop over rows */
-    while(*p && !isdigit(*p)) p++;		/* skip chars until a digit */
-    for (j=0; j < MAX_COL && *p; j++) {	/* scanf column-by-column */
-      l = sscanf(p, "%u%n", row[i] + j, &k);
-      p += k;				/* step over used buffer */
-      if (*p == '\n' || l < 1)		/* end of line/buffer */
-	break;
-    }
-  }
+//  FILE_TO_BUF(MEMINFO_FILE)
+//    if (!row[0])				/* init ptrs 1st time through */
+//      for (i=0; i < MAX_ROW; i++)		/* std column major order: */
+//	row[i] = num + MAX_COL*i;		/* A[i][j] = A + COLS*i + j */
+//  p = buf;
+//  for (i=0; i < MAX_ROW; i++)			/* zero unassigned fields */
+//    for (j=0; j < MAX_COL; j++)
+//      row[i][j] = 0;
+//  for (i=0; i < MAX_ROW && *p; i++) {		/* loop over rows */
+//    while(*p && !isdigit(*p)) p++;		/* skip chars until a digit */
+//    for (j=0; j < MAX_COL && *p; j++) {	/* scanf column-by-column */
+//      l = sscanf(p, "%u%n", row[i] + j, &k);
+//      p += k;				/* step over used buffer */
+//     if (*p == '\n' || l < 1)		/* end of line/buffer */
+//	break;
+//    }
+//  }
   /*    row[i+1] = NULL;	terminate the row list, currently unnecessary */
-  return row;					/* NULL return ==> error */
-} 
-
+//  return row;					/* NULL return ==> error */
+//} 
+//
 int system_user_count(void)
 {
   int users;
@@ -241,3 +241,30 @@ char *xmalloc (n)
     p = fixup_null_alloc (n);
   return p;
 }
+
+int load_meminfo(void)
+{
+        FILE_TO_BUF(MEMINFO_FILE)
+        return 1;
+}
+
+int meminfo(const char *s)
+{
+        char *cp;
+        int len;
+
+        len = strlen(s);
+        cp = buf;
+        while (1) {
+                if (strncasecmp(cp, s, len) == 0) {
+                        cp += len;
+                        if (*cp == ':')
+                                return atoi(++cp);
+                }
+                if ((cp = strchr(cp, '\n')) == NULL)
+                        break;
+                cp++;
+        }
+        return -1;
+}
+
diff --git a/sysinfo.h b/sysinfo.h
index 5d2e32f..2a7a947 100644
--- a/sysinfo.h
+++ b/sysinfo.h
@@ -1,8 +1,12 @@
 #ifndef SYSINFO_H
 #define SYSINFO_H
 
-int        loadavg(double *av1, double *av5, double *av15);
-int        uptime (double *uptime_secs, double *idle_secs);
+extern int loadavg(double *av1, double *av5, double *av15);
+extern int uptime (double *uptime_secs, double *idle_secs);
+extern int load_meminfo(void);
+// extern int meminfo(const char *s);
+/*
+
 
 unsigned** meminfo(void);
 
@@ -16,11 +20,12 @@ enum meminfo_row { meminfo_main = 0, meminfo_free, meminfo_buffers,
 		meminfo_nfs_unstab, meminfo_bounce, meminfo_climit,
 		meminfo_cas, meminfo_vmtotal, meminfo_vmused, 
 		meminfo_vmchunk 
+
 };
 
 enum meminfo_col { meminfo_total = 0
 }; 
 
 unsigned read_total_main(void);
-
+*/
 #endif /* SYSINFO_H */
diff --git a/system.c b/system.c
index e7805fb..679d492 100644
--- a/system.c
+++ b/system.c
@@ -124,7 +124,7 @@ void login_close(void)
   ut->ut_type=DEAD_PROCESS;
   memset(ut->ut_host,0,UT_HOSTSIZE);
   memset(ut->ut_user,0,UT_NAMESIZE);
-  time(&ut->ut_time); 
+  time((time_t *)&ut->ut_time); 
 /*  ut->ut_xtime = (unsigned int)time(NULL); */
   pututline(ut);
   endutent();
@@ -195,7 +195,7 @@ int login_open(struct passwd *pw, char *command)
     strcpy(utmpbuf.ut_user, pw->pw_name);                  /* Username */
     strcpy(utmpbuf.ut_host, "local:uronode");
     utmpbuf.ut_addr=0x7f000000;
-    time(&utmpbuf.ut_time);                                /* Time entry was made */
+    time((time_t *)&utmpbuf.ut_time);                                /* Time entry was made */
 /*    utmpbuf.ut_xtime = (unsigned int)time(NULL); */
 
     setutent();
diff --git a/systemd/README.systemd b/systemd/README.systemd
new file mode 100644
index 0000000..6df9ce5
--- /dev/null
+++ b/systemd/README.systemd
@@ -0,0 +1,14 @@
+To get URONode to answer IP socket requests via SystemD do the following:
+
+- copy the SystemD files into /lib/systemd/system
+- run: systemctl enable uronode
+- run: systemctl enable ax25
+- run: chkconfig uronode on
+- run: chkconfig ax25 on
+- run: systemctl daemon-reload
+- in /etc/xinetd.d/uronode (or node) set disable to yes
+  (or comment out your line in /etc/inetd.conf)
+- run: systemctl restart xinetd
+- reboot
+
+
diff --git a/systemd/ax25.system b/systemd/ax25.system
new file mode 100644
index 0000000..c241c10
--- /dev/null
+++ b/systemd/ax25.system
@@ -0,0 +1,13 @@
+[Unit]
+Description=ax25 service
+After=network.target syslog.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/local/bin/ax25 start
+ExecReload=/usr/local/bin/ax25 restart
+ExecStop =/usr/local/bin/ax25 stop
+
+[Install]
+WantedBy=multi-user.target
+
diff --git a/systemd/uronode.service b/systemd/uronode.service
new file mode 100644
index 0000000..b380c87
--- /dev/null
+++ b/systemd/uronode.service
@@ -0,0 +1,17 @@
+[Unit]
+Description = URONode Server
+Requires = uronode.socket
+After=syslog.target network.target
+
+[Service]
+Type=oneshot
+ExecStartPre=systemctl start uronode.socket
+ExecStart=/usr/local/sbin/uronode
+ExecStartPost=systemctl restart uronode.socket
+StandardInput=socket
+Sockets=uronode.socket
+
+[Install]
+Also = uronode.socket
+WantedBy = multi-user.target
+WantedBy = network.target
diff --git a/systemd/uronode.socket b/systemd/uronode.socket
new file mode 100644
index 0000000..8654ab4
--- /dev/null
+++ b/systemd/uronode.socket
@@ -0,0 +1,9 @@
+[Unit]
+Description=URONode Server Activation Socket
+
+[Socket]
+ListenStream=0.0.0.0:3694
+Accept=yes
+
+[Install]
+WantedBy=sockets.target
diff --git a/systemd/uronode at .service b/systemd/uronode at .service
new file mode 100644
index 0000000..3207cca
--- /dev/null
+++ b/systemd/uronode at .service
@@ -0,0 +1,15 @@
+[Unit]
+Description = URONode Server
+Requires = uronode.socket
+After=syslog.target network.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/local/sbin/uronode
+StandardInput=socket
+Sockets=uronode.socket
+
+[Install]
+Also = uronode.socket
+WantedBy = multi-user.target
+WantedBy = network.target
diff --git a/util.c b/util.c
index a7e8e37..a03e59a 100644
--- a/util.c
+++ b/util.c
@@ -39,7 +39,7 @@ void node_msg(const char *fmt, ...)
   if (User.ul_type == AF_NETROM) {
   axio_printf(NodeIo,"%s} ", NodeId);
   }
-  if ((User.ul_type == AF_INET) && (check_perms(PERM_ANSI, 0L) != -1)) {
+  if ((User.ul_type == AF_INET) || (User.ul_type == AF_INET6) && (check_perms(PERM_ANSI, 0L) != -1)) {
   axio_printf(NodeIo,"\n\e[01;31m%s\e[0m@\e[01;34m%s\e[0m:/uronode$ ",User.call, HostName);
   } 
   if ((User.ul_type == AF_INET) && (check_perms(PERM_ANSI, 0L) == -1)) {
@@ -48,6 +48,12 @@ void node_msg(const char *fmt, ...)
   if (User.ul_type == AF_AX25) {
   axio_printf(NodeIo,"%s",Prompt);
   }
+  if ((User.ul_type ==AF_INET6)  && (check_perms(PERM_ANSI, 0L) == -1)) {
+  axio_printf(NodeIo, "\nSystemD - %s@%s: ",User.call, Hostname);
+  }
+  if ((User.ul_type ==AF_INET6)  && (check_perms(PERM_ANSI, 0L) != -1)) {
+  axio_printf(NodeIo, "\n\e[01;31mSystemD \e[0m- \e[01;34m%s@\e[0m%s: ",User.call, Hostname);
+  }
   }
 */
 void node_perror(char *str, int err)

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-hamradio/uronode.git



More information about the pkg-hamradio-commits mailing list