From 45cd244172f2829f3f7b57f58d6af639f0aca05d Mon Sep 17 00:00:00 2001 From: Ugo Cirmignani Date: Sat, 2 Mar 2019 16:12:48 +0100 Subject: [PATCH] Working on mutex! --- build/modules/configRead.o | Bin 38120 -> 38120 bytes build/modules/connection.o | Bin 52224 -> 52224 bytes build/modules/ftpCommandElaborate.o | Bin 76552 -> 77176 bytes build/modules/ftpData.o | Bin 45960 -> 46216 bytes build/modules/ftpServer.o | Bin 60144 -> 60144 bytes build/uFTP | Bin 218840 -> 218872 bytes ftpCommandElaborate.c | 32 ++++++++++++++----------- ftpData.c | 35 +++++++++++++++------------- ftpData.h | 5 ++-- ftpServer.c | 6 ++--- 10 files changed, 44 insertions(+), 34 deletions(-) diff --git a/build/modules/configRead.o b/build/modules/configRead.o index 42c179161de84fe2e476d0305eef82725cc592e5..a046a7a49ce45ca7bf0c2eabfd456a34e65497f7 100644 GIT binary patch delta 1557 zcmZ9LTS!zv7{~v+y1Lf7u4^%#lffEMB4}DfLOpbQNQ%f+$_ERj7oiJ+Js1?LyK6~U zRP&G(ft6iM%2i3aVH!o2B#J^3M2b{mWhp^nbm2Sm8O!X;{(s+Z=FFV==1er(Cz|b% zlbMdu9P@ClJe&DFu+I$?=cECE*{~-bsA4#u>j4HBE{Hf_BnNTM0y|*0MqhL!0gEVl z3e8KayntC*xgTa@i3>o2HRfs+0H?}LlwB%cI}!_c5`X|;UMG>N#Ek$c8B2+K-C}<}rVd$Vyr3`liYu!MpPmSv&s9?B9P|a|k z;55Snf<}gi1QCX=*KVMj;qe*|ke99=-9uYQ^+!RP1p$~({7%5f%7Pq*r!;9j!!tVJ z%?!`U6fyLYDQ0*vnFy3Kyrk|{G4#=#28LJEfJT2>mer+CbpPoc_9>6>g{{u(_@Pq3@PS*%ysbLg;B2Ae(RlpL$W3)jB3qxTHh#8FWZ8`XwYmX&ux-pL19ER`-b=Y zNG6Ab(W_aTP3>w}ZU~9|G0oP;DLbXr=}yt_msWShtGZKO4hdsnvZA@u`$+-75;+(W z#tO}@PEvNAw1tI{uh~4FyHn79^g!ooPG*_CXYWKUQa zZJIsC+$E>O!syfNZ$7;dnO-Xb?=`zsy%1)!dLgg)SF2a^4RLwZ#JO|xGaFjHmB%kr L^^W7UWl8@4#;4L& delta 1543 zcmZ9LTS$~a6vzL&-qzCHbuGqkGgu=?7BsgA7K)&^#E4v@e9$m@>}D9DQ0%&HAyHDz zLuN)LWr>EXcB6}|6h+#_5-K7p4a2NVBS?%coNvy8%=hyBf9F3l=ggd$u{P^in>BjW zo8LMuU2`{*Rl0-pI;F3W-k@|R>5WQ9XVQUERd6@OOPva?28qg;uFsAjZ&F>;(Kdv~&>edsISYKqWF^FT?$S4XB2p)83qYZqKbPV zJM$I>hsvDXU0Z_tZOj$#=sQ}3yKCx1b@=Za5~$N=B2(9^)l}Rv3+iWs%{tq$^40pV zKIr1?o?Q3H=FE7;QIeef6KT%)nX2OJG+v$w%u~yLp~ABg6@1;533yTze4DWYxeOC? z?SP-*JH3L`*b+5vQV!*NEmJ*z^IHPN0T=BLnB(L>fOG(zcEv)AJLn|O|ph%{`K=Tw8|v$Ip!(JAL!Dcv^~zFOqxe zgt1g}r)fHXRq}kDFbXwyg+sZUqGT z2T7d>6BIU%j7%9+bTgZ5%?s7()HY+HQzjdA(oMux(aPpqWnTq3&pjFCehB&h&i|fs zU(UVHWX?aC^A}!f@#WK$ZP}!9nMkOZ9l8^G#GF3zi}W%^@(P3;~gqP zgYj0ina1Or)bq6DwyHC<=*HA2Yu~}$RG(;78EQ{Fp!&R_Z8RRgwyxavY5f7~?OLB=J*4$%m-nK#Qs8(dq@l#HQ=rVFh6QG_Pck`r+=mQf0%sT|1wLjt zDDVlxl)zbrg23kp0doSg!(m`cOqZ_k5~ArK6EdPq=yW%yE`H94d>(pE^-5=(r$;>rf-?@VqM}E6a+3mQwJ;v%+qjB zbN0JEVIbh;Ip61-s;yq&RY=>fR@)0W*Swv}o%!K~Cb=^Kzw=`}Qcd`Y2T8K0YjjH& zyJ~LTA5R}}v);_wQ2IQzvl;@v)s9bQUn*B;caqL8pWd4NHe9ChkV+DOz@y;r=c)AExo5WoHbxUsmuGy;HR8y@p$q6Ufr#qGi8s zxYvY_kSbaBal_puCs3x1CCi>O-2L8nlTUA?WDQg+Rrh;^pAUd#BkSpqj^8xm4@xyf pm6Bzzk?d-<5uJo}v{JHql7>4gHSag#XZalf=r!V3%654<`ae)l6dV8m delta 1778 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 delta 12492 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 Q1+qi-%J??Gmc0Z22dJHGr~m)} delta 5598 zcmZ`+3s_ZE7GC>YZd~$07kO+paN%C`0-~n$k{&$G!lDtb=FpT0W{zSh78d!sFim71 zQ+ZuAV+sf=Z$jYaQoJ^@-duuGzKV-SEt%57X9Bjt9UsY}Y8 zT%RxHE-n{H`9&@lN_i)j=SaEdXedCjOt_EhiyacYV1gKD8Z(=Y& zr4g)GU_bZSq`(1Q;W`E0ijQmq@0BuBscDp9TwgtB1s{ykCz=I2_o~7j1ky0BcrL=k1x_^ccnT{ERWD<{EUlg z_RqPjW*p{OsaE`QWduNEJirV9=V_jKOpu)8tC|P^SFi+M9}NRYRp8%WgaTwJ@C`pg z{VCGy3~s(L%{TI?o=-`T^X$AxJ%{gyE>`0QE~|Y0!)2AvIWDWC@gvVu9gXu`9xp5Q z6PHt^{4R9(8v-CK(PcC!V6OZ z3BoCe{3QY)k;~+a#;4RTT_$z=BLQ4ook`AUd=AZDEU@y>{Bv|zEZ9Q#5+L7-Xqx{4 zNaDWat&N$~w;)P|B5#RE7XNOa^wn|CDCP-R{9QgC>>U;C=5Zp{yDE)B2@mU8NjRvC z^Cf&w!2%ecC%kLKLyun_!Quv_u6s1G8jZ`NORQ1eYKb*?EHja=zfAW_h}IXBp><mF2#3poer+B z_}k{o=%pS!pIdIP7`4h@ijU-R=f*sjeb1;mD+b@riz6O9m6t-6qGNg-@dPGKZ`6n# z-941734AuA)@n_S&{89D`R#N{l$IW~P5j11Jl?2HiqK|7Xj7xLt0J_kBcHHMZPYvw z+Js0gIZE?TZA#$v+lQkA%?q9+)5Lz|hB<1q>7kd+c-&%HcbPrdCM(*gsx5lKXww)R zxNqT|))0NO`>|;;B}c`0T8!U{@h34xU{M(*$zq%+#!No485V%CKwzJEj$CZHJB7_c zKH~8*8(S{+9^khsof_r0KR}iq)-Z9|L_G3f>e%v%#Sh(Ix^Vu3D=Y4=oWEq*k_s$c z7K7&=Ox0Fa;Obe4fj=+Hv!~ZH(LdtT;yM8M`GUOm8T8W(`bc!IroIKS7rm}Gu(g-a z?=t9bFxXENpAvHR8x8vF4f>l5`bARj6X|9eh>A-%B&uTagM5v_evZ=fV-s%B`waRl zgTC)qdf&x5O>$nWM2^A1YtS3(`lvx~tlTz(-dKqjm7Xua3IHehbUf=m99%=$9)p{) zP_dZ4mXc*+Y!u@WF>2^vOIeXyCe4HLSG&IHjX1EDl5fPAg(GVzd0LDgi*X_rt)pa> z7~kY$X^Cn@o{zCwPb;q{b_nAirz{uguW>C7?wd;yGB zZ$SNXi81N-Dld;o|D%e26*kpVmTh7`QuQgo!FtN>GO^2fcLTs8Bn^~3Y+{>K^{Ozv zfwHGf>}gpm(brp*?@^nP`>ZtKm%p}G_eb$E1bfS1{(goi7gMz z-1>=yO;F9GH{A;H9S3k7=5D8Kx`};Az5few#dgZ>HL)eC5z4S>J7p^s%XgUPxnG@; zKjGkZ%C?w%SE(#9mMhdovE~plr5@U8CCPJ{;LWS(#$>HR>`w^$5pGWahngw7LLF&6^L|zTL=11CELpMo?C~mQCg!$Kc9)60MzLkM zqJ^?2O_87EPkjJ*2Af(aYc{bTD0UYPwotau#Oe>8Pm#1za+b#@7EEuYY!a1G_57Pu zJ70~Zt(4tnV&|$J_#OINDZ5{>`szMW56?9?&`MeDC4Ad(q?NKhlkanC*WN^T8)e5# zzGqcdUtm!iWj~nM6Ux_$)oqkr8T0EE9aj(OOzdr=tiZ(nRs72ZxEqJsD0{%fcB`|t z8pGQu+iGGzR%|oowo|sp#Ol6>a78<1$4u-jHSbAmYNzaL6Z^be0@!e{ow6|X38vTi zk7}AMkfmLhRVSb6SXPnT%Y8!#k&u0(AFelL9R5 z$qp$@mdwrA-ZL%axfF>A4)P6i@VJ5evEl*~EsWfgI9>+X7j{fkT08t-K7AUdj%6QTq1)cI-^} EA6LRF7$EzwY|+EO(&@spW-26A~m?f*Cb z*_qjSp1Y+f&(f49v)U`tSnkb;H?S#K?%CUyl+S@K4EQQVC$96o?`G6Gi@u2PrsDuO zQCxxB!#YOuo(oVw0Kjhr9vli*h%``FxwhJAbf|WwYSAs9+7ILR|XXH9{1Xd8Y`H45tZpGK>-oFq|P6WcZ38!|?T{Fu*y6v&Rg8 z#+WQUMkAEQbD-RX6xiQv@d8BIa-p8#JiYV;!v)&#Qw-mdlVJFcoOXtb9U*{DhD&t1 zy$s*eJ86b-I)K4=w9Y-IABc{yb%l-~!!Yrr2Vk0E60bE^q^_Pe_}q1mJ^yg=@>yS} z`h4!L_R3?qVTzSI;OaiP1sNAP(3cCkmg{JI=@!nXinx2U#{PMHrTZdD?tYUr-@02g z72Pxd`}fIWfD&2u4;sAGE8)*yiUFc|5^g8M05uGEc7*^M8J6hxk$-Nj%)5(P>jUC1 zr>=E#KW1ihYo|e7015ygM0cHj2LP}SCuU4*zv8|{^8&ze6j{?6RooA$008`m4Oz40 zn&R$pzX#x!5^rO^r^NSYvYLh;WKAm+k+eMLODR&#XZCBJGg7swDv0Qe>5K5SR9!(twV}C#rrvl3$vzm zR&fLT?q!V3nJqJlyN&*>P@`udNQ)uPnqzgJ7g%!EHK>;pSQoLT}kB2HTZ&*T>}w+Fj5E#66K z?<%?yN{cupN*hI-4wn9=T0M7<-<&F&^iubVm>sL5^DDOAP5xA=aPbBj z){{0ptPR8|R{4#c-bQg_tsSm4$BY6YEc3IK-I}n>V71S!S)G)OM5sBsQ9~EK7HzOo zD`_(Np|B`f`>&X$(YpI+u&zd2HAm~V1w^k|)ihk;X>JO?l%?#3zf=EcK+n1e0ECAg zbpibf-nkY8G79$pPzX#bcsCmY>YL=50|$M;x+ZviYrTNWuJhh2B|r_!P*?cI3XWb$7$E=@_ zdX#my)R{yO=#c}T;CN3+!pRiV(~3Ufw77y(V+;|QcbXxg;0!~*g3lS!3cg?%R`4Z5 zM#1>T5@1|G_G}1fj&kV~!e8?UiB8$bh8Gk}Y<2@L=EH!3Z~4rSg0sBg0}9Twb6mj% zb}|aSiwA*m1(STc)18q$Wqq#d;xb9Of#TM4tJ3*w^pZSFNW0Z`ds0~2g;Xk z^fDJww`*&+T>ceZ@J-u|Y&{^W$+*aafqd|3`HrT(T307hWvY9mKK#?v-R{4zRNa?Y ztB%)sD)n{xeYPB^kY)ei!7JSoZv0#hL<%JQnJ5A372Mnv1ez7x;$K1G_-dJFk=A~{ zxNSDJcMV1_l=Axl{UP}*0uTi7EPnvlN6C5J*za(Q`S$?e2#w6^#z}|!GQSakb2Kxr z8?z4gEmipjiJabc$Kmd=_YJt!T+8#sR9?st-^14opo+HSbfezk{_2zNdU`Xb8;>~L zTgB4tplnVzdK_*!|8E1>O1E>mk#x8_z0!S^q6@mQ*WsQ~?hwTmbmNf2{f}P?zzN#5 zpc`K~+&Q(MNg7+wjd_RbS7(>#+JfHpm&0A7wuCa-VR?HcYO4W9yjyK=CABQ-#%hP_ zRqlF9F6u^$!@a3`Jx(Kwy7835&8qG7(#)c6>~y$~$?>q8#3j9S(BXENPhNUE@IQfe BY%u@; diff --git a/build/uFTP b/build/uFTP index cbb0d1e9bca3cdea8154c8324cab14439cd5cc39..71f1100a4ca230ec02514eaa8fe9abe81980a5dc 100755 GIT binary patch delta 36005 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
    ^If*-Ntw|@B4 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�KkNyoSzN=pu;$S5&%$PEa(1#0LLeBUM~^{hOHw{4iVa_LN01SJNaK1pbTL!2oRwI4=nXSX98dHUwZ*0q0Fa0A3ex-Y*28{FRJV4XGIqz2H0IeUe zK9fl$DSHo_IhoXyHvGo6O(vBZ*WP30;&VaUKP>?C1AsbvtsL*&p@pyiY^jynt%r|0 z${~Lm0Myva_83T5rR4yya<7$FbCw;V$l^YD9{_CH%TlJ0C`r4YO`1Z&rTPb0pQ$8_ zZJk0~T`C^5vc7Xkd6qwgxJs!9*<}=YbCA8or|)4FJe7n?Uma%kr;;eC)=^XqmvqP2 zH~8Fnj4j3I>f>w=KDQia*YJ7rID3!JQ^#4@HzZuDaDp|)=fD%J4?cf8!M?#~Vjf$H z&p~-?&o?AW>i;LZg>=!M%!<#Gr&;*7BwTuu&zj-0)_L{?J|CWEGrlEJhV~b%d@x?O z*xlqZK*G+Wo2t74%)e;mNw}wW@DquhpX>^-{gRdYmEn6i_@i6_)?BvoH_on=o(tb1 zex@t5f+<(5{8kx(s}6z9t^oB5tbBAC{xHGEu{rGukY2#PoJOLgX9aBbG!ib&yUNz% z^TJhj0-r@!*#ms`xW?S3lW=MHHC73q)2^{L(@B)n@j4rUbis8t7oU}Hu#Nbvb(8&p z&yhFTV|+Hg&AetH{eV@)=bi_w{R~p6W#v~^j_(g04r(dP6CEtUmHCyGf8)%TQXTed z-2sNZV%uhrDCz6h>@wm$d&Ax$UCzqF3?y8d$XR22=5f{spU*h^#z4YdLV&Yn2BLGB zKseirh5LlF>jt8ex=QRlihe7xurv}bt&vz`eEuo1KKOhkv2XDCl`C6{&q6o0Cyj&~ z?z(e+3ttO6#`>xY+KOW}$P-|dH|OWe#L8($tl-j~;>&rBGW=KvAD8_8{+xd(6Dw~; ztl&@{^8^=Y9KiZ~N1{kEoBkb%j;^ogyi*x_+B@v2?gcP7nzOzJQoa&?0A`Nn{92jD zFNwwxe3TbJ+e%EDNupd9S5cH$;!NV|vfoY(m`Plv`&HP+bP~qWkcg|wX3r$yWDi?6 zlSD{UYqAqaZejP4>`{-orIT=SkHw^u2&r;o)+Qa(xG@`o&)5VuJDo(4BkX5n`?g?z zV6~|QdyLOXEt%IW5>8IADziw0G^`D4KZ}G*KeS~du=+4FVzqZ?wh_s<>=cqec4Loc zk?{68-8rA*<}^%6=`Joa+#FGrtp;%E$N5GKOZ!lw%u08M4DLUSU$K-75=Hj0)C>|$ zZm}g9B!X;WyE90Ighn$sZ|_+a0OJ5RBtyUFd_BHfwS&8?QrqJMH!AFFe7=$M zX=V769sCkMfZZ$$VIsD09$qH!$~&UIsXu`3SI!H{!2IQa!7pJiu@~Qy2*c=YoS!Qr z_J>1kxj%q*JLf&iG?U_JW}iPm*BzWcb9S8cSd2D0<%T~%)K1RvueLgzBF%I}Ly14Q zfN>{VIEO@$rR?`PB!XOGm+)a_Z|0C_snuZ?W+dU#xWlY5K0iOq`WQ(#S-_?mNd!5- zmf+(zw%bS|q$x+(H596Ml)cC2mq%IHToO*Uu|{)A1X;m)&Bw#`ny+P6 zeKo1*bLNb_=2bH5hcy>2+G`5CuuQDER$#B0m9lf+YO>vgBBo+ zjaC8ls;xa*9w01xn+hPUwsvX=K-iLzz5rWmYnz7xgf0ET9U#B9b|>mA>);O%8>j6k z0fa3NaRaCw2W}o+Bmn77AVAm(l^;NbhvfnMyN2b|4FCxH`s+~;wz?mFpW%5f2q0{o zVG00vc>bmV2wRV3AJ1O?&|c=(Y9Hs9i{m(`y+b>_H+;ul)nX_9C%BugyWv>_cLuUi%{w`;pkH z*M3Bc4_)yEIHcEJz-}Gx;tybG7^zK0?4xMHxD;(`loQ0n6m4&mJC@=BFeOF11N$$C zIVoCi=f--Ux2VY^ziZ&?Gr>hg`CYP+V(i0e;{XTiuN)(;m^lvfI}(D=$;-~ z*B2l^MQcEWGpO`DMOz)Q&*1g@~A&|NzSW9k{Ef#;#h+NY@W zoaJ01RmqE;e_SHFJiJnDzk!YOV};*Jb9M&ZCMI81!#Lek16%u#E#Y)b>*7c_UG^{+ zN5birtN5bir8A=mQw|tAYNH`Ao6Hd1o z%gNrDaJns6?(B^Tr~4Jl-Mlg3bX#ls+7nK<4eRX*r`wK{E#Y*(qnIt>bUQJaZ3(B_ zg@i5PbbFAnC7f;+;S)gAT1wcxKx@*?<9E1L? zI{^7;t2mis(1%w8Alz25E61RJi7McR@$Q#0p}sI5^0lpM^D&sBy{4@2|fb z4M1Gn&`8&;(>VtHMHH}C?8`CeeIo#fhfU&8jzPaT(y8KDjsd~}bv6k@!uPShuSl3- zljxXB)~>M;2eG4edh6H-T=>Z*)qV|tOV)<55xByWO{$}UUO6^$IFPLZ%O&gNSp5}j z?Kc~JdaQmVwzW-#!{(AzI97iV&C9jZll5-c+D?N_A%Co%;xO#8(HF<+*J6+N*vu;! z3mzUgC3<+^j29k@Xhy+I-z&CMfL|NqKe9YF7$BlHwy#J?S-q6b*~!ik`PjNqH5xzl zl(Lfb9lQaEN#IFY!ytSt8q-iU5GOtHdJNzzJbMcKBE*jh6B1Z<$=WbEq86Il&}RPH z$q^+AjR-DT*^?vO(c*?GoV;DK7EIO`p?!_V*aS{aR!nGOqjyc#??wSTeQ2`&DFQUL z@$)C^cj8YH6Kr(BWIax`q?yCP;Nfu(qq`5nL@b=*V#NvuU_w#RT>l+f*&EkqZcIYZhhwft`D`gGPZ$SqZ*~me9D;odA z6_ZH#*B7JZxL|kxm4&}0Vcm|GMOK&&N5P)7g=M}aVTKyowBma8j;v`f}5gJSk78@3FOOCBZM!%610@n zT0as;Wsr?b)PI2;9&EEo)~6sjq|~NaNT;}pd12s2w)bBWRzIbzt5a-PwgBj6BS%5_ zHEgP_pv!M$-o+%We%rFT3ez!6?Mij)qwAUo`uxwVFX}catE(^_x(TJaU!&2kg6_Yb zZ7L>V23MQ^vL`EpsBm4f7EMGaPoYO%ArOQ@EugepE<{uoEMG%tr6Ch2e2QJ4XD3jZD<{M0@jGlw^|ie`C`p zT^v#P5gornSsD`7Fu(UCto{yRiz97!*syFPzRO0Ag765$9x3RjIjsMC5@s0rNk0^B zY5I(I7$yRFj37(1X{?RjXHY_QoWpP(#{GD^;ZaTT7o>PskM|yU(IWzVTBr@aH9&Y1 zw62Ay$Xv$!KajAYEo|29vc-kMb;;Upi-T6S=1)(?1*^4-7x%T9m#c;V8Idtu*L|A-tX5YS6#N zpi^imD^ZEby8_%LYmRLqx@V&^4f@_Vi1#HNW0$N2hNzv30RUI4Np|mSKtMO)OqZ-| z13>sPZ1SkU_;tSGLvg_>7OkXk`=WJJbixq}iUMY#m}ia)eJN{@{u!EZLYN@t?Ag%< zoc#oUrdh!k7rX)=`>!mDYs%s)3J&~r4*cnezrGazTa4pbg8kcE1zy}Q3wW0ZfQY(c z(VbNmU(s;j&vxK1#u53R_5Db6(k+*r-+Uy~+^T*I!*{ncJpnuj{!w|Kxs?I%rmXbF zMrm5TQ|~J6Q;uwv+1~+@az~7{ohy6lsscO<$cZJm#7dCo_+%Fai&70QuK`NdSr{lBb&G*(XBJIaomyU)?-<@Bhme|&~Zni+ko}T9f|H|v{bnx z(QU$d<&H$R8OzEYiEay)l{*sMuUJ;@NOW5-JMKty+pxa$$cB{T$cAE$BU^~`kqrsQ zkqrsQkqrsQkqrsQkqrsQkuA6Mjzo93MwufUn&3FHA>lZ(MYua1*^qD?*-*@JWJ3=- zj%>(r9NCcLII^86y(7_`Zd>NahDwej8xDZu$c9AekBE4uqwRPI-F53sD|Cejv@3{@j#aIsY%!vWey+cFwo&{KbkL8Mpr zp9TTplC{}@4Vm1zy$#Zr~qo*Nx-X<(Z7ojm1Y-BQ2)FOMf)b_Sw zn0Qkqy8R0pCg%Lv5|*W`j=l6x6lru0cKbyop{$UdLFJJd2vD&ydb6Q)ut0$nFUSOB zc(5I^q4W#8P+qEPm~6+2o{ol1k#O9ktX@#@D{M+5{dh$|iFA1E8$@}4CqRvaWhtu{ z`XkhaG$>|=P35Jc3DKe#6{IvFJPbhPfx)fv_&lf`K*b%{@Md!Pf+Btrrx0OoObCFo z7uYOf%O%S)NspKCWHZ5rU9t)%>BYf(Gl^lx!lWABm=i8pX_I60msv@eR5S2T8!9d( z3TkhbP(g|a9B5;Va4>#iV=G9F!-M}&YC70Hr69|H3X|i&p9s z_5ZYW^-)z-S^U0zP!m6p_Z|WdIc&H-`Sb}7GnLe2^oa-vPbEbIQFECVz7)~4am*=o ztV|upoknU_n2tHt=v*@*B-YX)os3Ewt#q3F2+RDKHOti>)2w~ZfymWe3->)=_ndpq zJ-@Th?|1Jr@k5pM3M+7iVWinN`eR2U;{HL^{UAl2IHA&uI{L6%tYM_sxlbIRqy1ol z?5gus%zQ-J5u{qll^@jqeCH%}e<=6Ao$Wshy)*nC7J$5)z#o z^zt4W2fR^rv13c z?VomM3K?0mkuM#y{So`Yk+nPS(VC5~okEr`uZS>=1f|)?oqL^zAz8DLyYpG-wfzyP zDP&u-k%~gLH5<973scCpW+N4aY-=`hFSk_rBT`Ywwq_$0g=}j!Qc=jZW+N4aY-=|1 zV2CMXWX(ou3K?z9MrsNfS+kLcIor%W$eN9`-m?7>WX(n%;XnwHH5+-91FH~Ovyty| zU?U=HHnN@ryAWBkk?(QfAR=ovva!&nkdZYTdF;6IN02oesVQV+%|->PgUFhVY%aAa zWMs`o1=aQ6kTo0m9g|(y4Oz31--m1#7+JHC*PpUkU}Vik z{=n0qdt)-PW+QJw*xyE>!7u@$uhDyhLBccF=*z*d6*gR@CHKMVOtzeZ;ypxPIrR3Kt-y8k_9R1IxjRiervrD zfSQOdL$mOSY6>sac!Ct)mGQ)6Ji!+q>B^Fn$#{a>wnQ+Vn7sVpb~h`AnI_{2zEmB_ z8nDSgi?wY%HJ&VL-{0WNK7Qvw;R)`X;WCUw#uMCK)u91nXAKxTX~4KAqf0xUU?&Y2 z_i{@Wo?s^p7&~de*hvG%P8u*CG$RaSs>yhQS_3w1JVC7in~W!Tn6u67V=|tgHHQOe zGM?ZO4usHTJi((JScN9z3BJpLjc78SU_A$Rp~-lH?{VNDnv5sd$nO+1qRCSck1db1 zHDHtR1hociGM=bFb1lIf5Lt>fs$=`a%hH;z7^4rAchXp%Ev6wDn>6>PIc(ykeBKkOSpU(JAF@b3K- z`w-;7oZ(c;_D@6Uj}JjUd^vdck@Wa|{DrWm;Ha%Sd!=W;Z8Y`d*E)Am0neZ4q?xUS-Zw;j0l~4xRUYcJChhX6V z!dcKCL^1`~QZhZt_TCiQ%=T0Y9bvmKmA+#8Q#ysshB4qyp#0fTmuR4ZxF(IR{znYQ z2=2JBO?P(xF0~jbat`!|Z;dCtXo>N2ae>%HICfs{dO z{=@LfJ+QKXdR0LN^eUj7D#(a~0#)Q^zdH88Ov7;0Z=OJ_s~`wtCeWEG2*A92k_#aK zPmQO!3!wn2#?zsNkPkS1YY1}TR3429!BA+-qm?0uhQ)bAAxLxH*4O`DH%Vl5ECK;* z=BtiXU>#TtCmk@agq~aiV<1>eO-o=ZcqUT68YqIP6Y0?!xDU=3((5%a7itTs*HZ97 zSs{&JTUbbsErn>fT|jG=!UN8WCF+J=Q;UUh+W*T6*8&|~4%470NKq?bGF&X71uI~7 zb!Thj6 zeZlX70vGgmLyBu!)}Vl$}1F$G+7ZkbR1;;OP&`*cKle(pIp=C4LOS!q!E1l9} zt)jodPr~t}Rdf^{0a)E+y;Bb;yeTe7al-&Nq`JV{m;X(Vh7=cgUC=)YvZ8kLAKiE# z`u54(#j&Yw7!U>CXc%OrG{P_e8?IWjKY(dnpgGoRI01(oP#kYnw?MQ2cY^i&DTwL< zi}S44TA{%Kw+pN}pThGFxL9J{{tRw8xF4>Zg;|5Gf}UcsBY#z?>c-B8F!~r9e>FbR z$O!#fey6c)iPhFi)CqQEHb;s8dj;nrMY(751XUoUYe?Yr+30OR0R^3+0sga|oG#&m zj1c9rEiR=+F5&ZpbOZDcbsBqke{A$NW|q=XmuTQ|UhWn(aN-2ratohl%3o9kll2RB zmM{#b(c8cyG(1Y!&)xhe5%4^quiO3}o-a)0+uBSmQDOr;^D33~6?LBQT-9!NM)(-s zMdjN!f;`b8z!PQ`+oB-tixxiiqRz1ml~Q<&@P+@(0#I&@7|Bq#Iz|L|p0vb>I!|Sm zy8as7pVPak>#t~|^|2!0xqDz<=X9{|zb#hy{O#Uaf7LwWtS*0jr;4!OS~d*hijLoL zmhwHq=c&{hVf!Z0yhqhLcQkGG2p@ZQO&+mqd>@5>={ zD_#U<#p>qf>2!Y&!-(wkd}^37M)y$H$MLE^`TzIhV~UQyn~#{Uc60e_ohyd(tf#qS`Fx> zuJ^c)mZJ!G?xrK===56y=^P3l!)AD*@OhroZywCj9nh@v?b}4bMB#=i|B(beI( zn|kOQp(?BzPrH*u1N3d7S*9rGrLoBrHE?GiL=QqwrL5 zIjK=UfXp%Q@kW%&_p_Kq&NQ)u*SWXTL^-=S&U8@&`-9f{bW!Bs1@2si2=Ky`G*I|p z#H$n>C>nSt=JW|4`#iZmVK2z**%7Vfd-VWIrA=(@iL&BFW zQA4_HiPahu0dUk)>=bdIV=I+R5u>^%@76s{+c-9vKAs{*Ii94*QZdTWhf3IF(k3=1 J>Elw7{C}?+nx+5% diff --git a/ftpCommandElaborate.c b/ftpCommandElaborate.c index 40c2694..2467971 100644 --- a/ftpCommandElaborate.c +++ b/ftpCommandElaborate.c @@ -632,12 +632,13 @@ int parseCommandList(ftpDataType * data, int socketId) setDynamicStringDataType(&data->clients[socketId].listPath, data->clients[socketId].login.absolutePath.text, data->clients[socketId].login.absolutePath.textLen, &data->clients[socketId].memoryTable); } - //pthread_mutex_trylock(&data->clients[socketId].workerData.conditionMutex); + pthread_mutex_lock(&data->clients[socketId].conditionMutex); memset(data->clients[socketId].workerData.theCommandReceived, 0, CLIENT_COMMAND_STRING_SIZE); strcpy(data->clients[socketId].workerData.theCommandReceived, data->clients[socketId].theCommandReceived); data->clients[socketId].workerData.commandReceived = 1; - //pthread_mutex_unlock(&data->clients[socketId].workerData.conditionMutex); - pthread_cond_signal(&data->clients[socketId].workerData.conditionVariable); + pthread_cond_signal(&data->clients[socketId].conditionVariable); + pthread_mutex_unlock(&data->clients[socketId].conditionMutex); + return FTP_COMMAND_PROCESSED; } @@ -663,12 +664,14 @@ int parseCommandNlst(ftpDataType * data, int socketId) setDynamicStringDataType(&data->clients[socketId].nlistPath, data->clients[socketId].login.absolutePath.text, data->clients[socketId].login.absolutePath.textLen, &data->clients[socketId].memoryTable); } - //pthread_mutex_trylock(&data->clients[socketId].workerData.conditionMutex); + pthread_mutex_lock(&data->clients[socketId].conditionMutex); + memset(data->clients[socketId].workerData.theCommandReceived, 0, CLIENT_COMMAND_STRING_SIZE); strcpy(data->clients[socketId].workerData.theCommandReceived, data->clients[socketId].theCommandReceived); data->clients[socketId].workerData.commandReceived = 1; - //pthread_mutex_unlock(&data->clients[socketId].workerData.conditionMutex); - pthread_cond_signal(&data->clients[socketId].workerData.conditionVariable); + pthread_cond_signal(&data->clients[socketId].conditionVariable); + pthread_mutex_unlock(&data->clients[socketId].conditionMutex); + return FTP_COMMAND_PROCESSED; } @@ -688,12 +691,14 @@ int parseCommandRetr(ftpDataType * data, int socketId) if (isSafePath == 1 && FILE_IsFile(data->clients[socketId].fileToRetr.text) == 1) { - //pthread_mutex_trylock(&data->clients[socketId].workerData.conditionMutex); + pthread_mutex_lock(&data->clients[socketId].conditionMutex); + memset(data->clients[socketId].workerData.theCommandReceived, 0, CLIENT_COMMAND_STRING_SIZE); strcpy(data->clients[socketId].workerData.theCommandReceived, data->clients[socketId].theCommandReceived); data->clients[socketId].workerData.commandReceived = 1; - //pthread_mutex_unlock(&data->clients[socketId].workerData.conditionMutex); - pthread_cond_signal(&data->clients[socketId].workerData.conditionVariable); + pthread_cond_signal(&data->clients[socketId].conditionVariable); + pthread_mutex_unlock(&data->clients[socketId].conditionMutex); + return FTP_COMMAND_PROCESSED; } else @@ -718,18 +723,19 @@ int parseCommandStor(ftpDataType * data, int socketId) if (isSafePath == 1) { - //pthread_mutex_trylock(&data->clients[socketId].workerData.conditionMutex); + pthread_mutex_lock(&data->clients[socketId].conditionMutex); memset(data->clients[socketId].workerData.theCommandReceived, 0, CLIENT_COMMAND_STRING_SIZE); strcpy(data->clients[socketId].workerData.theCommandReceived, data->clients[socketId].theCommandReceived); data->clients[socketId].workerData.commandReceived = 1; - //pthread_mutex_unlock(&data->clients[socketId].workerData.conditionMutex); - pthread_cond_signal(&data->clients[socketId].workerData.conditionVariable); + pthread_cond_signal(&data->clients[socketId].conditionVariable); + pthread_mutex_unlock(&data->clients[socketId].conditionMutex); + } else { return FTP_COMMAND_NOT_RECONIZED; } - + return FTP_COMMAND_PROCESSED; } diff --git a/ftpData.c b/ftpData.c index e901ad1..a35d3db 100644 --- a/ftpData.c +++ b/ftpData.c @@ -593,9 +593,6 @@ void resetWorkerData(ftpDataType *data, int clientId, int isInitialization) /* wait main for action */ if (isInitialization != 1) { - pthread_mutex_destroy(&data->clients[clientId].workerData.conditionMutex); - pthread_cond_destroy(&data->clients[clientId].workerData.conditionVariable); - if (data->clients[clientId].workerData.theStorFile != NULL) { fclose(data->clients[clientId].workerData.theStorFile); @@ -614,18 +611,6 @@ void resetWorkerData(ftpDataType *data, int clientId, int isInitialization) data->clients[clientId].workerData.threadHasBeenCreated = 0; } - if (pthread_mutex_init(&data->clients[clientId].workerData.conditionMutex, NULL) != 0) - { - // printf("\ndata->clients[clientId].workerData.conditionMutex init failed\n"); - exit(0); - } - - - if (pthread_cond_init(&data->clients[clientId].workerData.conditionVariable, NULL) != 0) - { - // printf("\ndata->clients[clientId].workerData.conditionVariable init failed\n"); - exit(0); - } //Clear the dynamic vector structure int theSize = data->clients[clientId].workerData.directoryInfo.Size; @@ -645,12 +630,14 @@ void resetWorkerData(ftpDataType *data, int clientId, int isInitialization) void resetClientData(ftpDataType *data, int clientId, int isInitialization) { - if (isInitialization != 1) { if (data->clients[clientId].workerData.threadIsAlive == 1) pthread_cancel(data->clients[clientId].workerData.workerThread); + pthread_mutex_destroy(&data->clients[clientId].conditionMutex); + pthread_cond_destroy(&data->clients[clientId].conditionVariable); + pthread_mutex_destroy(&data->clients[clientId].writeMutex); #ifdef OPENSSL_ENABLED @@ -658,6 +645,10 @@ void resetClientData(ftpDataType *data, int clientId, int isInitialization) //SSL_free(data->clients[clientId].workerData.ssl); #endif } + else + { + + } if (pthread_mutex_init(&data->clients[clientId].writeMutex, NULL) != 0) { @@ -665,6 +656,18 @@ void resetClientData(ftpDataType *data, int clientId, int isInitialization) exit(0); } + if (pthread_mutex_init(&data->clients[clientId].conditionMutex, NULL) != 0) + { + printf("\ndata->clients[clientId].workerData.conditionMutex init failed\n"); + exit(0); + } + + if (pthread_cond_init(&data->clients[clientId].conditionVariable, NULL) != 0) + { + printf("\ndata->clients[clientId].workerData.conditionVariable init failed\n"); + exit(0); + } + data->clients[clientId].tlsIsNegotiating = 0; data->clients[clientId].tlsIsEnabled = 0; data->clients[clientId].dataChannelIsTls = 0; diff --git a/ftpData.h b/ftpData.h index 7c1f0aa..8211d16 100644 --- a/ftpData.h +++ b/ftpData.h @@ -148,8 +148,6 @@ struct workerData long long int retrRestartAtByte; /* The PASV thread will wait the signal before start */ - pthread_mutex_t conditionMutex; - pthread_cond_t conditionVariable; ftpCommandDataType ftpCommand; DYNV_VectorGenericDataType directoryInfo; FILE *theStorFile; @@ -207,6 +205,9 @@ struct clientData unsigned long long int connectionTimeStamp; unsigned long long int lastActivityTimeStamp; + pthread_mutex_t conditionMutex; + pthread_cond_t conditionVariable; + DYNMEM_MemoryTable_DataType *memoryTable; } typedef clientDataType; diff --git a/ftpServer.c b/ftpServer.c index aa6d201..ef396e8 100644 --- a/ftpServer.c +++ b/ftpServer.c @@ -264,12 +264,12 @@ void *connectionWorkerHandle(void * socketId) { //printf("\nWorker %d is waiting for commands!", theSocketId); //Conditional lock on tconditionVariablehread actions - pthread_mutex_lock(&ftpData.clients[theSocketId].workerData.conditionMutex); + pthread_mutex_lock(&ftpData.clients[theSocketId].conditionMutex); while (ftpData.clients[theSocketId].workerData.commandReceived == 0) { - pthread_cond_wait(&ftpData.clients[theSocketId].workerData.conditionVariable, &ftpData.clients[theSocketId].workerData.conditionMutex); + pthread_cond_wait(&ftpData.clients[theSocketId].conditionVariable, &ftpData.clients[theSocketId].conditionMutex); } - pthread_mutex_unlock(&ftpData.clients[theSocketId].workerData.conditionMutex); + pthread_mutex_unlock(&ftpData.clients[theSocketId].conditionMutex); //printf("\nWorker %d unlocked", theSocketId);