From 37b9940132a1ec982455d1796de2337e46064244 Mon Sep 17 00:00:00 2001 From: elvis Date: Fri, 11 Mar 2022 11:57:52 +0100 Subject: [PATCH] Added basics for config file and fixed makefile --- Relazione/Appunti.txt | 2 + build/server | Bin 0 -> 56064 bytes config.ini | 3 + lib/ini/ini.c | 274 ++++++++++++++++++++++++++++++++++++++++++ lib/ini/ini.h | 20 +++ src/server.c | 13 +- 6 files changed, 308 insertions(+), 4 deletions(-) create mode 100644 Relazione/Appunti.txt create mode 100755 build/server create mode 100644 config.ini create mode 100644 lib/ini/ini.c create mode 100644 lib/ini/ini.h diff --git a/Relazione/Appunti.txt b/Relazione/Appunti.txt new file mode 100644 index 0000000..677aba9 --- /dev/null +++ b/Relazione/Appunti.txt @@ -0,0 +1,2 @@ +resources: +read ini file: https://github.com/rxi/ini \ No newline at end of file diff --git a/build/server b/build/server new file mode 100755 index 0000000000000000000000000000000000000000..96565aa605a82c80c6b575227b46dbcaa687a481 GIT binary patch literal 56064 zcmeHv4|H3_mG@I(XH6g|wERgaZA1!%@F#I7P(v{5uu%|g9MX_b{#H?BB^EfAD#_rm zc#l99>xU3Ew9ph-n)YkiKw0V*vV?p%ID}%uVM_}6x;_hST{gheHXoS%(&BDevcKP* z8TsiY6uM`>v*+x2@0^*rcjn$ZckbMGXWo^Q7ys@5zW-;I6_{#S))bVPD4Xjot7wG) zS=J{|A}G=5@sphoc6sH!b&is^Trbk#hM_^ro79i; zqV0)}bRq*Hue_FpN?r?%jfc1fRmTDP#k09gvU8mpJwRT*S;;#}3nA`)YGh*|8jYtq zvy%q&>bL37l|1?ZAL2FkQ{B}%8tv-5KH1q8O?IwLq1P*KK+B^K@geTjNsXwQezFlI z8eP0-<)Y|cT)ga(l`_(z^s>;(<7w%?EZipQ9*wR`O|J5T<%K{iPmAK$nD|?hLC{h! z2Sw@S8pwO}0xnOBYK&fH&CzH_ESlZ0eod+)n$BfDP~MRCH+m~&ms!{4XPv<1`J`&7E{l2QSXRD~ z$dF}m?gq50(VC}y2=M@p)&GoT?LsH*GYh5vCzka*T5C577JDd~<;3yy>cYOSq2Sf| zz^Cyg%X06(Av_#F2<0%8`CZw}{EpNAdC)7lM)7?X4dt(feHziu)i~|tKfVQg3-}iBE#OXBBZa*oyJw%>HD2i1X9aJcjzt!F#;stPU)9cMPPD9H>u7+H;qU|vP&pN! z+D~l)&Vuzhbp~ta;#Tn?UQq_YhQVKi6E#2r=VE#6Ocw_>h-?|@<9UiMN=T{1k z11zh75NL1R&>77L!i%&pQonyO2_2n_Fq-`Y#fuAuwrS7zIK8Y#)EVuNx zL9$@TepW`lg^|Jp7>{-JMhe3%&MH09`#HDB-(Uinu_QA(uLzDQULs%?KpPK-_n?M7 z_bd$W3zokMSj`F}K)FafyeG0_Y-%Jh94WOrk@8VYj5zN=4E5<{euNrsXM)CAI~CO@ zF*a;5;ZvOmJ)%x2(p}gQup`}=t}qm^!+RJFA$^hA+T3si5#z^D^%$)fkK-O=0gkf) z6I6aA`WVJQ@OGiSMf;%=2MLOqWHP4~8P#NwQa&#VU_0YB--*bMU)MzfFchsjD!cK) zG%XDv8Y5AukIdXq0aO=fEbQ2C_Ysh;JgMyPkRa++Ir@0?>?nnY&KU_78Ajl8;U_B+ z6)0G+vgvr+Gz4;M*Qti#DcsH;&FNM%y_U2Jx<0^Z`_U{q_ z7kC7us{($GZHIt6+yeOPf?BFl1xqDRnfX2)8NTv+P`mXxzAElsCGG;ZICMc={d-Uz zN|#o>0H1nX(H-le!;E}2mS4SdZE*Ht%QEqp?}y#B7hx4~xK~Bwy@<%iK&*4eY!i`( z!|%a$_E-AE2YSYxWsogO!bF_^Mm0Yse+`a?HUABHHP;Gom0I`0>`-Ie?xWXYspArW zMnEW%T6M28VS2ReP*wIlO7gH!e}(X5c!gA(%*Hz~Ff!&e=vdb$8ZOwcz5M1!hn$>o;Fijp4;>_~IF(KnNXDHb6&-45_?`-O!PzZlKWAb;br|HqV}d%ma84YJ`NR)& zP@g7v&xF&Z0ojl9P4AnZ;;J#l%*lA#DDl+p!U4BxOgjxDqCS?zYpw*JI>*g|9-N}~ z+nEK~Zm(ffRh#i}NKCShym~XT!WACZ$KxCf+2L2|K?R8d`-9&YIw27Jd%XILIpd`~ zL&n1JtHJUSR7nU`fb6|MIJ-Xd*jaL%7}*u^ZswV;@2j z0TFB~;aK9Pj?3txEa?)VvIB&;1GmZXjjrK5yZBUJ_zHfjvBSG%bu09MQ|DRlX~&a; z2jm0r8LYPzT*fml2UjV)8z;H*7A`cU)?Idk8EZBYe+&k<1^+2zB(78v{{U9Q#h>Q@ zqt>rgBLd~T;Ot)ZSi#xq{kmyy9vGtCEg?2M?I!R-Y>wDnoA3r~#{Ej(fXgXaZnDGS z$0Tn41bk1;MCJStW8i~N^lSwEVdyhNn*d`+HpAc>)#hwcAoif#v(>p1tg<3E)3s#6 z=ytpG{1^JIz;149>ZMPu$O`lhBaRZ^%$u92GxS!!SkGLG=5}w2Y17HY8G|J`BOgY z+weQ*H^g}q7;9*qRdSAr&Lio{nTh_#OCd$7##YAO8c!tiLYR}_N1skGyK zNdaTdJW&Wj;f9q)_KN7(k^!qB?~XG-wqi`;$Aj9_n5O-Cr$ds0ou!eB4M zKvj%$Wv~}f+N!AF5FUG0%^IPRp;P6D5{i4quzh>r!cHBRIThQd6$X8!q-d~~t}!QC z2Lf_-Nv}|1D@4NgDdB0nwr&YnU}2&;*sE{Rl;Sv_FjD5bWJe0m?pN|*7k>Qll4G|T zokdV+AkY_nCD?l+7NyNsn3$nE#V?gj3loRn)Bx$N;a7N(e^3s6F?V5Nda$>K6n9B3)P7%43B$+%`?Il3$tdLWqRkTUT#1V{_hl^ z$)x!dwHRgzIAmWdkN!Jux8iCw_s_|AP-=3nJBs$fePlfWxp#oL7n4=*t1UJ6k8=G# zbL;i_uLAN2mNX(}hlSKVfM0-JBhGWw+76G1LZp(wBaZzo4jH~H4Ie0!%Z*mn2!R%q zSAurwS4(dL9I9*7*@H30=psJwxEM?VbN|%z&XC^lF6c2)ITeUehCQIwGvI(ys;;67 z=uZzQ$hWoS>Ye61LOw;_S7cPk>I7)Fsn}+0wR|P`MkdCEo<(5UjKm#`gzjP%D(ToIwcl3Oru9ABwoAuikfCYW%@&9bJk`fi@$Q zST*MCq~p=Hg`N@2r;biJ=qqQ@%Ifk4H!{053btLiaBTiKc1P~ECFTLRXS`(K-G{=w zd1E6cb&~Umu@igoVWyvs4|b2~d2NstS0l(cqu7u223)=KgXB-=&feUj*(bxzTh(x* zw)+r<8+6wAzzhjDZ`~Sx>yN4f`?ZQX%(c+_5Eb0|D8<#Ln=SL&;LTv+Tqvo!gWC@& z{C-Yf_)Vpxt8<2Q)+nj0_2#YNH>-|1?q2Ry!Q$f@HXVlj)Dz6!0UBN*d z{i~V|98kOsO;U6Qdl~j7J2EvV7G>z4HtO=eo54wbR#7nTuY6&ssAoJi-(_y`tYN z^dC}@!~An(r!TtMNv)S4FOXSI<%dWOh&rUeVU0)ZkNYT(BD-f)xiRxV2m9oB7Osp~ zJuJs zVO~4@UPWC(<^3!4yk`Y_PoVkY5LNi~?5%t)BQKBHPgAh;?x@rsdSst{WS_EJd2omc zmhu)Vu`LgB=M+eelk#n|DwVMfZ_VbYnq$__AppQg8lr`vJg9+)U5a< zC>in9M`yV?_c4fm1>ZlF0Vq`%^r)Q}Ruee5pw0I3$ZhEvA_GAjPOFWIgDxs!fzz7-R!d@y~MeFX4|) z6A4Q7JLweiq4gqq5%>1sjH>*W=9JTGi%5vyB?|6%&2s(~LoVIK&CAW3De`r&MoKc7 z^B~1MB4Sj>4F_8&zp4)u7Nf9@E@4+uSnPv!y8obJj;EL}xx^erF}Uwlm8_FNvniuI zD(I}k&OhMY zdB`s`)#=UK370fqq8DJe(6iffRGmhd@z&i?Z!|J@gtL|e8;Qi9W9pUnnj86g@x2Pa zS3RLT_otBD7kH7--(UJJ(0j2~nuj+3$Wp#D@hZSn>Lh<0op_5YOcAO+qBy$y_>PSC zF$7K?*x#Wla;67o=fPp}Q!O>;^+&ef5}6z+17p8;p~n9g`*~0Jn(xn>_72DwQ2i}9 zp;Vll7%nzotz4o#SjSb{TPEpofzW7Z1ba&<+uYP$+mie2!nR#XQ_v zeh(;>IZ~(uBw8X^%1}w_Lq(D;^>Fb_(BbM1S%h4&Zk&|G5w|Q3m5QuuWnBe21WL#v zwbDZG)4mt42=${`So&?}#dky8D;64ID7T7<yQ?wT(6L!8Ok|#rNJqDd=l(rGlkVqMK-p8Jb zLn6wcr+F`Y)cI$0R=PMLQwL=+CpMY~M=89|E{*_*l*_~;<-uLj9My=U&H0sxn_SDO z)wOJdV60^+MITGiFG+;A-*xt*%N#(Hy53Gjt|0YZ91YMlzr7JEZo3ARa~}Gi4c`=C zH`2XRV5b1= zD3uv5@?ZranCQ%@sgYrLy#u1hLEAB(UXb1pmAc#*k|cuPzl@0oR;Cp($Q;({mO~6WJ=_?h9*yWWZu!|8krTY6}=>ruN zn$i~1IBD45E?x#uD@sr)N@!A1nZ>Ip=Y*m%HmRr>mC1Y4@2@QrBUjRrc{3tLj8ee7n;%*(m20IRJMza0JYf(Dzg)U*_)IlI2SA|lflBJ zx;}$pFSbb#efhPB{j=jo?Ba2g;s|m{g+YOknFFa=A8)e3;&JFVi9b|*Mj*g)pC;hiczX0@zO-KDdNGz9SUrTq1 z{E}j|XJWrah|QlUBxpoRcd^I0_;t8+u@_)rkhQra-zqCpJ!KtUc4A5uULHhTL3r7N z{i~?kdi?{{!AI5LFkPu6T007sMdQYJFWKf|0&Ok0aZ$cwhs7(g9IL{#j=c6#DMF+; zZ1JDU7HC@eJSt|aWj)TNugO;k{)R)&3g=l)Uv7RBQNlS5W}3Wws2}{x%{-o*BdSB# zPP{I>q2OhOXgC=oH194ZanG~4qy}$#hW8uf?!O0hgNIILH`bc`F#dk$J*GJD1vbT` zM{(^#^6pe_FjwhhQAcgGreXQh&EI4+PL*ndrcSI>Q5P$VpXsnw(#QMoF40 zy-0cg^fz=YrieWE*+#if%4BdVm4Ya>G~f?I@b!YfHbL%fH-sQtUFdlgZ-;D9_*Gn= zoyWND)=~TjR&G9>Ry&EanVRR3;>ALb+dBhla;uVxBY0&*A9=61?_MdpT)H9|2 znAAr~eYDiGq&`;aJF(prA|wokvb>!by9areFJLCT3Y_p1^|mL*?;15_~hQbQ_^33EfQSc|zTU{*e%W z-fw@MP#YnBVppyp6o5}wmJ>Rh&=NwQBy=7jz8{q{2z{Q=$%HN>^l3s&5>$>Plpr*n zP>zsAs6gmlhI=LqEpNyxp15Wiq5ysot$$5Y@^LJJ5jC3F#?3kY3G zsEJU5&^$sL2%SKvMCe#T_Y&gWuKgiG(+E95=sg6(_U8!wE1^+B4xu**{gTkTgmx49 zGk8elc|u1M;zcmLV#UQP!l5Pj$F57mp^jAi+UZtpUstEhLs zCtw=jytu{Y^z-AXuFhPjxjEFRM?)vJg%aJ#9RB_AbStw4F?qVxJl&eEhnHB{MCQ6g z=F6$fwTTSG#4_v9)scwjEY7pQipM%IyVaUlpUNa-p+q*;l}YAe^YB0*NY1dXM@M3T zYR+(JWqq|P)|pG@HmLQ4vWXn^2(6E0vBqq2T`ZnUraG;3GM&&QaYz&zjCRI4LhZ56 zwvI$5q?QUMm?x35=FN|1qlB$B_?O34M-u;BvePR<@q}oY=~gTrPo#62L~IQ;WMyJ& zW&RK>Oa*f(OqkG_|+vy0VFLLnmh4o!n-uGu1iWQo1PVCt=ms$C9~|@YWviY~ml+;bD!Rn&ok~ z@OO*<*8NPhEN`D9Bm%?#kctW5-;XL8K&ybF@@wA$z6E>>_!jUj;9J1AfNufc0=@-& z3-}iBE#O> z_!jUj;9J1AfNufc0=@-&3-}iBE#OGp2jZqn^Tx_wNy+jTpl+n03vs&3!V z?YM6LO}BODDSZyt?JV8S(d}uvJzKXey8VJ~SL*gFx^35OMz=TW_7>gt>-HYqeowcL z=yt1apVsXQy8XFs$8`HIy4|PS_jTLQtk&}}-5#gg&+4{Ox9941v2K^?_A=eB(QSur zuhZ>+r|>_!jUj;9J1AfNufc0=@-&3-}iBE#O8r>3F3}uiAJMsvCQ?! z&S<;6nBmS79Pcs!Aofe0|JfFsKR$73BGsW`FA zh;^j02_mb3tgT}0#8T;mtS(I?ok@1)){?TDXeJR8iTQxSL`I(=*+fFt(l1yp(IG3? zNGzGf28b!Mn}~NLvpF@#W}@q>stpL5SdZ0m%B>oOrHBp@O;-&$B4{!#I_wf8*G>ha zv0N?_O?D~^jUF%pacv2BK|2hd6YeoLO+3}v7G0A`#oFSrtW4}2Fx-~N<}xW!a{Pcn zGxNj&BiZD-&Y0LGKZR@2`pS&g$CSQ(H6vJ$QnBCNo%m{(60_0Wdrc}S8@I{bxxOox z=#IMd-F)DvQF!3MA^42!>ed5?x;o9^kb5wj=n#Jysp(9vTOZ4cq+RScel)5OytU$1 zV?-e!5zn2lpz*9m?z$s=$#t=KE}4?`jq4s`u?fMUsB)A1R0_$)W1XT$pP;!+JewBo zevNl158SBHTuSz36H&m%UpFhfD-FM+HUq@5@?@tn3(@N{N!cR_6oIH!Z#6{Mx8oH} z#9{nsJ6saX8{)E;E5${Zr!ZZQ-W6BZ&4E~3+sc%y=dT0VbnN<0)nnZjz+OeII|4Zo zv&4Ejus()e9}Y~x>{G3Qxu}NDL^a;T>U_(p>wqU)j|A}UCagyT>tLjo!f>HFb4<+R&7iu_@zqjr~*dfqbApu)05xpE^Em2nfo@ z`cYffHB&9?aI~Rg)c+gOqw$%?DZF3f10jXqukqz`6#kILtC+Ydj>a43Dg0fH4`_V9p~sUXMnGr8nAXOJ7o=NILACx14k1>*8bh-8lJMj#Xnn)BFZE{JRLa_}w`9&HnDu{02AttA%@Vem743wDym8 zHNU|PKRi+%;>%dMaN(b=WH;0+`=vE*_*)3zG5l_v{Kg-T()qvkg_=}$m$`wRKqIQfS_ zMB49ZeuEqSMvUsEq_s2EA!8t_z^C)}_e_k+! zli$RLLCtUQkIHZ9_%Uqe*SO*Dcg;ur-8knr@#tro-{6LSwTIu0li$RzUuk}W8-DkE z2b(`{;+IQdOHzg6=aoZ}zGe@y)E*Zc-I{98F09^#zejsG$G zZG^lw;Z)UkfFI0$>G?|bKkE4nZsxae#_%!oyK%9fKCgaZ_%&|$Kg@s3`Q~VTgB$)K znSFA8H_rLZdALvW8{F{Yc$J4Z?dQhb_Tw=Z49u+39xXWhL!S?LEipcMUg8)Q+?-cS zHE!b9r5ZQ!DQfVLT1!&n=KarV+}MAE!S#7^i=o&4{x#rGhs%=ZZ&17OK@a|{2jA_% z-|*nS_uzF(cy+#yd+=jD_-qe;k_SKCgP-NW&-37mJ@^+r_(~6cr3a6B@OBTL^5ESb zJnzB#Jb1qc-{`?NdGH53_!A!d=N|km4_*g{RbAL9JjZzO(>(Z}d+>`r_*Xo5hX*fs z@NatXA9(N`9{fcQKIXyS@ZfKG@IQF)X^89Y^#?upF&=!j2S3?^H+t|U55CBQf5C&V z@ZgtwaK5jMg?FIbiSl)nyHUQ0vJvH5DEFY;i*g?d-{<>LzKya8)$>hzyU{OOcmHQA@reA*OiC9xM>D;d3N zD$nHbO!AKUGi#^UVVOK#G|dEEHPbbjnXB#cq~xlDo?KjQze#G<_DV9Vwo9koYC9!+ zG})yRZB<-l*s7?c)~Z--PR-L@JHH~8M45+9r_ZXrk~f>gbizz!%1}#+tR^=W#j&*Zj%%%q>1rKKC0|H!4II7u%KWW+U-uV`) zKXsvG!3xntRk(ETJbOKH)$0r-QPK5Jbc>I?x@;ys-+}|+_nWulL-i_1Uvi<|9be{qM literal 0 HcmV?d00001 diff --git a/config.ini b/config.ini new file mode 100644 index 0000000..b5ff269 --- /dev/null +++ b/config.ini @@ -0,0 +1,3 @@ +[threadpool] + +quantity = 10 \ No newline at end of file diff --git a/lib/ini/ini.c b/lib/ini/ini.c new file mode 100644 index 0000000..ab5f11d --- /dev/null +++ b/lib/ini/ini.c @@ -0,0 +1,274 @@ +/** + * Copyright (c) 2016 rxi + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include +#include +#include +#include + +#include "ini.h" + +struct ini_t { + char *data; + char *end; +}; + + +/* Case insensitive string compare */ +static int strcmpci(const char *a, const char *b) { + for (;;) { + int d = tolower(*a) - tolower(*b); + if (d != 0 || !*a) { + return d; + } + a++, b++; + } +} + +/* Returns the next string in the split data */ +static char* next(ini_t *ini, char *p) { + p += strlen(p); + while (p < ini->end && *p == '\0') { + p++; + } + return p; +} + +static void trim_back(ini_t *ini, char *p) { + while (p >= ini->data && (*p == ' ' || *p == '\t' || *p == '\r')) { + *p-- = '\0'; + } +} + +static char* discard_line(ini_t *ini, char *p) { + while (p < ini->end && *p != '\n') { + *p++ = '\0'; + } + return p; +} + + +static char *unescape_quoted_value(ini_t *ini, char *p) { + /* Use `q` as write-head and `p` as read-head, `p` is always ahead of `q` + * as escape sequences are always larger than their resultant data */ + char *q = p; + p++; + while (p < ini->end && *p != '"' && *p != '\r' && *p != '\n') { + if (*p == '\\') { + /* Handle escaped char */ + p++; + switch (*p) { + default : *q = *p; break; + case 'r' : *q = '\r'; break; + case 'n' : *q = '\n'; break; + case 't' : *q = '\t'; break; + case '\r' : + case '\n' : + case '\0' : goto end; + } + + } else { + /* Handle normal char */ + *q = *p; + } + q++, p++; + } +end: + return q; +} + + +/* Splits data in place into strings containing section-headers, keys and + * values using one or more '\0' as a delimiter. Unescapes quoted values */ +static void split_data(ini_t *ini) { + char *value_start, *line_start; + char *p = ini->data; + + while (p < ini->end) { + switch (*p) { + case '\r': + case '\n': + case '\t': + case ' ': + *p = '\0'; + /* Fall through */ + + case '\0': + p++; + break; + + case '[': + p += strcspn(p, "]\n"); + *p = '\0'; + break; + + case ';': + p = discard_line(ini, p); + break; + + default: + line_start = p; + p += strcspn(p, "=\n"); + + /* Is line missing a '='? */ + if (*p != '=') { + p = discard_line(ini, line_start); + break; + } + trim_back(ini, p - 1); + + /* Replace '=' and whitespace after it with '\0' */ + do { + *p++ = '\0'; + } while (*p == ' ' || *p == '\r' || *p == '\t'); + + /* Is a value after '=' missing? */ + if (*p == '\n' || *p == '\0') { + p = discard_line(ini, line_start); + break; + } + + if (*p == '"') { + /* Handle quoted string value */ + value_start = p; + p = unescape_quoted_value(ini, p); + + /* Was the string empty? */ + if (p == value_start) { + p = discard_line(ini, line_start); + break; + } + + /* Discard the rest of the line after the string value */ + p = discard_line(ini, p); + + } else { + /* Handle normal value */ + p += strcspn(p, "\n"); + trim_back(ini, p - 1); + } + break; + } + } +} + + + +ini_t* ini_load(const char *filename) { + ini_t *ini = NULL; + FILE *fp = NULL; + int n, sz; + + /* Init ini struct */ + ini = malloc(sizeof(*ini)); + if (!ini) { + goto fail; + } + memset(ini, 0, sizeof(*ini)); + + /* Open file */ + fp = fopen(filename, "rb"); + if (!fp) { + goto fail; + } + + /* Get file size */ + fseek(fp, 0, SEEK_END); + sz = ftell(fp); + rewind(fp); + + /* Load file content into memory, null terminate, init end var */ + ini->data = malloc(sz + 1); + ini->data[sz] = '\0'; + ini->end = ini->data + sz; + n = fread(ini->data, 1, sz, fp); + if (n != sz) { + goto fail; + } + + /* Prepare data */ + split_data(ini); + + /* Clean up and return */ + fclose(fp); + return ini; + +fail: + if (fp) fclose(fp); + if (ini) ini_free(ini); + return NULL; +} + + +void ini_free(ini_t *ini) { + free(ini->data); + free(ini); +} + + +const char* ini_get(ini_t *ini, const char *section, const char *key) { + char *current_section = ""; + char *val; + char *p = ini->data; + + if (*p == '\0') { + p = next(ini, p); + } + + while (p < ini->end) { + if (*p == '[') { + /* Handle section */ + current_section = p + 1; + + } else { + /* Handle key */ + val = next(ini, p); + if (!section || !strcmpci(section, current_section)) { + if (!strcmpci(p, key)) { + return val; + } + } + p = val; + } + + p = next(ini, p); + } + + return NULL; +} + + +int ini_sget( + ini_t *ini, const char *section, const char *key, + const char *scanfmt, void *dst +) { + const char *val = ini_get(ini, section, key); + if (!val) { + return 0; + } + if (scanfmt) { + sscanf(val, scanfmt, dst); + } else { + *((const char**) dst) = val; + } + return 1; +} diff --git a/lib/ini/ini.h b/lib/ini/ini.h new file mode 100644 index 0000000..cd6af9f --- /dev/null +++ b/lib/ini/ini.h @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2016 rxi + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the MIT license. See `ini.c` for details. + */ + +#ifndef INI_H +#define INI_H + +#define INI_VERSION "0.1.1" + +typedef struct ini_t ini_t; + +ini_t* ini_load(const char *filename); +void ini_free(ini_t *ini); +const char* ini_get(ini_t *ini, const char *section, const char *key); +int ini_sget(ini_t *ini, const char *section, const char *key, const char *scanfmt, void *dst); + +#endif diff --git a/src/server.c b/src/server.c index 614f0b7..9a5b890 100644 --- a/src/server.c +++ b/src/server.c @@ -12,6 +12,7 @@ #include #include #include +#include /** @@ -55,7 +56,7 @@ static void *sigHandler(void *arg) { static void usage(const char *argv0) { // TODO change this - fprintf(stderr, "use: %s threads-in-the-pool\n", argv0); + fprintf(stderr, "use: %s config file location\n", argv0); } static void checkargs(int argc, char* argv[]) { @@ -64,17 +65,21 @@ static void checkargs(int argc, char* argv[]) { usage(argv[0]); _exit(EXIT_FAILURE); } - if ((int) strtol(argv[1], NULL, 10) <= 0) { - fprintf(stderr, "ERROR: threads-in-the-pool must be greater than zero\n\n"); + ini_t *config = ini_load(argv[1]); + if ( config == NULL) { + fprintf(stderr, "ERROR: unable to read config file\n"); usage(argv[0]); _exit(EXIT_FAILURE); } + ini_free(config); } int main(int argc, char *argv[]) { // TODO read config file checkargs(argc, argv); - int threadsInPool = (int) strtol(argv[1], NULL, 10); + ini_t *config = ini_load(argv[1]); + int threadsInPool = (int) strtol(ini_get(config, "threadpool", "quantity"), null, 10); + ini_free(config); sigset_t mask; sigemptyset(&mask);