diff --git a/.gitea/workflows/alt.yaml b/.gitea/workflows/alt.yaml new file mode 100644 index 0000000..dcbe279 --- /dev/null +++ b/.gitea/workflows/alt.yaml @@ -0,0 +1,65 @@ +name: Altlinux build +run-name: Deploy to ${{ inputs.deploy_target }} by @${{ github.actor }} 🚀 +on: + - push + - workflow_dispatch +if: ${{ github.ref }} == 'refs/head/master' +jobs: + build-alt: + runs-on: alt-latest + + branches: + - 'master' + + steps: + - name: Checking environment + continue-on-error: true + run: printenv + - name: Installing prerequisites - update apt + run: apt-get update + - name: Installing prerequisites - install nodejs for actions & git + run: apt-get install -y git nodejs su + - name: Installing build environment + continue-on-error: true + run: | + apt-get install -y gcc rpm-build rpmlint make python gear hasher fakeroot patch rpmdevtools + - name: Installing needed software + run: apt-get install -y bison tcl + - name: Adding build user + run: useradd -d /builder -g users -m builder + - name: Fetching sources + uses: actions/checkout@v4 + - name: Getting version info + run: | + echo "BFORCE_VER=$(cat ${{ env.GITHUB_WORKSPACE }}/source/.version)" >> $GITHUB_ENV + - name: Compressing source to tar.gz archive + run: | + tar -cvzf ../bforce-${{ env.BFORCE_VER }}.tar.gz -C ${{ env.GITHUB_WORKSPACE }}/.. bforce + cp -v ${{ env.GITHUB_WORKSPACE }}/rpm/bforce.spec /builder/ + chown builder /builder/bforce.spec + echo '-------------------------------------------------------' + pwd + ls /builder + sed -i 's/^# %setup/%setup/' /builder/bforce.spec + - name: Building buildtree + run: | + su - builder -c "cd /builder && mkdir -pv rpmbuild/{RPMS,SRPMS,SOURCES,BUILD,SPECS}" + ls /builder -l + mkdir -pv /builder/rpmbuild/SOURCES + mv ${{ env.GITHUB_WORKSPACE }}/../bforce-${{ env.BFORCE_VER }}.tar.gz /builder/rpmbuild/SOURCES/ + chown -R builder /builder/* + - name: Building binary and source RPM + run: | + su - builder -c 'rpmbuild -bb /builder/bforce.spec --define "_topdir /builder/rpmbuild"' + - name: Constructing artifact name and version + run: | + echo "BFORCE_VERLONG=$(cat ${{ env.GITHUB_WORKSPACE }}/source/.version)-$(date +%Y%M%d)" >> $GITHUB_ENV + - name: Retrieving artifact files + run: mkdir bforce && cp /builder/rpmbuild/RPMS/x86_64/bforce-*.rpm bforce + - name: Try to upload artifacts bin + uses: actions/upload-artifact@v3 + with: + name: bforce-${{ env.BFORCE_VERLONG }}-Alt + path: /builder/rpmbuild/RPMS/x86_64 + - name: Echo OK + run: echo "All OK" diff --git a/README.md b/README.md index 38ef0b3..d2296bd 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ ![master branch](https://prj.zxalexis.ru/gitea/zx/bforce/actions/workflows/debpkg.yaml/badge.svg?branch=master) ![master branch](https://prj.zxalexis.ru/gitea/zx/bforce/actions/workflows/arch.yaml/badge.svg?branch=master) +![master branch](https://prj.zxalexis.ru/gitea/zx/bforce/actions/workflows/alt.yaml/badge.svg?branch=master) BinkleyForce FTN mailer ----------------------- diff --git a/rpm/bforce.spec b/rpm/bforce.spec index c080cdf..0f438da 100644 --- a/rpm/bforce.spec +++ b/rpm/bforce.spec @@ -1,54 +1,66 @@ Summary: Bforce, Fidonet mailer Name: bforce Version: 0.26.1 -Release: 0 +Release: %{_vendor}.1 Copyright: GPL Group: Fidonet/mailer -Source0: bforce-%{version}.%{release}.tar.gz +Source0: bforce-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-root %description BFORCE is a FTN mailer. Supports PSTN and binkp sessions. %prep -#%setup -q -n %{name}-%{version}.%{release} -cd source -./configure --prefix=/usr --disable-log-passwd --sysconfdir=/etc/bforce --bindir=/usr/bin --with-owner=uucp --with-group=news +# uncomment this to build from tarball +# %setup -q -n %{name} +echo "------------ PREPARING RPM BUILD IN $(pwd) ------------" +export RPM_PACKAGE_VERSION=$(cat %{_builddir}/%{name}/source/.version) +cd %{_builddir}/%{name}/source +%{_builddir}/%{name}/source/configure --prefix=/usr --disable-log-passwd --sysconfdir=/etc/bforce --bindir=/usr/bin --with-owner=uucp --with-group=news CFLAGS='-g1' %build -cd source +echo "------------ BUILDING RPM IN $(pwd) ------------" +cd %{_builddir}/%{name}/source make %install rm -rf $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT/etc/bforce mkdir -p $RPM_BUILD_ROOT/usr/bin mkdir -p $RPM_BUILD_ROOT/usr/sbin +mkdir -p $RPM_BUILD_ROOT/usr/share/man/man1 mkdir -p $RPM_BUILD_ROOT/var/log/bforce mkdir -p $RPM_BUILD_ROOT/var/spool/fido/bt/pin mkdir -p $RPM_BUILD_ROOT/var/spool/fido/bt/in mkdir -p $RPM_BUILD_ROOT/var/spool/fido/ndl mkdir -p $RPM_BUILD_ROOT/var/spool/fido/bforce +mkdir -p $RPM_BUILD_ROOT/$RPM_DOC_DIR/$RPM_PACKAGE_NAME-$RPM_PACKAGE_VERSION -install -o uucp -g news source/bin/bforce $RPM_BUILD_ROOT/usr/bin/bforce -install -o uucp -g news source/bin/bfindex $RPM_BUILD_ROOT/usr/bin/bfindex -install -o uucp -g news source/bin/bfstat $RPM_BUILD_ROOT/usr/bin/bfstat -install -o uucp -g news source/bin/nlookup $RPM_BUILD_ROOT/usr/bin/nlookup -install -o uucp -g news examples/bforce.conf $RPM_BUILD_ROOT/etc/bforce/bforce.conf.sample -install -o uucp -g news examples/bforce.passwd $RPM_BUILD_ROOT/etc/bforce/bforce.passwd.sample -install -o uucp -g news examples/bforce.subst $RPM_BUILD_ROOT/etc/bforce/bforce.subst.sample -install -o uucp -g news examples/freq.aliases $RPM_BUILD_ROOT/etc/bforce/freq.aliases.sample -install -o uucp -g news examples/freq.dirs $RPM_BUILD_ROOT/etc/bforce/freq.dirs.sample -install -m755 -o uucp -g news contrib/outman $RPM_BUILD_ROOT/usr/bin/outman - +install %{_builddir}/%{name}/source/bin/bforce $RPM_BUILD_ROOT/usr/bin/bforce +install %{_builddir}/%{name}/source/bin/bfindex $RPM_BUILD_ROOT/usr/bin/bfindex +install %{_builddir}/%{name}/source/bin/bfstat $RPM_BUILD_ROOT/usr/bin/bfstat +install %{_builddir}/%{name}/source/bin/nlookup $RPM_BUILD_ROOT/usr/bin/nlookup +install %{_builddir}/%{name}/examples/bforce.conf $RPM_BUILD_ROOT/etc/bforce/bforce.conf.sample +install %{_builddir}/%{name}/examples/bforce.passwd $RPM_BUILD_ROOT/etc/bforce/bforce.passwd.sample +install %{_builddir}/%{name}/examples/bforce.subst $RPM_BUILD_ROOT/etc/bforce/bforce.subst.sample +install %{_builddir}/%{name}/examples/freq.aliases $RPM_BUILD_ROOT/etc/bforce/freq.aliases.sample +install %{_builddir}/%{name}/examples/freq.dirs $RPM_BUILD_ROOT/etc/bforce/freq.dirs.sample +install %{_builddir}/%{name}/contrib/outman $RPM_BUILD_ROOT/usr/bin/outman +cp %{_builddir}/%{name}/man/*.1 $RPM_BUILD_ROOT/usr/share/man/man1/ +cp %{_builddir}/%{name}/{README.md,CHANGES,COPYING,INSTALL,INSTALL.ru,SYSLOG,TODO} $RPM_BUILD_ROOT/$RPM_DOC_DIR/$RPM_PACKAGE_NAME-$RPM_PACKAGE_VERSION/ %clean rm -rf $RPM_BUILD_ROOT %files -%doc README README.kst CHANGES CHANGES.kst CHANGES.ugenk COPYING INSTALL.ru README.ugenk SYSLOG TODO +%{_mandir}/man1/bforce.1.xz +%{_mandir}/man1/bfindex.1.xz +%{_mandir}/man1/bfstat.1.xz +%{_mandir}/man1/nlookup.1.xz +%{_mandir}/man1/outman.1.xz %defattr(-, root, root) %attr(550,uucp,news) /usr/bin/bforce @@ -56,7 +68,7 @@ rm -rf $RPM_BUILD_ROOT %attr(550,uucp,news) /usr/bin/bfstat %attr(550,uucp,news) /usr/bin/nlookup %attr(550,uucp,news) /usr/bin/outman -%attr(644,root,root) /usr/share/doc/bforce/* +%attr(644,root,root) /usr/share/doc/bforce-%{version}/* %dir %attr(770,uucp,news) /var/log/bforce %dir %attr(770,uucp,news) /var/spool/fido/ndl %attr(775,uucp,news) /var/spool/fido/bt diff --git a/source/Makefile.in b/source/Makefile.in index 7ba8e25..742b2b4 100644 --- a/source/Makefile.in +++ b/source/Makefile.in @@ -13,13 +13,14 @@ CC = @CC@ INCLUDES = -I./include CFLAGS = @CFLAGS@ -fno-builtin LIBS = @LIBS@ @CLOCK_LIB@ -YACC = @YACC@ +YACC = @YACC@ -l INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ SRCDIR = @srcdir@ SRCDIRCONF = $(SRCDIR)/../examples CONTRIBDIR = $(SRCDIR)/../contrib +CONTRIBMAN = $(SRCDIR)/../man OWNER = @OWNER@ GROUP = @GROUP@ @@ -27,6 +28,7 @@ CONFDIR = @sysconfdir@ BINDIR = @bindir@ LOGDIR = @LOGDIR@ SPOOLDIR = @SPOOLDIR@ +MANDIR = @MANDIR@ DAEMON_LOGFILE = $(LOGDIR)/bf-daemon BFORCE_LOGFILE = $(LOGDIR)/bf-log @@ -175,6 +177,7 @@ installdirs: if [ ! -d $(SPOOLDIR)/bt/out ]; then mkdir -p $(SPOOLDIR)/bt/out; fi if [ ! -d $(SPOOLDIR)/ndl ]; then mkdir -p $(SPOOLDIR)/ndl; fi if [ ! -d $(SPOOLDIR)/bforce ]; then mkdir -p $(SPOOLDIR); fi + if [ ! -d $(MANDIR)/man1 ]; then mkdir -p $(MANDIR)/man1; fi chown $(OWNER):$(GROUP) $(CONFDIR) chown $(OWNER):$(GROUP) $(LOGDIR) chown $(OWNER):$(GROUP) $(SPOOLDIR)/bt/in @@ -195,10 +198,17 @@ install-config: $(INSTALL_DATA) -o $(OWNER) -g $(GROUP) $(SRCDIRCONF)/bforce.passwd $(CONFDIR)/bforce.passwd.sample $(INSTALL_DATA) -o $(OWNER) -g $(GROUP) $(SRCDIRCONF)/freq.aliases $(CONFDIR)/freq.aliases.sample $(INSTALL_DATA) -o $(OWNER) -g $(GROUP) $(SRCDIRCONF)/freq.dirs $(CONFDIR)/freq.dirs.sample + +install-man: + $(INSTALL) $(CONTRIBMAN)/bforce.1 $(MANDIR)/man1/bforce.1 + $(INSTALL) $(CONTRIBMAN)/bfindex.1 $(MANDIR)/man1/bfindex.1 + $(INSTALL) $(CONTRIBMAN)/bfstat.1 $(MANDIR)/man1/bforce.1 + $(INSTALL) $(CONTRIBMAN)/nlookup.1 $(MANDIR)/man1/bforce.1 + $(INSTALL) $(CONTRIBMAN)/outman.1 $(MANDIR)/man1/bforce.1 install-contrib: $(INSTALL_PROGRAM) -o $(OWNER) -g $(GROUP) $(CONTRIBDIR)/outman $(BINDIR)/outman @echo "Please, edit $(BINDIR)/outman" -install: install-bin install-config +install: install-bin install-config install-man diff --git a/source/bforce/daemon.c b/source/bforce/daemon.c index dfd706e..fc9ff6e 100644 --- a/source/bforce/daemon.c +++ b/source/bforce/daemon.c @@ -810,6 +810,7 @@ int daemon_pidfile(int cmd) res = fscanf(pf, "%d", &hispid); if (res != 1) { log("daemon pidfile: not readable"); + fclose(pf); return -1; } @@ -854,6 +855,7 @@ int daemon_pidfile(int cmd) res = fscanf(pf, "%d", &hispid); if (res != 1) { log("daemon pidfile: not readable"); + fclose(pf); return -1; } @@ -883,6 +885,7 @@ int daemon_pidfile(int cmd) res = fscanf(pf, "%d", &hispid); if (res != 1) { log("daemon pidfile: not readable"); + fclose(pf); return -1; } diff --git a/source/bforce/daemon_lines.c b/source/bforce/daemon_lines.c index 470448a..e421864 100644 --- a/source/bforce/daemon_lines.c +++ b/source/bforce/daemon_lines.c @@ -32,7 +32,7 @@ int daemon_line_add(const char *name, int type) int i; for( i = 0; i < lines_num; i++ ) - if( !strcmp(lines_tab[i].name, name) ) + if( (lines_tab) && !strcmp(lines_tab[i].name, name) ) return i; log("register new line \"%s\"", name); @@ -90,13 +90,12 @@ bool daemon_line_isready(const char *name) void daemon_lines_deinit(void) { int i; - - for( i = 0; i < lines_num; i++ ) - if( lines_tab[i].name ) - free(lines_tab[i].name); - - if( lines_tab ) + if( lines_tab ) { + for( i = 0; i < lines_num; i++ ) + if( lines_tab[i].name ) + free(lines_tab[i].name); + free(lines_tab); lines_tab = NULL; } diff --git a/source/bforce/expression.tab.c b/source/bforce/expression.tab.c index 13f154b..36ead6c 100644 --- a/source/bforce/expression.tab.c +++ b/source/bforce/expression.tab.c @@ -67,7 +67,7 @@ /* First part of user prologue. */ -#line 49 "expression.y" + #include "includes.h" #include "confread.h" @@ -110,7 +110,7 @@ static int yyparse(void); static int yyerror(const char *s); -#line 114 "expression.tab.c" + # ifndef YY_CAST # ifdef __cplusplus @@ -1225,25 +1225,25 @@ yyreduce: switch (yyn) { case 2: /* fullline: expression */ -#line 94 "expression.y" + { DEB((D_EVENT, "[yacc] expression return %d", yyvsp[0])); expr_result = yyvsp[0]; } -#line 1231 "expression.tab.c" + break; case 3: /* expression: elemexp */ -#line 100 "expression.y" + { DEB((D_EVENT, "[yacc] elemexp return %d", yyvsp[0])); yyval = yyvsp[0]; } -#line 1240 "expression.tab.c" + break; case 4: /* expression: NOT expression */ -#line 105 "expression.y" + { DEB((D_EVENT, "[yacc] not exprression %d", yyvsp[0])); if( (yyvsp[0]) < 0 ) @@ -1251,190 +1251,190 @@ yyreduce: else yyval = !(yyvsp[0]); } -#line 1252 "expression.tab.c" + break; case 5: /* expression: expression LOGOP expression */ -#line 113 "expression.y" + { yyval = expr_check_logic(yyvsp[-2], yyvsp[-1], yyvsp[0]); } -#line 1260 "expression.tab.c" + break; case 6: /* expression: OPENB expression CLOSEB */ -#line 117 "expression.y" + { DEB((D_EVENT, "eventexp: [yacc] backeted.expr %d", yyvsp[-1])); yyval = yyvsp[-1]; } -#line 1269 "expression.tab.c" + break; case 7: /* elemexp: INCOMING */ -#line 123 "expression.y" + { yyval = expr_check_incoming(); } -#line 1277 "expression.tab.c" + break; case 8: /* elemexp: OUTGOING */ -#line 127 "expression.y" + { yyval = expr_check_outgoing(); } -#line 1285 "expression.tab.c" + break; case 9: /* elemexp: LISTED */ -#line 131 "expression.y" + { yyval = expr_check_listed(); } -#line 1293 "expression.tab.c" + break; case 10: /* elemexp: PROTECTED */ -#line 135 "expression.y" + { yyval = expr_check_protected(); } -#line 1301 "expression.tab.c" + break; case 11: /* elemexp: FLAG flagstring */ -#line 139 "expression.y" + { yyval = yyvsp[0]; } -#line 1309 "expression.tab.c" + break; case 12: /* elemexp: CONNSPEED AROP NUMBER */ -#line 143 "expression.y" + { if( state.valid && state.connspeed > 0 ) yyval = expr_check_arop(state.connspeed, yyvsp[-1], yyvsp[0]); else yyval = -1; } -#line 1320 "expression.tab.c" + break; case 13: /* elemexp: SPEED AROP NUMBER */ -#line 150 "expression.y" + { if( state.valid && state.node.speed > 0 ) yyval = expr_check_arop(state.node.speed, yyvsp[-1], yyvsp[0]); else yyval = -1; } -#line 1331 "expression.tab.c" + break; case 14: /* elemexp: TZ AROP NUMBER */ -#line 157 "expression.y" + { yyval = expr_check_arop(time_gmtoffset(), yyvsp[-1], yyvsp[0]); } -#line 1339 "expression.tab.c" + break; case 15: /* elemexp: PHONE TEXT */ -#line 161 "expression.y" + { yyval = expr_check_phone(expr_p_text); } -#line 1347 "expression.tab.c" + break; case 16: /* elemexp: TIME timestring */ -#line 165 "expression.y" + { yyval = yyvsp[0]; } -#line 1355 "expression.tab.c" + break; case 17: /* elemexp: EXEC TEXT */ -#line 169 "expression.y" + { yyval = expr_check_exec(expr_p_text); } -#line 1363 "expression.tab.c" + break; case 18: /* elemexp: EXIST TEXT */ -#line 173 "expression.y" + { yyval = expr_check_exist(expr_p_text); } -#line 1371 "expression.tab.c" + break; case 19: /* elemexp: PORT TEXT */ -#line 177 "expression.y" + { yyval = expr_check_port(expr_p_text); } -#line 1379 "expression.tab.c" + break; case 20: /* elemexp: MAILER TEXT */ -#line 181 "expression.y" + { yyval = expr_check_mailer(expr_p_text); } -#line 1387 "expression.tab.c" + break; case 21: /* elemexp: TEXT */ -#line 185 "expression.y" + { yyval = expr_check_addr(expr_p_text); if( yyval == -2 ) YYABORT; } -#line 1397 "expression.tab.c" + break; case 22: /* flagstring: TEXT */ -#line 192 "expression.y" + { yyval = expr_check_flag(expr_p_text); } -#line 1405 "expression.tab.c" + break; case 23: /* flagstring: TEXT COMMA flagstring */ -#line 196 "expression.y" + { yyval = expr_check_logic(yyvsp[-2], OR, yyvsp[0]); } -#line 1413 "expression.tab.c" + break; case 24: /* timestring: TEXT */ -#line 201 "expression.y" + { yyval = expr_check_time(expr_p_text); if( yyval == -2 ) YYABORT; } -#line 1423 "expression.tab.c" + break; case 25: /* timestring: TEXT COMMA timestring */ -#line 207 "expression.y" + { yyval = expr_check_logic(yyvsp[-2], OR, yyvsp[0]); } -#line 1431 "expression.tab.c" + break; -#line 1435 "expression.tab.c" + default: break; } @@ -1627,7 +1627,7 @@ yyreturnlab: return yyresult; } -#line 211 "expression.y" + #include "expression_lex.c" diff --git a/source/bforce/freq_proc.c b/source/bforce/freq_proc.c index 06e57f4..6249dc1 100644 --- a/source/bforce/freq_proc.c +++ b/source/bforce/freq_proc.c @@ -115,7 +115,7 @@ static void req_readfrlist(char *fname, s_frlist **frlist, int magic) (*ptrl) = (s_frlist*)xmalloc(sizeof(s_frlist)); memset(*ptrl, '\0', sizeof(s_frlist)); - if( path && *path ) (*ptrl)->path = xstrcpy(path); + if( *path ) (*ptrl)->path = xstrcpy(path); if( !magic && *(path + strlen(path) - 1) != DIRSEPCHR ) { /* add trailing DIRSEP ('/' or ..) to paths */ diff --git a/source/bforce/io_tcpip.c b/source/bforce/io_tcpip.c index 38f3145..06758ae 100644 --- a/source/bforce/io_tcpip.c +++ b/source/bforce/io_tcpip.c @@ -19,7 +19,7 @@ #define DEFAULT_PORT 60179 /* Birthday .. mother fucker :) */ -struct addrinfo *ai = NULL; +struct addrinfo *paddrinfo = NULL; static RETSIGTYPE tcpip_interrupt(int sig) { @@ -171,7 +171,7 @@ int tcpip_connect(const char *hostname, e_tcpmode tcpmode) //aihints.ai_socktype = SOCK_STREAM; aihints.ai_protocol = IPPROTO_TCP; - nameres = getaddrinfo ( host, port, &aihints, &ai ); + nameres = getaddrinfo ( host, port, &aihints, &paddrinfo ); if ( nameres != 0 ) { rc = 1; @@ -208,10 +208,10 @@ int tcpip_connect(const char *hostname, e_tcpmode tcpmode) if( host ) { free(host); host = NULL; } DEB((D_INFO, "tcpip_connect: resolver got result!")); - aisave = ai; + aisave = paddrinfo; if (rc == 0 ) - rc = tcpip_connect2(ai); + rc = tcpip_connect2(paddrinfo); freeaddrinfo( aisave ); diff --git a/source/configure.in b/source/configure.in index 16fd356..017523d 100644 --- a/source/configure.in +++ b/source/configure.in @@ -3,7 +3,7 @@ dnl dnl $Id$ dnl #AC_INIT(bforce/bforce.c) -AC_INIT([bforce],[0.24.1],[zx@zxalexis.ru]) +AC_INIT([bforce],[0.26.1],[zx@zxalexis.ru]) AC_CONFIG_HEADER(include/config.h) AC_CANONICAL_SYSTEM dnl # Minimum Autoconf version required.