From b0785259b62c1cd990082905f7e8ac5840148029 Mon Sep 17 00:00:00 2001 From: Dmitry Isaenko Date: Mon, 20 Nov 2017 15:09:35 +0300 Subject: [PATCH] update to version 1.2 --- Makefile | 6 +- README | 6 +- bin/bot.conf | 11 ++ bin/loperIRCLogBot | Bin 190688 -> 0 bytes files/patchFile | 12 -- loperIRCLogBot.c | 379 ++++++++++++++++++++++++--------------------- 6 files changed, 219 insertions(+), 195 deletions(-) create mode 100644 bin/bot.conf delete mode 100755 bin/loperIRCLogBot delete mode 100644 files/patchFile diff --git a/Makefile b/Makefile index 4ec6528..30a0360 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ all: lib loperIRCLogBot lib: cp ./files/* ./libircclient-1.9/src/ - patch -p0 -i ./files/patchFile +# patch -p0 -i ./files/patchFile $(MAKE) -C ./libircclient-1.9/src/ || exit 1; cp -r ./libircclient-1.9/include/ ./libircclient cp ./libircclient-1.9/src/libircclient.a . @@ -17,8 +17,8 @@ lib: loperIRCLogBot: loperIRCLogBot.c $(MKDIR_P) ./bin # $(CC) $(CFLAGS) loperIRCLogBot.c -o ./bin/loperIRCLogBot - $(CC) loperIRCLogBot.c libircclient.a -o ./bin/loperIRCLogBot + $(CC) -std=gnu89 loperIRCLogBot.c libircclient.a -o ./bin/loperIRCLogBot clean: - rm -rf ./bin/*.o ./bin/loperIRCLogBot ./libircclient libircclient.a ./libircclient-1.9/src/libircclient.o ./libircclient-1.9/src/libircclient.a + rm -rf ./bin/*.o ./bin/loperIRCLogBot ./libircclient libircclient.a ./libircclient-1.9/src/libircclient.o ./libircclient-1.9/src/libircclient.a ./libircclient-1.9/src/config.h ./libircclient-1.9/src/Makefile diff --git a/README b/README index 846398c..af783c1 100644 --- a/README +++ b/README @@ -26,10 +26,10 @@ Where is the executable? Where should I look for this and how to start? $ ./bin/loperIRCLogBot What about license? -Source code, which is actually 'loperIRCLogBot.c' file spreads under the GNU General Public License v.3 license. You can find it in LICENSE file or just visit www.gnu.org (it should be there for sure). It also uses (a little bit) modified libircclient writted by George Yunaev. Libircclient is licensed under Lesser General Public License version 3 or higher. +Source code, which is actually 'loperIRCLogBot.c' file spreads under the GNU General Public License v.3 license. You can find it in LICENSE file or just visit www.gnu.org (it should be there for sure). It also uses libircclient writted by George Yunaev. Libircclient is licensed under Lesser General Public License version 3 or higher. Is it possible to let this app work with shared libraries of the libircclient that I already have in my distro? -Nope. The little modification needed for loperIRCLogBot doesn't let you utilize original non-changed library. Take a look on a patch stored at ./files folder (that's the reason). +Yes! Will update Makefile sooner or later. Where is the application configuration should be set? How? At the ./bin/bot.conf file. You could generate template by passing -g option: './loperIRCLogBot -g'. It should stored in same folder with executable file. No other option for this for now. @@ -71,4 +71,4 @@ Any chance to log more than one channel? Nope. If connection is lost, could this bot re-connect? When he will do it? -In 20 minutes. Maybe earlier. Depends on activity at the channel and pings from the server. It's implemented not the best way at the moment. +In ~6 minutes. Maybe earlier. diff --git a/bin/bot.conf b/bin/bot.conf new file mode 100644 index 0000000..3f5220d --- /dev/null +++ b/bin/bot.conf @@ -0,0 +1,11 @@ +server: irc.tomsk.net +port: 6666 +channel: #lpr +nick: loperIRClogbot +username: android +realname: loper +password: 0 +maxNickLength: 30 +logPath: 0 +link: 0 +reJoin: yes diff --git a/bin/loperIRCLogBot b/bin/loperIRCLogBot deleted file mode 100755 index b7434893044035ff02f6382eceb6b8e21a846f8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190688 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

D9SjvgdsmS>W9kA=gS12ByL^rla!#vfE}v~ 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 z zFD<@kNYjI^LFn40#TN`|deA{`CV>y%nWOoE|D5pQTOvM4h!?)~%%vr;9E>Izoy5xhHMdi_`(SA^(noYAK$EjZ^6*~ntrXwJMb)f1z-MvZX*GQ?w$RsA%*>^>n78dbKpox1Y`!NL+np%eDmILsoT8NCKXSzCC zNOg_`(x0(LiRR%Li#PqpBKPgI#c-fh3Y;0>zZpJD=jRRaFY2ER*eKk&5#`tKV2@L-eF z8*!S?zbDZDUg#GdR%Pg(vgE;E1wTUS4e{KG;^B+us093x3HXx@p5lCl)jLY`&Pbro zCE%|}z~3tJzdOOopDFV1OrU=x0smYA{kMgCtB=yx7$$8Xi;)}9lIjz9Yu zyoJmEo{)e)N93%Kyc{A-7XW`%mBH*S_<4e#BlR#w@Jj_huF=vzBly*X=W(I;W49T4 zAu4OWk$~SU^4Cj#@s9m(66pUb^y6ecgq`6Kf4%LWfS+LSR98*bueCHU@aLoi`kDlM z3*ko_&i;S$3G|l}e)q~zL66Lb;JQA6{wqw+`#0Io4-$rN8hYA4NFF~f_{S3DY!UkP z%c>0JY?+sSnLxia0lyPX;Jm){)LJ=M7j_r?3dtkv+}Gg6xU%L%(93#spUXf&PvJ{6mBvLF?4dWPb=#9~Jq*c~<__61V3BkNdJCgyE-xuaQmlr2j8T6}ik^gN6 z`=#%X&Jg=OLwvn@U=`Mn}R&gT>G_llg$_qB4i?rhWq4=2$7Sm;-O*3x4<{#x*J)cm%=cf zW3W>2-;Qa~se>eE}xy|zl^#7TFA3EG0&w~ih`{Z?x z%`ukHv|v8RB+%C+;DgSNxgGhImd*}3yc^ph-E?<$QM$FIC0)oC%#ov|O1I=XbNQZ3 zzL3qQTRL-vES*{wz(c2Z*?c~i4-8d0pY7?)v}E~EFinS_omtRj7c#1)*wT|Wr=Z=L z&VWov_vCXeq>glUW?PEs)@-3A-_cXd$p*!au54Xq;n<@m9z8B-&9-HF zJB#&%%k>rsN1TO@_U=rvH=kva@j;pl>?qoU&@_n*(x=Zl=aiY#PV0ZAP$ct$^qDix zJ@u3s>2uFGqi$+_y8e_?XG~2KA%(6b-BRdHn`2mZv?bTwO&%UY7Yp4zc?v>Xx@F${ zs;V<*Ogr_o^n|fTkDbWZikYGb3@3u3QOxK1g0_4%8xc+zJ1NL#TNd`m7#&@$HpHBU zK7^sSE1RcNToToiDP&u^dipccp=+j-gVY}ldEFf?^MlOXT)x=3p1=ikBj^*ce3A?bPM}jFTLop1wE_tLW%n*ipC3dE}a;@Z0H+x^qW%_fbv*wWB)-8>G&Ky06DAGfOTvxh_ z@BxR63YZW4gVx@zp0v>xP&9k8**rZsQ1#SirjGtG1kmaw`DrYqA)Swgm>oJsTlJv0>xYpj|Upt{mtP5n5PnIM{0jM)=#u{ z-s>sO8^~f%r*+VDru_Vd{Vy)>U$B!#S)bqh^8T{eDANoHDGRU*jv*o0x^^Xla4vzW8hNmf#ADiJWJ ztI$qvQgms!_fHDX!EH$?$7I%4%yyR5m>GQ8TwDK?q|@zPxo$fprPG}1VoouU*M(e~ zMo=q--C7gL7*C7Av~!7{<_1n;s|zMCi)K-ah}i^oF5lZtWz7p||7+>=VxBqrBbk9S z&(UDmOy@!Wa_;S>*;Gw5Ws946-q@AtB%=PZZIyZ!8(ZDI-SfM1i@GTZ9W>1ycU-zq zXvuV!MetbKHqa8F#=TjMjoEfxjOxeE{CtULXP!+8L0ci4Ri-lm5BqdJvq)A)lqT7- zFnL|3wJX!vv5-dxJ@>R(4R~;v$dxT5Je|2r&F7_aZii=@X^XG7Q~+JMg=*4dgOhhi zK^tw2RE$iaDYw(p7p7}vQ9Z3QQ=t8wv5^LuXWwNm*>#dOYnWs0g4RFFJQYxR#OHb> z!pvf(V+JYN*3nb8gk*}jj{XvfA~v~o=4f`MvDeno&Z`SY*sqaROWKE!M^Of33&B)1!H^gOl_cy3*QJ&WQ{`g8ima!awVC!3zj+qj7J zXqvBRAEt!S0+O_EBBMm=kjg2+^!VAJ{osB~x&gnkNw;`T|I3wC z)C=f61JeZ6Y#e>~_?B%4Kh9fEBOD(&LOv%PGW+qq!Wp|* zu3Lo}_CpWaCc6H989&}@ctiMC2*0*p&_O!^EF1Fh{=>XoEyWz$#Nr447tnR)KUL`P zp2TM1-zqouOv7>3@w=FC924CC<9&(^@^88I6Mn>jSj=Z3{VnImdlxSY|9ZtRLio^r zTJhr?aJ4AzVFhI$@BwuN0p_-2AAMc~=y@UKu5HH6M{CIC=^bYbrO}t!t;K%zdhYSC6ESx?(e)t3XQ3pRET)BR{ z2ea+FhTPHHUc?VMKU4hfeVI*`W1h+%_|X1Z@#8tpyvHm*#;NT^`q6)#0G0*+ajv&Q z_?tF?(zaFoyTO~(XaC13Jox$jl=6>+)9^6mpn+;Kx_&{RG%W2PtGu!gqTdfq z0~!|`cMz4xx)~TW4nRZ$pbI^efzqZx3`_U0bPXzBvDsg78KOTGIKGMu(Cr5R0{&iG diff --git a/files/patchFile b/files/patchFile deleted file mode 100644 index 87e345e..0000000 --- a/files/patchFile +++ /dev/null @@ -1,12 +0,0 @@ -diff -u ./libircclient-1.9/src/libircclient.c ./libircclient-1.9/src_new/libircclient.c ---- ./libircclient-1.9/src/libircclient.c 2016-05-04 03:39:22.000000000 +0300 -+++ ./libircclient-1.9/src_new/libircclient.c 2017-03-26 03:49:04.000000000 +0300 -@@ -622,6 +622,8 @@ - if ( command && !strncmp (command, "PING", buf_end - command) && params[0] ) - { - irc_send_raw (session, "PONG %s", params[0]); -+ if ( session->callbacks.event_unknown ) -+ (*session->callbacks.event_unknown) (session, command, prefix, params, paramindex); - return; - } - diff --git a/loperIRCLogBot.c b/loperIRCLogBot.c index c58a605..a803266 100644 --- a/loperIRCLogBot.c +++ b/loperIRCLogBot.c @@ -1,7 +1,7 @@ /*********************************************************************************** * Author: Dmitry Isaenko * - * License: GNU GPL v.3 * - * Version: 1.1 * + * License: GNU GPL v.3 * + * Version: 1.2 * * Site: https://developersu.blogspot.com/ * * 2017, Russia * ***********************************************************************************/ @@ -16,8 +16,8 @@ // only to get PATH_MAX #include -//define default max time before re-connect happens (20 min). -#define TIME_TO_DIE 1200 +//define period before sending PING to server (5 min - 300). +#define TIME_TO_PING 300 // set if you want to turn mode +x on while connecting #define X_MODE @@ -36,7 +36,7 @@ // TODO normal deamon-mode functionality // TODO make it multi-channel -// TODO-feachure make an ability to define log path for the bot.conf? +// TODO-feachure make an ability to define log path for the bot.conf? Or move it to /etc/ typedef struct conf_sruct { int status; @@ -54,7 +54,7 @@ typedef struct conf_sruct { } configuration; -configuration load_config(int run, char * nick_path) { +configuration load_config(int run, char * nick_or_path) { /* * if run = 0 we load config from the file * if run = 1 we return configuration structure stored in this function @@ -75,7 +75,7 @@ configuration load_config(int run, char * nick_path) { if (run == 0) { // the first call - strcpy(confFilePath, nick_path); + strcpy(confFilePath, nick_or_path); strcat(confFilePath, "bot.conf"); // add bot.conf to path-to-executable if ( (conf = fopen(confFilePath,"r")) != NULL) { @@ -182,10 +182,10 @@ configuration load_config(int run, char * nick_path) { } else if ( (strcmp(sta[i][0], "logPath")) == 0){ if (strcmp(sta[i][1], "0") == 0) - strcpy(C.logPath, nick_path); + strcpy(C.logPath, nick_or_path); else { if (sta[i][1][0] != '/'){ - C.status = -255; + C.status = -3; return C; } else{ @@ -232,7 +232,7 @@ configuration load_config(int run, char * nick_path) { return C; // just return already loaded structure by request } else if ( run == 2){ // save nick recieved - strcpy(C.nick, nick_path); + strcpy(C.nick, nick_or_path); return C; } @@ -251,9 +251,82 @@ int set_log_dir(char * logdir){ return 0; } +// Function to print time stamps when writing to console +void printTimeStamp(){ + char timeStamp[22]; + time_t now = time(NULL); + + strftime(timeStamp, 22, "%d %b %Y %X ", localtime(&now)); + printf("%s", timeStamp); +} + +// Mainly used to update is_alive +void event_ctcp_rep(irc_session_t *session, const char *event, const char *origin, const char **params, unsigned int count){ // handle own ctcp requests - get recieved data and do something with it + configuration C = load_config(1, ""); //load config to get current nickname + + #ifdef PING_DEBUG + printf("\nReply from my CTCP, where USER = %s\n", origin); + #endif + if (strncmp(origin, C.nick, strlen(C.nick)) == 0){ // if bot generated response, then it's ping for internal use. (Ok, documentation is 80% clear on this, it will work but in future should be checked) + is_alive(1, time(NULL), session); + } +} + +/* Handle timeouts before re-connect (rewrite in January 2038) + state = 0 - get status + state = 1 - write status + + returns 0 - OK + returns 1 - not OK +*/ +int is_alive( int state, time_t timeGot, irc_session_t * session){ // in future, it should be stand-alone thread + static int defaultTimeout = TIME_TO_PING; + static time_t timeSav; + static int pingRequestSent = 0; // 0 - not sent, 1 - already sent + configuration C = load_config(1, ""); //load config to get current nickname + + #ifdef PING_DEBUG + printf("is_alive:ping = %d\n", pingRequestSent); + #endif + + if (state == 0) { + if ( ((long) timeGot - timeSav) > defaultTimeout ) { // ok, it's time to send PING to yourself or probably we have problems + if (pingRequestSent == 0){ // if we didn't sent PING request before, let's do it and change pingRequestSent + #ifdef PING_DEBUG + printf("PANIC - Request sent\n"); + printf(" stored time = %ld\n",timeSav); + printf(" recieved time = %ld\n",timeGot); + #endif + irc_cmd_ctcp_request(session, C.nick, "PING"); + pingRequestSent = 1; + return 0; + } + else{ // we already sent PING + if (((long) timeGot - timeSav) > (defaultTimeout+180)){ // we know, that the time is greater than stored one, so we add 3min(180) and if it's greater, then re-connect + #ifdef PING_DEBUG + printf("Now we have problems\n"); + #endif + return 1; + } + else + return 0; + } + } + } + else if ( state == 1 ){ + timeSav = timeGot; // re-write stored time + pingRequestSent = 0; // reset pingRequestSent + #ifdef PING_DEBUG + printf("\n1-WRITE event\nTime Saved (re-written) = %ld\n", timeSav); //debug + printf("defaultTimeout = %d\n", defaultTimeout); //debug + #endif + return 0; + } + return 0; // how it could be possible to come here? ok, whatever +} void event_connect (irc_session_t * session, const char * event, const char * origin, const char ** params, unsigned int count) { - is_alive( 1, time(NULL) ); // initial timestamp written into the watchdog function + is_alive(1, time(NULL), session ); // this time really 'initial' timestamp written into the watchdog function // dump_event (session, event, origin, params, count); configuration C = load_config(1, ""); @@ -281,8 +354,6 @@ void dump_event (irc_session_t * session, const char * event, const char * origi #endif FILE * fp; // set FD for the file for logs - is_alive( 1, time(NULL) ); // update timestamp - configuration C = load_config(1, ""); #ifdef DEBUG @@ -307,11 +378,11 @@ void dump_event (irc_session_t * session, const char * event, const char * origi !(strcmp(event,"CHANNEL")) ? fprintf(fp,"%s <%s>: %s\n",nowTime, nickBuf, params[1]): !(strcmp(event,"ACTION")) ? fprintf(fp,"%s %s %s\n",nowTime, nickBuf, params[1]): - !(strcmp(event,"JOIN")) ? fprintf(fp,"%s >> %s [%s] joined %s\n",nowTime, nickBuf, hostBuf, params[0]): + !(strcmp(event,"JOIN")) ? fprintf(fp,"%s >> %s [%s] joined %s\n",nowTime, nickBuf, hostBuf, params[0]): !(strcmp(event,"INVITE")) ? fprintf(fp,"%s %s invites %s to %s\n",nowTime, nickBuf, params[0], params[1]): !(strcmp(event,"KICK")) ? fprintf(fp,"%s !<< %s kicked by %s [%s] with reason: %s\n",nowTime, params[1], nickBuf, hostBuf, params[2]): !(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,"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,"NICK")) ? fprintf(fp,"%s -!- %s [%s] changed nick to: %s \n",nowTime, nickBuf, hostBuf, params[0]): 0; @@ -347,11 +418,11 @@ void event_ctcp_req(irc_session_t * session, const char * event, const char * or if( strcmp (params[0], "VERSION") == 0 ){ dump_event (session, event, origin, params, count); - irc_cmd_ctcp_reply(session, origin, "VERSION loperIRCLogBot v.1.1"); + irc_cmd_ctcp_reply(session, origin, "VERSION loperIRCLogBot v.1.2"); } else if( strcmp (params[0], "SOURCE") == 0 ){ dump_event (session, event, origin, params, count); - irc_cmd_ctcp_reply(session, origin, "SOURCE loperIRCLogBot v.1.1"); + irc_cmd_ctcp_reply(session, origin, "SOURCE loperIRCLogBot v.1.2"); } else if( strcmp (params[0], "TIME") == 0 ){ dump_event (session, event, origin, params, count); @@ -363,7 +434,7 @@ void event_ctcp_req(irc_session_t * session, const char * event, const char * or } else if( strcmp (params[0], "CLIENTINFO") == 0 ){ dump_event (session, event, origin, params, count); - irc_cmd_ctcp_reply(session, origin, "CLIENTINFO loperIRCLogBot v.1.1 - Supported tags: VERSION, SOURCE, TIME, PING, CLIENTINFO"); + irc_cmd_ctcp_reply(session, origin, "CLIENTINFO loperIRCLogBot v.1.2 - Supported tags: VERSION, SOURCE, TIME, PING, CLIENTINFO"); } } @@ -434,13 +505,6 @@ static void event_notice (irc_session_t * session, const char * event, const cha } - -void event_unknown(irc_session_t * session, const char * event, const char * origin, const char ** params, unsigned int count) -{ -// implemented to log server PING requests and to 'teach' is_alive() function - if( strcmp(event, "PING") == 0 ) - is_alive( 2, time(NULL) ); -} int make_template(char * dest){ FILE * templ; strcat (dest, "bot.conf"); @@ -465,63 +529,36 @@ int make_template(char * dest){ } -/* Handle timeouts before re-connect (rewrite in January 2038) - state = 0 - get status - state = 1 - write status - state = 2 - write PING status - state = 3 - define defaultTimeout due the connection to the server - - returns 0 - OK - returns 1 - not OK -*/ -int is_alive( int state, time_t timeRec ){ - static int defaultTimeout = TIME_TO_DIE; - static int timeSav; - static int signature = 0; - - if (state == 0) { - if ( ((int) timeRec - timeSav) < defaultTimeout ) - return 0; - else - return 1; +void reportSettingsIssues(int sum){ + char *setLst[] = {"server", + "channel", + "port", + "nick", + "username", + "realname", + "password", + "maxNickLenght", + "logPath", + "link", + "reJoin"}; + int i; + + switch (sum){ + case -1: + printf("Configuration file issue: value or attribute missed or redundant\n"); + break; + case -2: + printf ("Unable to open configuration file\n"); + break; + case -3: + printf("Configuration file issue: 'logPath' is not defined as absolute path\n"); + break; + default: + printf("Configuration file issue. Next field(s) not found:\n"); + for (i=0; i<11; i++) + if ((sum & (1< 2){ - printf("Too many arguments.\nUse --help for information.\n"); + printf("Too many arguments.\n" + "Use --help for information.\n"); return 0; } // -================================================================================================- config = load_config(0, dest); - - if (config.status == 0){ - printf("SETTINGS\n--------\nstatus - %d\nserver - %s\nchannel - %s\nport - %d\nnick - %s\nusername - %s\nrealname - %s\npassword - %s\nmaxNickLength - %d\nlogPath - %s\nlink - %s\nreJoin - %d\n---------------------------\n", config.status, config.server, config.channel, config.port, config.nick, config.username, config.realname, config.password, config.maxNickLength, config.logPath, config.link, config.reJoin); + if (config.status == 0) { + printf("\t--------\n" + "\tSETTINGS\n" + "\t--------\n" + "server - %s\n" + "channel - %s\n" + "port - %d\n" + "nick - %s\n" + "username - %s\n" + "realname - %s\n" + "password - %s\n" + "maxNickLength - %d\n" + "logPath - %s\n" + "link - %s\n" + "reJoin - %s\n" + "\t--------\n", + config.server, + config.channel, + config.port, + config.nick, + config.username, + config.realname, + config.password, + config.maxNickLength, + config.logPath, + config.link, + config.reJoin == 0?"No":"Yes"); if ( set_log_dir(config.logPath) != 0){ // set logs directory - printf ("Unable to create directory for log files (%s)\nPlease make sure that you have premissions to write in this directory\n", config.logPath); + printf ("Unable to create directory for log files (%s)\n" + "Please make sure that you have premissions to write in this directory\n", + config.logPath); return 1; } else { @@ -646,7 +713,8 @@ int main(int argc, char *argv[]) { callbacks.event_ctcp_req = event_ctcp_req; callbacks.event_notice = event_notice; - callbacks.event_unknown = event_unknown; // this event will be triggered when app recieve PING request from server. And any other unknown event, and this is buggy moment, and should be fixed. + callbacks.event_ctcp_rep = event_ctcp_rep; // & dump_event? Now no need to dump. This event is triggered upon receipt of an CTCP response. Thus if you generate the CTCP message and the remote user responded, this event handler will be called. +// callbacks.event_unknown = event_unknown; // this event will be triggered when app recieve PING request from server. And any other unknown event, and this is buggy moment, and should be fixed. callbacks.event_channel = dump_event; callbacks.event_nick = dump_event; @@ -657,16 +725,17 @@ int main(int argc, char *argv[]) { callbacks.event_kick = dump_event; callbacks.event_invite = dump_event; callbacks.event_umode = dump_event; - callbacks.event_ctcp_rep = dump_event; callbacks.event_ctcp_action = dump_event; // "ACTION" handler // Now create the session while (1) { + printTimeStamp(); printf("Connecting...\n"); session = irc_create_session( &callbacks ); if ( !session ){ + printTimeStamp(); printf("Unable to create session\n"); // return 1; // give a try once again } @@ -675,12 +744,15 @@ int main(int argc, char *argv[]) { // Connect to a regular IRC server if ( irc_connect (session, config.server, config.port, 0, config.nick, config.username, config.realname ) ){ + printTimeStamp(); printf ("Could not connect: %s\n", irc_strerror (irc_errno(session))); // return 1; //give a try once again + // TODO add a counter for few reply and die / do something with this } else { - is_alive(3, time(NULL)); // this time really 'initial' timestamp written into the watchdog function - + + is_alive(1, time(NULL), session); //initialize is_alive internal start time + printTimeStamp(); printf("Connection established\n"); ///////////////////// irc_run() replacement /////////////////// @@ -694,95 +766,48 @@ int main(int argc, char *argv[]) { FD_ZERO (&out_set); // +1 chk - if ( is_alive(0, time(NULL)) != 0 ){ - printf("\n------------\nPING timeout\n------------\n"); - break; // 1 + if ( is_alive(0, time(NULL), session) != 0 ){ + printf("\n\t-----------------------------------\n\t"); + printTimeStamp(); + printf("PING timeout\n" + "\t-----------------------------------\n"); + break; // 1 } // end +1 chk + irc_add_select_descriptors (session, &in_set, &out_set, &maxfd); if ( select (maxfd + 1, &in_set, &out_set, 0, &tv) < 0 ) { + printTimeStamp(); printf ("Could not connect or I/O error: LIBIRC_ERR_TERMINATED\n"); break; // 1 } if ( irc_process_select_descriptors (session, &in_set, &out_set) ){ + printTimeStamp(); printf ("Could not connect or I/O error\n" ); break; // 1 } } irc_disconnect(session); + printTimeStamp(); printf("Disconnected after successful connection\n"); //return 0; //////////////////////////////////////////////////////////////////////////// } } - printf ("Not connected: reconnection will be performed in 5 sec\n"); + printTimeStamp(); + printf ("Not connected: will retry in 5 sec\n"); sleep (5); } // while end } - + return 0; // never happens } - - else if (config.status == -2){ - printf ("Unable to open config file\n"); - return 1; - } - else if (config.status == -1){ - printf("Configuration file issue: value or attribute missed or redundant\n"); - return 1; - } - else if (config.status == -255){ // special - printf("Configuration file issue: 'logPath' is not defined as absolute path\n"); - return 1; - } - else if (config.status == 255){ // it's like config.status == 0b1000000 and so on - printf("Configuration file issue: probably 'logPath' missed\n"); - return 1; - } - else if (config.status == 126){ - printf("Configuration file issue: probably 'server' missed\n"); - return 1; - } - else if (config.status == 125){ - printf("Configuration file issue: probably 'channel' missed\n"); - return 1; - } - else if (config.status == 123){ - printf("Configuration file issue: probably 'port' missed\n"); - return 1; - } - else if (config.status == 119){ - printf("Configuration file issue: probably 'nick' missed\n"); - return 1; - } - else if (config.status == 111){ - printf("Configuration file issue: probably 'username' missed\n"); - return 1; - } - else if (config.status == 95){ - printf("Configuration file issue: probably 'realname' missed\n"); - return 1; - } - else if (config.status == 63){ - printf("Configuration file issue: probably 'password' missed\n"); - return 1; - } - else if (config.status == 511){ - printf("Configuration file issue: probably 'link' missed\n"); - return 1; - } - else if (config.status == 1023){ - printf("Configuration file issue: probably 'reJoin' missed\n"); - return 1; - } - else { - printf("Configuration file issue: few attributes missed (%d)\n", config.status); - return 1; - } + else + reportSettingsIssues(config.status); return 0; }