summaryrefslogtreecommitdiffstats
path: root/ax25mond
diff options
context:
space:
mode:
Diffstat (limited to 'ax25mond')
-rw-r--r--ax25mond/.cvsignore3
-rw-r--r--ax25mond/Makefile.am4
-rw-r--r--ax25mond/Makefile.in412
-rw-r--r--ax25mond/ax25mond.c614
4 files changed, 333 insertions, 700 deletions
diff --git a/ax25mond/.cvsignore b/ax25mond/.cvsignore
new file mode 100644
index 0000000..2da6d7d
--- /dev/null
+++ b/ax25mond/.cvsignore
@@ -0,0 +1,3 @@
+Makefile
+Makefile.in
+ax25mond
diff --git a/ax25mond/Makefile.am b/ax25mond/Makefile.am
index 4ccbdc4..6499f30 100644
--- a/ax25mond/Makefile.am
+++ b/ax25mond/Makefile.am
@@ -19,8 +19,8 @@ installconf:
$(INSTALL_DATA) $$p $(DESTDIR)$(AX25_SYSCONFDIR)/$$p; \
done
-AX25_SYSCONFDIR=$(sysconfdir)/ax25/
-AX25_LOCALSTATEDIR=$(localstatedir)/ax25/
+AX25_SYSCONFDIR=$(sysconfdir)/ax25
+AX25_LOCALSTATEDIR=$(localstatedir)/ax25
INCLUDES = -DAX25_SYSCONFDIR=\""$(AX25_SYSCONFDIR)"\" \
-DAX25_LOCALSTATEDIR=\""$(AX25_LOCALSTATEDIR)"\"
diff --git a/ax25mond/Makefile.in b/ax25mond/Makefile.in
deleted file mode 100644
index 4ae17f9..0000000
--- a/ax25mond/Makefile.in
+++ /dev/null
@@ -1,412 +0,0 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
-
-# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-SHELL = @SHELL@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-
-DESTDIR =
-
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-
-top_builddir = ..
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
-INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-transform = @program_transform_name@
-
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_alias = @host_alias@
-host_triplet = @host@
-AS = @AS@
-AWK = @AWK@
-AX25_LIB = @AX25_LIB@
-CC = @CC@
-DLLTOOL = @DLLTOOL@
-LD = @LD@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-MAKEINFO = @MAKEINFO@
-NCURSES_LIB = @NCURSES_LIB@
-NM = @NM@
-OBJDUMP = @OBJDUMP@
-PACKAGE = @PACKAGE@
-RANLIB = @RANLIB@
-VERSION = @VERSION@
-
-sbin_PROGRAMS = ax25mond
-
-man_MANS = ax25mond.8 ax25mond.conf.5
-
-EXTRA_DIST = $(man_MANS) $(etcfiles)
-
-ax25mond_LDADD = $(AX25_LIB)
-
-ax25mond_SOURCES = ax25mond.c
-
-
-# Needed so that install is optional
-etcfiles = ax25mond.conf
-
-AX25_SYSCONFDIR = $(sysconfdir)/ax25/
-AX25_LOCALSTATEDIR = $(localstatedir)/ax25/
-
-INCLUDES = -DAX25_SYSCONFDIR=\""$(AX25_SYSCONFDIR)"\" -DAX25_LOCALSTATEDIR=\""$(AX25_LOCALSTATEDIR)"\"
-
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = ../config.h
-CONFIG_CLEAN_FILES =
-PROGRAMS = $(sbin_PROGRAMS)
-
-
-DEFS = @DEFS@ -I. -I$(srcdir) -I..
-CPPFLAGS = @CPPFLAGS@
-LDFLAGS = @LDFLAGS@
-LIBS = @LIBS@
-ax25mond_OBJECTS = ax25mond.o
-ax25mond_DEPENDENCIES =
-ax25mond_LDFLAGS =
-CFLAGS = @CFLAGS@
-COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
-man5dir = $(mandir)/man5
-man8dir = $(mandir)/man8
-MANS = $(man_MANS)
-
-NROFF = nroff
-DIST_COMMON = Makefile.am Makefile.in
-
-
-DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-
-TAR = tar
-GZIP_ENV = --best
-SOURCES = $(ax25mond_SOURCES)
-OBJECTS = $(ax25mond_OBJECTS)
-
-all: all-redirect
-.SUFFIXES:
-.SUFFIXES: .S .c .lo .o .s
-$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps ax25mond/Makefile
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-
-mostlyclean-sbinPROGRAMS:
-
-clean-sbinPROGRAMS:
- -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
-
-distclean-sbinPROGRAMS:
-
-maintainer-clean-sbinPROGRAMS:
-
-install-sbinPROGRAMS: $(sbin_PROGRAMS)
- @$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(sbindir)
- @list='$(sbin_PROGRAMS)'; for p in $$list; do \
- if test -f $$p; then \
- echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
- $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
- else :; fi; \
- done
-
-uninstall-sbinPROGRAMS:
- @$(NORMAL_UNINSTALL)
- list='$(sbin_PROGRAMS)'; for p in $$list; do \
- rm -f $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
- done
-
-.c.o:
- $(COMPILE) -c $<
-
-.s.o:
- $(COMPILE) -c $<
-
-.S.o:
- $(COMPILE) -c $<
-
-mostlyclean-compile:
- -rm -f *.o core *.core
-
-clean-compile:
-
-distclean-compile:
- -rm -f *.tab.c
-
-maintainer-clean-compile:
-
-.c.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
-
-.s.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
-
-.S.lo:
- $(LIBTOOL) --mode=compile $(COMPILE) -c $<
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-
-distclean-libtool:
-
-maintainer-clean-libtool:
-
-ax25mond: $(ax25mond_OBJECTS) $(ax25mond_DEPENDENCIES)
- @rm -f ax25mond
- $(LINK) $(ax25mond_LDFLAGS) $(ax25mond_OBJECTS) $(ax25mond_LDADD) $(LIBS)
-
-install-man5:
- $(mkinstalldirs) $(DESTDIR)$(man5dir)
- @list='$(man5_MANS)'; \
- l2='$(man_MANS)'; for i in $$l2; do \
- case "$$i" in \
- *.5*) list="$$list $$i" ;; \
- esac; \
- done; \
- for i in $$list; do \
- if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
- else file=$$i; fi; \
- ext=`echo $$i | sed -e 's/^.*\\.//'`; \
- inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
- inst=`echo $$inst | sed '$(transform)'`.$$ext; \
- echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man5dir)/$$inst"; \
- $(INSTALL_DATA) $$file $(DESTDIR)$(man5dir)/$$inst; \
- done
-
-uninstall-man5:
- @list='$(man5_MANS)'; \
- l2='$(man_MANS)'; for i in $$l2; do \
- case "$$i" in \
- *.5*) list="$$list $$i" ;; \
- esac; \
- done; \
- for i in $$list; do \
- ext=`echo $$i | sed -e 's/^.*\\.//'`; \
- inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
- inst=`echo $$inst | sed '$(transform)'`.$$ext; \
- echo " rm -f $(DESTDIR)$(man5dir)/$$inst"; \
- rm -f $(DESTDIR)$(man5dir)/$$inst; \
- done
-
-install-man8:
- $(mkinstalldirs) $(DESTDIR)$(man8dir)
- @list='$(man8_MANS)'; \
- l2='$(man_MANS)'; for i in $$l2; do \
- case "$$i" in \
- *.8*) list="$$list $$i" ;; \
- esac; \
- done; \
- for i in $$list; do \
- if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
- else file=$$i; fi; \
- ext=`echo $$i | sed -e 's/^.*\\.//'`; \
- inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
- inst=`echo $$inst | sed '$(transform)'`.$$ext; \
- echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man8dir)/$$inst"; \
- $(INSTALL_DATA) $$file $(DESTDIR)$(man8dir)/$$inst; \
- done
-
-uninstall-man8:
- @list='$(man8_MANS)'; \
- l2='$(man_MANS)'; for i in $$l2; do \
- case "$$i" in \
- *.8*) list="$$list $$i" ;; \
- esac; \
- done; \
- for i in $$list; do \
- ext=`echo $$i | sed -e 's/^.*\\.//'`; \
- inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
- inst=`echo $$inst | sed '$(transform)'`.$$ext; \
- echo " rm -f $(DESTDIR)$(man8dir)/$$inst"; \
- rm -f $(DESTDIR)$(man8dir)/$$inst; \
- done
-install-man: $(MANS)
- @$(NORMAL_INSTALL)
- $(MAKE) $(AM_MAKEFLAGS) install-man5 install-man8
-uninstall-man:
- @$(NORMAL_UNINSTALL)
- $(MAKE) $(AM_MAKEFLAGS) uninstall-man5 uninstall-man8
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP)
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- here=`pwd` && cd $(srcdir) \
- && mkid -f$$here/ID $$unique $(LISP)
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
- tags=; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS)'; \
- unique=`for i in $$list; do echo $$i; done | \
- awk ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
- || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
-
-mostlyclean-tags:
-
-clean-tags:
-
-distclean-tags:
- -rm -f TAGS ID
-
-maintainer-clean-tags:
-
-distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
-
-subdir = ax25mond
-
-distdir: $(DISTFILES)
- @for file in $(DISTFILES); do \
- d=$(srcdir); \
- if test -d $$d/$$file; then \
- cp -pr $$d/$$file $(distdir)/$$file; \
- else \
- test -f $(distdir)/$$file \
- || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
- || cp -p $$d/$$file $(distdir)/$$file || :; \
- fi; \
- done
-ax25mond.o: ax25mond.c
-
-info-am:
-info: info-am
-dvi-am:
-dvi: dvi-am
-check-am: all-am
-check: check-am
-installcheck-am:
-installcheck: installcheck-am
-install-exec-am: install-sbinPROGRAMS
-install-exec: install-exec-am
-
-install-data-am: install-man
-install-data: install-data-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-install: install-am
-uninstall-am: uninstall-sbinPROGRAMS uninstall-man
-uninstall: uninstall-am
-all-am: Makefile $(PROGRAMS) $(MANS)
-all-redirect: all-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
-installdirs:
- $(mkinstalldirs) $(DESTDIR)$(sbindir) $(DESTDIR)$(mandir)/man5 \
- $(DESTDIR)$(mandir)/man8
-
-
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
- -rm -f config.cache config.log stamp-h stamp-h[0-9]*
-
-maintainer-clean-generic:
-mostlyclean-am: mostlyclean-sbinPROGRAMS mostlyclean-compile \
- mostlyclean-libtool mostlyclean-tags \
- mostlyclean-generic
-
-mostlyclean: mostlyclean-am
-
-clean-am: clean-sbinPROGRAMS clean-compile clean-libtool clean-tags \
- clean-generic mostlyclean-am
-
-clean: clean-am
-
-distclean-am: distclean-sbinPROGRAMS distclean-compile \
- distclean-libtool distclean-tags distclean-generic \
- clean-am
- -rm -f libtool
-
-distclean: distclean-am
-
-maintainer-clean-am: maintainer-clean-sbinPROGRAMS \
- maintainer-clean-compile maintainer-clean-libtool \
- maintainer-clean-tags maintainer-clean-generic \
- distclean-am
- @echo "This command is intended for maintainers to use;"
- @echo "it deletes files that may require special tools to rebuild."
-
-maintainer-clean: maintainer-clean-am
-
-.PHONY: mostlyclean-sbinPROGRAMS distclean-sbinPROGRAMS \
-clean-sbinPROGRAMS maintainer-clean-sbinPROGRAMS uninstall-sbinPROGRAMS \
-install-sbinPROGRAMS mostlyclean-compile distclean-compile \
-clean-compile maintainer-clean-compile mostlyclean-libtool \
-distclean-libtool clean-libtool maintainer-clean-libtool install-man5 \
-uninstall-man5 install-man8 uninstall-man8 install-man uninstall-man \
-tags mostlyclean-tags distclean-tags clean-tags maintainer-clean-tags \
-distdir info-am info dvi-am dvi check check-am installcheck-am \
-installcheck install-exec-am install-exec install-data-am install-data \
-install-am install uninstall-am uninstall all-redirect all-am all \
-installdirs mostlyclean-generic distclean-generic clean-generic \
-maintainer-clean-generic clean mostlyclean distclean maintainer-clean
-
-installconf:
- $(mkinstalldirs) $(DESTDIR)$(AX25_SYSCONFDIR)
- @list='$(etcfiles)'; for p in $$list; do \
- echo " $(INSTALL_DATA) $$p $(DESTDIR)$(AX25_SYSCONFDIR)/$$p"; \
- $(INSTALL_DATA) $$p $(DESTDIR)$(AX25_SYSCONFDIR)/$$p; \
- done
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/ax25mond/ax25mond.c b/ax25mond/ax25mond.c
index 58a932a..928b8ed 100644
--- a/ax25mond/ax25mond.c
+++ b/ax25mond/ax25mond.c
@@ -49,15 +49,15 @@
// For older kernels
#ifndef PF_PACKET
- #define PF_PACKET PF_INET
+#define PF_PACKET PF_INET
#endif
/*--------------------------------------------------------------------------*/
static union {
- struct sockaddr sa;
- struct sockaddr_in si;
- struct sockaddr_un su;
+ struct sockaddr sa;
+ struct sockaddr_in si;
+ struct sockaddr_un su;
} addr;
/*--------------------------------------------------------------------------*/
@@ -65,313 +65,355 @@ static union {
int sock_list[MAX_SOCKETS];
char sock_monmode[MAX_SOCKETS];
char sock_filename[MAX_SOCKETS][100];
-int sock_num=0;
+int sock_num = 0;
int conn_list[MAX_CONNECTS];
struct sockaddr conn_addr[MAX_CONNECTS];
int conn_addrlen[MAX_CONNECTS];
char conn_monmode[MAX_CONNECTS];
-int conn_num=0;
+int conn_num = 0;
int highest_sock_fd;
-int end=0;
+int end = 0;
/*--------------------------------------------------------------------------*/
/* from buildsaddr.c */
struct sockaddr *build_sockaddr(const char *name, int *addrlen)
-{ char *host_name;
- char *serv_name;
- char buf[1024];
-
- memset((char *) &addr, 0, sizeof(addr));
- *addrlen=0;
-
- host_name=strcpy(buf, name);
- serv_name=strchr(buf, ':');
- if(!serv_name)
- return 0;
- *serv_name++=0;
- if(!*host_name || !*serv_name)
- return 0;
-
- if(!strcmp(host_name, "local") || !strcmp(host_name, "unix")) {
- addr.su.sun_family=AF_UNIX;
- *addr.su.sun_path=0;
- strcat(addr.su.sun_path, serv_name);
- *addrlen=sizeof(struct sockaddr_un);
- return &addr.sa;
- }
-
- addr.si.sin_family=AF_INET;
-
- if(!strcmp(host_name, "*")) {
- addr.si.sin_addr.s_addr=INADDR_ANY;
- } else if(!strcmp(host_name, "loopback")) {
- addr.si.sin_addr.s_addr=inet_addr("127.0.0.1");
- } else if((addr.si.sin_addr.s_addr=inet_addr(host_name))==-1L) {
- struct hostent *hp=gethostbyname(host_name);
- endhostent();
- if(!hp)
- return 0;
- addr.si.sin_addr.s_addr=((struct in_addr *) (hp->h_addr))->s_addr;
- }
-
- if(isdigit(*serv_name & 0xff)) {
- addr.si.sin_port=htons(atoi(serv_name));
- } else {
- struct servent *sp=getservbyname(serv_name, (char *) 0);
- endservent();
- if(!sp)
- return 0;
- addr.si.sin_port=sp->s_port;
- }
-
- *addrlen=sizeof(struct sockaddr_in);
- return &addr.sa;
+{
+ char *host_name;
+ char *serv_name;
+ char buf[1024];
+
+ memset((char *) &addr, 0, sizeof(addr));
+ *addrlen = 0;
+
+ host_name = strcpy(buf, name);
+ serv_name = strchr(buf, ':');
+ if (!serv_name)
+ return 0;
+ *serv_name++ = 0;
+ if (!*host_name || !*serv_name)
+ return 0;
+
+ if (!strcmp(host_name, "local") || !strcmp(host_name, "unix")) {
+ addr.su.sun_family = AF_UNIX;
+ *addr.su.sun_path = 0;
+ strcat(addr.su.sun_path, serv_name);
+ *addrlen = sizeof(struct sockaddr_un);
+ return &addr.sa;
+ }
+
+ addr.si.sin_family = AF_INET;
+
+ if (!strcmp(host_name, "*")) {
+ addr.si.sin_addr.s_addr = INADDR_ANY;
+ } else if (!strcmp(host_name, "loopback")) {
+ addr.si.sin_addr.s_addr = inet_addr("127.0.0.1");
+ } else if ((addr.si.sin_addr.s_addr = inet_addr(host_name)) == -1L) {
+ struct hostent *hp = gethostbyname(host_name);
+ endhostent();
+ if (!hp)
+ return 0;
+ addr.si.sin_addr.s_addr =
+ ((struct in_addr *) (hp->h_addr))->s_addr;
+ }
+
+ if (isdigit(*serv_name & 0xff)) {
+ addr.si.sin_port = htons(atoi(serv_name));
+ } else {
+ struct servent *sp = getservbyname(serv_name, (char *) 0);
+ endservent();
+ if (!sp)
+ return 0;
+ addr.si.sin_port = sp->s_port;
+ }
+
+ *addrlen = sizeof(struct sockaddr_in);
+ return &addr.sa;
}
/*--------------------------------------------------------------------------*/
-void add_socket(char *sockname, char monmode) {
- struct sockaddr *saddr;
- int saddrlen;
-
- if(sock_num==MAX_SOCKETS-1) {
- fprintf(stderr, "WARNING: Too many sockets defined - only %d are "
- "allowed\n", MAX_SOCKETS);
- return;
- }
-
- if(!(saddr=build_sockaddr(sockname,&saddrlen))) {
- fprintf(stderr, "WARNING: Invalid socket name: \"%s\"\n", sockname);
- return;
- }
-
- if(saddr->sa_family==AF_UNIX)
- strcpy(sock_filename[sock_num], strchr(sockname, ':')+1);
- else
- sock_filename[sock_num][0]=0;
-
- if((sock_list[sock_num]=socket(saddr->sa_family,SOCK_STREAM,0))<0) {
- fprintf(stderr, "WARNING: Error opening socket \"%s\": %s\n",
- sockname, strerror(errno));
- return;
- }
-
- if(bind(sock_list[sock_num],saddr,saddrlen)<0) {
- fprintf(stderr, "WARNING: Error binding socket \"%s\": %s\n",
- sockname, strerror(errno));
- return;
- }
-
- if(listen(sock_list[sock_num], 5)<0) {
- fprintf(stderr, "WARNING: Error listening on socket \"%s\": %s\n",
- sockname, strerror(errno));
- return;
- }
-
- fcntl(sock_list[sock_num],F_SETFL,O_NONBLOCK);
-
- if(sock_list[sock_num] > highest_sock_fd)
- highest_sock_fd=sock_list[sock_num];
-
- sock_monmode[sock_num]=monmode;
- sock_num++;
+void add_socket(char *sockname, char monmode)
+{
+ struct sockaddr *saddr;
+ int saddrlen;
+
+ if (sock_num == MAX_SOCKETS - 1) {
+ fprintf(stderr,
+ "WARNING: Too many sockets defined - only %d are "
+ "allowed\n", MAX_SOCKETS);
+ return;
+ }
+
+ if (!(saddr = build_sockaddr(sockname, &saddrlen))) {
+ fprintf(stderr, "WARNING: Invalid socket name: \"%s\"\n",
+ sockname);
+ return;
+ }
+
+ if (saddr->sa_family == AF_UNIX)
+ strcpy(sock_filename[sock_num], strchr(sockname, ':') + 1);
+ else
+ sock_filename[sock_num][0] = 0;
+
+ if ((sock_list[sock_num] =
+ socket(saddr->sa_family, SOCK_STREAM, 0)) < 0) {
+ fprintf(stderr,
+ "WARNING: Error opening socket \"%s\": %s\n",
+ sockname, strerror(errno));
+ return;
+ }
+
+ if (bind(sock_list[sock_num], saddr, saddrlen) < 0) {
+ fprintf(stderr,
+ "WARNING: Error binding socket \"%s\": %s\n",
+ sockname, strerror(errno));
+ return;
+ }
+
+ if (listen(sock_list[sock_num], 5) < 0) {
+ fprintf(stderr,
+ "WARNING: Error listening on socket \"%s\": %s\n",
+ sockname, strerror(errno));
+ return;
+ }
+
+ fcntl(sock_list[sock_num], F_SETFL, O_NONBLOCK);
+
+ if (sock_list[sock_num] > highest_sock_fd)
+ highest_sock_fd = sock_list[sock_num];
+
+ sock_monmode[sock_num] = monmode;
+ sock_num++;
}
/*--------------------------------------------------------------------------*/
-void close_sockets() {
- int i;
-
- for(i=0;i<sock_num;i++) {
- close(sock_list[i]);
+void close_sockets()
+{
+ int i;
- if(sock_filename[i][0])
- unlink(sock_filename[i]);
- }
+ for (i = 0; i < sock_num; i++) {
+ close(sock_list[i]);
+
+ if (sock_filename[i][0])
+ unlink(sock_filename[i]);
+ }
}
/*--------------------------------------------------------------------------*/
-void quit_handler(int dummy) {
- end=1;
+void quit_handler(int dummy)
+{
+ end = 1;
}
/*--------------------------------------------------------------------------*/
-int main(int argc, char *argv[]) {
- fd_set monavail;
- int monrx_fd, monrxtx_fd;
- struct sockaddr monfrom;
- int monfromlen;
- fd_set conn_request;
- struct timeval tv;
- char buf[500];
- int size;
- int i;
- struct ifreq ifr;
- FILE *conffile;
- char confline[100];
- char *mode;
- char *sockname;
-
- if(argc>1) {
- if(argc==2 &&
- (strcmp(argv[1],"-v")==0 || strcmp(argv[1],"--version")==0)) {
- printf("%s: Version " VERSION "\n\n", argv[0]);
- printf("Copyright (C) 1998-1999 Johann Hanne, DH3MB. All rights reserved.\n"
- "This program is free software; you can redistribute it and/or modify\n"
- "it under the terms of the GNU General Public License as published by\n"
- "the Free Software Foundation; either version 2 of the License, or\n"
- "(at your option) any later version.\n\n"
- "This program is distributed in the hope that it will be useful,\n"
- "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
- "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n");
- exit(1);
- } else {
- printf("Usage: %s [-v|--version]\n", argv[0]);
- exit(0);
- }
- }
-
- // At first, read the configuration file
- if(!(conffile=fopen(CONFFILE, "r"))) {
- fprintf(stderr, "Unable to open " CONFFILE ".\n");
- exit(1);
- }
- while(fgets(confline, 100, conffile)) {
- if(confline[0]=='#') // Comment
- continue;
-
- confline[strlen(confline)-1]=0; // Cut the LF
-
- if(!(sockname=strchr(confline, ' '))) {
- fprintf(stderr, "WARNING: The following configuration line includes "
- "one or more errors:\n%s\n", confline);
- continue;
- }
-
- *(sockname++)=0;
- mode=confline;
- if(strcasecmp(mode, "RX")==0)
- add_socket(sockname, 0);
- else if(strcasecmp(mode, "RXTX")==0)
- add_socket(sockname, 1);
- else
- fprintf(stderr, "WARNING: Mode \"%s\" not supported\n", mode);
-
- }
- fclose(conffile);
-
- if(sock_num==0) {
- fprintf(stderr, "FATAL: No usable socket found\n");
- exit(1);
- }
-
- // Fork into background
- if(fork())
- exit(0);
-
- // Close stdout, stderr and stdin
- fclose(stdout);
- fclose(stderr);
- fclose(stdin);
-
- // Set some signal handlers
- signal(SIGPIPE, SIG_IGN);
- signal(SIGTERM, quit_handler);
-
- openlog("ax25mond", LOG_PID, LOG_DAEMON);
-
- // Open AX.25 socket for monitoring RX traffic only
- if((monrx_fd=socket(PF_PACKET,SOCK_PACKET,htons(ETH_P_AX25)))<0) {
- syslog(LOG_ERR, "Error opening monitor socket: %s\n",strerror(errno));
- exit(1);
- }
- fcntl(monrx_fd,F_SETFL,O_NONBLOCK);
-
- // Open AX.25 socket for monitoring RX and TX traffic
- if((monrxtx_fd=socket(PF_PACKET,SOCK_PACKET,htons(ETH_P_ALL)))<0) {
- syslog(LOG_ERR, "Error opening monitor socket: %s\n",strerror(errno));
- exit(1);
- }
- fcntl(monrxtx_fd,F_SETFL,O_NONBLOCK);
-
- while(!end) {
-
- // Look for incoming connects on all open sockets
- FD_ZERO(&conn_request);
- for(i=0;i<sock_num;i++)
- FD_SET(sock_list[i], &conn_request);
- tv.tv_sec=0;
- tv.tv_usec=0;
- select(highest_sock_fd+1, &conn_request, 0, 0, &tv);
- for(i=0;i<sock_num;i++)
- if(FD_ISSET(sock_list[i], &conn_request)) {
- conn_list[conn_num]=accept(sock_list[i],
- &conn_addr[conn_num],
- &conn_addrlen[conn_num]);
- conn_monmode[conn_num]=sock_monmode[i];
- conn_num++;
- }
-
- // Check if there is new data on the RX-only monitor socket
- FD_ZERO(&monavail);
- FD_SET(monrx_fd,&monavail);
- tv.tv_sec=0;
- tv.tv_usec=10;
- select(monrx_fd+1, &monavail, 0, 0, &tv);
- if(FD_ISSET(monrx_fd,&monavail)) {
- monfromlen=sizeof(monfrom);
- size=recvfrom(monrx_fd,buf,sizeof(buf),0,&monfrom,&monfromlen);
- // Send the packet to all connected sockets
- for(i=0;i<conn_num;i++) {
- if(conn_monmode[i]==0)
- if(send(conn_list[i],buf,size,0)<0)
- if(errno!=EAGAIN) {
- syslog(LOG_ERR, "Error sending monitor data: %s\n",
- strerror(errno));
- close(conn_list[i]);
- conn_list[i]=conn_list[conn_num-1];
- conn_num--;
- }
- }
- }
-
- // Check if there is new data on the RX+TX monitor socket
- FD_ZERO(&monavail);
- FD_SET(monrxtx_fd,&monavail);
- tv.tv_sec=0;
- tv.tv_usec=10;
- select(monrxtx_fd+1, &monavail, 0, 0, &tv);
- if(FD_ISSET(monrxtx_fd,&monavail)) {
- monfromlen=sizeof(monfrom);
- size=recvfrom(monrxtx_fd,buf,sizeof(buf),0,&monfrom,&monfromlen);
- // Check, if we have received a AX.25-packet
- strcpy(ifr.ifr_name,monfrom.sa_data);
- ioctl(monrxtx_fd,SIOCGIFHWADDR,&ifr);
- if (ifr.ifr_hwaddr.sa_family==AF_AX25)
- // Send the packet to all connected sockets
- for(i=0;i<conn_num;i++) {
- if(conn_monmode[i]==1)
- if(send(conn_list[i],buf,size,0)<0)
- if(errno!=EAGAIN) {
- syslog(LOG_ERR, "Error sending monitor data: %s\n",
- strerror(errno));
- close(conn_list[i]);
- conn_list[i]=conn_list[conn_num-1];
- conn_num--;
- }
- }
- }
-
- }
-
- for(i=0;i<conn_num;i++)
- close(conn_list[i]);
- close_sockets();
- close(monrx_fd);
- close(monrxtx_fd);
- closelog();
- return 0;
+int main(int argc, char *argv[])
+{
+ fd_set monavail;
+ int monrx_fd, monrxtx_fd;
+ struct sockaddr monfrom;
+ int monfromlen;
+ fd_set conn_request;
+ struct timeval tv;
+ char buf[500];
+ int size;
+ int i;
+ struct ifreq ifr;
+ FILE *conffile;
+ char confline[100];
+ char *mode;
+ char *sockname;
+
+ if (argc > 1) {
+ if (argc == 2 &&
+ (strcmp(argv[1], "-v") == 0
+ || strcmp(argv[1], "--version") == 0)) {
+ printf("%s: Version " VERSION "\n\n", argv[0]);
+ printf
+ ("Copyright (C) 1998-1999 Johann Hanne, DH3MB. All rights reserved.\n"
+ "This program is free software; you can redistribute it and/or modify\n"
+ "it under the terms of the GNU General Public License as published by\n"
+ "the Free Software Foundation; either version 2 of the License, or\n"
+ "(at your option) any later version.\n\n"
+ "This program is distributed in the hope that it will be useful,\n"
+ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n");
+ exit(1);
+ } else {
+ printf("Usage: %s [-v|--version]\n", argv[0]);
+ exit(0);
+ }
+ }
+ // At first, read the configuration file
+ if (!(conffile = fopen(CONFFILE, "r"))) {
+ fprintf(stderr, "Unable to open " CONFFILE ".\n");
+ exit(1);
+ }
+ while (fgets(confline, 100, conffile)) {
+ if (confline[0] == '#') // Comment
+ continue;
+
+ confline[strlen(confline) - 1] = 0; // Cut the LF
+
+ if (!(sockname = strchr(confline, ' '))) {
+ fprintf(stderr,
+ "WARNING: The following configuration line includes "
+ "one or more errors:\n%s\n", confline);
+ continue;
+ }
+
+ *(sockname++) = 0;
+ mode = confline;
+ if (strcasecmp(mode, "RX") == 0)
+ add_socket(sockname, 0);
+ else if (strcasecmp(mode, "RXTX") == 0)
+ add_socket(sockname, 1);
+ else
+ fprintf(stderr,
+ "WARNING: Mode \"%s\" not supported\n",
+ mode);
+
+ }
+ fclose(conffile);
+
+ if (sock_num == 0) {
+ fprintf(stderr, "FATAL: No usable socket found\n");
+ exit(1);
+ }
+ // Fork into background
+ if (fork())
+ exit(0);
+
+ // Close stdout, stderr and stdin
+ fclose(stdout);
+ fclose(stderr);
+ fclose(stdin);
+
+ // Set some signal handlers
+ signal(SIGPIPE, SIG_IGN);
+ signal(SIGTERM, quit_handler);
+
+ openlog("ax25mond", LOG_PID, LOG_DAEMON);
+
+ // Open AX.25 socket for monitoring RX traffic only
+ if ((monrx_fd =
+ socket(PF_PACKET, SOCK_PACKET, htons(ETH_P_AX25))) < 0) {
+ syslog(LOG_ERR, "Error opening monitor socket: %s\n",
+ strerror(errno));
+ exit(1);
+ }
+ fcntl(monrx_fd, F_SETFL, O_NONBLOCK);
+
+ // Open AX.25 socket for monitoring RX and TX traffic
+ if ((monrxtx_fd =
+ socket(PF_PACKET, SOCK_PACKET, htons(ETH_P_ALL))) < 0) {
+ syslog(LOG_ERR, "Error opening monitor socket: %s\n",
+ strerror(errno));
+ exit(1);
+ }
+ fcntl(monrxtx_fd, F_SETFL, O_NONBLOCK);
+
+ while (!end) {
+
+ // Look for incoming connects on all open sockets
+ FD_ZERO(&conn_request);
+ for (i = 0; i < sock_num; i++)
+ FD_SET(sock_list[i], &conn_request);
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+ select(highest_sock_fd + 1, &conn_request, 0, 0, &tv);
+ for (i = 0; i < sock_num; i++)
+ if (FD_ISSET(sock_list[i], &conn_request)) {
+ conn_list[conn_num] = accept(sock_list[i],
+ &conn_addr
+ [conn_num],
+ &conn_addrlen
+ [conn_num]);
+ conn_monmode[conn_num] = sock_monmode[i];
+ conn_num++;
+ }
+ // Check if there is new data on the RX-only monitor socket
+ FD_ZERO(&monavail);
+ FD_SET(monrx_fd, &monavail);
+ tv.tv_sec = 0;
+ tv.tv_usec = 10;
+ select(monrx_fd + 1, &monavail, 0, 0, &tv);
+ if (FD_ISSET(monrx_fd, &monavail)) {
+ monfromlen = sizeof(monfrom);
+ size =
+ recvfrom(monrx_fd, buf, sizeof(buf), 0,
+ &monfrom, &monfromlen);
+ // Send the packet to all connected sockets
+ for (i = 0; i < conn_num; i++) {
+ if (conn_monmode[i] == 0)
+ if (send
+ (conn_list[i], buf, size,
+ 0) < 0)
+ if (errno != EAGAIN) {
+ syslog(LOG_ERR,
+ "Error sending monitor data: %s\n",
+ strerror
+ (errno));
+ close(conn_list
+ [i]);
+ conn_list[i] =
+ conn_list
+ [conn_num - 1];
+ conn_num--;
+ }
+ }
+ }
+ // Check if there is new data on the RX+TX monitor socket
+ FD_ZERO(&monavail);
+ FD_SET(monrxtx_fd, &monavail);
+ tv.tv_sec = 0;
+ tv.tv_usec = 10;
+ select(monrxtx_fd + 1, &monavail, 0, 0, &tv);
+ if (FD_ISSET(monrxtx_fd, &monavail)) {
+ monfromlen = sizeof(monfrom);
+ size =
+ recvfrom(monrxtx_fd, buf, sizeof(buf), 0,
+ &monfrom, &monfromlen);
+ // Check, if we have received a AX.25-packet
+ strcpy(ifr.ifr_name, monfrom.sa_data);
+ ioctl(monrxtx_fd, SIOCGIFHWADDR, &ifr);
+ if (ifr.ifr_hwaddr.sa_family == AF_AX25)
+ // Send the packet to all connected sockets
+ for (i = 0; i < conn_num; i++) {
+ if (conn_monmode[i] == 1)
+ if (send
+ (conn_list[i], buf,
+ size, 0) < 0)
+ if (errno !=
+ EAGAIN) {
+ syslog
+ (LOG_ERR,
+ "Error sending monitor data: %s\n",
+ strerror
+ (errno));
+ close
+ (conn_list
+ [i]);
+ conn_list
+ [i] =
+ conn_list
+ [conn_num
+ - 1];
+ conn_num--;
+ }
+ }
+ }
+
+ }
+
+ for (i = 0; i < conn_num; i++)
+ close(conn_list[i]);
+ close_sockets();
+ close(monrx_fd);
+ close(monrxtx_fd);
+ closelog();
+ return 0;
}