From 858bbbef0ad5578bc85dd34ffa08863b41014a38 Mon Sep 17 00:00:00 2001 From: Enris Nogare von Tein <ent13@inf.ufpr.br> Date: Fri, 24 Jun 2016 11:48:04 -0300 Subject: [PATCH] docummented upload.c, upload-utils.c Signed-off-by: Enris Nogare von Tein <ent13@inf.ufpr.br> --- useful/stg312/openslx_gui | Bin 95395 -> 95371 bytes useful/stg312/upload | Bin 37918 -> 37918 bytes useful/stg312/upload-utils.c | 83 ++++++++++++++++--------------- useful/stg312/upload-utils.h | 4 ++ useful/stg312/upload.c | 93 ++++++++++++++++++----------------- useful/stg312/utils.c | 36 ++------------ 6 files changed, 99 insertions(+), 117 deletions(-) diff --git a/useful/stg312/openslx_gui b/useful/stg312/openslx_gui index 753039de3c83ae9bd154a4add470f4f3faeb7a9c..12e9e866b242509371b2841bace8d660e767ccde 100755 GIT binary patch delta 16304 zcmZ4dlC}FK>jVwPjES1dIdf(+fI-g0oBIVVTET1vi&h6P!(#GE#@iw(*ABdGb<%tp zJ7cM-msxzq6~mrQn`bcn;AAYGJdsCSQa%%+nh&gpf#EM31A`C)F9XlygFO0-CX+w% z=rbOetjMd+s5m*0SDf+i<V;?D!>4`_U5Zd$pP{-IB}2q(Ss@aZ>=4t=PCm)2&saG5 zC$BqW)nrFLaYlp5k$n1+cS0cQD<R4m3ZdqloxG4woUv%~PCk9fO;Edxp=#zr&19R* z$S*GWz!PGEHxoqq2Gj)8$%g#yl4ZUS*=rC<hF+-N-IFKs>obN<KFBXFX&VGl;|n!G z0ct}1<d6K~j1H4I1@t9#p`rAi5n@m<2gF}plLH0x8D%Cn3WzgGPM#?s&$xE-P62gJ zADEjrzZ9^P;4sK@VDLD8@W5s*%@vGNnfVS39-YTu6#f1G|HawA|Nnb*9`@*V-LbEJ z@*6F6#%Ys9wAC3`O}5ciXWTzIMO&Tm;^ZD}X{jgq4h;LB=Q}XG;0Eh)eX&oSfq`NF z*Zj!`wH3YoLrmQPa^Q>DAOHXF(}Ku4FhIn1e*gd9qdRngN4M*XeJHB+f1t=r*3q$J z`ky~JM<<L86w&*bCZEtzW&?%6KCa0hbu<{cCQIo?3J4WAFuYju?f?JgAOB1B_RCIg z)>UTIn!H?BQ3>Y7nqMH3TMK@JJlQ(o_y7O<EDFHhnEXn&kWqSaj9xfn=;SSW35-^g zMfD>YJtybu>oP`7o~y6Rm^S&ezAj_a<e&OoFn4qsn6ZK4bl=p;M-4RDK#{+XYw{Na zQ`u0H4HTjKxF!b~hUmfEG4I>||NGid!{gV-|Nmb+{RVOwB>0z3zG7$~3Gs0OB#NRx z{r|tO3!-nbtdS(+rpe|;plFFVQfIs{x!p*e@y_J+MhZ+{^Cw?4Dgsfi#)jZzw{I%c zjF%t&|KB$kYDT}Y3Ogv1?0Z=-d6%)0B$&+wRoM(uxd^KAt8uu+Cs0_iF)%Q^XahOq zGl<Jt=)mye`iKAj_k&qyKmGsT-CFY>6bp>}tzfr`Zf-HLW@Lwj^f6Nvqb<4&3@`qE z{QtkxwWqnZhoRJHCn%xpQYv&{*r!tHz_1@gKoSbu`~Uy<8%&ll%V0F#+-fGo$XGUc zhPk@cv_eoSc2VH~Y4Ygyz2MQwqvF~5(Q(HFkWA-AkIqB;KIAzt><1ALvozm=&H8En zm$7W}cMDt5nIOAB1VsMkYp}ehr8eV=$)%R}^45zmFm$`F={)`-|K0!p`#Xyr7+x#| z8PW%0&3+3?Pp%t0x*0q=T@UP^0upR{`~Uw7#h0LnbUoqG?RsJt$ZPv%6+_~1IY{>g zkiuAy!XF?bz!~nuzHO5aT1hiroP5_xPAfFjfnncusGgLU|Nrm557P7N&Hw)|rXuNi zRy<kNT8)u;vX8YiH-Cu(!;1xP{{P=EHo3^U6p}V&Ccm{-W&;&%`*bFY*(e8sO0a!8 zB@pMRz4-rszX?d+p4VW{8~~LC51#-3zuyWZx(p(^10;ItIatL75L*uvQVt*$Ew3lv z_f(v`+D4VpZSqAM19=pu$36f5|HVv@Az)8l*cUTd!PbZ|Z*s70Cd_?@Z2K5zO%AkE zm+2A!1$R&9@fTjN{{MfW`U(_^pzN?=U(Mtxb_Q$^vnQXjvt{g?%wez2IB&9ny*lI8 z$r1MIj3*{H*efvJp1jcBOSwgYfuZw|N4M*YeNQ1?g~YJti~s-k^??%g?a6!&YK*rh zn>zS2-k#j*V99uU@_vUj#@mzC9F1U3i*r<z0B2xWcs+RZ|Np*u5dG5~RV8Gy9T?z& zxfmn~&M~(qUvX5GfCM_k`WI;+$t4h-f==>`w<jAqX*1rQ9P4zCv1YQ3vw;G{bI>^d z{NVrp7kW=&0dQj9i;~Gb&erT7I2agSOn5kXLyE}eN6sdU%6i2foe>;q#~lPR7(BXN zCwMd;-~c7a?$8Y$o!3Bdl``4URg%$ba<r=fqvYfsS4oxs_y7NY@#_)Da8MW>@aT5X zfGRe*2NFI0LT2(wS7Qy7u+s)<fY@LGv0(>PQ{!Y6w?uyX2mk-K9w_13{~eSr8YfS2 zYiB$;S;pN?A?hK>P)I~_mO@fq+I^7NJ&*&dCs(=4)}wg;!kz#BUvML7lZ9#%M`+Wz z12Vz&z>CKZKn#fShER3y!Ttan&jL|*;>B(xb&gPV$6@N~kH5Hc8)S~_g%^{N6ox<* z&W9;H{$dM6-HjL7Na~WH>dF!7dLZf^yl4iCfr9!1G{g#T|Np-aRDFZ|uLAO{Ry>9x zUy!1FsJRKZ|Nr0bz{0@rV%p^W9%a&{P;qmRC7}8`fPn#AkuSS7`J%NLKe%F&fhIo2 z+mrphrT9>i@{P%JJ*Cx51CSE%`di=}z5?W^Vh9_Y^RG|7=V@I(8|*+(Fdx`g2eo}U zIBdbeyyqr3^iI4eMpD-YRacKtHwB{Z!V7OCb&H_t!V&6nAnI<sP==_J^yqdyux~R| zp*}*P%jAt-vJxoCXXZ^<VC7GK=H<k6<_0KC_)x+`eX^gov^q+V{JVkhf77l1|Mwk$ z+BS9a1aB2iSRt@u@?LLQenoerkn6oMS>8rU4b;+t7Y8X2)4(C90b$<&g>27cO`p^D z4Iq);)(@ao$jdTFo_GTi>uh}hYM^vOsLtarzJX%`%-vT2jpRp@jeQM89YE^4U4Nu_ z7_+EqFfcHbu)gq_T<Mz=8^glD@H)w(+x0`YgH7`f#!|t3plWD8h<MS+z`*d@^|dpo z?FDj>(KWEQU+nt=aR;QRl)3f)|7&@VZr30C{veC9+?wp<r!@JBp9C9AxdX$C;K}>_ zblG@8Oa&0LUIWB@d+q=KlZQh+I-hzpzY*~0to`B9S^5EDauGWN!wVg_f?$v4HySVI zTmdJa8y?-RHy~A}e>o&nly3h2|DqP08bFEf#=cajMCWyo7I5O52hsgtUr{-y1H=9j zkQ1UOm-uUI_h0+}pMRU{b^d(^I*;vdD2Fvb#jilbZHh|;_xFR;n@&FEFBLfp6d2&D z;{i0Ua)8Y~{$c}&?sk0u3Nn)`|NldDy}ALasjmM2zaNyHUszxJ|9}4ikZ~Wc|NsAj z2QHyB*)~AMKK3%m$*x#@`52_!4iur_n)1fJyHH<xfgJ?)W&Gp?0V27(K<)s$@CDR` z7GP74zW}9&eG1Sd;(Yc0e~;D!rJ^3)p$9+>5vbz+kN^L_)_&0fk_MXs^XI2aAh#WV zF$-iG)Sq&b6$4G{cYtkl{Q*i0Am6XJ3~IVPX|8?3%HIy^&2+my@#tnb>QV2&@c+S! zmtYrzin|X`JJT=y|G)18)I(O6{{Mfu0Mw2=fT7S1q;Nt7B;o}x{r~^E>cy;jxUv_Z zdIwUgiGoyKsD!9|aq<8E*MTnzu_=6W@&EsQ3N;Xg`#}mdUU*<rco?LxqYk2Q+Qt9> zCqNQ#aJ@(Kn+%W6+8G|5r4wGnUIYb`>k5x<*A=J<_3_pJ|6kaFjRqyu75ggcA%=N@ z!w(XL5ZxPIh#{%#hN@FSs56JC+wtPv)&KR-KG}+W^PviVfug7rY#={G;ei*&z!3_u zcr#SpC4{=?7r@Rw@nRm5y5mrFs}Sn;L)2Y(Q3h8RzGB~PsKO?M!s!r&Hz1YLOR$9N z0}oKb=?=Z&(JAo46mG(beXpSgID*xIT^=@hWw5-cWS|2Btblp35@cp~=z~eRB77(k z4U_)|OPiwzg+tYXI;)Q0{(~d9c=71GxC=$0-sHd#X*CofR<K^z7ofy!335@lE4b3D zojfVTNv!Jp|Nmg4UYPy*|G(Sy4X6;lJo$j1=;Z$)95LVP9T;8+UH<=n|346m1ET)} zIBB~6*w5PF!0_TTC@*!p{s37Ze*XXe{oEkYyHHWog7*8R|Nr+3f#mmIntZ@dgdGy1 z4=2}!$}?`AJTLUVpx_0h($wGu)5XbsVG05UjSdW*=R7)(Lmc~Y^1d)d*Yg+t|3B_} zCrO=wq1*QkD97%qMOC*Jtm1(_SOqA;exR%9o~#nC$e20VEnHFA9jy9|5Lopauz3j$ zDE6vO?h03|X9lbLA`e#g1+1<G)!v8a!PN{nOia%pc}QUYe^6;q2$Jt~{jhIxqXWbK zX^jpHFV2DDsnhkxK66mRc}XLz@ZNSBVbm#*nr^qy4<I}Dt!o5lIY@{oocaHMpB1Xs z8i>{ppqM!Tva#Fs!@i9WT`%@eE{Kq;-vP3J7s!4yklCHCA0Q6gaSoh?et2|;f{MZq zsFuxw7!3BFAJ|}Qs!EVlX<%1X&%p4)4@nslc4Z6<FEo%;-2pictHYR(RBgkl>dq-x zkk%i6F#)HtZE$7BUu5A_H33PL%envm_a6m?rWIH{BvZ(p{{O$z_09fEAPGf~lG`Ab z___c8nRj^kOy-NS@_Y`8hgTrs8j#M;))$b55t!;cxJ#OWfdSlz-v1M%h#jP;dn#BK z(y)ToK7ErXMoF-VHaRf7xG;HrlssbqSil%0FlqAJD0xPq$-L1LY!M)VkjdK7@`6`R z{{QdM3vP3P5=!dn$$Zh`aTOp1>}OG=R-6Ha8^l&f&C~|c+YNDS=kXWfr~d!nKOLmg z_w4`w`*(m?&LA_;8gBn5Ux-$e0jIs2AT^gk26wjZ`1k++{%@QN3@?Hv^TsF|Du9Ew z^}s(+T0H(D5oB5CvHee)V0okdILJY81qUX_$4I#x1?lQ+J@N1V|9z8DGlUgLee+(B z6hkT3{@)<G%TE9Qzi%e0I-$vXV`S@j+!Po*IuGtrf``3CvjfA6UT_)%n-2;v{h$B; z?*mow`w@9|*RlWq_bo;>a~Vi%8LHT%V_^4#+_TTR8JwFT*`c%b!aw2v|M#s#Ri8XL zCsv_;Evld~#E=WnPy$D1XX_1+_t&GU<b<dMNr7DMb?X2BeH&4gJUa?@5k$$c{Z1ec z8=VAqcGX||@7v74zz~Dv(H%$s|KINlQuOa6v?6)!ybsh=KvFar+05fFKn~miYCyi0 z+y`o;BdN?hIypXBoH1Z>eVmEJ>Jy-72Z!@Ma8d~e*~5Bj^65AQ)#T&<|L;!(321^+ zMK@R($Wu}$|Nq~g3z85xIawfHGDs9+4A@7_dqEUD>TiLhpkgJw9^K$T>t<*@P@?P6 z&D!FOHTqdkPOgrZ<f?&27t_hf^Wt^Hw}4VsXX^`4By>Zl&f_oaCO?dq(Aj$Q|Nqw_ z9^K&deT;zt5@7rw%OO_oYlIqBePXg_qK>#OR>QVW&Pb5gR|gp;0W+)tRGUBztOe<U z8rTjs@a1HWL|yUOpm@h{oa*FX3G(_=kNp4t8e!f)P{cqS_!^`OYF;nYyl}92;B<sx z-sH(WiSh=_sOJ3zjqO9siv*j8+JpOgX!6Bqd09xNj{~I>NGX66;X5XaCn>6k9f8I7 z9gr$WSc2mFEGPwn<NNUBm?SCL6Gz~w#se*<_a2?RFGj}N+yQI6f|9ZaA{|A224@76 zthsgat0Z0bbchY0lmtyOAa{HOi9$mQlxsj@Zx4eqPANMiwTpo(>eu}HXMj@Y!O3yS z5{wa(%ae^5S597)Y|2<a`9ZRxNbF&d`(1bJ{|8dVf8_uF7g3WPQbfhB><394e{lz7 zQRnd&PY(b8|3V)mCA|_VwGk`@>WrL#RtNf%3sUSD4@_R4A}V7ARpo@C>cGLtg(-TI z`BIgw-yZt^e;>Fq0_V0qh-)rDgurEWHALvf3!_6I2f04*Xs&(0z~7QQIVV*Dy`3gK zc}l7}<LAkHQWab;9R#)3S|F{p7Et3Ey)Cu@tfB+bTI;~3qHnTdnj&M)Wal(RWiPPm zDUjCM6tHTv)|$rT_B2H%wu6&brODSnJ@EhkewG#oh8NxkK~W3o-0JWB|9`(QNYoS} z3LdsNx$pn~eR+%w4Ev>9V0F#WJ<tN~#lA0~XytF2&&a^AuMngPQS#5<^Z&ocan~0n zEe;IFT^9&~n}`cMx<e;>qzf>HO^!@gWHgyvovz3zG<j~iBIAe2`_mQt&+q^Le_sWv zNw;_Z|G(b_<TAwr2=}sr%<pyu4@|Gz3v<z)pCA{Na_vt5ssA`xFGIm|!yd30AE?g& zN{k2g|NsA*YyUNniY=g|0P4MT9)Gc7AIy~K_aGf5!l1z?kIrMDvYFup+o8z|Gi2)L zANl_ul8iI=O-6Mn!|wn8_f16=d$a5R{}=5bTfp6J(5R~dG)Xdols{{MRCZT({r|sj zI;!3cyPyv8Xgo55fq@}9_HgKAn@oLyzk9(6?!<o3@ZXE~dnearYb72A3o<vm?qO`M z-NRXT<%Qrburj1^hd)r;rtkaz|HY?$AZbwF@y0%(R){nHfkGA1#}tO>2K5!dqaTMS zvt>PIdcS*eVXod}$!tN!bCb2Rl?;x7+^pCNOB^*jz)`dSJU0R!x%{;oWQ{A-v2P~V zW^30U0E;2Hb>C%>F^JT|zXLQ_y&bF*i~Ae){Qv*rHrTDG?tcz;G`Oev2crAIzFVk9 zZ`uCe=07NtfYQPYP#oMvRWJpl5tOpJ89a9C>6aGd<R_+hbaEVX;9z*Md>3dGo^v8d zP3Q3!GbcCXNU$sH1UYBNWXBW{&QPdK?BqQ;5-d-4{Qp0>Doa6d-(yruE==ak4HB*0 z`TzgEXQ(onlM8YU1m2(uYEIseD<W<J@?GPR4oF%^)8m(K0gdfVzMm^9vqE2iA=IN+ z7eoj9Xg)Q(?Q!rgvq$qAju)+)1@c5WH=C9_b7)#ar<#ibAydw?q4Ys0{R&D8PhMER zese;@XC^g}6$~zkDfz_;d50J0E2I{efT>)CwEUvn#FBgkuj2f?$$8CD%nS?+n~ycG zW311Z_y7M476yhJi~s-6U}0c5y5#@=11t;-r<eTy|A2*o;o_42{~1^r7_Kk*|6hTX zf#L3w|Nk9W85kZf`TswGm4V^qlK=l3SQ!}JFZus}0V@N;SCD>I28Q1t{j3ZOj7$Ij zXJBJsU|;(GKWMg`cj^EC4r~kz!b|`EPhexHXOLX_|9=A;1B3k1|Nj@TF)*ku{r~>} z8v}#((*OS-urV+gf(&41U@!+6z|O#63o?M6fx#JM06PPNCrCd#1A{+EKRW|MC`dm$ z0|U>B|NmdGGcW|L`Tt*lgMs1By8r(zI2ag0w*3E}z`?)}wdMc+29A0LhJ-Eu|1aQR zU`X5Y|Nj9F28Nt1|NlSWU|=ZP^8Y^rCj&#pmjC}1I2jn~w*3F^z{$YS0y2P;fuRdz z04D>(1dx7C28L-M{hSO8b3pnz85kCU^m8#VtN`ifVqjPY($B@fumz-_i-BPmNPj&S z1H%E30bC3W$3O;fF)*9~8NkKBa0z4pHv_{BkOABb4EI0=a5FGG0U5x}z!1It|Njnd z28Jy={{P>=&A?!@_y7MJ+zbpa5B~qpz{9|>;>iF18axaPpO5|jAHc)F@blRJ{{=h@ z4F8Y)|386;fr0h-|Nr$Hco-PCkN^LFfro)X@c94#A9xrT#E<{~FTl&dAbb4(e*<0y z2Ib@b{|E3gFlZkC|G$8jfkFTH|Nj$s85m5D|Np;%mw~|=q@S08!4agNmw~|@q@Rz0 z!55^TkAWc=q@Rz0ArhpYkAWc`q@Rz0A@%tG`u`jF7#Ola2JkU36oL%kV_+x;8NkoL z0BRo^@G~$pgACwjV6Z#!|9=5L1B1xP|NkfOGcdTH{QrLgKLbP6$^ZW^@G~&1J^BCt z2Yv>Ib0`1*7Z6}z_<QRAe+vNyhKHyB|4$HLU|>D_|9^u314GdH|NmDAFfc4RU;qFA z2>}KM*$e;wzYt(xh`jLsKZhU#L;QvR|1|^|7*ata41x>{*%$u*&k$r_D7^6he}^Cg zL-~dO|5peyFw|c7|Nn#_14A=NzaRrcCrG~#14BPZzYqh%RFHll28P)n{Xz^33qksY z7#Nm=^b0XCtgQzbAjH718DxME1H(>`0m2Lnpm9D8VFreyAOnOM7*2x>5N2Sw2r@vJ zf#EvH0AU7(yCD6-3=EG!`h^)7UV`+CFfdqN{QqA=gn?lyXiQ6lfx-In|Nj{x3=CJU z{Qutpnl``o|NjaR1_no`oB#h`04col|NjRO1_rBp|Nl#fGB9M_`~TlUl!4*-<NyB? zL>U;qKK}o|L6m{v$<zP;SBNq&biDZg|AHt3!;i^pJGB`zCg1GTXFM^PvrC=v?_|R+ zdB(?+1H0rIPfjlEl4o2$d19A5<J8F;yW|<GCtvK6XH1;@u}hxOeX?M;JfrSp!!8*X zMg|7q$$=2Y&&h?|@{IQ<PwbXwJUV$}w>;zO$rroj87EHu*e%akK3T9wo-uZ^VUIkc z^W?xDc}C62h21hNObiVClP5wLUng(u0Zrmw?2%_YIQe6bJmd1og1z#Ly^{@l)tO`# zOpfYRW3-yw*sIPsXY$Hkb;dW7FZRkaUYh)|SDtalWWhdp#(9$s`{Ws0CI|M(GiFUL z?2`wLOZ3SznoZu=C(kG|`C_jO3o8Qy)8vm3#*4{<{ql_GCL8w4Gj5q2*e}mGYjR<~ zJY&P;iT(17X_Ghh%QN~+zSu9%Xf*j_zdWPFWWjzJ7B&Wkf0GR-$TL2f95_Lq@zmtP z3G$2^CQqCo&p2)J#tHI_HIpw+P-i?n`R4?6#y^u4C#q}4Z2bR!Eeit!gCn0n8<R6H zn@2M<^8ywgb`Eg)&!ED<z|g|Z!0>Q#;Y4-Dipeu4sx!`>d~l*XW8>t96XhAxCo@ix zXY`${I7yz-c(UUpc}B^}2PaCiPT^o+_&>REl04(n$qOgRGoGG&aFRUZ#>o#S$umx$ z%s5$|v39cJWO>Hq$&Qod89gT_PL^lXpWHZEo>6r2!bvhLoD2-VCm)<F&-ifi!^!fD z$0svR0WEP-oFdOSd9vdadB)1giBsem<0m&xk!N(Byl{#<qxR&3Q{)+sO@259<Wa?` z(yS)j3=I8~6{pHGE}HB(6*Rz_I8~l;+vLWn>Wq6QubisRSULIPRFG3XPE}`IG+A<* zJmZzgmeWAVC~_LeS(Vd3&YC$*o=J57<XzL`7=KT`ISu5fpVL5&lAI25l;w1gqavq+ z9920T<fxg`L5|uv9ptE+)8&~2_f7saU5@elWXT!wjCUtn&X8w3JUMcPJmbpAl{4fS z`zOzwA<tMkdFKpy#^}j6XUH=;PX0MVo>6_W<V<-c-o2BpX38;so*X$-p7G}7%9-*^ zoO>tFnkmQVI(g?zP|)6-DbMIK`R7bfB9)w_&X_gXah5#e+{uZv)S0ACPVSl|r>S-F z|9|k>IOKRPV1>uC3<Cqh69EQ>`pFk($us6o{y0mW(PXmZY<0#BlO1Qfv);J$|3A~_ ziL>7`PF^tEWOBpY3ydb41Lw)HGR~h|uvnc-+XvFHNaLLBxL8KGK%apDl7c3NLL^i- zUs!yYmoZ`Tl#QB<3nuT|D9Q97Z}QEJ%1j^fCjZ;0!6-0UeUm1m!{oqCdW`coH*6B% zW?VaY;@&@uij({HU1NMOId%VO#)ip;2Q(QEOpZPv$;dFd^nePZz~os6G#L#hA331O zpHK|3i@gZ6s4!ykp92z{aEEP{J*ddVs6E;Kw1ku))U}`$PM~zoI7ezF7Xt(14D-o_ zrzMPSF{Oi;85kJnIb%w^0ZA<IoV@3>gp@y~^b!^Z2F4|!li!_|kc!5XW?*7qU|f|r zS>cRCYC5L$88!w6#&x-v66qj`4aJxeQ6K|1RbooK2kF>aKY8vM38_|0>Bk%l42-+F zC!aqfAvF<G+7RT8ebXm1o|Q13iz)qxk%58n@M27f1WpD9#-l4I`<#`KT8}9$1d=|v zb#mQV3C7)%r=QJZESt=Bt^~1)adPuHE2g0O$@|Yq)(2&<GcYhsj8G_GU<%S;1hE5T zO}H2sm_pnbK)f6V>2E>|3{26WWlx}Jg)Q7<oa4gBz@Sjhz!Z&SMl^~Uv2Zi~^D!_m zrGi%Dfy{s{G-cG9Qw2376=FyR$RVi^LlPJii})EBm~ug;uuX0}FI`{Y#R+m$gsg-h z0|Qgxb+8lNWtjvR7?_G7CIrZW#%GyIg1{d0V358AlAH}%rvbA135Z}|U|^i%!Vhu& zY>+<Yi96~+R?h}m%{*~Ky=;Oo0|V0>kQ~#*2w6W+kj$+w;ssgn0I_gBL=tM@0=R`! zK#tx7nlA&{r2-oK0$aEVYT+h`J`a$6n?Uw4O>~fr2f1>~J+Ox|WJ^JoZw2|AX<~@% z8W3+=20KGN1JlF=h+B3*oD#tx9R;%P7HAy?$U4}%SH?NH0ucY*0$ImAu><VCTOj+G zCpOf}rh&BG2FZc^#}Bd|%wwLopkB5NiMyg+mILH~+ZpWj3=H6~S%xINqh59gR2mXC z@<;}IKqBJ~C~TM~&Zw6yW@2DqdI@qG)5HJ<HjdSt3=GoUpve5)1zkNH1o8$rz^;OP zP>`9z!1Q}LIAH31WWZ_j_fIev9D=_=J_3c{Q&1B73-M3}B#{0=0x5w(=@iHcPDap* zGLZ4G70QfrbOad~l*<{II2j>2Ba{n39EhO-D&TnMVuYGguW}pYejcdW3<jkeAalhT zL5pWV=GuS=u-i+Z=88krg3T3YgqaHt2MI<<Kx8logHm#fAOnNQ2?hoRMF!bYMg|5M z-kE|744ljlN}(liNxdKgMCm%1Qd<UDHVy^`8UDjyr3z(GrSk+C7-ap~85m>)UNV3T zNr1`-gKT;W(=Ny$n+Z}R$Rq?(Q~*`PeivquxDeD$;taBfnd%uBWQ26UN+-aSvI{}o z<Oox$!5|yX#lRpV90pc-0H)GVh=GA&iW~z23j?Uu<X|)bm5)b^7#O(N7#QGnngk>a zw{kNuFmbRhWn^GrPGMkRV7X$?uzB`n79qxolNUUdNSO|;0}<7YG^Dzjiz%T5>gLW_ zj41)BfmUKlKx&}L7oQ4G)_=w(wG~qZq!QXa+5ee@)Im&XNF{W9a^o`z<FlC3kV@z> zrUaxCx;gpGGYP5tn9`6M=jr5s&m^Q@V@gA6oR6WC4WEmre8-fBR5^b!C6<9|vIERv zkmQ3DrjS~Q6H@|G3r$XZE<Abvb2ceaOcjudNP6=9=Ms#HlYcxnWGtMl^+JWQce4Kr z$q+e6>E^<qupX)vG$jU#dvj3+2Ki^I3=GWj5H%hQ3K!ATM8nl6K-Bm!D0~i^yyt}k zw<1I!fI&fY^8FW*!O9SR2!n!oIK+D}i;lw$QGuw5U{HueQ}Y_GMjfIihC!ivviD0# zZVd=OfkAQZ<ouVSVww<s3Il_Zz99nxvjK>IcJi#3(%D8SpaOGZhWs%u1_oy14dBu% zfk8=DpMind1*EPx0^+op@Y-UR7z2a+6Och}5Zwv#)*1{9%$^Y48S)oFn!Q1qnI^_C z$Z5$jFfga_OjdX$ZIZD|08~;xD3|{w!@$6t1u}qn;*E0oH6TT0dl^8o7s?rw+7%fX zm|H<+9G;y2O1i!sqH;y8{CQ0V2IdZsUCa|V)XMJ?Wnf^QuulY}aYwB@w={^MF9ael z)G8NeBr-5Bg2*1Im4Bhcz`(o|RFW}IJW<P_azcWEf%#Zf9K?&kprI{r8Ob5Rz#yBz z0+IwVnJ3n-sFgng^709YI}SkIaT4N=9Z+{%gxGWf>W)hgcRYZ)<32?80@NK3Anv$P z%fQ9~3Kms=T?PhbK}L|L&n7~g1S(`eDQ|MeYn}{YMu_DbYSqAjAi@Z-eMPMrI22?U zAr|bYRRafuEF;AJ3$^OtaL|IvAE;FW2ZS~w#04j688m8D7#NuCz;+i+{_|S0-i|R7 z)J2^bp;-Wu_ybNE0cxOXhuNO-t^}w`&0t{T@D^lX(C`Aqi3?aaXr}?l#h`)|L^IC$ zBhA2|S<b-h0ydF(;*C0xkuHoNBbg^&sDqg41~wB^iK{(VW?=AQc4sVM16dNF2C9;n zJ)oZ5QLpw(l7WHQ3(8+nul9qTfq~f@95_r99n@+;X#vLdP>7v;?~P<+EZA|(6JOLZ zD72<R0vEKd66C~Fk_-%L;A|ZSRrRKhL18Ua6|7140j??@s_H`>gTlGV0dFOZ6QCkr z>KGJ0K=r}$vW*nX^hBttA9V~0LX+pbm5fY=iu|c#P%ue@xC*AP1FkOxs;Z%$K_LuH z)jGJUG^nbUdIp7x$$al5>(ikk9rX+fv!ME5zWD{$mjPAPQ_rBtn+|aUXs!noGHRPZ z5nBWfYEWBT6Dkig#X%b8w_>O%6Y3chydbJ3FMB6!TmluJQqQ1}0}*F{`LGAByA-Nw zMm>W<-{d#%B<stdB6I2)6gEKh!EC(&*H;czwV<9sQ9c9Wc9<%)AW%`z0#&i3o`Hcu zt6qnJfq4$2Jan5CsNV?kCgU7a8AuwP15Tq%6D2Z0X><-ajWSJ4V9;IzD&ZC~>Q0{X zUb226SQV(*2vW5WtcrQ!gnBhlOOJUmSe9vGfEuX1&%A^&7@UzjAnAN5Je{j&GB7WL zI&V!qB$Y2`d<7~OC+?_M2Q@F5S1?wCi^LW6YHYj=49qJTRT&w$LH!~%R#1t(YO?(Y z(fT8dpxp`}pUeVHK!c00rLqto9Ra%r=GG%<Zaof`1-TWRu}{Dq2XXsJxZA;b@D##z znGDRQVQyE4I`#~jW6y#di*W0?$-h3RF)B<}{HV#8FxmT~B;$g~sUKAsH%#vOsL6Dp zVe;0G8jK8^?|qDAo&5Tzq<}Ij12cyew>7J$Fp~rWgUaNDud$mie2?Q~v1QT}oo>X) z=))qxq#-iBiIK6NeH$|a0~5ov$+EvzP3Ha0J^B7Gz3so57<V!<Y5Pp~;b63x{)vTA zo15c{;Wv)22H!Zo8cx?{Wn9cCu>CwMV>J`w#OdA~j3JEcr!U}Olo2v)yTPH)VY{1S zB8S~>4)3x^!|mrd7+o1f*E4AdGieBOd}dM-W>OM?kkd7|7<Cx;Y!BmN%rf1+&z@0< znNex_LnlUkPLn)Hsx+A{>C9*@>j33C<bh&~f#I7Nga(t78QF!WH#jp2aKiUiPM_(_ zXwKQu2{EK&`%P!Y<4lYk(-*oinsdJY2-e0RIQ^j;qxtmxu8gdpvAvVi72O%l8Bb1+ zbZ4|@l$$;iL}^UF38FH#OL{QYGcuY?-{{FG%FNH;0Ah$s!YqUs2qBpn1Q|NEKlEgr z&LWurbvG>Qo(7GBFz_=hm_E^uQQY$ZR2pPGNb_T;G-!hsh!1LCgXphNae;h@hoCKL z242vB0|P&U!}gDUjQLEA4bu|?8O0?J6hV~Pf%GykFkFUeXP7<_BrO0P075t2VEVy8 zMsdc3={Exz^(A3LLa?UeLr_h|z{_AbT``DJT+$qEoI)Nn)WE>YU^_h!B#k}>lmwOb zoZbkMMjr!O1eFe*z7ZsiJ_hsxDxEm}AxIj13`hgihhyMn$ek`2%qT92KH!rAm9Cub z2$HTxbNN!JbnEm&kaRbi^h2oh#OVt`($mqTRl)g(mtpSoiy&$A(VYaS^vdasA&laZ z=%YKcpwe5X8-k=^9YgfwqA)!XBn|8Gp(mGu=@UWHupS(G>Nqg{U<ji=<HYG7L8{QZ zSxnHdojYAIlu=v~y-(!=m0meLFqBbTa6MX2qj9=nD5LoF389P}g1gb=j!jPl$sGt~ z<d8g$CdUp9)w9zdf^0?aH@QKjZ%!8sV-y!e?>99~{|GWUAdHbi5WUlMV7g)$qj(@J z+R*z<EYJ`~?=r#S5xvLc1Xa&D{UXRE{LpR-ELYS_-x$UyK3yQ3kwa1%O>Pe~+bK*p z3}+OV1T8xOWk~c~xnO!?IHS1dh6YHcMbDKNpyKGU%FqZ=uL&}ffq}u21yqppGAK?z z7|y8An6dq1I3qhFWBv4>5sb?bV};XKMlyyoKA6rJ#Td_MGCeVhQJm3WdSw)&KI7Tx zD?x&~+c~2d?=v#WPk$N1xSnzC^qH}Y;f$u!KgKeOgEz#2EQB>vWjP@`t$C&^#xaUB z%1pP6W7KD?nw}ZQ=+1a{`^Gp%c}B*k(=Wy|x-%Y_E}6in&sa9yGl4N)ayK+1?FJdg zz`&r*4Kayr`oRRoc*afB6%!ft8AGQBCNg4f0^bK!d}n%NB4atD;`E=1jMo_@w_i*G x*>`yQ$7Du##^ULgDUAAzUDGpD7~L5irf*DPEN3j5u9?cH&sexUGL_Mb9{}(`x~TvF delta 16656 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 BNI(Dp diff --git a/useful/stg312/upload b/useful/stg312/upload index 4e0731747b8e9e55b28d2beee811755ca462a55e..9c8adf2445df5c7a787c79480e14a9610f0dd17f 100755 GIT binary patch delta 2475 zcmbQYf@$6grU@4~V+<I;AZFst{en-lz-)#mS`J{wlgTR?Z;Ny+n;>n$Cm1Kby0Cmp zd8dioj7?3OXE06VH_>BYVA#jVz`(HofU*O_3z5J7|9f<|UikO_zenfs7mGkNguCy( zvI7H1jPdW}2ckNYJB4J0zk#$U{sC**@$diteH<#2cM2&majQ(eE##jnpyI&rV(xE* zw3-UU2+iOB|F<3}5qqt%A8bVB@BjaIlrS(by!2yaVAyW}(w7Pn19{=46(a+KM|UgO zg1Jx=p8o=wP%5&2#pHfrDIsB1h{3yI!V;5r3rl4+LxuZc!X2s(3@;x3`u~3i*yL>t z2$Ln%AVws^)GDYsFud3bSKEc8b~aS4IYh1C{soimMZ|qX)geak!Gsmm9T;9DfQ%?+ zU|@J{0rN!~RN>Q~U|$ICF90b7nFbDp*Zli;OkO0C!uWMEyXaDGq$rxaT~wa&{p9PS zL6ESY_X82Q94eD-#H1MiPYxFgV*ECFm6$Oo9`1_;s({0I`gbIy8W4vne+S#owO>GE za)`JKqtE1-;yG-I8V(HmzfR_sFlEe`>?q;SxOMVGiOrIGK*IYq92j2w`vOWGt_Su# z0HvF=lVc^77_U!mkQ8G)J9)aK2IH;C2P8#=Ux1W;1}W_hUE$H~dSKu6$<HNqq_0CP z2gksRKdAD0Qu<5+nv>(DBp9!6u8>M)WD?e#d|x_AMp4s&;YHggkQZEcfKp-Cr~m)= zv4T>|*~zgoT8tKxJ7lcbL?8kuWVG1CA<Q2#PK=q8t!2G<iZmS<9CxrVFfi<_oIFuh zj7<)rVy&z$<NwLGWqlbFCu_=Opt`T_1IWtI6CT~JFZNxZyhhG|v2pTUIa9{I$-?sK zGLu2h@_i3d<GKLkEXVi%|L+3_;Qq<e<c%1YO+G1a>SPPHNyC8w;_3Nsp$YJX(#QY* zJ6lWs|Np<w9#u{C+yDQY_kv^?OEvc&nCzgSA@TuaTl_niL`kXbeuc?33L0_&S`G{^ zl;1&3efgGwfdQhoxKwk0!{kE>8f>9p<0pSmFwl(vGvThOeFJwgD8~5SLL)Z{tZcHc zqP)NgkomXY{{O!(1|nFaD8+bY^K?aJCKFIbVqoxBNGvKW%`D4TNJ&*FPRvY6RLDEL zIA0+-Kd&S;SD`dlAwMZAwIp95t2jSTZ}T-}CieP0kN*D;VPs(FdGi0i3L^tU<<tNF zYZw_A>Yx7qKZlWlq4nwi|9co27`mVS|9^*(fnnm)|Ns9mGB8Yk`v1QS69dECr~m)k zFflMJe)|7^3=;#xN|1gg28Q(@{Y(rDTS5An7#Mbg^fNIq90ciSVqiE9($CCL&u|uG z05b!_Wsm{P3=B6x1~4-)+y@!J%)syzWB@Y*!)uTM%nS@4K?X20Fnk9Yz{0@r7o?ws zfr0ti|Nk*83=Evl{{OFGVPJ@S_W%DJ76yiwFaQ5P!ot8X>&^fFZ&(-@&V2j-Uxbx` z!RGt_|1qqSuW2hWCQSaRt<RV+SyM-y@$2M3T^UgNygj*4N1pNE<cT`+jLRo))RAZG zoqSP8p0RlHM;&>_$jO4b@{IPA4Rz%iRVN4P$}@6LF4UE0{5W}{o(u~k1H<*n8+GLw z_fEd3E6=!i@<&~H#?Hxtdh(3<lMVIc8AB%r>d7-&PcGDxXH=X#QBR(ceey;<dB(Ss zKk7-dK4D^DxIFozo;>5u$%6XwjPoZO>dP~>P7c(UXWTluP+y%<cJfSpb;f0r59+Hk zZkYU1-<|QsW<!JNyqh1`3JWocPX6Mr5F`GHi-Cc8;*MJJlWYtO%o6<!Ant}*aYi8q z24=+sJ`ndnt#}DD0|T?tMQ#xHLajt`Mj`{V0Yvsht@vDV1_oxsIbgjjY8fPVaxyS5 zS4}Pmkgu<Tm^h<W{Hq8919J_keYFr-n0>7f6JhqXq1rbYA`7!`3c|ksk_-&Yd)*iq z80y3!m8k(2B(+cG3*@N>%P>!zQz!ab0Hm;*5#)^tb>i<po;(-@N*EJY)Qbl&F)%P6 zf;g$6UR)C-4&`>#i@yei6qGxmUi=OyETG&O_2OJ0-$A)Q>cpi$iVv%SOqf{zqE6fn zr1}Vi|DjGIlY#jt$hpiDSJa6wVP}AIpVWz)f&vdJyQWV3DTsR>5^M|V#gjlj0CSlp zMu`6h*$U+ah<^uJ3g$6S+)yvAEddFO$r3?)3Zje<f9<H3*(A)sz$^ylGfi}mQQ%=< zV3wNf7NpF0ZE{wS3gh+3{Xr^>HzschQenI~`DTy`<E_d6f>ao9PgV|AVZ1xpBe;N3 za`Mh#RYsY~_k&d#4JWgPC^8ytRu5Ul#3-}*Qdlb^<C4h{5w;w!=QCGvOqjo9^6Usj z#?zDcMkI-?XVMTxMIuZZB9l!coh9~h*j~TRVaKE)+|1$4q%O>4D$HTaWF|U!LZla? z+2-4ki)A-AlrLarTsT>=TAvfqZi=in=lq}z@$84qGppU185Jf!tTSi)I9amZp7HbM h$a;MyNtk*_!hn#>41x?FHZN=pXJw4o{IgA!7XZQGvDW|q delta 2450 zcmbQYf@$6grU@4~T?`n&z-8ji{eow-z-)#yS`J{wnaL{|Z;MQNZaZJ=qCi;9^y3qS zR=kjz-@542<{3;A`AuXP7#Q|3GB7ag-=*xp@IvJ8|NkD{tr!0N|L@Ux{KX;=4dL#) zuI#`75@Y;3`GKg;<W3=3;d>x0ihsabcKrMQf8Ph?$vcG<m_92{zAfaR`U50A_cubC zPX%Ix=I{UiTMv|oz1G+dHlp(P|NlEm7#J8{`Y|#v?3Yk+V0e)V5(9bRr4=IsgGYBO z*n(E53D19lOehuEKVfpeu$0hmsPJx>FvH~C!ctk;su277VZsHf4h%0I{`&ua2iW9o z3<#4M)gWq<VQM+l92j0~g{$pCQriqwYYtH>xW8kvy@<HaU#Ku2OqfI6f#F30$cSPF z28P!bFkkqoL+pC`6YLAY{ShFAAk)C1@S1=Bg2{_SQW)<}W*1$`jTA+bw~NX%UY~qj zGzb#*^L`)#_k;3e8!;)y=aa+5f*9{jUL|G>iii7RfhyoIp8g$4Db#-D?_m46_Ww|y z93t+*Xfk=Gcn+JVh6BU?yOX&kOc?_vJ4*O7&Ye6_VzcBDknnO12Zk5_zJOAP>w$d_ zK<Q@d<XA~1#{H8UB*hrFPM$8Q!FXu$0Z9?z3m~PRK}x$rS9o;09@w{k@^eWY>HQjD z&x2#&#UE68Jt=*r9~zV6r6d^lZ?2F^Wn}uTG5Nl9k_@M&1H+59ParS2?f|92u228} z?_&j}maUUxWwaO-CU?kKu?a&2PRMAni9wh@WSkfSCtJ&U@kD7lFgWgDVPIg`nK*f( ztQeatM8#TJUB>5=Z_D~JdQR4q%RqHs-3O4Bp(i}LU0>|mKY5Lu0b}OmyK<(CWs`;F z(`Bkb&hmW^QscS+<SfVc|Nrj;2jKF_)8vg9`zD{1H+8ZG+oa*Z0P*zvx6lOmLh0lG z|DCNR|NsBrXN#()`tAS!&3i#IjHR0US4?(L&=9!+vMv4{OroUJc0b4D8U+nG3oQqR z7s~ITroMd3z`y{}TU@HSKV$MC1r4@fu<?^WC>ZF5f|+pF)V_f`85CoDZ=sPJ4puhV zS5aPI0?7Q^Z~y<_7YPxpQIulbvU$3qGLuYdQBi)8l|oT|eu+Y6u|i&ci9%wYLSj)- zVkOt+cgjrc^;aJK{~yB0z_8@W|NknC3=9*W{{LUY$iOiD>Hq(87#SGmKK=iH4<iG^ z;-~-r-(h56So!q-|38cj4C|l%|1ZPDz_9h{|Nk~j3=F%U{{J7t#K3S6q@Rg_;W$V? z69dCpkbWixhRY!RObiS+LHd~(8194gGc(jPJOvrR%)sy(WB@Y*!$*(-%nS_QK?X20 zF#H7>z|6qF{Ote#JIo9WoX`IM|HI6{!2j(3e;F1A2GM8#|J$%IFi1c9|38L>fkE-v z|Nk{C3=D<O{{NrD!oa}z>i_>EEDQ{r-u(anhJ}IQ$+!RiMOYaaLcah1AHzENowgEV z#biMpea4E(jymd0yiX=)>BupDp4_P;&v<k4N*#H|{gY4X$TKdT{8C4rv3oM7t~_Jm zWKCUp#_-9Wy7G*+lQVVY8I>n@>dG^5KAyZvSB~-h<deGcj8`YW)Rkx4J(*Kao^j!1 zO+9(W_Q{@l@{GBYGxg*dgC}?D$un9`Ua2R~C_nk6o;(xlqsg!I<QQL1=G2#Gyf|4? zU!HOMWKVs0#<`O-_2n7QPVUrKXEdF>QD2>L-{hP6>Wn8QGa9(Fe)#zRKhx$wgMQx0 z2?jEoAJ_^DF^Ww7;;#@R_KAyufqCMNTJe)?3=GWT{R|-PhFWn(AqEC!g#<nj_du<9 z2`F?GFLHyp7iuMnGZGn?^&zq+YQ^V@GcYh4%mM3NQOh8?laqmgxqNa#fP8&9#Kal3 z;$KA=7?>+j?W=;w!t85;m<Y448P&cC5LuXg6A||Pmt<gI-sQ%?z)&X+sWlC_K=lIy z!(_fdo_eqh^TauIqOS!&3ac4G-k4A){to2HeNikR?uvTx044?o=KT;SHPnl1g2bWR zj(YLeppb%cC)A7I0fhyWJELBl3*<W}_eY($6iD#_HINAt>tED~+ksRcgz!JqNn|oG z9|Ad-dE$yX@g?jGaPE^jaZ^y>L1ov}i9ZE#&p?80LA`hq$Om99)5Hkz{~%kTya4g< zAWOkK=7}5XrL`p>VKG@Eh)+R;5#p~M^)j1;85o#F!F;BP4l)Wn3=GVYlih-p881!F z3Q}RbJh?weh4Jd-EkP=b*CyW#QenJ4`CpI<<ITy+!77Y*CVK=IFiK3`8LY}EJ^6mH zDx>~n)(}NTgU#w8tC$$2HeU*BWn^4DIU>TA?bUpa?)i%+&y7%IJT-ZLM3UG#CJkXG z4G}O2VTdwmh)y<-be7o5VSD{LhaHoKa5INDle#dIsW68vlbOimNs(TRrkn3ZE|%R~ zSH6guv2(IwwLT}Jc@$Y~&Ur%{;?*0QXI8s2Gs;bVSZB`oezIh}J>$pCk@fmak}&m< ZWC0<W83Y+_Y+l$H&dTVp`DdFdF977zubuz^ diff --git a/useful/stg312/upload-utils.c b/useful/stg312/upload-utils.c index c2b3024d..e3521a05 100644 --- a/useful/stg312/upload-utils.c +++ b/useful/stg312/upload-utils.c @@ -17,7 +17,7 @@ #include <sys/types.h> #include <signal.h> - +//Função que faz logout do sistema void logout(){ CURL *curl; @@ -26,6 +26,7 @@ void logout(){ curl = curl_easy_init(); if(curl) { + //para entender melhor o que é cada opção do Curl, leia: https://curl.haxx.se/libcurl/c/libcurl-tutorial.html curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0"); curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1 ); curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookie"); @@ -43,13 +44,14 @@ void logout(){ } +//Checa se existe algum upload antigo em progresso int checa_upload_antigo(){ FILE *upload_in_progress; char *old_upload; old_upload = malloc(255*sizeof(char)); - upload_in_progress = fopen(".progress.out", "a+"); + upload_in_progress = fopen(".progress.out", "a+"); //Abre o arquivo que contem os dados do upload antigo printf("Linha %d\n", __LINE__); rewind(upload_in_progress); fscanf(upload_in_progress, "%s", old_upload); @@ -62,6 +64,7 @@ int checa_upload_antigo(){ return 0; } +//Estima o tempo de upload, não faz a estimativa correta, mas só deus sabe como fazer essa joça realmente. O curl faz muita coisa que demora mais que só o upload, eu assumo int calcula_tempo_upload(){ FILE *velocidade_upload; @@ -91,7 +94,7 @@ int calcula_tempo_upload(){ velocidade_f = atoi(velocidade); puts("calculou"); puts("chegou aqui"); - return((1953)/velocidade_f*3); // *3 para levar em conta problemas de rede. + return(10*(1953)/velocidade_f*3); // *3 para levar em conta problemas de rede. *10 pois o curl demora muito mais que só fazer o upload } //Função que gera o arquivo de dados do usuario, tanto os que foram recebidos do banco quanto informaçõs de sistema. Esse arquivo @@ -131,7 +134,7 @@ int checa_sucesso_do_login(){ FILE *login; char *user_data_str; - login = fopen(".login.out", "r");; + login = fopen(".login.out", "r"); //Arquivo que contem a resposta do login user_data_str = malloc(2550*sizeof(char)); fgets(user_data_str,2550*sizeof(char), login ); @@ -140,10 +143,10 @@ int checa_sucesso_do_login(){ json_t *root; json_error_t error; - root = json_loads(user_data_str,0, &error); + root = json_loads(user_data_str,0, &error); //Pega os dados do arquivo em formato json printf("Linha %d\n", __LINE__); - if(!root){ + if(!root){ //Caso não tenha conseguido carregar os dados puts("erro ao carregar dados!"); //exit(0); } @@ -151,7 +154,7 @@ int checa_sucesso_do_login(){ if(!json_is_object(root)) { - fprintf(stderr, "error: root is not an array\n"); + fprintf(stderr, "Dados não estão em formato Json\n"); json_decref(root); } printf("Linha %d\n", __LINE__); @@ -162,13 +165,13 @@ int checa_sucesso_do_login(){ const char *message_text; printf("Linha %d\n", __LINE__); - sha = json_object_get(root, "status"); + sha = json_object_get(root, "status"); //Pega o Status da resposta printf("Linha %d\n", __LINE__); if(json_is_string(sha)) { printf("Linha %d\n", __LINE__); - message_text = json_string_value(sha); + message_text = json_string_value(sha); //coloca o valor de status na string printf("Linha %d\n", __LINE__); puts(message_text); printf("Linha %d\n", __LINE__); @@ -179,7 +182,7 @@ int checa_sucesso_do_login(){ printf("Linha %d\n", __LINE__); } - if(!(strcmp("ok", message_text))){ + if(!(strcmp("ok", message_text))){ //Caso o status seja diferente de OK printf("Linha %d\n", __LINE__); puts(message_text); return 1; @@ -197,7 +200,7 @@ void pega_dados_do_usuario(user_info *dados){ FILE *user_data; char *user_data_str; user_data_str = malloc(2550*sizeof(char)); - user_data = fopen(".data.out", "r"); + user_data = fopen(".data.out", "r"); //Abre arquivo contendo os dados do usuário fgets(user_data_str,2550*sizeof(char), user_data ); puts("User data: "); puts(user_data_str); @@ -205,64 +208,64 @@ void pega_dados_do_usuario(user_info *dados){ json_t *root; json_error_t error; - root = json_loads(user_data_str,0, &error); - if(!root){ + root = json_loads(user_data_str,0, &error); //Pega os dados do arquivo em formato json + if(!root){ //Caso não tenha conseguido carregar os dados puts("erro ao carregar dados!"); //exit(0); } if(!json_is_object(root)) { - fprintf(stderr, "error: root is not an array\n"); + fprintf(stderr, "Dados não estão em formato Json\n"); json_decref(root); } json_t *sha; const char *message_text; - sha = json_object_get(root, "name"); + sha = json_object_get(root, "name"); //Pega nome if(json_is_string(sha)) { - message_text = json_string_value(sha); + message_text = json_string_value(sha); //coloca o valor de status na string puts(message_text); strcpy(dados->name, message_text); }else{ - dados->name[0] = '\0'; + dados->name[0] = '\0'; //Caso o campo seja nulo no banco de dados puts("error, not string"); } - sha = json_object_get(root, "login"); + sha = json_object_get(root, "login"); //Pega nome if(json_is_string(sha)) { - message_text = json_string_value(sha); + message_text = json_string_value(sha); //coloca o valor de status na string puts(message_text); strcpy(dados->login, message_text); }else{ - dados->login[0] = '\0'; + dados->login[0] = '\0'; //Caso o campo seja nulo no banco de dados puts("error, not string"); } - sha = json_object_get(root, "email"); + sha = json_object_get(root, "email"); //Pega nome if(json_is_string(sha)) { - message_text = json_string_value(sha); + message_text = json_string_value(sha); //coloca o valor de status na string puts(message_text); strcpy(dados->email, message_text); }else{ - dados->email[0] = '\0'; + dados->email[0] = '\0'; //Caso o campo seja nulo no banco de dados puts("error, not string"); } - sha = json_object_get(root, "city"); + sha = json_object_get(root, "city"); //Pega nome if(json_is_string(sha)) { - message_text = json_string_value(sha); + message_text = json_string_value(sha); //coloca o valor de status na string puts(message_text); strcpy(dados->city, message_text); }else{ - dados->city[0] = '\0'; + dados->city[0] = '\0'; //Caso o campo seja nulo no banco de dados puts("error, not string"); } } @@ -272,7 +275,7 @@ int checa_sucesso_get_info(){ FILE *user_data; char *user_data_str; user_data_str = malloc(2550*sizeof(char)); - user_data = fopen(".data.out", "r"); + user_data = fopen(".data.out", "r"); //Arquivo que contém o retorno do get info e os dados do usuário fgets(user_data_str,2550*sizeof(char), user_data ); puts("User data: "); puts(user_data_str); @@ -280,24 +283,24 @@ int checa_sucesso_get_info(){ json_t *root; json_error_t error; - root = json_loads(user_data_str,0, &error); - if(!root){ + root = json_loads(user_data_str,0, &error); //Pega os dados do arquivo em formato json + if(!root){ //Caso não tenha conseguido carregar os dados puts("erro ao carregar dados!"); //exit(0); } if(!json_is_object(root)) { - fprintf(stderr, "error: root is not an array\n"); + fprintf(stderr, "Dados não estão em formato Json\n"); json_decref(root); } json_t *sha; const char *message_text; - sha = json_object_get(root, "status"); + sha = json_object_get(root, "status"); //Pega o Status da resposta if(json_is_string(sha)) { - message_text = json_string_value(sha); + message_text = json_string_value(sha); //coloca o valor de status na string puts(message_text); if(!(strcmp(message_text, "ok"))){ return 1; @@ -342,6 +345,7 @@ int faz_login(GtkWidget *w, gpointer p){ curl = curl_easy_init(); if(curl) { + //para entender melhor o que é cada opção do Curl, leia: https://curl.haxx.se/libcurl/c/libcurl-tutorial.html curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0"); curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1 ); curl_easy_setopt(curl, CURLOPT_WRITEDATA, login_out); @@ -351,17 +355,16 @@ int faz_login(GtkWidget *w, gpointer p){ curl_easy_setopt(curl, CURLOPT_VERBOSE, 0); curl_easy_setopt(curl, CURLOPT_HEADER, 0); - //curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.0.6/slx-admin/api.php?do=webservice"); curl_easy_setopt(curl, CURLOPT_URL, API_URL); curl_easy_setopt(curl, CURLOPT_POST, 1); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data); puts("Fazendo login."); - curl_easy_perform(curl); + curl_easy_perform(curl); //Faz login puts("teste 2"); fclose(login_out); printf("Linha antes checagem %d\n", __LINE__); - if(checa_sucesso_do_login()){ + if(checa_sucesso_do_login()){ //Se o login foi bem sucedido, pega as informações do usuário printf("Linha %d\n", __LINE__); char *data2="request=getinfo"; @@ -372,7 +375,7 @@ int faz_login(GtkWidget *w, gpointer p){ curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data2); printf("Linha %d\n", __LINE__); puts("pegando informação."); - curl_easy_perform(curl); + curl_easy_perform(curl); //Pega informações fclose(dados_do_user); if(!(checa_sucesso_get_info())){ //nao conseguiu pegar informações @@ -387,8 +390,8 @@ int faz_login(GtkWidget *w, gpointer p){ else puts("Nao pegou dados"); curl_easy_cleanup(curl); - puts("teste"); - if(checa_upload_antigo()){ + + if(checa_upload_antigo()){ //Verifica se existe um upload antigo nessa máquina tela_upload_antigo(NULL, data_ant); }else{ if(data_ant->control == 0){ @@ -436,7 +439,7 @@ void faz_upload_teste(GtkWidget *w, gpointer p){ strcpy(argv[2], "teste"); strcpy(argv[3], ".r1"); argv[4] = NULL; - g_spawn_async_with_pipes(NULL, argv,NULL,G_SPAWN_DO_NOT_REAP_CHILD,NULL,NULL, &pid, NULL, NULL, NULL, NULL); + g_spawn_async_with_pipes(NULL, argv,NULL,G_SPAWN_DO_NOT_REAP_CHILD,NULL,NULL, &pid, NULL, NULL, NULL, NULL); //NAO USE FORK PARA SPAWNAR SCRIPTS, use essa função. Documentação em: https://developer.gnome.org/glib/stable/glib-Spawning-Processes.html#g-spawn-sync handler = stg4_tela_confirmacao_upload; data->dado6 = loading; data->dado1 = data_ant->dado1; @@ -478,7 +481,7 @@ void faz_upload(GtkWidget *w, gpointer p){ strcpy(argv[3], ".r1"); argv[4] = NULL; printf("Linha %d\n", __LINE__); - g_spawn_async_with_pipes(NULL, argv,NULL,G_SPAWN_DO_NOT_REAP_CHILD,NULL,NULL, &pid, NULL, NULL, NULL, NULL); + g_spawn_async_with_pipes(NULL, argv,NULL,G_SPAWN_DO_NOT_REAP_CHILD,NULL,NULL, &pid, NULL, NULL, NULL, NULL); //NAO USE FORK PARA SPAWNAR SCRIPTS, use essa função. Documentação em: https://developer.gnome.org/glib/stable/glib-Spawning-Processes.html#g-spawn-sync printf("Linha %d\n", __LINE__); diff --git a/useful/stg312/upload-utils.h b/useful/stg312/upload-utils.h index f7f0fa6f..82e030c1 100644 --- a/useful/stg312/upload-utils.h +++ b/useful/stg312/upload-utils.h @@ -6,6 +6,10 @@ #include <errno.h> #include <sys/wait.h> +//Aviso a quem vai editar esse código. Boa sorte com a libcurl, a documentação é muito escassa e mal explicada, nada faz sentido +// a opção de debug não indica nada importante e as soluções são extremamente Cripticas se vc não tem um conhecimento grande de +// como funcionam requisições web. + void logout(); int checa_upload_antigo(); int calcula_tempo_upload(); diff --git a/useful/stg312/upload.c b/useful/stg312/upload.c index 3860c8ef..a1487308 100644 --- a/useful/stg312/upload.c +++ b/useful/stg312/upload.c @@ -17,13 +17,14 @@ #include <signal.h> #include "upload-utils.h" +//Função que checa o sucesso do upload feito; int checa_sucesso_upload(){ FILE *user_data; char *user_data_str; user_data_str = malloc(2550*sizeof(char)); - user_data = fopen(".upload.out", "r"); - system("cat .upload.out"); + user_data = fopen(".upload.out", "r"); //Abre arquivo contendo a resposta do servidor + system("cat .upload.out"); //Para debug fgets(user_data_str,2550*sizeof(char), user_data ); puts("User data: "); puts(user_data_str); @@ -31,8 +32,8 @@ int checa_sucesso_upload(){ json_t *root; json_error_t error; - root = json_loads(user_data_str,0, &error); - if(!root){ + root = json_loads(user_data_str,0, &error); //carrega o pacote json com a resposta + if(!root){ //falha ao abrir o pacote puts("erro ao carregar dados!"); return 116; //exit(0); @@ -40,37 +41,38 @@ int checa_sucesso_upload(){ if(!json_is_object(root)) { - fprintf(stderr, "error: root is not an array\n"); + fprintf(stderr, "O arquivo de saida não contem um objeto json."); json_decref(root); } json_t *sha; const char *message_text; - sha = json_object_get(root, "status"); + sha = json_object_get(root, "status"); //Pega o status if(json_is_string(sha)) { - message_text = json_string_value(sha); + message_text = json_string_value(sha); //Coloca o status no string puts(message_text); }else{ - puts("error, not string"); + puts("error, not string"); //Status não é um string } - if(!(strcmp(message_text, "ok"))){ + if(!(strcmp(message_text, "ok"))){ //Tudo certo, o programa vai continuar return 1; } - sha = json_object_get(root, "code"); + sha = json_object_get(root, "code"); //Se não esta tudo certo, pega o codigo de erro if(json_is_string(sha)) { - message_text = json_string_value(sha); + message_text = json_string_value(sha); //Coloca o codigo em uma string puts(message_text); }else{ - puts("error, not string"); + puts("error, not string"); //O código não é uma string return 116; } + //Para entender que erro é o que verifique documentação da API que está no Redmine (https://redmine.c3sl.ufpr.br/projects/openslx-dnbd3/files arquivo api_webservice_report) ou Taiga puts("Irá procurar o erro."); if(!(strcmp(message_text, "109"))){ puts("Erro 109: Uploadid nao informado, caso esteja vendo esse erro repita todo o processo de criação de imagem."); @@ -104,7 +106,7 @@ int checa_sucesso_upload(){ if(!(strcmp(message_text, "115"))){ puts("Erro 115: Erro ao fazer o upload, o programa tentará reenviar agora."); - return 115; + return 115; //Vai enviar a próxima parte, pois a primeira já foi enviada } if(!(strcmp(message_text, "116"))){ @@ -116,12 +118,13 @@ int checa_sucesso_upload(){ } +//Função que vai pegar o upload ip fornecido pela api int pega_upload_id(char *id){ FILE *user_data; char *user_data_str; user_data_str = malloc(2550*sizeof(char)); - user_data = fopen(".upid.out", "r"); + user_data = fopen(".upid.out", "r"); //Abre o arquivo que contém o upload id fgets(user_data_str,2550*sizeof(char), user_data ); puts("User data: "); puts(user_data_str); @@ -129,22 +132,22 @@ int pega_upload_id(char *id){ json_t *root; json_error_t error; - root = json_loads(user_data_str,0, &error); + root = json_loads(user_data_str,0, &error); //carrega o pacote json com o upload id if(!root){ - puts("erro ao carregar dados!"); + puts("erro ao carregar dados!"); //Não achou o arquivo //exit(0); } if(!json_is_object(root)) { - fprintf(stderr, "error: root is not an array\n"); + fprintf(stderr, "O arquivo de saida não contem um objeto json."); json_decref(root); } json_t *sha; const char *message_text; - sha = json_object_get(root, "status"); + sha = json_object_get(root, "status"); //Pega status if(json_is_string(sha)) { message_text = json_string_value(sha); @@ -153,8 +156,8 @@ int pega_upload_id(char *id){ puts("error, not string"); } - if(!(strcmp(message_text, "ok"))){ - sha = json_object_get(root, "uploadid"); + if(!(strcmp(message_text, "ok"))){ //Se o status estiver OK, continua + sha = json_object_get(root, "uploadid"); //pega o uploadid do json if(json_is_string(sha)) { message_text = json_string_value(sha); @@ -163,11 +166,11 @@ int pega_upload_id(char *id){ puts("error, not string"); } - strcpy(id, message_text); + strcpy(id, message_text); //copia o uploadid pra id return 1; } - sha = json_object_get(root, "code"); + sha = json_object_get(root, "code"); //Se o status não OK if(json_is_string(sha)) { message_text = json_string_value(sha); @@ -185,7 +188,7 @@ int pega_upload_id(char *id){ int main(int argc, char *argv[]){ - system("echo n > .result.out"); + system("echo n > .result.out"); //Inicia o arquivo de sucesso com falha CURL *curl; char *version, *upload_name, *part_suffix, *old_upload, *uploadid; @@ -207,20 +210,17 @@ int main(int argc, char *argv[]){ curl = curl_easy_init(); if(curl) { - curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0"); + //para entender melhor o que é cada opção do Curl, leia: https://curl.haxx.se/libcurl/c/libcurl-tutorial.html + curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0"); //Useragent utilizado curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1 ); - //curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookie"); curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookie"); curl_easy_setopt(curl, CURLOPT_VERBOSE, 0); curl_easy_setopt(curl, CURLOPT_HEADER, 0); - // curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.0.6/slx-admin/api.php?do=webservice"); curl_easy_setopt(curl, CURLOPT_URL, API_URL); - //char *data2="request=newupload&nparts=10"; curl_easy_setopt(curl, CURLOPT_POST, 1); - //curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data2); - upload_in_progress = fopen(".progress.out", "a+"); + upload_in_progress = fopen(".progress.out", "a+"); //Abre o arquivo com o possível upload antigo em progresso. printf("Linha %d\n", __LINE__); rewind(upload_in_progress); fscanf(upload_in_progress, "%s", old_upload); @@ -229,17 +229,17 @@ int main(int argc, char *argv[]){ i = 0; puts(old_upload); - if(!(strcmp(old_upload, "Upload"))){ + if(!(strcmp(old_upload, "Upload"))){ //Verifica se existe um upload antigo puts("Achou um upload antigo, continuando ele"); fscanf(upload_in_progress, "%s", old_upload); - strcpy(uploadid, old_upload); + strcpy(uploadid, old_upload); //Le o uploadid do upload em andamento fscanf(upload_in_progress, "%s", old_upload); fscanf(upload_in_progress, "%s", old_upload); - strcpy(part_suffix, old_upload); - fscanf(upload_in_progress, "%d", &i); + strcpy(part_suffix, old_upload); //Le em qual parte está o upload + fscanf(upload_in_progress, "%d", &i); //Le o int de qual parte esta o upload fscanf(upload_in_progress, "%s", old_upload); - strcpy(version, old_upload); - }else{ + strcpy(version, old_upload); //Le a versão do upload + }else{ //Se não achou um upload antigo, pede um upload id da API strcpy(version, argv[1]); strcat(version, "/"); strcat(version, argv[2]); @@ -257,13 +257,13 @@ int main(int argc, char *argv[]){ curl_easy_setopt(curl, CURLOPT_WRITEDATA, upid); puts("Pegando UploadId."); - curl_easy_perform(curl); + curl_easy_perform(curl); //Pega o uploadid printf("Linha %d\n", __LINE__); fclose(upid); if(!(pega_upload_id(uploadid))){ - puts("Erro ao iniciar um novo Upload. Tente novamente."); + puts("Erro ao iniciar um novo Upload. Tente novamente."); //Não conseguiu pegar um uploadid novo return 0; } @@ -271,6 +271,7 @@ int main(int argc, char *argv[]){ } fclose(upload_in_progress); + // Vai preparar pra fazer o upload. printf("Linha %d\n", __LINE__); char *calculated_sha = malloc(255*sizeof(char)); @@ -285,6 +286,7 @@ int main(int argc, char *argv[]){ printf("Linha %d\n", __LINE__); curl_formadd(&formpost,&lastptr,CURLFORM_COPYNAME, "uploadid", CURLFORM_COPYCONTENTS, uploadid,CURLFORM_END); + //começa a fazer o upload for(; i < NUMBER_OF_PARTS; ++i){ puts(version); strcpy(upload_name, version); @@ -292,7 +294,7 @@ int main(int argc, char *argv[]){ upload_output = fopen(".upload.out", "wr"); - strcpy(sha_command_line, "openssl dgst -sha1 "); + strcpy(sha_command_line, "openssl dgst -sha1 "); //calcula o sha do arquivo strcat(sha_command_line, upload_name); sha_calc = popen(sha_command_line, "r"); fscanf(sha_calc, "%s", calculated_sha); @@ -305,15 +307,15 @@ int main(int argc, char *argv[]){ puts("Fazendo Upload de:"); puts(part_suffix); - upload_in_progress = fopen(".progress.out", "wr"); - fprintf(upload_in_progress, "Upload\n%s\n%s\n%s\n%d\n%s", uploadid, upload_name, part_suffix, i, version); - fclose(upload_in_progress); + upload_in_progress = fopen(".progress.out", "wr"); //Abre o arquivo que conterá os dados necessários para continuar o upload caso esse falhe + fprintf(upload_in_progress, "Upload\n%s\n%s\n%s\n%d\n%s", uploadid, upload_name, part_suffix, i, version); //Insere os dados necessários para continuar o upload em caso de falha + fclose(upload_in_progress); //fecha o arquivo, obriga um sync dele - curl_easy_perform(curl); + curl_easy_perform(curl); //Faz o upload propriamente dito fclose(upload_output); printf("Linha %d\n", __LINE__); - check_response = checa_sucesso_upload(); + check_response = checa_sucesso_upload(); //Checa se o upload foi feito com sucesso printf("Linha %d\n", __LINE__); if(check_response == 1){ puts("Parte enviada para o servidor com suceso."); @@ -325,7 +327,7 @@ int main(int argc, char *argv[]){ puts("Sistema irá tentar reenviar a ultima parte."); --i; timeout_count++; - if(timeout_count == 5){ + if(timeout_count == 5){ //Caso o banco não esteja respondendo. puts("Conexão com o banco perdida. Tente novamente."); return 0; } @@ -338,6 +340,7 @@ int main(int argc, char *argv[]){ } printf("Linha %d\n", __LINE__); } + //Fez o upload, vai atualizar o arquivo de upload em progresso printf("Linha %d\n", __LINE__); upload_in_progress = fopen(".progress.out", "wr"); printf("Linha %d\n", __LINE__); @@ -345,6 +348,6 @@ int main(int argc, char *argv[]){ printf("Linha %d\n", __LINE__); curl_easy_cleanup(curl); } - system("echo s > .result.out"); + system("echo s > .result.out"); //Terminou tudo corretamente, atualiza o arquivo de checagem de sucesso! return(0); } diff --git a/useful/stg312/utils.c b/useful/stg312/utils.c index 0127a311..90ff9b13 100644 --- a/useful/stg312/utils.c +++ b/useful/stg312/utils.c @@ -49,7 +49,7 @@ gboolean on_key_press (GtkWidget *w, GdkEventKey *event, gpointer p){ help_screen(NULL, NULL); break; - case GDK_KEY_F6: //Apertoyu f10 + case GDK_KEY_F6: //Apertoyu f6 if(data_ant->control == 1) abre_shell(NULL, NULL); break; @@ -59,7 +59,7 @@ gboolean on_key_press (GtkWidget *w, GdkEventKey *event, gpointer p){ g_signal_emit_by_name(window, "destroy"); break; - case GDK_KEY_Page_Up://Apertou pageup, clica no botao. Não consigo fazer isso pro enter, só enter do key pad + case GDK_KEY_Page_Up://Apertou pageup, clica no botao. g_signal_emit_by_name(button, "clicked"); break; @@ -74,8 +74,7 @@ return FALSE; void abre_software_center(GtkWidget *w, gpointer p){ int status; - puts("software center"); - g_spawn_command_line_sync("synaptic", NULL, NULL, &status, NULL); //o comando "software-center" ainda não funciona, trocar por um outro funcional + g_spawn_command_line_sync("synaptic", NULL, NULL, &status, NULL); //Abre o synaptic. Quando melhorarem o software center usar o software center } @@ -93,38 +92,11 @@ void abre_site(GtkWidget *w, gpointer p){ int status; - g_spawn_command_line_sync("xdg-open http://slxboxdev.c3sl.ufpr.br", NULL, NULL, &status, NULL); // Abre o shell + g_spawn_command_line_sync("xdg-open http://slxboxdev.c3sl.ufpr.br", NULL, NULL, &status, NULL); // Abre o site. } -/* -void logout(){ - - CURL *curl; - - - curl = curl_easy_init(); - if(curl) { - - curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0"); - curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1 ); - curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookie"); - curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookie"); - - curl_easy_setopt(curl, CURLOPT_VERBOSE, 0); - curl_easy_setopt(curl, CURLOPT_HEADER, 0); - - //curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.0.6/slx-admin/api.php?do=webservice"); - curl_easy_setopt(curl, CURLOPT_URL, API_URL); - curl_easy_setopt(curl, CURLOPT_POST, 1); - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "request=logout"); - curl_easy_perform(curl); - } - -}*/ - - //Função que sai do programa, fazendo logout antes void sair(GtkWidget *w, gpointer p){ -- GitLab