From 4cf8dd2e8dd5c0b0fb445f67e482eb5c9d742732 Mon Sep 17 00:00:00 2001 From: Dmitry Isaenko Date: Sat, 9 Dec 2017 16:49:04 +0300 Subject: [PATCH] v1.5 release --- README.md | 1 - bin/loperIRCLogBot | Bin 0 -> 197144 bytes src/config.c | 310 ++++++++++++++++++++++++++++++++++++++++ src/defined_values.h | 6 +- src/loperIRCLogBot.c | 333 ++++++++----------------------------------- 5 files changed, 371 insertions(+), 279 deletions(-) create mode 100755 bin/loperIRCLogBot create mode 100644 src/config.c diff --git a/README.md b/README.md index ced7eb2..faea941 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,6 @@ If you have bot.conf file at /etc/loperIRCLogBot folder it won't be deleted. So ## Configuration Application settings should be set on /etc/loperIRCLogBot/bot.conf OR ./bin/bot.conf file. You could generate template by passing -g option: './loperIRCLogBot -g'. -Configuration file contains 15 lines, so make sure that you didn't define any sensetive information below these 15 lines. Here is an example: ``` server: irc.example.com diff --git a/bin/loperIRCLogBot b/bin/loperIRCLogBot new file mode 100755 index 0000000000000000000000000000000000000000..a2df725e4da4c81168b7ab89b005ad060b701f4d GIT binary patch literal 197144 zcmbrn3t&{$@jre8L}SEmRMe=btA+x~Bk>7{nuT4ts~d?wDUAVtGuOxQhznA@auj8^G~TZMmq?9i?oxq0|4g= zjwLKB?eW}elXjkYQmSeF@f?7EWBMt?n0}@5;yec{wB|e=4*6t%-JeqXRXwlUrac_I+U&un|uq^g)b{0MZS?Zsch5ouM`17*RS&*gv z-?EJB-7NUJEc`D-zh0E}{v42njyDTGzW{;0=6idV`kh(oznZ0fIE#EjS?d2b3!ZVN zFFtFsjQ7ke{g!6oe`pr^YqHdD&QkxaEch*1=;UYNGnIwTM_K5M%tGhHEcMUNBDbTn z^!t65`c@YFKeFJz%7X98((jd7@YiRdb99#RzL^DIo(2EgEc6Ftk+YGd{^Bh3BU#3E zUzYl(WTAgT7Jd%SLg%mO_fV}+D}8?sY9Q~Gznb(0_5^_2_4Q7sZ}tZZ1UMH(7w>Y~+Jb$vs)j>x*og$;Z*R?ctKX3xf3RjdIoHE1_> z?CeOSvZAh9tE{i93s**gudWK$MrT*fU!c|0g`>0UqV*M8bu?UCt2M-;5zuX1phart zH8j>&F06>idv#51Z3HZkdPU^|HlAHwQG*uI`HkUl-PTeAH@@#gW?jd89VKJ`$a~xUNDfp*p)orCJIp97QEHm@vpua%{CQypW?p z+e>PR@eK&zb3QS}^k474zA46Z&F1;>?FE5TM& zRW-5;Dy_P*wmyPEM#8m930FtzlpaM9;DSo7Z-{COGn}J$EvA@;<|`s$>bWtzu>R_> zNG}|2WfWpr^vc=lX!Og6wi6$mxkI&*hLbz$YOK&x&HcUzE69mB6Wf-!E)P}<_?QryJlA(}bG1ZlI(OO!fOMd8A#4LpenuEAYvC4*H z#}MwPJq?(jUGL11C)chc%vp&&d2e?+-8{TAn|nkF!7ZxyyJ(7=bFa(6z-TK zuLt5UTzux^b>ZR4GoN8DeE$qq(~4bqXAgnJV_bN9OGH|gy6_yc^U+;+^5lHVU3e$P zuxzFa4}oSrb6oiR3|7if9@Q1qUuXN$v`RfBN{Nb+pt6ca&F8pd2{sPsSB^W@Izhrau3qR9^AMV1>ap6yK z;pe;Xr@HVBF8l}=evu15%7t%o;kl-FKFeJAVh4$5vkPD1!mn`QPjlf{y6~sF@DI4~ zXSndIT==tG_|+~v*YwV(&4nN1Ao1Ml!jE;~J6!m2F8p>E{u~#6hYLU6g*RRJb6xmd zF8p~e{9YISd>3AOZ;n8;|5ABVfAU;-p9^2$!cTDF3tjk$F1*);_q*`JT=;+sU+ltP z;KGk_;U~H9r7pbg!s{-4(1kB|;V*RIXS(ngx$tvb_>c=f--R!8;Tv4|$u9gN7k-Kh z-{iuVyYS0g_={cmW*2^{3%|mJpXS1^bm6DF@DI4~GhFypF8n1f{Aw5eQWw6>h38(K z^V#acU*;h3>~P^Pcj33Y@K?C-J6!lHU3k-lpXI{ua^bIX;rF`mvt4-Y{W${B{?(g+ zTHgB#BECYQCP-IMy72^9eJxvC0MRN0=#%RVwf|n*cMFv5E!$oG?=u%Pa85gqgZn1p>cEm??{; z3H%0OrYhF1AAlILjWAObYlpzk5@u>*bqKtHFjEq%P2jbJnTlAe1b&P#QxI#Vzz-5; z>R~kt{71q}Ijkmue@&RFhSebO?Sz?PSaSsa1!1NZR=L185@t$al?wcG!b~NsVu2e8 zGlj6c0{@IKQwOU+;JJjEGFY0xmlI~HVD0*zuxm7Ii=Y$!;Ew8{I6Xue_DiHWR!VKk>Ch!}C8N#hy---SSGjv-!1b&t< zL$=i+@CL#R)mEFpYY8(%TdM?qj4(s9wNl^*33KUUH4FSl!VJ+?lfb_w%+PE#2z)zX zhGc7wz`r2OP;8Y8d?R6oV5?N%pA%;2wTcC9B+QU&c?JF%VTM|(K;XHA8DcF>;L8a! zv|78q75x(~CA>r63kmxOcL+Rz@C3qb0*@oi&}pp__%yZmyv%n`2W{9+! z1U`oFB*F~>A4ZrV(V8Q0K4FGJt6boIgc$;@Qh~qO0GOfADi-*2!VGzqSKyBcGt^lH z0>4L?Az&k|-RvpNLcK$s!SY7=-ZVTLYimB5b?X2`Nu z3j82phAOLB;6D;(h_adl{xxBSCaXc<+X*uyS#t#b1!0CFt6bn42{Qy)r2_w)Fhh@3 zEN~-Xh8)W)@XrV{)K~=q&n3(dV`+d(J_#BxUZorF>G2PCl}``0x0U~?RMXqn@4A!>D(Of zuf-0Xf!@tJC~Vf2+)vkgwH$PW^47w)!C3r!EtcDP2ij$b{f7;@I%ZivM;pE)8s3I> zy0M{UD~8Ep~j1NnC#oBgQ|?`~Y*Ml~K?<23`|wr>$q(cJo-aNaa=u z=q7biHd4RJka__Q2yKU`$adVeLajF1sh~+y7AiQkLbo$eNTs;F3&W}>Cm5= zTOS>TleKEyDBMz-$0w}qNGu>`!-37Lk`2GUkI)}99E`7=?+4ky{@6XY! zKVdo1wC*<`nIFs3<06tA%vl*7=wAv=E=#gp)#{49=qjxNO@Nf6zJ3RyXS;a-Rc|CI zPe_LkEjFk<_h9r2uhXS^9fe-olfPvlKAm$?@~*GY(}Ok>1DZl0J+L1nDZHeU)QfIx z(Tx|(7uiXCZx<>5b*)#jCq?;X=pP;&052Ihl@OS72mG7}e!55M2S4q}mCi`7>D?%`oMn3DHhukj{q^+Vg4R4R zV75`PMt?ok-=_MHHEyb(!cXj<5=H!E}{0MCt4=pwF!6JJL~)-9K=WK-l?1}d|CmyBQ2Wc4zj7$-i zc{*(uCfF@tR7KXJeOaZR$F9a^MaH79{E4u>9ZaY8!}?Z`?!~$^$;$fK8P@kD-3RL{ zD737@Y-zTo@8giDup^NKwJgsJb*%K(ODmtN8L@BwuvYZ7FJAElMZE!Tg2pD7>L}$< z&JKtG#-5q$LL#dO&Y*RP_WJG$NoWUF3DgDLgY8fEWc+E|%+Yf?s@pX$ZL4n*^w%x} zxDh?tlOtoz&cyi`bK5mZ9?E92YKGix3%oDg|8^&J$wAH#UaZa1uFyF6>t{@bmx+wJ0%WZtjFS76<;|8{HacB^}~^IFsQ z-)@85uBm6cQfu)3+x^3Cr`zp3OGOV&Fm3ByW#9XH9i_t8?WTwHY|7<>b>IG*I@4_% zXFa8(dc|3@)>*e7ZM2--BC67>}V9gz@HIF_u*B%X}zdJdW3HVQg1p z>)XXq7{6vqC5(Ct!YJN9(~eV^2ECxa5&ILyme!}=pQD+DB>OsYcGS%#3&&@ChY|ib z!?+z(9a-E*BY}M?S3VpC{YcvJmXzO*lk_kb)8iG>xr*r@ zz^Tpj`8}APs|1%_(wo>)G5z(w!Sq_>mHT1Zan+O`grx7!>e|gG!K9H}gDz6JmH2yZ z6WomF)=SVwd+uZ)2wRi(-=*W?eMTax&M@hS`{i`?EDbI_=}3?eM?XCJfV#r9YwPF++VzMM4(*qXKFZE8j+7V ziVvhl?PgT*QKtB~fDdJS*MMlZ_xSbxh|+ruWJ|?*30T)t$9)3=DENX8bks>~&URti zlXyvlc*Ltx_@ffE(VF#pCHZWw!wIPCF}xpV(3g@YJEknalz~D*it7L$N)UAqy9M#f z{i%e4I9P@xONC({K!+AgY(EC=MDu~dbZo(XENhQ#S?_{tTA_l#eEgNs#2(G0v zSp4K&cVgaoNqhII`?O3Swj6t|x-&gJ2oilSm>bviTr4m7Lw6$7c|vdUl-N~5OIFtQ z0(;4JnZ2E7sEwtZ*ntWzQgFZ6u^5eVBz81?7Bo~H*w-u*`(A@(8yfpw_dqE6(oNj% zy25v*y&;d?YQVa&Zl<`S$IJ0>?|)(MT2C*Z1FWo))?i-?wO{)}e+cUzX_HRwlBQzZ z7omF;kc!@;U@j+>BGj|MszIiSZJ85nbW0cKGo(=fQZVQP`CUA%GgmFrQf1uA8|Vz_ zIn=SY-Ep$ei*L0Qzf4RkuuD(lAIOf~0Y;4VYr8NXT6mD%+Vlakkkc?LSMyCz&0rUU zoGxnIU6kVR!qkn}4&9isT{p@){6^rpmV+O}x}RK{_e-XMV+u8j!HWUox#5hohDc6Sv?YZaUFF&e=Qf5YReM(gc)ZH@R3TA;@YNeCT^=lx9RjQSEuGHiW~HFvYhpe7uOELI9qsAgT)cbDWy70HMbGlWBUD#&C|=JZI1%_ z3%hE|Pi@IvAVN>->?ppD4{WqO%bYEp;pg*zp|A%(!`=M6PqCzulx54AHrex)xt|Ms zfskfkDt6>!GnbNXgT}6wb5%1n0ZvC->t0L)hvx{^wH_5^uv{bTb3im{CO!aZst! z0{D7*RD_WNF_R5>p;W&t3J~ig$K}HDu9j_RsZ2(5*sWDPija2N?EVer3n5K%y0z8t z-?jW7ML>1&J5aIsU2BjL@`pSGzA+uA|G$ziR0I_H^GN;?3e+Y)!6yIJo5Fpm!~Ku4 z&q;35?}I|;B@W#Ro9^!v-ShrWbmzP2ra-}=>KNoCMKub1saRV%VuQ;CKw^?RoFMf) z$@7&!SvS?xf#Kr_-jf^-Y-%0-u$~gH4Eqotol+ha53;y8M7-m)DRMX2WWgdH7 zX4t9bt*TS8>J+A-aBRE#lV*vUg`AN)nB*LHzRGT=ga@{Id7oacG7m#UTk+m7#TxM2 ztoJwqJ+^aDYcsTFu6xZn9qtcPGnb%h<`TmWGHa~UvCD^J(NcLVA0v-+F&+qtBk<@I z6jSSngoaoJ8j=Pn)f_wlX=`ZdUUZEvG;_7cT^;PFyU+JuWxtGfb4UsC?iq00@(bY# z=Q(PSsu!*0-?jn&3nRd^F8|SNe8aQQR9dkq{H^^|Xo;>r!9^r%l`==CtAigdl_~x| z|JSZ=+qbL3gqC!5BfH|y2|#sDSEKB%4p3c9{n4W;VpmAEl`33=vyJTtcD9|O%yhOE znTOV*5A#DSFpvNFV7!7CN?F3%H3y!vY|Oe?T=+4Q`@ zozgFS{cTbAsxC#6Ls?2cX~qpMjwD*Vd%0T) zrBK3lBla>hx)mC2gGM`gyQUd0>*>IbmftBYsu24v+|1JJU*`9tW4wTdrCGaq@(+kS z*LT1i+92ModK&9J6xrs`jswqq>}%pn8T(qgvs|+Hb=$us^N)APWBFEjq}%X->wFrI zUi`UCXbw{sBgvajE%*te;0-V%dJr1$mr}8fS1?0%INt);b3?cjoLP_UBNNnbtB9 z#X_8u-M(+i(1x&o)6#uSrkK}cT1(m2gB=Kj|GN#FI(tv^Bz_I{@p1!h0p@!WXTVD0 zdrP8&t>fg)=SlRJmkLkf8`QM;Gb?03F1pc@zJpna{l>4~t3}U28Pb#WYoA5s7Sz>R zcd*af?G2y9U67(ySu z;8eSd)#Tcp+(WAE!4H-lee!dpi=R_6{4|p&$Z4H^#mo&(FP*2i{)*k!Won$%Y*s)u zkXmdv)Ykeiiq(X>9Q3T;V1i{5jb@NE)?J5K)oViN?SW=F5o`~vki)R{z)Cr6YY#ji z=S=N^RdO)Y9#}1BE$x9eIlgEQZ2dbrMEeferf&~ymtElYzz*41#q~XIWu}tsG~SjQ z-#g%%$p+^7fX(J#abb8z>sAiuo_~VXJHcIR!76~w1d{~Eppv;1VCUl2>-Zky`@+_{ z`Ch~Kiq;4CJ`3;dfm_f<>x8UtSxeO!>tA}$=r~zA$ChW{7O@0i|849VyCFIl7zBcp ze{(agCbYf@I!bb0NH-q1B`1FUEe9`oY@eyH9(~y|P31vaW>ft9If&AFSe zHmVMXg(GbZNxgP+5KB|Jv-W9rY|m!@f>KfMOw?P$QT4p?`%mZ=r3cznx~~|%0^VGm z-vui6g<#*MzDs;F)IGeJhtm+AmV?X3SK;BdhpoJa_Z*PyR!=8aeF~D8VV9FZ1-4*W zD(>Sh@{vv!f2OLOt*Q`QE3F|`D#HBdKcpUagV*wF;*|HX6xN5&p+N46wH6az4p>b) zIWJ9THjqa=&n`BiGZJYTZ8PvV(Y$R01`p!<@Qu2$eM=&jwY0d5v7aZI1Q+mt94cyK zK_DDl&K?hk#GtJ~t@8;T!T!m*HS@r}n(Tc7m3E*bxPTM(rT8t2*GqA1kj*Pu+k`8j z)&YG|%zY9~Zp}(DkHz(hqDPsh2G?SBPyqXk=up=7WhFL<#V7S3cINjW7VneTajg9% z1k(3dy)1r3iXpvXLa#mRNbeXNmbT6(Zes>_0C2WOmJDiL$-?_Gg_hd%qS|O2RDrpX z!O2MOpw?3INMR?{lYD@6ZG^1~5{6R0u8}K^7FRwH4dVWw|7vc5jbL3UW z>t~8WUiWK3_p7)2by)Z7nC{oo?$`Of?+|s%{Gu-2z!C2HFIe&jR zN`s`5Cgh9Ej}I+&qH1gLFc+e_KhyTzt(a1;tDQSmZONlCfJ)vJJRRFx<}w&PwR$D% z*v6DD<%S5&K2=)id9owZrh!`-iiw?h7YB{6B{Y!qx}(t?JBCmrH)y2}(63^q;PDP8 zjImKMJVqE63)z(6c_eur0-n{(yOqP|35iW9b4X&okJgILE}k=C;BRM$nC&3KL*i8K z?{39nV{c9@U)BBla~MnREjH4Vp^LN2=Ru`Cxr-vD2-=f-@!Is*zkebv*Ax($UcL(Y z!eQ8VI1MxQ8qXTbJ5b9=zKp*;>M=X(QE$7{`xpMIk^LP5-DhO%**r*2fTOlr53@(7 zt#xKVK1cVOu#;wZ1Xt2q`f*{-5mmdHGZ+$(2%27mYp{#h zEvB)B({SC&K{CJ1@(0o9@xAY;EirFW>L6DNL~`tjtiDL<&c_q<_}2 zY~V>=gf!8G?z%{`r~Sb;jg1)^{Xs)<_?evd!OvvMKH3a1!`3vj3}lzZ#upv^nGec;WVFtwdNPeu0;dQqtJKz z#6oyMaC>dBp6tS5>*t%;_^FwgWqSL>V$tOi5DX+gh}B>n*UW;kFGXW|a$D4^V}pC_ z#@OMVr>pOY>8S!1VxyvidDAYm!uO-n>sFwZ*^d5nTumC z=UO&c`{5A8W_$HkrR+_-K<(eqcl5L7NW`2ghXrTF~ zbl@`rg^M20lb`rg(~AarlFL!7r$a@BzSUsK&RQ8ZjCQ@;crmr8Sryru-1dQtkml?4F)zJjnCj|d<7*i^K3(5hd%X2^l z?mSM@2pJFYVcfyepb^0QVWZT5B4H(D46~+y8FLcYv-OdhRIt%)Pw}ontGh4}uQ^z+ zWXtcp8%nh=_+`ihxzn8VKTz_?jAc`2i%L8*hh<_d+=znulU$H3!pI<+NNOeZFJf=Fr>}J<8W~T~Uq}yAAWu z9146WeMbMz`>|qs$1Id;_+siNPhva>qi-w(NI779;EQk0F`t0I(1q$ec?#+TlAm}I zqhTq2sALa{F_Cm*K#?b5GGZH>t;0}Q-Hb2#1Ywi#-`5otuknJhpz)e{02%}<+i9)E ztwWwF)wcKt6l-gc*lSH!(Bg zCOpY6De3s8`8|Auww5ch;Txip;(KRAi<8?RWYmlA4SJG$u*9&3`Y3R|))UdQ{Kx|8 zdXfhMC&jU6e67c^=qvP2%!Jt6c$@~ac?+1%|K+$S-m_%+XV$ce_TV7~p|~qL4Ywfpe1A9?Z_l|fb;kD@I)`GEoDUnp73svU16yq2 zjZGAr2pD_UoDOEzdeNgeQ#hO?4U`rmKeE6<&xqC7gZ`9*4mJ2m=RBzy?0B_RjY-!a*S(%;GQmTM>SjE=e{tI*RJc%P%qopmacc6e) zwQIM(5e3Pe;DRz3KLR__K>*VsQ33(_jW_VcQOs9wC^hgEI*SnY zKKWeZ$ILBhL&&zhfghfyz>I`ytix_@6D+5T=k%>G9Y5>%-TJ==h`VsF4Fdg{1{M z#Lh$rz25p12ah*)JJ@(8nDZP3AuL&kVpPpauJ?i2`1AchEP9FPV1i2r7W@sAmOvdP zk6U-4C55z_6G`clHjuc1DqM!3tIR4#T$L(^ohXg|2GroM;~(x}Z(iwbba0k$i@#_9 z^*(@&t(eq;-qB8BDxG%Uvz@8hP3Yb3T&G?9!*5xyP1T#xyWSB_z4Sl>c7Vb3ONYc5 zsQKgp9H6Hq0J1a&S-jC;lKhzm z+gjF4g>^WlA~sUeCNV=<$>gWqR+4xF4KWH&!h)Rj)mMz3I3+Y?s*EL%vdRl0k=twi z4b>d|a6Vdl;MQ&b7XR=wq3{LmIvWKMc|SC&ZZ^#L4ocXQco8j(&HKt(=3k;ox+sMn zDQ8dOA5=ZP%4oN&Q5Vv?O6uD7BYO8FF3Hq)>)tvYRb^ga9C`o$<_1KQcWS68&zJK8 zT&gudgam$-JSO%b56UixoRN|hdme#9H{TZI%pn6u+Se5!wLX2kTx<0tZzh5GrbSK& z^UaoDI_Z|*QK*nzeygx^%=qHS?`3E>oBVE-x^DSJf3E8Gklj2~!?fazp{I!+h_O

=Bm69%uVMWTDTpuW(&xVtUYT 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

It?kls0N;vgjMB~TtWndTer@8G<+ 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 // something for load_config function + +#define CONFIG_INIT 0 // defined for load_config() +#define RETURN_STRUCT 1 // defined for load_config() +#define NICK_CHANGE 2 // defined for load_config() + +typedef struct conf_sruct { + int status; + char *server; // ! + char *channel; // ! + int port; + char nick[129]; // max nick length is 128 + '\0' + char *username; // ! + char *realname; // ! + char *password; // ! + int maxNickLength; + char *logPath; // ! + char *link; // ! should be enough to store link + int reJoin; // 1 - yes, 0 - no + int floodTimeOut; +} configuration; + +configuration * load_config(int run, char * nick_or_path) { +/* + * if run = CONFIG_INIT (0) we load config from the file + * if run = RETURN_STRUCT (1) we return configuration structure stored in this function + * if run = NICK_CHANGE (2) we overrite 'nick' at the configuration structure + */ + int i,j; + + FILE *conf; + + char *st; // WHAT THE FUCKING POINTER HERE? Dark side magic forces. + char **sta[2]; + static configuration C; // returning structure + + char confFilePath[PATH_MAX]; + + int checksum = 0; + + // added + char tempChar; + size_t countLinesInFile = 0; + + char **fArr = NULL; + size_t eN = 0; + + // --*--- + if (run == CONFIG_INIT) { // the first time call + if ( (conf = fopen("/etc/loperIRCLogBot/bot.conf","r")) != NULL) + printf("Using configuration file stored at /etc/loperIRCLogBot/bot.conf\n" + "Prefere using the one, stored in this folder? Just rename or delete the one from /etc...\n"); + else { + strcpy(confFilePath, nick_or_path); + strcat(confFilePath, "bot.conf"); // add bot.conf to path-to-executable + + if ( (conf = fopen(confFilePath,"r")) != NULL) + printf("Using configuration file stored at %s\n" + "Please note, configuration file also could be stored at '/etc/loperIRCLogBot/bot.conf' and have higher priority\n", confFilePath); + else { + C.status = -2; //unable to open file = -2 + return &C; + } + } + // count a number of lines inside file + while ((tempChar = getc(conf)) != EOF){ + if (tempChar == '\n') + countLinesInFile++; // this size should be used to define 2D array for using in getline(); + } + rewind(conf); // Move read pointer to the beggining of our file + #ifdef DEBUG_LOG + printf("\nFile have %zu lines\n", countLinesInFile); + #endif + // end counting + if ((fArr = (char **) malloc(countLinesInFile*sizeof(char *))) == NULL){ // allocate 2D array + C.status = -4; + return &C; + } + + for (i = 0; i 128){ + C.maxNickLength = 128; // now idiots could feel themselfs protected. Libircclient restriction IIRC set to 128 chars + } + } + else if ( (strcmp(sta[0][i], "logPath")) == 0){ + if (strcmp(sta[1][i], "0") == 0){ + C.logPath = (char *) malloc (strlen(nick_or_path)+1 * sizeof(char *)); // NOTE: And never free(); + strcpy(C.logPath, nick_or_path); + } + else { + if (sta[1][i][0] != '/'){ + C.status = -3; + return &C; + } + else{ + if ((C.logPath = (char *) malloc (strlen(sta[1][i])+2 * sizeof(char *))) == NULL){ // NOTE: And never free(); +2 to include variant, when '/' is needed + C.status = -4; + return &C; + } + strcpy(C.logPath, sta[1][i]); + if ( C.logPath[strlen(C.logPath)] != '/' ) + strcat (C.logPath, "/"); + } + } + } + else if ( (strcmp(sta[0][i], "link")) == 0){ + if((C.link = (char *) malloc (strlen(sta[1][i])+1 * sizeof(char *))) == NULL){ // NOTE: And never free(); + C.status = -4; + return &C; + } + strcpy(C.link, sta[1][i]); + } + else if ( (strcmp(sta[0][i], "reJoin")) == 0){ + if (strcmp(sta[1][i], "yes") == 0 || strcmp(sta[i][1], "Yes") == 0 ) + C.reJoin = 1; + else + C.reJoin = 0; + } + else if ( (strcmp(sta[0][i], "floodTimeOut")) == 0) + C.floodTimeOut = atoi(sta[1][i]); + } + if (strlen(C.nick) > C.maxNickLength) + C.nick[C.maxNickLength] = '\0'; // yeah, they will love it, before set nick name longer then 128 char =( + } + // ++++++++++++++++++++++++++++++++++++++++++++++ + + #ifdef DEBUG_LOG + printf("____Recieved keys____" + "\n______________________\n"); + for (i=0;i +#include #include #include #include @@ -21,230 +21,10 @@ #include "defined_values.h" #include "daemon.c" - +#include "config.c" // see load_config and typedef of configuration structure in here // TODO make it multi-channel -typedef struct conf_sruct { - int status; - char server[2048]; - char channel[2048]; - int port; - char nick[2048]; - char username[2048]; - char realname[2048]; - char password[2048]; - int maxNickLength; - char logPath[PATH_MAX]; - char link[2048]; // should be enough to store link - int reJoin; // 1 - yes, 0 - no - int floodTimeOut; -} configuration; - - -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 - * if run = 2 we overrite 'nick' at the configuration structure - */ - int i; - - FILE * conf; - - static char fileArray[15][2048]; // user setup stored here and avaliable by any call after initial (by passing 0 to function) - char * st; - char sta[15][2][2048]; // should be 3D - static configuration C; //returning structure - - char confFilePath[PATH_MAX]; - - int checksum = 0; - - if (run == 0) { // the first time call - - if ( (conf = fopen("/etc/loperIRCLogBot/bot.conf","r")) != NULL){ - printf("Using configuration file stored at /etc/loperIRCLogBot/bot.conf\n" - "Prefere using the one, stored in this folder? Just rename or delete the one from /etc...\n"); - - for (i=0;(!feof(conf));i++){ - fgets(fileArray[i], sizeof(fileArray[i]), conf); - if (i>=14){ // 15 lines is max size for config file - C.status = -2; - return C; - } - } - } - else { - strcpy(confFilePath, nick_or_path); - strcat(confFilePath, "bot.conf"); // add bot.conf to path-to-executable - - printf("Using configuration file stored at %s\n" - "Please note, configuration file also could be stored at '/etc/loperIRCLogBot/bot.conf' and have higher priority\n", confFilePath); - if ( (conf = fopen(confFilePath,"r")) != NULL) { - for (i=0;(!feof(conf));i++){ - fgets(fileArray[i], sizeof(fileArray[i]), conf); - if (i>=14){ // 15 lines is max size for config file - C.status = -2; - return C; - } - } - } - else { - C.status = -2; //unable to open file or it's too big = -2 - return C; - } - } - fclose(conf); - - #ifdef DEBUG_LOG - printf("___Content of the file___\n"); - for (i=0;i<15; i++){ - printf("%s", fileArray[i]); - } - printf("______________________\n"); - #endif - - // Parsing configuration file - IF STRING DOESN'T HAVE ":" - SKIP IT - for (i=0;i<15;i++){ - if ( strstr(fileArray[i], ":") != NULL ) { - st = strtok(fileArray[i], ": \t\n"); // if we can't get ANY parameter at the string, that have ":" inside, then skip this string - if (st != NULL){ - strcpy(sta[i][0],st); - - st = strtok(NULL, " \t\n"); // if we see anything before 'space' \t or \n - - if (st == NULL){ // if we had a first parameter in string, (no matter was it set before ":" or after) and don't have the second one, - C.status = -1; // then we ruin the chain and returning error. 'Status' of incorrect config-file = "-1" - return C; - } - else { - strcpy(sta[i][1], st); - - if ( strstr(sta[i][0], "link") != NULL ){ // if it's 'link', then add here everything user wrote - st = strtok(NULL, "\n"); - while (st != NULL){ - strcat(sta[i][1], st); - st = strtok(NULL, "\n"); - } - } - } - } - } - } - - for (i=0;i<15;i++){ - if ( strstr(sta[i][0], "server") != NULL ) - checksum |= 1<<0; - else if ( strstr(sta[i][0], "channel") != NULL ) - checksum |= 1<<1; - else if ( strstr(sta[i][0], "port") != NULL ) - checksum |= 1<<2; - else if ( strstr(sta[i][0], "nick") != NULL ) - checksum |= 1<<3; - else if ( strstr(sta[i][0], "username") != NULL ) - checksum |= 1<<4; - else if ( strstr(sta[i][0], "realname") != NULL ) - checksum |= 1<<5; - else if ( strstr(sta[i][0], "password") != NULL ) - checksum |= 1<<6; - else if ( strstr(sta[i][0], "maxNickLength") != NULL ) - checksum |= 1<<7; - else if ( strstr(sta[i][0], "logPath") != NULL ) - checksum |= 1<<8; - else if ( strstr(sta[i][0], "link") != NULL ) - checksum |= 1<<9; - else if ( strstr(sta[i][0], "reJoin") != NULL ) - checksum |= 1<<10; - else if ( strstr(sta[i][0], "floodTimeOut") != NULL ) - checksum |= 1<<11; - - } - - if (checksum != 0b111111111111){ - C.status = checksum; // incorrect number of settings defined - return C; - } - else { - // Format array for return in case we're all good - - C.status = 0; // OK = 0. - - for (i=0; i<15; i++){ - if ((strcmp(sta[i][0], "server")) == 0) - strcpy(C.server, sta[i][1]); - else if ( (strcmp(sta[i][0], "port")) == 0) - C.port = atoi(sta[i][1]); - else if ( (strcmp(sta[i][0], "channel")) == 0) - strcpy(C.channel, sta[i][1]); - else if ( (strcmp(sta[i][0], "nick")) == 0) - strcpy(C.nick, sta[i][1]); - else if ( (strcmp(sta[i][0], "username")) == 0) - strcpy(C.username, sta[i][1]); - else if ( (strcmp(sta[i][0], "realname")) == 0) - strcpy(C.realname, sta[i][1]); - else if ( (strcmp(sta[i][0], "password")) == 0) - strcpy(C.password, sta[i][1]); - else if ( (strcmp(sta[i][0], "maxNickLength")) == 0){ - C.maxNickLength = atoi(sta[i][1]); - if (C.maxNickLength > 128){ - C.maxNickLength = 128; // now idiots could feel themselfs protected. Libircclient restriction IIRC set to 128 chars - } - } - else if ( (strcmp(sta[i][0], "logPath")) == 0){ - if (strcmp(sta[i][1], "0") == 0) - strcpy(C.logPath, nick_or_path); - else { - if (sta[i][1][0] != '/'){ - C.status = -3; - return C; - } - else{ - strcpy(C.logPath, sta[i][1]); - if ( C.logPath[strlen(C.logPath)] != '/' ) - strcat (C.logPath, "/"); - } - } - } - else if ( (strcmp(sta[i][0], "link")) == 0){ - if (strcmp(sta[i][1], "0") == 0) - strcpy(C.link, ";)"); - else - strcpy(C.link, sta[i][1]); - } - else if ( (strcmp(sta[i][0], "reJoin")) == 0){ - if (strcmp(sta[i][1], "yes") == 0 || strcmp(sta[i][1], "Yes") == 0 ) - C.reJoin = 1; - else - C.reJoin = 0; - } - else if ( (strcmp(sta[i][0], "floodTimeOut")) == 0) - C.floodTimeOut = atoi(sta[i][1]); - } - if (strlen(C.nick) > C.maxNickLength) - C.nick[C.maxNickLength] = '\0'; // yeah, they will love it, before set nick name longer then 128 char =( - } - // ++++++++++++++++++++++++++++++++++++++++++++++ - - #ifdef DEBUG_LOG - printf("___Recieved keys from the file___\n"); - for (i=0;i<15; i++){ - printf("%s - %s\n", sta[i][0], sta[i][1]); - } - printf("______________________\n"); - #endif - - return C; - } - else if ( run == 1 ){ - return C; // just return already loaded structure by request - } - else if ( run == 2){ // save nick recieved - strcpy(C.nick, nick_or_path); - return C; - } -} - int createDir(char * logdir, char * newDirName){ struct stat st = {0}; @@ -271,12 +51,12 @@ const char * printTimeStamp(){ // const function, static array.. one say this // 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 + configuration *C = load_config(RETURN_STRUCT, ""); //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) + 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); } } @@ -291,7 +71,7 @@ void event_ctcp_rep(irc_session_t *session, const char *event, const char *orig int is_alive( int state, time_t timeGot, irc_session_t * session){ // in future, it should be stand-alone thread 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 + configuration *C = load_config(RETURN_STRUCT, ""); //load config to get current nickname #ifdef PING_DEBUG printf("is_alive:ping = %d\n", pingRequestSent); @@ -305,7 +85,7 @@ int is_alive( int state, time_t timeGot, irc_session_t * session){ // in futu printf(" stored time = %ld\n",timeSav); printf(" recieved time = %ld\n",timeGot); #endif - irc_cmd_ctcp_request(session, C.nick, "PING"); + irc_cmd_ctcp_request(session, C->nick, "PING"); pingRequestSent = 1; return 0; } @@ -336,11 +116,11 @@ void event_connect (irc_session_t * session, const char * event, const char * or { is_alive(1, time(NULL), session ); // this time really 'initial' timestamp written into the watchdog function - configuration C = load_config(1, ""); // dump_event (session, event, origin, params, count); + configuration *C = load_config(RETURN_STRUCT, ""); // dump_event (session, event, origin, params, count); #ifdef X_MODE irc_cmd_user_mode (session, "+x"); // TODO clarify this shit #endif - irc_cmd_join (session, C.channel, 0); + irc_cmd_join (session, C->channel, 0); } void dump_event (irc_session_t * session, const char * event, const char * origin, const char ** params, unsigned int count) @@ -358,29 +138,26 @@ void dump_event (irc_session_t * session, const char * event, const char * origi } #endif - static time_t floodTrackTime = 0; - char nowTime[20]; - char nickBuf[128]; char hostBuf[1024]; - time_t now = time(NULL); + char realLogPath[PATH_MAX]; FILE * fp; // set FD for the file for logs - configuration C = load_config(1, ""); - + configuration *C = load_config(RETURN_STRUCT, ""); + // Set name for the log file - irc_target_get_nick (origin, nickBuf, 128); irc_target_get_host (origin, hostBuf, 1024); strftime(nowTime, 20, "logs/%Y-%m-%d.txt", localtime(&now)); - strcat(C.logPath, nowTime); // now C.logPath have the correct name of the file + strcpy(realLogPath, C->logPath); + strcat(realLogPath, nowTime); - if ( (fp = fopen (C.logPath, "ab")) != NULL ) + if ( (fp = fopen (realLogPath, "ab")) != NULL ) { strftime(nowTime,20, "[%H:%M:%S] ", localtime(&now)); @@ -397,16 +174,16 @@ void dump_event (irc_session_t * session, const char * event, const char * origi if (!strcmp(event,"KICK")){ // Reloading configuration in case our nick has been changed recently - if ( !(strcmp(params[1], C.nick)) && C.reJoin == 1 ){ + if ( !(strcmp(params[1], C->nick)) && C->reJoin == 1 ){ event_connect (session, event, origin, params, count); } } else if (!strcmp(event, "CHANNEL")) // works like shit. Should be separated thread - if (strncmp(params[1], C.nick, strlen(C.nick)) == 0 ) - if ((now - floodTrackTime) >= C.floodTimeOut){ - irc_cmd_msg(session, params[0], C.link); + if (strncmp(params[1], C->nick, strlen(C->nick)) == 0 ) + if ((now - floodTrackTime) >= C->floodTimeOut){ + irc_cmd_msg(session, params[0], C->link); floodTrackTime = now; - fprintf(fp,"%s <%s>: %s\n",nowTime, C.nick, C.link); + fprintf(fp,"%s <%s>: %s\n",nowTime, C->nick, C->link); } fclose (fp); @@ -459,29 +236,29 @@ void event_join (irc_session_t * session, const char * event, const char * origi void nick_change(irc_session_t * session){ static char append[] = "|0"; - configuration C = load_config(1, ""); + configuration *C = load_config(RETURN_STRUCT, ""); if ( append[1] > '9') // Refactoring request append[1] = '0'; // if all your nicknames with |0 |2 ... |9 are already occupied, we're fucked up. Really, there is no good solution in this code. // Let's say that we have string like 1234567|0, and maxNickLength = 10, then we see, that string length is greater (9) then maxNickLength-2, but also we've already appended something like "|0" into it, then // we could check it and wipe. Otherwise we wipe 2 last chars. - if ( strlen(C.nick) > (C.maxNickLength - 2) ){ - if ( (C.nick[C.maxNickLength-3] == '|') && (C.nick[C.maxNickLength-2] >= '0') && (C.nick[C.maxNickLength-2] <= '9') ) - C.nick[C.maxNickLength-3] = '\0'; + if ( strlen(C->nick) > (C->maxNickLength - 2) ){ + if ( (C->nick[C->maxNickLength-3] == '|') && (C->nick[C->maxNickLength-2] >= '0') && (C->nick[C->maxNickLength-2] <= '9') ) + C->nick[C->maxNickLength-3] = '\0'; else - C.nick[C.maxNickLength-2] = '\0'; + C->nick[C->maxNickLength-2] = '\0'; } - if ( C.nick[strlen(C.nick)-2] == '|' ) - C.nick[strlen(C.nick)-1] = append[1]; + if ( C->nick[strlen(C->nick)-2] == '|' ) + C->nick[strlen(C->nick)-1] = append[1]; else - strncat(C.nick, append, 2); + strncat(C->nick, append, 2); append[1]++; - C = load_config(2, C.nick); + C = load_config(NICK_CHANGE, C->nick); - irc_cmd_nick(session, C.nick); + irc_cmd_nick(session, C->nick); } void event_numeric (irc_session_t * session, unsigned int event, const char * origin, const char ** params, unsigned int count) @@ -498,7 +275,7 @@ void event_numeric (irc_session_t * session, unsigned int event, const char * or static void event_notice (irc_session_t * session, const char * event, const char * origin, const char ** params, unsigned int count) { char nickBuf[1024]; // too big?? - configuration C = load_config(1,""); + configuration *C = load_config(RETURN_STRUCT,""); dump_event (session, event, origin, params, count); @@ -510,7 +287,7 @@ static void event_notice (irc_session_t * session, const char * event, const cha if ( strcasecmp (nickBuf, "nickserv") ) return; if ( (strstr (params[1], "This nickname is registered") != NULL) || (strstr (params[1], "This nickname is owned by someone else") != NULL) ){ - irc_send_raw(session, "nickserv IDENTIFY %s", C.password); + irc_send_raw(session, "nickserv IDENTIFY %s", C->password); } else if( strstr (params[1], "Password accepted") != NULL ) printf ("Nickserv authentication succeeded\n"); @@ -600,6 +377,12 @@ void reportSettingsIssues(int sum){ case -3: printf("Configuration file issue: 'logPath' is not defined as absolute path\n"); break; + case -4: + printf("Unable to allocate memory.\n"); + break; + case -5: + printf("Internal error.\n"); + break; default: printf("Configuration file issue. Next field(s) not found:\n"); for (i=0; i<12; i++) @@ -621,7 +404,7 @@ void silentMode(){ } int main(int argc, char *argv[]) { - configuration config; + configuration *config; irc_callbacks_t callbacks; // The IRC callbacks structure irc_session_t * session; @@ -684,8 +467,8 @@ int main(int argc, char *argv[]) { return 0; } // -================================================================================================- - config = load_config(0, dest); - if (config.status == 0) { + config = load_config(CONFIG_INIT, dest); + if (config->status == 0) { printf("\t--------------------\n" "\t%s\n" "\t\tSETTINGS\n" @@ -704,22 +487,22 @@ int main(int argc, char *argv[]) { "floodTimeOut - %d\n" "\t--------\n", printTimeStamp(), - 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", - config.floodTimeOut); - if ( createDir(config.logPath, "logs") != 0){ // set logs directory + 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", + config->floodTimeOut); + if ( createDir(config->logPath, "logs") != 0){ // set logs directory 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); + config->logPath); return 1; } else { @@ -763,7 +546,7 @@ int main(int argc, char *argv[]) { irc_option_set( session, LIBIRC_OPTION_SSL_NO_VERIFY ); // Connect to a regular IRC server - if ( irc_connect (session, config.server, config.port, 0, config.nick, config.username, config.realname ) ){ + if ( irc_connect (session, config->server, config->port, 0, config->nick, config->username, config->realname ) ){ printf ("%s Could not connect: %s\n", printTimeStamp(), irc_strerror (irc_errno(session))); // return 1; //give a try once again @@ -827,7 +610,7 @@ int main(int argc, char *argv[]) { return 0; // never happens } else { - reportSettingsIssues(config.status); + reportSettingsIssues(config->status); return 1; } return 0;