diff options
Diffstat (limited to 'ax25mond')
-rw-r--r-- | ax25mond/.cvsignore | 3 | ||||
-rw-r--r-- | ax25mond/Makefile.am | 4 | ||||
-rw-r--r-- | ax25mond/Makefile.in | 412 | ||||
-rw-r--r-- | ax25mond/ax25mond.c | 614 |
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; } |