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
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

delta 2450
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
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