From f5b291600f6f7366d92b9a5ae6a3d6a69e870053 Mon Sep 17 00:00:00 2001 From: Dmitry Isaenko Date: Sun, 3 Dec 2017 02:28:34 +0300 Subject: [PATCH] 1.4 release --- bin/loperIRCLogBot | Bin 192376 -> 192976 bytes daemon.c | 134 +++++++++++++++++++++++++++++++++++++++++++++ defined_values.h | 6 +- loperIRCLogBot.c | 103 ++++++++++------------------------ 4 files changed, 168 insertions(+), 75 deletions(-) create mode 100644 daemon.c diff --git a/bin/loperIRCLogBot b/bin/loperIRCLogBot index 7c32c12bae472115a19fd4e55c8dd97e27b39b94..edca99f5f442b09a08ce5c6f305cce8024db6968 100755 GIT binary patch delta 34627 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 delta 32247 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 0) // Exit parent process. pid of is not 0, then it's parent. pid = 0 then it's child. + exit(EXIT_SUCCESS); // report to log? + if (chdir("/") < 0) { // change working directory of the process to / + syslog(LOG_ERR, "Failed to change process dir to /"); + exit(EXIT_FAILURE); // it's safe to replace to 'return' statement + } + umask(0); // set umask for using filesystem as we want + if (setsid() < 0) { // set SID + syslog(LOG_ERR, "Failed to set SID"); + exit(EXIT_FAILURE); + } + // PERFORM SECOND FORK + pid = fork(); + if (pid < 0){ + syslog(LOG_ERR, "Failed to make second fork"); + exit(EXIT_FAILURE); + } + if (pid > 0) + exit(EXIT_SUCCESS); + + // Save process PID to file /var/run/loperIRCLogBot.pid // TODO: consider using of 'PIDFile' from libutil.h + if ((pidFile = fopen(DEF_PID_FILE, "w")) != NULL){ // + Consider using HFS3 and /run instead of /var/run. NOTE: could be a problem for embedded system, i.e. OWRT doesn't provide this filder + fprintf(pidFile,"%ld\n", (long) getpid()); + fclose(pidFile); + } + else { + syslog(LOG_ERR, "Failed to create PID file /var/run/loperIRCLogBot.pid"); + exit(EXIT_FAILURE); + } + // ############# DEFINE SIGNAL HANDLERS ####################### + struct sigaction sa; + memset(&sa, 0, sizeof(sa)); + + sa.sa_handler = signalHandler; + + if (sigfillset(&sa.sa_mask) < 0){ + syslog(LOG_ERR, "Can't set mask of blocked signals"); + exit(EXIT_FAILURE); + }; // block all signals when execute + sa.sa_flags = SA_RESTART; // restart interrupted system calls + + if (sigaction(SIGHUP, &sa, NULL) < 0) { + syslog(LOG_ERR, "Can't set sigaction() to handle application signals: SIGHUP"); + exit(EXIT_FAILURE); + } + if (sigaction(SIGINT, &sa, NULL) < 0) { + syslog(LOG_ERR, "Can't set sigaction() to handle application signals: SIGINT"); + exit(EXIT_FAILURE); + } + if (sigaction(SIGTERM, &sa, NULL) < 0) { + syslog(LOG_ERR, "Can't set sigaction() to handle application signals: SIGTERM"); + exit(EXIT_FAILURE); + } + + // ############# SIGNAL HANDLERS SET ####################### + //doing it using guidelines form man daemon + if (freopen("/dev/null", "rb", stdin) == NULL ){ + syslog(LOG_ERR, "Failed to close 'stdin'"); + exit(EXIT_FAILURE); + } + if (freopen("/var/log/loperIRCLogBot.log", "a", stdout) == NULL ){ + syslog(LOG_ERR, "Failed to redirect 'stdout' to /var/log/loperIRCLogBot.log"); + exit(EXIT_FAILURE); + } + setlinebuf(stdout); // line buffer + if (freopen("/var/log/loperIRCLogBot.log", "a", stderr) == NULL ){ + syslog(LOG_ERR, "Failed to redirect 'stderr' to /var/log/loperIRCLogBot.log"); + exit(EXIT_FAILURE); + } + setvbuf(stderr, NULL, _IONBF, 0); // no buffering for srderr + + //syslog(LOG_ERR, "SUCCESS"); + syslog(LOG_NOTICE, "loperIRCLogBot successfuly started"); +} diff --git a/defined_values.h b/defined_values.h index d52c8e6..7b93b3c 100644 --- a/defined_values.h +++ b/defined_values.h @@ -5,8 +5,10 @@ // Set if you want to turn mode +x on while connecting #define X_MODE +// Set path to loperIRCLogBot.pid file for daemon mode +#define DEF_PID_FILE "/var/run/loperIRCLogBot.pid" // re-define in configuration file // Current version of the program -#define __CUR_VER__ "1.3.1" +#define __CUR_VER__ "1.4" #define NPING_DEBUG #define NDEBUG @@ -21,7 +23,7 @@ #define DEF_HELP_MSG \ "Avaliable options:\n\n \ - -d, --daemon Start application as daemon (experimental)\n \ + -d, --daemon Start application as daemon. Writes to /var/log/loperIRCLogBot.log and syslog. Stores PID number at /var/run/loperIRCLogBot.pid\n \ -g, --genconf Create configuration file template. Attention! It will overrite your existing configuration file.\n \ -s, --silent Silent mode. All program messages stores to the 'output.txt' file\n \ -v, --version Application version\n\n \ diff --git a/loperIRCLogBot.c b/loperIRCLogBot.c index 7378c42..dcf605b 100644 --- a/loperIRCLogBot.c +++ b/loperIRCLogBot.c @@ -1,7 +1,7 @@ /*********************************************************************************** * Author: Dmitry Isaenko * * License: GNU GPL v.3 * - * Version: 1.3.1 * + * Version: 1.4 * * Site: https://developersu.blogspot.com/ * * 2017, Russia * ***********************************************************************************/ @@ -14,17 +14,17 @@ #include #include #include // only to get PATH_MAX -#include // for using setsid +#include // for using setsid. #include // Use syslog #include // Use signals +#include // Use pselect #include "defined_values.h" +#include "daemon.c" -// TODO after implementing signals set closelog(); -// TODO normal deamon-mode functionality +// TODO after implementing signals set closelog(); +++ use unlink(PID_FILE) to remove PID stored at /var/run/loperIRCLogBot.pid. Make logrotation by SIGHUP. 12.5 // TODO make it multi-channel -// TODO-feachure make an ability to define log path for the bot.conf? Or move it to /etc/ typedef struct conf_sruct { int status; @@ -345,8 +345,8 @@ void event_connect (irc_session_t * session, const char * event, const char * or } void dump_event (irc_session_t * session, const char * event, const char * origin, const char ** params, unsigned int count) -{ -#ifdef DEBUG +{ // TODO: Re-write. Actually, this implementation is also pice of shit +#ifdef DEBUG // It cause too many system calls even we don't need them char buf[512]; int cnt; @@ -393,7 +393,7 @@ void dump_event (irc_session_t * session, const char * event, const char * origi !(strcmp(event,"MODE")) ? strcmp(nickBuf, hostBuf) == 0 ? 0: fprintf(fp,"%s -!- %s [%s] set %s %s\n",nowTime, nickBuf, hostBuf, params[1], params[2] ? params[2]:""): !(strcmp(event,"PART")) ? fprintf(fp,"%s << %s [%s] parted: %s \n",nowTime, nickBuf, hostBuf, params[1]): !(strcmp(event,"TOPIC")) ? fprintf(fp,"%s -!- %s [%s] has changed topic to: %s \n",nowTime, nickBuf, hostBuf, params[1]): - !(strcmp(event,"QUIT")) ? fprintf(fp,"%s << %s [%s] quit: %s \n",nowTime, nickBuf, hostBuf, params[0]): + !(strcmp(event,"QUIT")) ? fprintf(fp,"%s << %s [%s] quit: %s \n",nowTime, nickBuf, hostBuf, params[0]): !(strcmp(event,"NICK")) ? fprintf(fp,"%s -!- %s [%s] changed nick to: %s \n",nowTime, nickBuf, hostBuf, params[0]): 0; if (!strcmp(event,"KICK")){ @@ -608,16 +608,6 @@ void reportSettingsIssues(int sum){ printf("\t'%s'\n", setLst[i]); } } -// not implemented & not used signal handler -void signalHandler (int sig){ - if (sig == SIGHUP){ - syslog(LOG_NOTICE, "loperIRCLogBot got SIGHUP"); - // close all opened files here - exit(EXIT_SUCCESS); - - } - -} void silentMode(){ // close stdin, redirect stdout & stderr @@ -630,65 +620,27 @@ void silentMode(){ if ( freopen("/dev/null", "rb", stdin) == NULL ) exit(EXIT_FAILURE); } -void daemonMode(){ - setlogmask (LOG_UPTO (LOG_ERR)); - openlog("loperIRCLogBot", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_DAEMON); - - pid_t pid; - - // PERFORM FIRST FORK - pid = fork(); - if (pid < 0) { - syslog(LOG_ERR, "Failed to make first fork"); - exit(EXIT_FAILURE); // report to log - } - if (pid > 0) // Exit parent process. pid of is not 0, then it's parent. pid = 0 then it's child. - exit(EXIT_SUCCESS); // report to log? - if (chdir("/") < 0) { // change working directory of the process to / - syslog(LOG_ERR, "Failed to change process dir to /"); - exit(EXIT_FAILURE); // it's safe to replace to 'return' statement - } - umask(0); // set umask for using filesystem as we want - if (setsid() < 0) { // set SID - syslog(LOG_ERR, "Failed to set SID"); - exit(EXIT_FAILURE); // report to log - } - // PERFORM SECOND FORK - pid = fork(); - if (pid < 0){ - syslog(LOG_ERR, "Failed to make second fork"); - exit(EXIT_FAILURE); // report to log - } - if (pid > 0) - exit(EXIT_SUCCESS); // report to log? - //doing it using guidelines form man daemon - if (freopen("/dev/null", "rb", stdin) == NULL ){ - syslog(LOG_ERR, "Failed to close 'stdin'"); - exit(EXIT_FAILURE); - } - if (freopen("/var/log/loperIRCLogBot.log", "a", stdout) == NULL ){ - syslog(LOG_ERR, "Failed to redirect 'stdout' to /var/log/loperIRCLogBot.log"); - exit(EXIT_FAILURE); - } - setlinebuf(stdout); // line buffer - if (freopen("/var/log/loperIRCLogBot.log", "a", stderr) == NULL ){ - syslog(LOG_ERR, "Failed to redirect 'stderr' to /var/log/loperIRCLogBot.log"); - exit(EXIT_FAILURE); - } - setvbuf(stderr, NULL, _IONBF, 0); // no buffering for srderr - - syslog(LOG_NOTICE, "loperIRCLogBot successfuly started"); -} int main(int argc, char *argv[]) { configuration config; irc_callbacks_t callbacks; // The IRC callbacks structure irc_session_t * session; - struct timeval tv; + struct timespec ts; // time structure for pselect(); fd_set in_set, out_set; int maxfd = 0; - + + // ### daemon mode tails. + // Define signals that we will block while using pselect(); See below. pselect set mask provided, then change it to default + sigset_t blockedSignals; // block all signals; to use in pselect() + sigset_t normalSignals; // define default mask + sigfillset(&blockedSignals); + sigdelset(&blockedSignals, SIGINT); + + sigfillset(&normalSignals); // Not sure that it could make impact on anything + sigprocmask(SIG_UNBLOCK, &normalSignals, NULL); + // ### + // Let's find out the path to executable file! It's needed, because when we create config file like ../executable -g // it creates it on the same folder where user located at, not at the folder where the executable is. // Same for logs. @@ -826,8 +778,13 @@ int main(int argc, char *argv[]) { ///////////////////// irc_run() replacement /////////////////// while ( irc_is_connected(session) ) { - tv.tv_usec = 250000; - tv.tv_sec = 0; + if (reloadLogSig == 1) //debugFunction + logsReopen(); + if (terminateSig == 1) //debugFunction + killBySignalRecieved(session); + + ts.tv_sec = 0; + ts.tv_nsec = 250000000; // Init sets FD_ZERO (&in_set); @@ -845,8 +802,8 @@ int main(int argc, char *argv[]) { irc_add_select_descriptors (session, &in_set, &out_set, &maxfd); - - if ( select (maxfd + 1, &in_set, &out_set, 0, &tv) < 0 ) + // Set mask to all signals, while neccessary for us are: SIGHUP, SIGTERM. Exclude SIGINT, 'cause no matter how this app fucks up in case of _exit(2). + if ( pselect (maxfd + 1, &in_set, &out_set, 0, &ts, &blockedSignals) < 0 ) // and errno == EINTR ! { printf ("%s Could not connect or I/O error: LIBIRC_ERR_TERMINATED\n", printTimeStamp()); break; // 1