New upstream version 2.6

This commit is contained in:
Hibby 2017-01-21 14:34:12 +00:00
parent 5752427e73
commit a3886f2ff6
19 changed files with 334 additions and 97 deletions

View File

@ -174,6 +174,89 @@ 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 Xnet may require a larger buffer than FlexNet for some reason? Bob also
checked that in. Thanks Bob. checked that in. Thanks Bob.
18/04/2016 - v2.6
Removed stale and unused axdigi.conf file. Thanks to David KI6ZHD for
pointing this out that I had a stale file in the archive. This file
belonged to another digi daemon I was going to revive instead of Craig
Small's multi-interface crossport digi daemon. I find that especially
with FlexNet, a multi-interface crossport digipeat system not only is
unique to the native linux kernel BUT is also very efficient. If you
have a stale copy of axdigi.conf floating around, please delete this.
Added a question to engage or disengage interactive configure/make mode.
This idea came to me from a query I received by KI6ZHD. If you choose NOT
to use interactive mode, than you must run make/make upgrade/make install
manually. Note: ALL options including rose and flexnet WILL BE COMPILED IN.
Tomasz SP2L was seeing carriage returns when administering his server
remotely and sending SIGHUP to flexd in the terminal messages confirming
the -HUP. Removed.
Added a version output for FlexD and tweeked the one for axdigi. Now both
helper daemons will display its versions based on URONode's version and
some very brief information about themselves. flexd -v or flexd -h
along with axdigi -v or axdigi -h will bring up this information.
Decided that since there's so many commands beginning with M I would move
the MHeard command to a Jheard command. This keeps the commandset more in
line with other systems except for TheNet and X1J-4, and separates that one
command away from the volume of M's. While at it I also made a JL for
Just heard Long. If you specify an interface, Jheard/JLong engages only for
that interface. Note - JLong will say: it may time out HFers. I also had to
modify Makefile and rework the help files to match. While at it I needed to
modify the uronode.8 MAN page.
Gave Makefile a more modernized compile line option. I'm hoping this will
keep URONode one of packet's better robust nodes.
I noticed some sites were violating Software2000's NetRom specifications
by defaulting reconnect on still in their uronode.conf files. I had thought
that I fixed this in an earlier release. Perhaps I did and then migrated
an old .c file back into the mix? (wouldn't be the first time I've done
that by mistake!) Anyway... three key things Software2000 was insistant upon
were NO CTEXT, NO RECONNECT, NO GOODBYE MESSAGES. If you've noticed, I've
taken ALL that out of URONode. These things were done as to not confuse
robot scripts such as PBBS mail forwarding sessions. While other systems
may wish to continue to violate the NetRom protocol (and others) I will
do everything in my power NOT to.
An anonymous user from sourceforge had a compiler warning on the
do_prompt cycle in config.c and provided a fix for it. I don't know if
the user is even a ham but their alias is dcb314, and we thank them. Their
report and fix which is included:
config.c:407:35: warning: logical 'or' of collectively exhaustive tests is always true [-Wlogical-op]
Source code is
if ((User.ul_type != AF_NETROM) || (User.ul_type != AF_INET) ||
(User.ul_type != AF_INET6)) {
Maybe better code
if ((User.ul_type != AF_NETROM) && (User.ul_type != AF_INET) &&
(User.ul_type != AF_INET6)) {
While I don't get the warning he had, the logistics seem to be fine. Thanks
again to dcb314 at sourceforge for their report.
I have made a diff file for JNOS2.0K that makes it a bit more user
compatible with URONode, and other linux-based nodes. For almost 30 years
TCP port 3694 has been used for inbound telnet for linux-based nodes, and
URONode is no exception... just as IP protocol 93 is for axip and UDP
port 93 is for axudp (again other systems love to violate protocols, we
try not to). Besides my little isms that I like in xNOS which I often
contributed to K2MF for MFNOS, I've began to do similar for JNOS. I'm adding
the .diff file in the main code distribution so if you do run JNOS 2.0K as
your PBBS TCP port 3694 is now recognized in JNOS with my patch. I have
as of this writing submitted it to Maiko for considerations, I don't know
if he's going to use it or not. If you do want to patch your JNOS 2.0K
copy it into your jnos source directory and run: patch -p1 -i jnos20k.diff
and you should see about a half dozen files updated. If Maiko doesn't wish
to include this and you want me to keep up to date with it, let me know.
With the recent CVE study on Winlink2000 and plain text passwords exposed, I
went through URONode to insure it wasn't posessing the same issue. By
default URONode doesn't ask for ANY passwords however it's highly suggested
that the sysop require passwords on any internet or amprnet interface. Before
yes, a sysop could require a password on an ax25/NetRom/Rose interface which
would be exposed. Now, if a sysop mistakenly tries to force a password
on RF, it will be ignored by the node so it's not exposed.
----------- Note on SystemD -------- ----------- Note on SystemD --------
In uronode.socket, you'll notice the line: In uronode.socket, you'll notice the line:
ListenStream=0.0.0.0:3694 ListenStream=0.0.0.0:3694
@ -221,4 +304,3 @@ Join our support mail list graciously donated by TAPR!
http://www.tapr.org/mailman/listinfo/uronode http://www.tapr.org/mailman/listinfo/uronode
73 de Brian N1URO 73 de Brian N1URO

View File

@ -2,15 +2,15 @@ all: nodeusers uronode axdigi calibrate @FLEXNET@
CC = gcc CC = gcc
LD = gcc LD = gcc
# CFLAGS = -O2 -g -s -Wstrict-prototypes # CFLAGS = -O2 -g -s -Wno-unused-result -Wstrict-prototypes
CFLAGS = -O2 -g -Wno-unused-result -Wstrict-prototypes CFLAGS = -DUNIX -g3 -DDEBUG
LDFLAGS = LDFLAGS =
LIBS = -lax25 -lax25io LIBS = -lax25 -lax25io
include Makefile.include include Makefile.include
COMMON_SRC = user.c util.c COMMON_SRC = user.c util.c
NODE_SRC = node.c cmdparse.c config.c command.c mheard.c axcalluser.c \ NODE_SRC = node.c cmdparse.c config.c command.c jheard.c axcalluser.c \
gateway.c extcmd.c procinfo.c router.c system.c sysinfo.c ipc.c gateway.c extcmd.c procinfo.c router.c system.c sysinfo.c ipc.c
NODEUSERS_SRC = nodeusers.c NODEUSERS_SRC = nodeusers.c
FLEXD_SRC = flexd.c procinfo.c FLEXD_SRC = flexd.c procinfo.c

View File

@ -39,7 +39,7 @@
#include <linux/ax25.h> #include <linux/ax25.h>
/* added by N1URO */ /* added by N1URO */
#include <netax25/daemon.h> #include <netax25/daemon.h>
#include "node.h"
int recv_packet(unsigned char *buf, int size, unsigned char *port); int recv_packet(unsigned char *buf, int size, unsigned char *port);
void print_call(unsigned char *buf); void print_call(unsigned char *buf);
unsigned char *find_call(char *port); unsigned char *find_call(char *port);
@ -53,7 +53,7 @@ void get_interfaces(int skt);
#define E_BIT 0x01 /* Address extension bit */ #define E_BIT 0x01 /* Address extension bit */
#define REPEATED 0x80 /* Has-been-repeated bit */ #define REPEATED 0x80 /* Has-been-repeated bit */
#define MAX_PORTS 16 #define MAX_PORTS 16
#define VERSION "0.3" // #define VERSION "0.3"
#define AXDIGI_PID_FILE "/var/run/axdigi.pid" #define AXDIGI_PID_FILE "/var/run/axdigi.pid"
int port_count = 0; int port_count = 0;
unsigned char portname[MAX_PORTS][20]; unsigned char portname[MAX_PORTS][20];
@ -95,13 +95,14 @@ int main(int argc, char *argv[])
{ {
if (strcmp(argv[1], "-v") == 0 || strcmp(argv[1], "-h") ==0) if (strcmp(argv[1], "-v") == 0 || strcmp(argv[1], "-h") ==0)
{ {
printf("axdigi version %s. Copyright (C) 1995 Craig Small VK2XLZ\n", VERSION); printf("axdigi: version %s.\n\r", VERSION);
printf("Copywrite (c) 1995 Craig Small - VK2XLZ\n\r");
printf("modificatiions Copyright (C) 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("axdigi comes with ABSOLUTELY NO WARRANTY.\n\r");
printf("This is free software, and you are welcome to redistribute it\n"); printf("This is free software, and you are welcome to redistribute it\n\r");
printf("under the terms of GNU General Public Licence as published\n"); printf("under the terms of GNU General Public Licence as published\n\r");
printf("by Free Software Foundation; either version 2 of the License, or\n"); printf("by Free Software Foundation; either version 2 of the License, or\n\r");
printf("(at your option) any later version.\n"); printf("(at your option) any later version.\n\r");
return 0; return 0;
} }
} }
@ -122,7 +123,7 @@ if (!daemon_start(TRUE)) {
pidfile = fopen(AXDIGI_PID_FILE, "w"); pidfile = fopen(AXDIGI_PID_FILE, "w");
fprintf(pidfile, "%d\n", (int)getpid()); fprintf(pidfile, "%d\n", (int)getpid());
fprintf(stderr, "axDigi started. \n\r"); fprintf(stderr, "axDigi started. \n");
fclose(pidfile); fclose(pidfile);
signal(SIGHUP, hup_handler); signal(SIGHUP, hup_handler);

View File

@ -216,7 +216,8 @@ int cmdparse(struct cmd *list, char *cmdline)
static char cmdbuf[1024]; static char cmdbuf[1024];
/* convert cmdline to argc,argv[] if '#' or empty: return */ /* convert cmdline to argc,argv[] if '#' or empty: return */
if ((argc = parse_args(argv, cmdline)) == 0 || *argv[0] == '#') return 2; /* changing return 2 to return -1 */
if ((argc = parse_args(argv, cmdline)) == 0 || *argv[0] == '#') return 1;
/* check if the command in argv[0] is in the list */ /* check if the command in argv[0] is in the list */
for (cmdp = list; cmdp != NULL; cmdp = cmdp->next) { for (cmdp = list; cmdp != NULL; cmdp = cmdp->next) {
if (strlen(argv[0]) < cmdp->len || strlen(argv[0]) > strlen(cmdp->name)) continue; if (strlen(argv[0]) < cmdp->len || strlen(argv[0]) > strlen(cmdp->name)) continue;

View File

@ -53,8 +53,9 @@ void init_nodecmds(void)
#ifdef HAVE_FLEX #ifdef HAVE_FLEX
add_internal_cmd(&Nodecmds, "Desti", 1, do_dest); add_internal_cmd(&Nodecmds, "Desti", 1, do_dest);
#endif #endif
#ifdef HAVE_MHEARD #ifdef HAVE_JHEARD
add_internal_cmd(&Nodecmds, "MHeard", 2, do_mheard); add_internal_cmd(&Nodecmds, "Jheard", 1, do_jheard);
add_internal_cmd(&Nodecmds, "JLong", 2, do_jlong);
#endif #endif
#ifdef HAVE_NETROM #ifdef HAVE_NETROM
add_internal_cmd(&Nodecmds, "Nodes", 1, do_nodes); add_internal_cmd(&Nodecmds, "Nodes", 1, do_nodes);

View File

@ -404,7 +404,7 @@ static int do_roseid(int argc, char **argv)
static int do_prompt(int argc, char **argv) static int do_prompt(int argc, char **argv)
{ {
if ((User.ul_type != AF_NETROM) || (User.ul_type != AF_INET) || (User.ul_type != AF_INET6)) { if ((User.ul_type != AF_NETROM) && (User.ul_type != AF_INET) && (User.ul_type != AF_INET6)) {
if (argc < 2) { if (argc < 2) {
return -1; return -1;
Prompt = strdup(argv[1]); Prompt = strdup(argv[1]);

13
configure vendored
View File

@ -1,5 +1,11 @@
#!/bin/sh #!/bin/sh
echo -n "Use interactive mode? [Y/n]: "; read answer
if [ "$answer" = "Y" -o "$answer" = "y" -o "$answer" = "" ]
then NON_INTERACTIVE=0;
else NON_INTERACTIVE=1;
fi
_sleep() _sleep()
{ {
[ "$NON_INTERACTIVE" = 1 ] || sleep "$@" [ "$NON_INTERACTIVE" = 1 ] || sleep "$@"
@ -100,7 +106,7 @@ fi
IN="#" IN="#"
HAVENETROM="#undef HAVE_NETROM" HAVENETROM="#undef HAVE_NETROM"
HAVEROSE="#undef HAVE_ROSE" HAVEROSE="#undef HAVE_ROSE"
HAVEMHEARD="#undef HAVE_MHEARD" HAVEMHEARD="#undef HAVE_JHEARD"
HAVEAUTOROUTE="#undef HAVE_AUTOROUTE" HAVEAUTOROUTE="#undef HAVE_AUTOROUTE"
HAVETCPIP="#undef HAVE_TCPIP" HAVETCPIP="#undef HAVE_TCPIP"
HAVEMOTD="#undef HAVE_MOTD" HAVEMOTD="#undef HAVE_MOTD"
@ -174,7 +180,7 @@ fi
if [ $? -ne 1 ] if [ $? -ne 1 ]
then then
HAVEAX25="#define HAVE_AX25 1" HAVEAX25="#define HAVE_AX25 1"
HAVEMHEARD="#define HAVE_MHEARD 1" HAVEMHEARD="#define HAVE_JHEARD 1"
fi fi
# #
# echo -n "Include support for ax25 AutoRouter ? [Y/n]: "; read answer # echo -n "Include support for ax25 AutoRouter ? [Y/n]: "; read answer
@ -270,7 +276,8 @@ echo ""
_sleep 1 _sleep 1
echo "Special thanks to: Morgan, sm6tky for his security report" echo "Special thanks to: Morgan, sm6tky for his security report"
echo "and Barry K2MF for his input on some of my routines and supplying" echo "and Barry K2MF for his input on some of my routines and supplying"
echo "some source code." echo "some source code. If you did not use interactive mode, you must"
echo "run make manually."
_sleep 1 _sleep 1
echo "" echo ""
#echo -n "Shall I run the make command for you ? [Y/n]: " #echo -n "Shall I run the make command for you ? [Y/n]: "

View File

@ -1,20 +0,0 @@
# URONode axdigi module
# load using /usr/sbin/axdigi &
#
#print debuginfo on/off
Debug off
#
#The digi call
MyCall xx0xx
#
# on use ssid 0-15 for digicall ,off use only ssid of mycall
IgnoreSSID on
#
#number of entrys for autorouting
lookupsize 100
#
#timeout auto routing data in sec.
TIMEOUT 3600
#
DefaultPort ln.tue
#

9
etc/help/jheard.hlp Normal file
View File

@ -0,0 +1,9 @@
USAGE
Jheard [<interface>]
DESCRIPTION
Gives a list of the last 20 heard AX25 stations on all interfaces
and, if specified, on the specified interface.
Use the "INterfaces" command to get a list of available
interfaces.

8
etc/help/jlong.hlp Normal file
View File

@ -0,0 +1,8 @@
USAGE
JLong <interface>
DESCRIPTION
Gives a list of ALL heard AX25 stations on all interfaces.
This may be a VERY LONG LIST. If you're on HF you may timeout.
Add an interface to see a long list for just that interface.

View File

@ -1,8 +0,0 @@
USAGE
Mheard [<port>]
DESCRIPTION
Gives a list of heard AX25 stations on all ports and, if
specified, on the specified port.
Use the "Ports" command to get a list of available ports.

View File

@ -33,8 +33,7 @@ LocalNet 44.0.0.0/32
Alias CAllbook "telnet %{3:144.167.99.66} 2000 %1 s" Alias CAllbook "telnet %{3:144.167.99.66} 2000 %1 s"
Alias CONVers "telnet %{2:44.88.0.9} 3600 \"/n %u %{1:1}\"" Alias CONVers "telnet %{2:44.88.0.9} 3600 \"/n %u %{1:1}\""
Alias DXCluster "connect dxnet" Alias DXCluster "telnet %{2:44.88.0.9} 9001 %1 s"
Alias Quit "bye"
Alias WX "telnet %{3:38.102.137.140} %1 s" Alias WX "telnet %{3:38.102.137.140} %1 s"
# Hidden ports. # Hidden ports.
@ -49,8 +48,7 @@ Alias WX "telnet %{3:38.102.137.140} %1 s"
# 2 Reconnected flag # 2 Reconnected flag
# 3 Run through pipe and reconnect # 3 Run through pipe and reconnect
# #
ExtCmd NEstat 1 nobody /bin/netstat netstat --inet ExtCmd NEtstat 1 nobody /bin/netstat netstat --inet
#ExtCmd PMS 1 root /usr/sbin/pms pms -u %U -o XX0XX
# Node ID. # Node ID.
# This displays before all output texts when the user connects into # This displays before all output texts when the user connects into

43
flexd.c
View File

@ -23,6 +23,7 @@
#include <netax25/daemon.h> #include <netax25/daemon.h>
#include "config.h" #include "config.h"
#include "node.h"
#include "procinfo.h" #include "procinfo.h"
#define DEFAULT_POLL_TIME 600 #define DEFAULT_POLL_TIME 600
@ -111,7 +112,7 @@ void read_conf(void)
} }
} }
} }
fprintf(stderr,"FlexD started.\n\r"); fprintf(stderr,"FlexD started.\n");
fclose(fgt); fclose(fgt);
fclose(fp); fclose(fp);
} }
@ -141,7 +142,7 @@ int download_dest(char *gateway, char *fname)
} }
if ((addr = ax25_config_get_addr(port)) == NULL) { if ((addr = ax25_config_get_addr(port)) == NULL) {
sprintf(buffer, "flexd connect: invalid AX.25 port name - %s\r\n", port); sprintf(buffer, "flexd connect: invalid AX.25 port name - %s\n", port);
write(STDOUT_FILENO, buffer, strlen(buffer)); write(STDOUT_FILENO, buffer, strlen(buffer));
return 1; return 1;
} }
@ -150,7 +151,7 @@ int download_dest(char *gateway, char *fname)
* Open the socket into the kernel. * Open the socket into the kernel.
*/ */
if ((s = socket(AF_AX25, SOCK_SEQPACKET, 0)) < 0) { if ((s = socket(AF_AX25, SOCK_SEQPACKET, 0)) < 0) {
sprintf(buffer, "flexd connect: cannot open AX.25 socket, %s\r\n", strerror(errno)); sprintf(buffer, "flexd connect: cannot open AX.25 socket, %s\n", strerror(errno));
write(STDOUT_FILENO, buffer, strlen(buffer)); write(STDOUT_FILENO, buffer, strlen(buffer));
return 1; return 1;
} }
@ -165,7 +166,7 @@ int download_dest(char *gateway, char *fname)
addrlen=sizeof(struct full_sockaddr_ax25); addrlen=sizeof(struct full_sockaddr_ax25);
if (bind(s, (struct sockaddr *)&axbind, addrlen) != 0) { if (bind(s, (struct sockaddr *)&axbind, addrlen) != 0) {
sprintf(buffer, "flexd connect: cannot bind AX.25 socket, %s\r\n", strerror(errno)); sprintf(buffer, "flexd connect: cannot bind AX.25 socket, %s\n", strerror(errno));
write(STDOUT_FILENO, buffer, strlen(buffer)); write(STDOUT_FILENO, buffer, strlen(buffer));
close(s); close(s);
return 1; return 1;
@ -178,14 +179,14 @@ int download_dest(char *gateway, char *fname)
axconnect.fsa_ax25.sax25_family = AF_AX25; axconnect.fsa_ax25.sax25_family = AF_AX25;
if (fcntl(s, F_SETFL, O_NONBLOCK) == -1) { if (fcntl(s, F_SETFL, O_NONBLOCK) == -1) {
sprintf(buffer, "flexd connect: fcntl on socket: %s\r\n", strerror(errno)); sprintf(buffer, "flexd connect: fcntl on socket: %s\n", strerror(errno));
write(STDOUT_FILENO, buffer, strlen(buffer)); write(STDOUT_FILENO, buffer, strlen(buffer));
close(s); close(s);
return 1; return 1;
} }
if (ax25_aton_arglist((const char **)dlist, &axconnect) == -1) { if (ax25_aton_arglist((const char **)dlist, &axconnect) == -1) {
sprintf(buffer, "flexd connect: invalid destination callsign or digipeater\r\n"); sprintf(buffer, "flexd connect: invalid destination callsign or digipeater\n");
write(STDOUT_FILENO, buffer, strlen(buffer)); write(STDOUT_FILENO, buffer, strlen(buffer));
close(s); close(s);
return 1; return 1;
@ -194,16 +195,16 @@ int download_dest(char *gateway, char *fname)
if (connect(s, (struct sockaddr *)&axconnect, addrlen) == -1 && errno != EINPROGRESS) { if (connect(s, (struct sockaddr *)&axconnect, addrlen) == -1 && errno != EINPROGRESS) {
switch (errno) { switch (errno) {
case ECONNREFUSED: case ECONNREFUSED:
strcpy(buffer, "*** Connection refused - aborting\r\n"); strcpy(buffer, "*** Connection refused - aborting\n");
break; break;
case ENETUNREACH: case ENETUNREACH:
strcpy(buffer, "*** No known route - aborting\r\n"); strcpy(buffer, "*** No known route - aborting\n");
break; break;
case EINTR: case EINTR:
strcpy(buffer, "*** Connection timed out - aborting\r\n"); strcpy(buffer, "*** Connection timed out - aborting\n");
break; break;
default: default:
sprintf(buffer, "*** Cannot connect, %s\r\n", strerror(errno)); sprintf(buffer, "*** Cannot connect, %s\n", strerror(errno));
break; break;
} }
@ -235,7 +236,7 @@ int download_dest(char *gateway, char *fname)
if (ret != 0) { if (ret != 0) {
cp = strdup(strerror(ret)); cp = strdup(strerror(ret));
strlwr(cp); strlwr(cp);
sprintf(buffer, "flexd connect: Failure with %s\r\nError: %s\r\n", gateway, cp); sprintf(buffer, "flexd connect: Failure with %s\nError: %s\n", gateway, cp);
write(STDOUT_FILENO, buffer, strlen(buffer)); write(STDOUT_FILENO, buffer, strlen(buffer));
free(cp); free(cp);
close(s); close(s);
@ -373,7 +374,7 @@ void hup_handler(int sig)
{ {
signal(SIGHUP, SIG_IGN); signal(SIGHUP, SIG_IGN);
fprintf(stderr, "SIGHUP caught by FlexD, restarting... \n\r"); fprintf(stderr, "SIGHUP caught by FlexD, restarting... \n");
read_conf(); read_conf();
update_flex(); update_flex();
@ -405,6 +406,24 @@ int main(int argc, char *argv[])
{ {
FILE *pidfile; FILE *pidfile;
if (argc > 1)
{
if (strcmp(argv[1], "-v") == 0 || strcmp(argv[1], "-h") ==0)
{
printf("FlexD version %s.\n\r", VERSION);
printf("Copywrite (c) 2000-2003 by Roy PE1RJA and Stefano IZ5AWZ\n\r");
printf("Copywrite (c) 2003 - present by Brian Rogers - N1URO.\n\r");
printf("FlexD is free sofware and you are welcome to redistribute it\n\r");
printf("under the terms of GNU General Public Licence as published\n\r");
printf("by Free Software Foundation; either version 2 of the License, or\n\r");
printf("(at your option) any later version.\n\r");
printf("\n\r");
printf("FlexD comes with NO WARRANTY. Use at your own risk.\n\r");
return 0;
}
}
signal(SIGPIPE, SIG_IGN); signal(SIGPIPE, SIG_IGN);
if (ax25_config_load_ports() == 0) { if (ax25_config_load_ports() == 0) {

View File

@ -549,7 +549,7 @@ int do_connect(int argc, char **argv)
char *connstr = NULL; char *connstr = NULL;
axio_puts("",NodeIo); axio_puts("",NodeIo);
stay = ReConnectTo; stay = 0;
if (!strcasecmp(argv[argc - 1], "s")) { if (!strcasecmp(argv[argc - 1], "s")) {
stay = 1; stay = 1;
argv[--argc] = NULL; argv[--argc] = NULL;

View File

@ -23,7 +23,7 @@ struct mheard_list {
struct mheard_list *next; struct mheard_list *next;
}; };
int do_mheard (int argc,char **argv) { int do_jheard (int argc,char **argv) {
FILE *fp; FILE *fp;
struct mheard_struct mh; struct mheard_struct mh;
struct mheard_list *list = NULL, *new, *tmp, *p; struct mheard_list *list = NULL, *new, *tmp, *p;
@ -35,7 +35,7 @@ int do_mheard (int argc,char **argv) {
if(User.ul_type == AF_NETROM) if(User.ul_type == AF_NETROM)
axio_printf(NodeIo,"%s} ",NodeId); axio_printf(NodeIo,"%s} ",NodeId);
if(argc > 1) { if(argc > 0) {
if(ax25_config_get_dev(argv[1]) == NULL if(ax25_config_get_dev(argv[1]) == NULL
|| (check_perms(PERM_HIDDEN, 0) == -1 || (check_perms(PERM_HIDDEN, 0) == -1
&& is_hidden(argv[1]))) { && is_hidden(argv[1]))) {
@ -85,7 +85,7 @@ int do_mheard (int argc,char **argv) {
if(check_perms(PERM_ANSI,0L) != -1) if(check_perms(PERM_ANSI,0L) != -1)
axio_printf(NodeIo,"\e[01;33m"); axio_printf(NodeIo,"\e[01;33m");
node_msg("MHeard list:"); node_msg("Just Heard list:");
if(check_perms(PERM_ANSI,0L) != -1) if(check_perms(PERM_ANSI,0L) != -1)
axio_printf(NodeIo,"\e[0;m"); axio_printf(NodeIo,"\e[0;m");
@ -149,3 +149,131 @@ int do_mheard (int argc,char **argv) {
node_msg(""); node_msg("");
return 0; return 0;
} }
int do_jlong (int argc,char **argv) {
FILE *fp;
struct mheard_struct mh;
struct mheard_list *list = NULL, *new, *tmp, *p;
char *s, *t, *u;
int mhcount = 0;
axio_puts("",NodeIo);
if(User.ul_type == AF_NETROM)
axio_printf(NodeIo,"%s} ",NodeId);
if(argc > 0) {
if(ax25_config_get_dev(argv[1]) == NULL
|| (check_perms(PERM_HIDDEN, 0) == -1
&& is_hidden(argv[1]))) {
axio_printf(NodeIo,"Invalid interface: %s", argv[1]);
if(User.ul_type == AF_NETROM)
node_msg("");
return 0;
}
}
if((fp = fopen(DATA_MHEARD_FILE,"r")) == NULL) {
node_perror(DATA_MHEARD_FILE,errno);
return 0;
}
while (fread(&mh,sizeof(struct mheard_struct),1,fp)
== 1) {
if(argc > 1) {
if(strcmp(argv[1],mh.portname))
continue;
}
if(check_perms(PERM_HIDDEN,0) == -1 && is_hidden(mh.portname))
continue;
if((new = calloc(1,sizeof(struct mheard_list))) == NULL) {
node_perror("do_mheard: calloc",errno);
break;
}
new->data = mh;
if(list == NULL || mh.last_heard > list->data.last_heard) {
tmp = list;
list = new;
} else {
for(p = list; p->next != NULL; p = p->next) {
if(mh.last_heard > p->next->data.last_heard)
break;
}
tmp = p->next;
p->next = new;
}
new->next = tmp;
mhcount++;
}
fclose(fp);
if(check_perms(PERM_ANSI,0L) != -1)
axio_printf(NodeIo,"\e[01;33m");
node_msg("Just Heard Long list (May timeout HFers):");
if(check_perms(PERM_ANSI,0L) != -1)
axio_printf(NodeIo,"\e[0;m");
axio_printf(NodeIo,"Callsign Device Packets Date & Time Frame Type(s)\n");
axio_printf(NodeIo,"--------- ------ -------- --------------- -------------");
while(list != NULL) {
s = ctime(&list->data.last_heard);
s[19] = 0;
s += 4;
t = ax25_ntoa(&list->data.from_call);
if((u = strstr(t,"-0")) != NULL)
*u = '\0';
axio_printf(NodeIo,"\n%-9s %-6s %-8d %s",t,list->data.portname,list->data.count,s);
if(list->data.mode & MHEARD_MODE_ARP)
axio_printf(NodeIo," ARP");
if(list->data.mode & MHEARD_MODE_FLEXNET)
axio_printf(NodeIo," FlexNet");
if(list->data.mode & MHEARD_MODE_IP_DG)
axio_printf(NodeIo," IP-DG");
if(list->data.mode & MHEARD_MODE_IP_VC)
axio_printf(NodeIo," IP-VC");
if(list->data.mode & MHEARD_MODE_NETROM)
axio_printf(NodeIo," NetRom");
if(list->data.mode & MHEARD_MODE_ROSE)
axio_printf(NodeIo," Rose");
if(list->data.mode & MHEARD_MODE_SEGMENT)
axio_printf(NodeIo," Segment");
if(list->data.mode & MHEARD_MODE_TEXNET)
axio_printf(NodeIo," TexNet");
if(list->data.mode & MHEARD_MODE_TEXT)
axio_printf(NodeIo," Text");
if(list->data.mode & MHEARD_MODE_PSATFT)
axio_printf(NodeIo," PacsatFT");
if(list->data.mode & MHEARD_MODE_PSATPB)
axio_printf(NodeIo," PacsatPB");
if(list->data.mode & MHEARD_MODE_UNKNOWN)
axio_printf(NodeIo," Unknown");
tmp = list;
list = list->next;
free(tmp);
}
if(User.ul_type == AF_NETROM)
node_msg("");
return 0;
}

View File

@ -11,19 +11,19 @@ AWZNode, and Flexnode.
.SH COMMANDS .SH COMMANDS
The following commands are supported for users of The following commands are supported for users of
.B URONode: .B URONode:
.TP 14 .TP 13
.BI ? .BI ?
Give short list of available commands. Give short list of available commands.
.TP 14 .TP 13
.BI Bye .BI Bye
Disconnect user from the node. Disconnect user from the node.
.TP 14 .TP 13
.BI "Connect <call | alias> [s|d] For NETROM" .BI "Connect <call | alias> [s|d] For NETROM"
.TP 14 .TP 13
.BI "Connect <port> <call> [via <call1> ...] [d|s] For AX.25" .BI "Connect <port> <call> [via <call1> ...] [d|s] For AX.25"
.TP 14 .TP 13
.BI "Connect <call> <address> [<digi>] [d|s] For ROSE" .BI "Connect <call> <address> [<digi>] [d|s] For ROSE"
.TP 14 .TP 13
.BI "Connect <destination> [s|d] For FlexNet" .BI "Connect <destination> [s|d] For FlexNet"
.sp 1 .sp 1
Initiates an AX25, NET/ROM, ROSE or Flexnet connection to a remote host. Initiates an AX25, NET/ROM, ROSE or Flexnet connection to a remote host.
@ -47,14 +47,14 @@ disconnects you will be returned to this node. If a single `d' is entered as
the last argument, you will be disconnected from this node too. The Default the last argument, you will be disconnected from this node too. The Default
behaviour (neither `s' nor `d' entered) is configured in the node configuration behaviour (neither `s' nor `d' entered) is configured in the node configuration
file and depends on the sysop preference. file and depends on the sysop preference.
.TP 14 .TP 13
.BI "CAllbook <call>[@<server>]" .BI "CAllbook <call>[@<server>]"
Retrieve data about a callsign from an internet-accessible Retrieve data about a callsign from an internet-accessible
callbook server. The server name can usually be omitted, since callbook server. The server name can usually be omitted, since
the default server configured by the operator is usually the default server configured by the operator is usually
valid. The default setting can be overridden by specifying valid. The default setting can be overridden by specifying
a host name. a host name.
.TP 14 .TP 13
.BI "Escape [<escape string>]" .BI "Escape [<escape string>]"
Override the sysop configured default escape character setting. If the Escape Override the sysop configured default escape character setting. If the Escape
command is given without an argument then the current escape character setting command is given without an argument then the current escape character setting
@ -78,29 +78,38 @@ to set the escape character to an Octal value.
.IP .IP
.BI "off" .BI "off"
to disable the escape character. to disable the escape character.
.TP 14 .TP 13
.BI "Finger [<username>][@<hostname>]" .BI "Finger [<username>][@<hostname>]"
Retrieve information about users of a system. If the user Retrieve information about users of a system. If the user
name is omitted, shows the users currently logged on the name is omitted, shows the users currently logged on the
host. If the hostname is omitted, defaults to the local host. host. If the hostname is omitted, defaults to the local host.
.TP 14 .TP 13
.BI "Help [<command>]" .BI "Help [<command>]"
Give help for the specified command or this text if no Give help for the specified command or this text if no
command is specified. Commands can not be abbreviated. command is specified. Commands can not be abbreviated.
Use the "?" command to retrieve a list of available commands. Use the "?" command to retrieve a list of available commands.
.TP 14 .TP 13
.BI "HOst <hostname> | <ip address>" .BI "HOst <hostname> | <ip address>"
Give the Domain Name Service host name information about <hostname> or Give the Domain Name Service host name information about <hostname> or
<ip address>. <ip address>.
.TP 14 .TP 13
.BI Info .BI Info
Display the version information and the contents of the Display the version information and the contents of the
/usr/local/etc/ax25/uronode.info file, which should describe any aspects /usr/local/etc/ax25/uronode.info file, which should describe any aspects
of your system that you would like to brag about. of your system that you would like to brag about.
.TP 14 .TP 13
.BI INTerfaces .BI INTerfaces
Display the node's interface schema, most folks often call these "ports". Display the node's interface schema, most folks often call these "ports".
.TP 14 .TP 13
.BI Jheard <interface>
Displays the last 20 stations heard to this node. You may use an interface
name to get the last 20 stations heard to that particular interface.
.TP 13
.BI JLong <interface>
Displays the full list of the heards database up to the last 100 callsigns.
Add the name of an interface for the full heards listing for that specific
interface.
.TP 13
.BI "Links [d | n | v | <call>]" .BI "Links [d | n | v | <call>]"
Shows the AX25 link table of the local node. The destinations Shows the AX25 link table of the local node. The destinations
on this list can be reached using the Connect command without on this list can be reached using the Connect command without
@ -113,10 +122,7 @@ The optional parameter v show the AX25 links via digipeaters.
You can also specify a destination callsign to get the verbose You can also specify a destination callsign to get the verbose
information for a single destination. information for a single destination.
.TP 14 .TP 13
.BI "Mheard [<portname>]"
Give a list of heard AX.25 stations on the specified port.
.TP 14
.BI "Nodes [* | <node>]" .BI "Nodes [* | <node>]"
Show the NET/ROM node table of the local host. The nodes on this Show the NET/ROM node table of the local host. The nodes on this
list can be reached using the Connect command without knowing the list can be reached using the Connect command without knowing the
@ -128,7 +134,7 @@ neighbour node used to reach each node. You can also specify
a node callsign to get the verbose information for a single node. a node callsign to get the verbose information for a single node.
In that case a "which" field that tells what route the kernel In that case a "which" field that tells what route the kernel
will use to reach the node is also shown. will use to reach the node is also shown.
.TP 14 .TP 13
.BI "Ping <host> [<size>]" .BI "Ping <host> [<size>]"
Check if a host can be reached trough the network by sending Check if a host can be reached trough the network by sending
an ICMP Echo Request packet to the host and waiting for it to an ICMP Echo Request packet to the host and waiting for it to
@ -137,7 +143,7 @@ between the local and remote hosts is shown.
.sp .sp
If an optional length is specified the data portion of the If an optional length is specified the data portion of the
packet is filled with length number of bytes up to 128. packet is filled with length number of bytes up to 128.
.TP 14 .TP 13
.BI Routes .BI Routes
Shows the NET/ROM route table of the local host (eg. the nodes Shows the NET/ROM route table of the local host (eg. the nodes
which the local node directly talks with). These nodes are used which the local node directly talks with). These nodes are used
@ -163,7 +169,7 @@ Is the quality of this route locked by the operator.
.IP .IP
.BI "QSO" .BI "QSO"
Number of NET/ROM session enties. Number of NET/ROM session enties.
.TP 14 .TP 13
.BI "Telnet <host> [<port>] [<string>] [d|s]" .BI "Telnet <host> [<port>] [<string>] [d|s]"
Initiate a telnet session to a remote host using TCP/IP. Initiate a telnet session to a remote host using TCP/IP.
By default, the telnet command connects to the TCP port 23 By default, the telnet command connects to the TCP port 23
@ -179,7 +185,7 @@ the remote host disconnects you will be returned to this node.
If a single `d' is entered as the last parameter, you will If a single `d' is entered as the last parameter, you will
be disconnected from this node too. Default behaviour (neither be disconnected from this node too. Default behaviour (neither
`s' nor `d' entered) depends on sysop configuration. `s' nor `d' entered) depends on sysop configuration.
.TP 14 .TP 13
.BI "MSG <user> <message>" .BI "MSG <user> <message>"
Send a message to another user of the node. The user Send a message to another user of the node. The user
in question must be in idle state (ie. not connected/connecting in question must be in idle state (ie. not connected/connecting
@ -188,7 +194,7 @@ anywhere or running a program).
If the user has an SSID other than zero, the SSID must be If the user has an SSID other than zero, the SSID must be
specified. If multiple users are logged in with the same specified. If multiple users are logged in with the same
callsign/SSID pair, those who are in idle state, get the message. callsign/SSID pair, those who are in idle state, get the message.
.TP 14 .TP 13
.BI Users .BI Users
Show a list of users currently connected to the local node, Show a list of users currently connected to the local node,
where the users are coming from, and what are they doing at the where the users are coming from, and what are they doing at the

6
node.c
View File

@ -258,7 +258,11 @@ int main(int argc, char *argv[])
node_msg("Sorry, I'm not allowed to talk to you."); node_msg("Sorry, I'm not allowed to talk to you.");
node_log(LOGLVL_LOGIN, "Login denied for %s @ %s", User.call, User.ul_name); node_log(LOGLVL_LOGIN, "Login denied for %s @ %s", User.call, User.ul_name);
node_logout("Login denied"); node_logout("Login denied");
} else if (strcmp(pw, "*") != 0) { }
else if (User.ul_type == AF_AX25 || User.ul_type == AF_NETROM || User.ul_type == AF_ROSE) {
(strcmp(pw, "*") == 0);
}
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,"*** 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: "); axio_printf(NodeIo,"\nPassword: ");
if ((User.ul_type == AF_INET) || (User.ul_type == AF_INET6)) { if ((User.ul_type == AF_INET) || (User.ul_type == AF_INET6)) {

9
node.h
View File

@ -1,5 +1,5 @@
#define VERSION "URONode v2.5.1" #define VERSION "URONode v2.6"
#define COMPILING "March 31, 2016" #define COMPILING "November 25, 2016"
#define STATE_IDLE 0 #define STATE_IDLE 0
#define STATE_TRYING 1 #define STATE_TRYING 1
@ -168,5 +168,6 @@ extern void newmail(void);
extern void mailcheck(void); extern void mailcheck(void);
extern void lastlog(void); extern void lastlog(void);
/* in mheard.c */ /* in jheard.c */
extern int do_mheard(int argc, char **argv); extern int do_jheard(int argc, char **argv);
extern int do_jlong(int argc, char **argv);

View File

@ -429,7 +429,7 @@ int examine_user(void)
do { do {
if (strcmp(cp, "shell")==0) { if (strcmp(cp, "shell")==0) {
shell=1; shell=1;
add_internal_cmd(&Nodecmds, "SYSop", 1, do_system); // add_internal_cmd(&Nodecmds, "SYSop", 1, do_system);
} }
cp=strtok(NULL, " ,;-/\t\n\r"); cp=strtok(NULL, " ,;-/\t\n\r");
} while(cp!=NULL); } while(cp!=NULL);