From f6643f30ebba56b11d26b16ad5583221c258a150 Mon Sep 17 00:00:00 2001 From: Tom Early Date: Wed, 11 Mar 2020 10:14:59 -0700 Subject: [PATCH] moved sigaction to std::signal --- QnetDVAP.cpp | 69 +++++++--------------------------- QnetGateway.cpp | 98 ++++++++++--------------------------------------- QnetITAP.cpp | 23 +++--------- QnetITAP.h | 2 +- QnetLink.cpp | 59 +++++++---------------------- QnetModem.cpp | 28 ++++---------- QnetRelay.cpp | 28 ++++---------- 7 files changed, 67 insertions(+), 240 deletions(-) diff --git a/QnetDVAP.cpp b/QnetDVAP.cpp index fa892e9..b665e75 100644 --- a/QnetDVAP.cpp +++ b/QnetDVAP.cpp @@ -1,7 +1,7 @@ /* - * Copyright (C) 2010, 2011 by Scott Lawson KI4LKF + * Copyright (C) 2010,2011 by Scott Lawson KI4LKF * - * Copyright (C) 2015 by Thomas A. Early N7TAE + * Copyright (C) 2015,2020 by Thomas A. Early N7TAE * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,7 +31,6 @@ #include #include #include -#include #include #include #include @@ -43,6 +42,7 @@ #include #include #include +#include #include "DVAPDongle.h" #include "QnetTypeDefs.h" @@ -150,11 +150,9 @@ static void calcPFCS(unsigned char *packet, unsigned char *pfcs) return; } -static void sig_catch(int signum) +static void sig_catch(int) { - if ((signum == SIGTERM) || (signum == SIGINT) || (signum == SIGHUP)) - keep_running = false; - exit(0); + keep_running = false; } /* process configuration file */ @@ -524,23 +522,11 @@ static void RptrAckThread(SDVAP_ACK_ARG *parg) sprintf(RADIO_ID, "%20.2f", ber); memcpy(RADIO_ID, "BER%", 4); - struct sigaction act; unsigned char silence[12] = { 0x9e,0x8d,0x32,0x88,0x26,0x1a,0x3f,0x61,0xe8,0x70,0x4f,0x93 }; - act.sa_handler = sig_catch; - sigemptyset(&act.sa_mask); - if (sigaction(SIGTERM, &act, 0) != 0) { - printf("sigaction-TERM failed, error=%d\n", errno); - return; - } - if (sigaction(SIGHUP, &act, 0) != 0) { - printf("sigaction-HUP failed, error=%d\n", errno); - return; - } - if (sigaction(SIGINT, &act, 0) != 0) { - printf("sigaction-INT failed, error=%d\n", errno); - return; - } + std::signal(SIGTERM, sig_catch); + std::signal(SIGINT, sig_catch); + std::signal(SIGHUP, sig_catch); sleep(TIMING_PLAY_WAIT); @@ -642,7 +628,6 @@ static void ReadDVAPThread() SDSVT dsvt; SDVAP_REGISTER dr; CTimer last_RF_time; - struct sigaction act; bool dvap_busy = false; // bool ptt = false; bool the_end = true; @@ -656,23 +641,9 @@ static void ReadDVAPThread() int num_dv_frames = 0; int num_bit_errors = 0; - act.sa_handler = sig_catch; - sigemptyset(&act.sa_mask); - if (sigaction(SIGTERM, &act, 0) != 0) { - printf("sigaction-TERM failed, error=%d\n", errno); - keep_running = false; - return; - } - if (sigaction(SIGHUP, &act, 0) != 0) { - printf("sigaction-HUP failed, error=%d\n", errno); - keep_running = false; - return; - } - if (sigaction(SIGINT, &act, 0) != 0) { - printf("sigaction-INT failed, error=%d\n", errno); - keep_running = false; - return; - } + std::signal(SIGTERM, sig_catch); + std::signal(SIGINT, sig_catch); + std::signal(SIGHUP, sig_catch); while (keep_running) { @@ -891,7 +862,6 @@ static void ReadDVAPThread() int main(int argc, const char **argv) { - struct sigaction act; int rc = -1; short cnt = 0; @@ -964,20 +934,9 @@ int main(int argc, const char **argv) CTimer ackpoint; - act.sa_handler = sig_catch; - sigemptyset(&act.sa_mask); - if (sigaction(SIGTERM, &act, 0) != 0) { - printf("sigaction-TERM failed, error=%d\n", errno); - return 1; - } - if (sigaction(SIGHUP, &act, 0) != 0) { - printf("sigaction-HUP failed, error=%d\n", errno); - return 1; - } - if (sigaction(SIGINT, &act, 0) != 0) { - printf("sigaction-INT failed, error=%d\n", errno); - return 1; - } + std::signal(SIGTERM, sig_catch); + std::signal(SIGINT, sig_catch); + std::signal(SIGHUP, sig_catch); /* open dvp */ if (!dongle.Initialize(MODULE_SERIAL_NUMBER.c_str(), MODULE_FREQUENCY, MODULE_OFFSET, MODULE_POWER, MODULE_SQUELCH)) diff --git a/QnetGateway.cpp b/QnetGateway.cpp index a183a80..4882443 100644 --- a/QnetGateway.cpp +++ b/QnetGateway.cpp @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -43,6 +42,7 @@ #include #include #include +#include #include "IRCDDB.h" #include "IRCutils.h" @@ -54,7 +54,7 @@ #define CFG_DIR "/usr/local/etc" #endif -const std::string GW_VERSION("QnetGateway-9.3"); +const std::string GW_VERSION("QnetGateway-9.4"); extern void dstar_dv_init(); extern int dstar_dv_decode(const unsigned char *d, int data[3]); @@ -62,13 +62,9 @@ extern int dstar_dv_decode(const unsigned char *d, int data[3]); static std::atomic keep_running(true); /* signal catching function */ -static void sigCatch(int signum) +static void sigCatch(int) { - /* do NOT do any serious work here */ - if ((signum == SIGTERM) || (signum == SIGINT)) - keep_running = false; - - return; + keep_running = false; } int CQnetGateway::FindIndex(const int i) const @@ -388,30 +384,14 @@ int CQnetGateway::open_port(const SPORTIP *pip, int family) /* receive data from the irc server and save it */ void CQnetGateway::GetIRCDataThread(const int i) { - std::string user, rptr, gateway, ipaddr; + std::string user, rptr, gateway, ipaddr, utime; DSTAR_PROTOCOL proto; IRCDDB_RESPONSE_TYPE type; - struct sigaction act; short last_status = 0; - act.sa_handler = sigCatch; - sigemptyset(&act.sa_mask); - act.sa_flags = SA_RESTART; - if (sigaction(SIGTERM, &act, 0) != 0) { - printf("GetIRCDataThread: sigaction-TERM failed, error=%d\n", errno); - keep_running = false; - return; - } - if (sigaction(SIGINT, &act, 0) != 0) { - printf("GetIRCDataThread: sigaction-INT failed, error=%d\n", errno); - keep_running = false; - return; - } - if (sigaction(SIGPIPE, &act, 0) != 0) { - printf("GetIRCDataThread: sigaction-PIPE failed, error=%d\n", errno); - keep_running = false; - return; - } + std::signal(SIGTERM, sigCatch); + std::signal(SIGINT, sigCatch); + std::signal(SIGHUP, sigCatch); short threshold = 0; bool not_announced[3]; @@ -477,9 +457,9 @@ void CQnetGateway::GetIRCDataThread(const int i) while (((type = ii[i]->getMessageType()) != IDRT_NONE) && keep_running) { switch (type) { case IDRT_USER: - ii[i]->receiveUser(user, rptr, gateway, ipaddr); + ii[i]->receiveUser(user, rptr, gateway, ipaddr, utime); if (LOG_IRC) - printf("U%d u[%s] r[%s] g[%s] a[%s]\n", i, user.c_str(), rptr.c_str(), gateway.c_str(), ipaddr.c_str()); + printf("U%d u[%s] r[%s] g[%s] a[%s] t[%s]\n", i, user.c_str(), rptr.c_str(), gateway.c_str(), ipaddr.c_str(), utime.c_str()); if (!user.empty()) { if (!rptr.empty() && !gateway.empty() && !ipaddr.empty()) { @@ -2081,8 +2061,6 @@ void CQnetGateway::APRSBeaconThread() char rcv_buf[512]; time_t tnow = 0; - struct sigaction act; - /* Every 20 seconds, the remote APRS host sends a KEEPALIVE packet-comment on the TCP/APRS port. @@ -2094,21 +2072,9 @@ void CQnetGateway::APRSBeaconThread() */ short THRESHOLD_COUNTDOWN = 15; - act.sa_handler = sigCatch; - sigemptyset(&act.sa_mask); - act.sa_flags = SA_RESTART; - if (sigaction(SIGTERM, &act, 0) != 0) { - printf("APRSBeaconThread: sigaction-TERM failed, error=%d\n", errno); - return; - } - if (sigaction(SIGINT, &act, 0) != 0) { - printf("APRSBeaconThread: sigaction-INT failed, error=%d\n", errno); - return; - } - if (sigaction(SIGPIPE, &act, 0) != 0) { - printf("APRSBeaconThread: sigaction-PIPE failed, error=%d\n", errno); - return; - } + std::signal(SIGTERM, sigCatch); + std::signal(SIGINT, sigCatch); + std::signal(SIGHUP, sigCatch); time_t last_keepalive_time; time(&last_keepalive_time); @@ -2266,22 +2232,9 @@ void CQnetGateway::PlayFileThread(SECHO &edata) const unsigned char sdsilence[3] = { 0x16U, 0x29U, 0xF5U }; const unsigned char sdsync[3] = { 0x55U, 0x2DU, 0x16U }; - struct sigaction act; - act.sa_handler = sigCatch; - sigemptyset(&act.sa_mask); - act.sa_flags = SA_RESTART; - if (sigaction(SIGTERM, &act, 0) != 0) { - printf("sigaction-TERM failed, error=%d\n", errno); - return; - } - if (sigaction(SIGINT, &act, 0) != 0) { - printf("sigaction-INT failed, error=%d\n", errno); - return; - } - if (sigaction(SIGPIPE, &act, 0) != 0) { - printf("sigaction-PIPE failed, error=%d\n", errno); - return; - } + std::signal(SIGTERM, sigCatch); + std::signal(SIGINT, sigCatch); + std::signal(SIGHUP, sigCatch); printf("File to playback:[%s]\n", edata.file); @@ -2421,7 +2374,6 @@ void CQnetGateway::qrgs_and_maps() bool CQnetGateway::Init(char *cfgfile) { short int i; - struct sigaction act; setvbuf(stdout, (char *)NULL, _IOLBF, 0); @@ -2434,21 +2386,9 @@ bool CQnetGateway::Init(char *cfgfile) return true; } - act.sa_handler = sigCatch; - sigemptyset(&act.sa_mask); - act.sa_flags = SA_RESTART; - if (sigaction(SIGTERM, &act, 0) != 0) { - printf("sigaction-TERM failed, error=%d\n", errno); - return true; - } - if (sigaction(SIGINT, &act, 0) != 0) { - printf("sigaction-INT failed, error=%d\n", errno); - return true; - } - if (sigaction(SIGPIPE, &act, 0) != 0) { - printf("sigaction-PIPE failed, error=%d\n", errno); - return true; - } + std::signal(SIGTERM, sigCatch); + std::signal(SIGINT, sigCatch); + std::signal(SIGHUP, sigCatch); for (i = 0; i < 3; i++) memset(&band_txt[0], 0, sizeof(SBANDTXT)); diff --git a/QnetITAP.cpp b/QnetITAP.cpp index 1640247..0ea9b6b 100644 --- a/QnetITAP.cpp +++ b/QnetITAP.cpp @@ -2,7 +2,7 @@ * Copyright (C) 2018-2019 by Thomas A. Early N7TAE * * CQnetITAP::GetITAPData() is based on some code that is... - * Copyright (C) 2011-2015,2018 by Jonathan Naylor G4KLX + * Copyright (C) 2011-2015,2018,2020 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -45,7 +45,7 @@ #include "QnetConfigure.h" #include "Timer.h" -#define ITAP_VERSION "QnetITAP-2.1.5" +#define ITAP_VERSION "QnetITAP-2.1.6" std::atomic CQnetITAP::keep_running(true); @@ -63,21 +63,9 @@ bool CQnetITAP::Initialize(const char *cfgfile) if (ReadConfig(cfgfile)) return true; - struct sigaction act; - act.sa_handler = &CQnetITAP::SignalCatch; - sigemptyset(&act.sa_mask); - if (sigaction(SIGTERM, &act, 0) != 0) { - printf("sigaction-TERM failed, error=%d\n", errno); - return true; - } - if (sigaction(SIGHUP, &act, 0) != 0) { - printf("sigaction-HUP failed, error=%d\n", errno); - return true; - } - if (sigaction(SIGINT, &act, 0) != 0) { - printf("sigaction-INT failed, error=%d\n", errno); - return true; - } + std::signal(SIGTERM, CQnetITAP::SignalCatch); + std::signal(SIGHUP, CQnetITAP::SignalCatch); + std::signal(SIGINT, CQnetITAP::SignalCatch); Modem2Gate.SetUp(modem2gate.c_str()); if (Gate2Modem.Open(gate2modem.c_str())) @@ -631,7 +619,6 @@ void CQnetITAP::SignalCatch(const int signum) { if ((signum == SIGTERM) || (signum == SIGINT) || (signum == SIGHUP)) keep_running = false; - exit(0); } void CQnetITAP::calcPFCS(const unsigned char *packet, unsigned char *pfcs) diff --git a/QnetITAP.h b/QnetITAP.h index faec024..dbcca21 100644 --- a/QnetITAP.h +++ b/QnetITAP.h @@ -106,12 +106,12 @@ public: void Run(const char *cfgfile); // data - static std::atomic keep_running; private: int assigned_module; // functions bool Initialize(const char *cfgfile); + static std::atomic keep_running; static void SignalCatch(const int signum); bool ProcessGateway(const int len, const unsigned char *raw); bool ProcessITAP(const unsigned char *raw); diff --git a/QnetLink.cpp b/QnetLink.cpp index 43c0f38..fbe3be3 100644 --- a/QnetLink.cpp +++ b/QnetLink.cpp @@ -1,7 +1,7 @@ /* * Copyright (C) 2010 by Scott Lawson KI4LKF - * Copyright (C) 2015,2018,2019 by Thomas A. Early N7TAE + * Copyright (C) 2015,2008-2020 by Thomas A. Early N7TAE * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,7 +28,6 @@ #include #include #include -#include #include #include @@ -47,12 +46,13 @@ #include #include #include +#include #include "DPlusAuthenticator.h" #include "QnetConfigure.h" #include "QnetLink.h" -#define LINK_VERSION "QnetLink-7.2" +#define LINK_VERSION "QnetLink-7.3" #ifndef BIN_DIR #define BIN_DIR "/usr/local/bin" #endif @@ -182,19 +182,10 @@ void CQnetLink::RptrAckThread(char *arg) char RADIO_ID[21]; memcpy(RADIO_ID, arg + 1, 21); unsigned char silence[12] = { 0x9E, 0x8D, 0x32, 0x88, 0x26, 0x1A, 0x3F, 0x61, 0xE8, 0x16, 0x29, 0xf5 }; - struct sigaction act; - act.sa_handler = sigCatch; - sigemptyset(&act.sa_mask); - act.sa_flags = SA_RESTART; - if (sigaction(SIGTERM, &act, 0) != 0) { - printf("sigaction-TERM failed, error=%d\n", errno); - return; - } - if (sigaction(SIGINT, &act, 0) != 0) { - printf("sigaction-INT failed, error=%d\n", errno); - return; - } + std::signal(SIGTERM, sigCatch); + std::signal(SIGINT, sigCatch); + std::signal(SIGHUP, sigCatch); short int streamid_raw = Random.NewStreamID(); @@ -926,12 +917,9 @@ void CQnetLink::g2link(const char from_mod, const char *call, const char to_mod) } /* signal catching function */ -void CQnetLink::sigCatch(int signum) +void CQnetLink::sigCatch(int) { - /* do NOT do any serious work here */ - if ((signum == SIGTERM) || (signum == SIGINT)) - keep_running = false; - return; + keep_running = false; } void CQnetLink::Process() @@ -3242,18 +3230,9 @@ void CQnetLink::PlayAudioNotifyThread(char *msg) void CQnetLink::AudioNotifyThread(SECHO &edata) { - struct sigaction act; - act.sa_handler = sigCatch; - sigemptyset(&act.sa_mask); - act.sa_flags = SA_RESTART; - if (sigaction(SIGTERM, &act, 0) != 0) { - fprintf(stderr, "sigaction-TERM failed, error=%d\n", errno); - return; - } - if (sigaction(SIGINT, &act, 0) != 0) { - fprintf(stderr, "sigaction-INT failed, error=%d\n", errno); - return; - } + std::signal(SIGTERM, sigCatch); + std::signal(SIGINT, sigCatch); + std::signal(SIGHUP, sigCatch); char mod = edata.header.hdr.rpt1[7]; @@ -3409,8 +3388,6 @@ void CQnetLink::AudioNotifyThread(SECHO &edata) bool CQnetLink::Init(const char *cfgfile) { - struct sigaction act; - tzset(); setvbuf(stdout, (char *)NULL, _IOLBF, 0); @@ -3421,17 +3398,9 @@ bool CQnetLink::Init(const char *cfgfile) return true; } - act.sa_handler = sigCatch; - sigemptyset(&act.sa_mask); - act.sa_flags = SA_RESTART; - if (sigaction(SIGTERM, &act, 0) != 0) { - printf("sigaction-TERM failed, error=%d\n", errno); - return true; - } - if (sigaction(SIGINT, &act, 0) != 0) { - printf("sigaction-INT failed, error=%d\n", errno); - return true; - } + std::signal(SIGTERM, sigCatch); + std::signal(SIGINT, sigCatch); + std::signal(SIGHUP, sigCatch); for (int i=0; i<3; i++) { notify_msg[i][0] = '\0'; diff --git a/QnetModem.cpp b/QnetModem.cpp index 2488c82..0807ddc 100644 --- a/QnetModem.cpp +++ b/QnetModem.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 by Thomas A. Early N7TAE + * Copyright (C) 2019,2020 by Thomas A. Early N7TAE * * CQnetModem is inspired by {Modem,MMDVMHost}.cpp in * Jonathan Naylor's brilliant MMDVMHost that is... @@ -44,7 +44,7 @@ #include "QnetModem.h" #include "QnetConfigure.h" -#define MODEM_VERSION "QnetModem-0.1.3" +#define MODEM_VERSION "QnetModem-1.0.0" #define MAX_RESPONSES 30 std::atomic CQnetModem::keep_running(true); @@ -218,21 +218,9 @@ bool CQnetModem::Initialize(const char *cfgfile) if (ReadConfig(cfgfile)) return true; - struct sigaction act; - act.sa_handler = &CQnetModem::SignalCatch; - sigemptyset(&act.sa_mask); - if (sigaction(SIGTERM, &act, 0) != 0) { - printf("sigaction-TERM failed, error=%d\n", errno); - return true; - } - if (sigaction(SIGHUP, &act, 0) != 0) { - printf("sigaction-HUP failed, error=%d\n", errno); - return true; - } - if (sigaction(SIGINT, &act, 0) != 0) { - printf("sigaction-INT failed, error=%d\n", errno); - return true; - } + std::signal(SIGTERM, SignalCatch); + std::signal(SIGINT, SignalCatch); + std::signal(SIGHUP, SignalCatch); Modem2Gate.SetUp(modem2gate.c_str()); if (Gate2Modem.Open(gate2modem.c_str())) @@ -850,11 +838,9 @@ bool CQnetModem::ReadConfig(const char *cfgFile) return false; } -void CQnetModem::SignalCatch(const int signum) +void CQnetModem::SignalCatch(const int) { - if ((signum == SIGTERM) || (signum == SIGINT) || (signum == SIGHUP)) - keep_running = false; - exit(0); + keep_running = false; } int main(int argc, const char **argv) diff --git a/QnetRelay.cpp b/QnetRelay.cpp index 19b17f1..6c8fbc0 100644 --- a/QnetRelay.cpp +++ b/QnetRelay.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 by Thomas A. Early N7TAE + * Copyright (C) 2018,2020 by Thomas A. Early N7TAE * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -36,7 +36,7 @@ #include "QnetTypeDefs.h" #include "QnetConfigure.h" -#define RELAY_VERSION "QnetRelay-1.1.0" +#define RELAY_VERSION "QnetRelay-1.1.1" std::atomic CQnetRelay::keep_running(true); @@ -56,21 +56,9 @@ bool CQnetRelay::Initialize(const char *cfgfile) if (ReadConfig(cfgfile)) return true; - struct sigaction act; - act.sa_handler = &CQnetRelay::SignalCatch; - sigemptyset(&act.sa_mask); - if (sigaction(SIGTERM, &act, 0) != 0) { - printf("sigaction-TERM failed, error=%d\n", errno); - return true; - } - if (sigaction(SIGHUP, &act, 0) != 0) { - printf("sigaction-HUP failed, error=%d\n", errno); - return true; - } - if (sigaction(SIGINT, &act, 0) != 0) { - printf("sigaction-INT failed, error=%d\n", errno); - return true; - } + std::signal(SIGTERM, SignalCatch); + std::signal(SIGINT, SignalCatch); + std::signal(SIGHUP, SignalCatch); return false; } @@ -403,11 +391,9 @@ bool CQnetRelay::ReadConfig(const char *cfgFile) return false; } -void CQnetRelay::SignalCatch(const int signum) +void CQnetRelay::SignalCatch(const int) { - if ((signum == SIGTERM) || (signum == SIGINT) || (signum == SIGHUP)) - keep_running = false; - exit(0); + keep_running = false; } int main(int argc, const char **argv)