PNG  IHDRX cHRMz&u0`:pQ<bKGD pHYsodtIME MeqIDATxw]Wug^Qd˶ 6`!N:!@xI~)%7%@Bh&`lnjVF29gΨ4E$|>cɚ{gk= %,a KX%,a KX%,a KX%,a KX%,a KX%,a KX%, b` ǟzeאfp]<!SJmɤY޲ڿ,%c ~ع9VH.!Ͳz&QynֺTkRR.BLHi٪:l;@(!MԴ=žI,:o&N'Kù\vRmJ雵֫AWic H@" !: Cé||]k-Ha oݜ:y F())u]aG7*JV@J415p=sZH!=!DRʯvɱh~V\}v/GKY$n]"X"}t@ xS76^[bw4dsce)2dU0 CkMa-U5tvLƀ~mlMwfGE/-]7XAƟ`׮g ewxwC4\[~7@O-Q( a*XGƒ{ ՟}$_y3tĐƤatgvێi|K=uVyrŲlLӪuܿzwk$m87k( `múcE)"@rK( z4$D; 2kW=Xb$V[Ru819קR~qloѱDyįݎ*mxw]y5e4K@ЃI0A D@"BDk_)N\8͜9dz"fK0zɿvM /.:2O{ Nb=M=7>??Zuo32 DLD@D| &+֎C #B8ַ`bOb $D#ͮҪtx]%`ES`Ru[=¾!@Od37LJ0!OIR4m]GZRJu$‡c=%~s@6SKy?CeIh:[vR@Lh | (BhAMy=݃  G"'wzn޺~8ԽSh ~T*A:xR[ܹ?X[uKL_=fDȊ؂p0}7=D$Ekq!/t.*2ʼnDbŞ}DijYaȲ(""6HA;:LzxQ‘(SQQ}*PL*fc\s `/d'QXW, e`#kPGZuŞuO{{wm[&NBTiiI0bukcA9<4@SӊH*؎4U/'2U5.(9JuDfrޱtycU%j(:RUbArLֺN)udA':uGQN"-"Is.*+k@ `Ojs@yU/ H:l;@yyTn}_yw!VkRJ4P)~y#)r,D =ě"Q]ci'%HI4ZL0"MJy 8A{ aN<8D"1#IJi >XjX֔#@>-{vN!8tRݻ^)N_╗FJEk]CT՟ YP:_|H1@ CBk]yKYp|og?*dGvzنzӴzjֺNkC~AbZƷ`.H)=!QͷVTT(| u78y֮}|[8-Vjp%2JPk[}ԉaH8Wpqhwr:vWª<}l77_~{s۴V+RCģ%WRZ\AqHifɤL36: #F:p]Bq/z{0CU6ݳEv_^k7'>sq*+kH%a`0ԣisqにtү04gVgW΂iJiS'3w.w}l6MC2uԯ|>JF5`fV5m`Y**Db1FKNttu]4ccsQNnex/87+}xaUW9y>ͯ骵G{䩓Գ3+vU}~jJ.NFRD7<aJDB1#ҳgSb,+CS?/ VG J?|?,2#M9}B)MiE+G`-wo߫V`fio(}S^4e~V4bHOYb"b#E)dda:'?}׮4繏`{7Z"uny-?ǹ;0MKx{:_pÚmFמ:F " .LFQLG)Q8qN q¯¯3wOvxDb\. BKD9_NN &L:4D{mm o^tֽ:q!ƥ}K+<"m78N< ywsard5+вz~mnG)=}lYݧNj'QJS{S :UYS-952?&O-:W}(!6Mk4+>A>j+i|<<|;ر^߉=HE|V#F)Emm#}/"y GII웻Jі94+v뾧xu~5C95~ūH>c@덉pʃ1/4-A2G%7>m;–Y,cyyaln" ?ƻ!ʪ<{~h~i y.zZB̃/,雋SiC/JFMmBH&&FAbϓO^tubbb_hZ{_QZ-sύodFgO(6]TJA˯#`۶ɟ( %$&+V'~hiYy>922 Wp74Zkq+Ovn錄c>8~GqܲcWꂎz@"1A.}T)uiW4="jJ2W7mU/N0gcqܗOO}?9/wìXžΏ0 >֩(V^Rh32!Hj5`;O28؇2#ݕf3 ?sJd8NJ@7O0 b־?lldщ̡&|9C.8RTWwxWy46ah嘦mh٤&l zCy!PY?: CJyв]dm4ǜҐR޻RլhX{FƯanшQI@x' ao(kUUuxW_Ñ줮[w8 FRJ(8˼)_mQ _!RJhm=!cVmm ?sFOnll6Qk}alY}; "baӌ~M0w,Ggw2W:G/k2%R,_=u`WU R.9T"v,<\Ik޽/2110Ӿxc0gyC&Ny޽JҢrV6N ``یeA16"J³+Rj*;BϜkZPJaÍ<Jyw:NP8/D$ 011z֊Ⱳ3ι֘k1V_"h!JPIΣ'ɜ* aEAd:ݺ>y<}Lp&PlRfTb1]o .2EW\ͮ]38؋rTJsǏP@芎sF\> P^+dYJLbJ C-xϐn> ι$nj,;Ǖa FU *择|h ~izť3ᤓ`K'-f tL7JK+vf2)V'-sFuB4i+m+@My=O҈0"|Yxoj,3]:cо3 $#uŘ%Y"y죯LebqtҢVzq¼X)~>4L׶m~[1_k?kxֺQ`\ |ٛY4Ѯr!)N9{56(iNq}O()Em]=F&u?$HypWUeB\k]JɩSع9 Zqg4ZĊo oMcjZBU]B\TUd34ݝ~:7ڶSUsB0Z3srx 7`:5xcx !qZA!;%͚7&P H<WL!džOb5kF)xor^aujƍ7 Ǡ8/p^(L>ὴ-B,{ۇWzֺ^k]3\EE@7>lYBȝR.oHnXO/}sB|.i@ɥDB4tcm,@ӣgdtJ!lH$_vN166L__'Z)y&kH;:,Y7=J 9cG) V\hjiE;gya~%ks_nC~Er er)muuMg2;֫R)Md) ,¶ 2-wr#F7<-BBn~_(o=KO㭇[Xv eN_SMgSҐ BS헃D%g_N:/pe -wkG*9yYSZS.9cREL !k}<4_Xs#FmҶ:7R$i,fi!~' # !6/S6y@kZkZcX)%5V4P]VGYq%H1!;e1MV<!ϐHO021Dp= HMs~~a)ަu7G^];git!Frl]H/L$=AeUvZE4P\.,xi {-~p?2b#amXAHq)MWǾI_r`S Hz&|{ +ʖ_= (YS(_g0a03M`I&'9vl?MM+m~}*xT۲(fY*V4x@29s{DaY"toGNTO+xCAO~4Ϳ;p`Ѫ:>Ҵ7K 3}+0 387x\)a"/E>qpWB=1 ¨"MP(\xp߫́A3+J] n[ʼnӼaTbZUWb={~2ooKױӰp(CS\S筐R*JغV&&"FA}J>G֐p1ٸbk7 ŘH$JoN <8s^yk_[;gy-;߉DV{c B yce% aJhDȶ 2IdйIB/^n0tNtџdcKj4϶v~- CBcgqx9= PJ) dMsjpYB] GD4RDWX +h{y`,3ꊕ$`zj*N^TP4L:Iz9~6s) Ga:?y*J~?OrMwP\](21sZUD ?ܟQ5Q%ggW6QdO+\@ ̪X'GxN @'4=ˋ+*VwN ne_|(/BDfj5(Dq<*tNt1х!MV.C0 32b#?n0pzj#!38}޴o1KovCJ`8ŗ_"]] rDUy޲@ Ȗ-;xџ'^Y`zEd?0„ DAL18IS]VGq\4o !swV7ˣι%4FѮ~}6)OgS[~Q vcYbL!wG3 7띸*E Pql8=jT\꘿I(z<[6OrR8ºC~ډ]=rNl[g|v TMTղb-o}OrP^Q]<98S¤!k)G(Vkwyqyr޽Nv`N/e p/~NAOk \I:G6]4+K;j$R:Mi #*[AȚT,ʰ,;N{HZTGMoּy) ]%dHء9Պ䠬|<45,\=[bƟ8QXeB3- &dҩ^{>/86bXmZ]]yޚN[(WAHL$YAgDKp=5GHjU&99v簪C0vygln*P)9^͞}lMuiH!̍#DoRBn9l@ xA/_v=ȺT{7Yt2N"4!YN`ae >Q<XMydEB`VU}u]嫇.%e^ánE87Mu\t`cP=AD/G)sI"@MP;)]%fH9'FNsj1pVhY&9=0pfuJ&gޤx+k:!r˭wkl03׼Ku C &ѓYt{.O.zҏ z}/tf_wEp2gvX)GN#I ݭ߽v/ .& и(ZF{e"=V!{zW`, ]+LGz"(UJp|j( #V4, 8B 0 9OkRrlɱl94)'VH9=9W|>PS['G(*I1==C<5"Pg+x'K5EMd؞Af8lG ?D FtoB[je?{k3zQ vZ;%Ɠ,]E>KZ+T/ EJxOZ1i #T<@ I}q9/t'zi(EMqw`mYkU6;[t4DPeckeM;H}_g pMww}k6#H㶏+b8雡Sxp)&C $@'b,fPߑt$RbJ'vznuS ~8='72_`{q纶|Q)Xk}cPz9p7O:'|G~8wx(a 0QCko|0ASD>Ip=4Q, d|F8RcU"/KM opKle M3#i0c%<7׿p&pZq[TR"BpqauIp$ 8~Ĩ!8Սx\ւdT>>Z40ks7 z2IQ}ItԀ<-%S⍤};zIb$I 5K}Q͙D8UguWE$Jh )cu4N tZl+[]M4k8֦Zeq֮M7uIqG 1==tLtR,ƜSrHYt&QP윯Lg' I,3@P'}'R˪e/%-Auv·ñ\> vDJzlӾNv5:|K/Jb6KI9)Zh*ZAi`?S {aiVDԲuy5W7pWeQJk֤#5&V<̺@/GH?^τZL|IJNvI:'P=Ϛt"¨=cud S Q.Ki0 !cJy;LJR;G{BJy޺[^8fK6)=yʊ+(k|&xQ2`L?Ȓ2@Mf 0C`6-%pKpm')c$׻K5[J*U[/#hH!6acB JA _|uMvDyk y)6OPYjœ50VT K}cǻP[ $:]4MEA.y)|B)cf-A?(e|lɉ#P9V)[9t.EiQPDѠ3ϴ;E:+Օ t ȥ~|_N2,ZJLt4! %ա]u {+=p.GhNcŞQI?Nd'yeh n7zi1DB)1S | S#ًZs2|Ɛy$F SxeX{7Vl.Src3E℃Q>b6G ўYCmtկ~=K0f(=LrAS GN'ɹ9<\!a`)֕y[uՍ[09` 9 +57ts6}b4{oqd+J5fa/,97J#6yν99mRWxJyѡyu_TJc`~W>l^q#Ts#2"nD1%fS)FU w{ܯ R{ ˎ󅃏џDsZSQS;LV;7 Od1&1n$ N /.q3~eNɪ]E#oM~}v֯FڦwyZ=<<>Xo稯lfMFV6p02|*=tV!c~]fa5Y^Q_WN|Vs 0ҘދU97OI'N2'8N֭fgg-}V%y]U4 峧p*91#9U kCac_AFңĪy뚇Y_AiuYyTTYЗ-(!JFLt›17uTozc. S;7A&&<ԋ5y;Ro+:' *eYJkWR[@F %SHWP 72k4 qLd'J "zB6{AC0ƁA6U.'F3:Ȅ(9ΜL;D]m8ڥ9}dU "v!;*13Rg^fJyShyy5auA?ɩGHRjo^]׽S)Fm\toy 4WQS@mE#%5ʈfFYDX ~D5Ϡ9tE9So_aU4?Ѽm%&c{n>.KW1Tlb}:j uGi(JgcYj0qn+>) %\!4{LaJso d||u//P_y7iRJ߬nHOy) l+@$($VFIQ9%EeKʈU. ia&FY̒mZ=)+qqoQn >L!qCiDB;Y<%} OgBxB!ØuG)WG9y(Ą{_yesuZmZZey'Wg#C~1Cev@0D $a@˲(.._GimA:uyw֬%;@!JkQVM_Ow:P.s\)ot- ˹"`B,e CRtaEUP<0'}r3[>?G8xU~Nqu;Wm8\RIkբ^5@k+5(By'L&'gBJ3ݶ!/㮻w҅ yqPWUg<e"Qy*167΃sJ\oz]T*UQ<\FԎ`HaNmڜ6DysCask8wP8y9``GJ9lF\G g's Nn͵MLN֪u$| /|7=]O)6s !ĴAKh]q_ap $HH'\1jB^s\|- W1:=6lJBqjY^LsPk""`]w)󭃈,(HC ?䔨Y$Sʣ{4Z+0NvQkhol6C.婧/u]FwiVjZka&%6\F*Ny#8O,22+|Db~d ~Çwc N:FuuCe&oZ(l;@ee-+Wn`44AMK➝2BRՈt7g*1gph9N) *"TF*R(#'88pm=}X]u[i7bEc|\~EMn}P瘊J)K.0i1M6=7'_\kaZ(Th{K*GJyytw"IO-PWJk)..axӝ47"89Cc7ĐBiZx 7m!fy|ϿF9CbȩV 9V-՛^pV̌ɄS#Bv4-@]Vxt-Z, &ֺ*diؠ2^VXbs֔Ìl.jQ]Y[47gj=幽ex)A0ip׳ W2[ᎇhuE^~q흙L} #-b۸oFJ_QP3r6jr+"nfzRJTUqoaۍ /$d8Mx'ݓ= OՃ| )$2mcM*cЙj}f };n YG w0Ia!1Q.oYfr]DyISaP}"dIӗթO67jqR ҊƐƈaɤGG|h;t]䗖oSv|iZqX)oalv;۩meEJ\!8=$4QU4Xo&VEĊ YS^E#d,yX_> ۘ-e\ "Wa6uLĜZi`aD9.% w~mB(02G[6y.773a7 /=o7D)$Z 66 $bY^\CuP. (x'"J60׿Y:Oi;F{w佩b+\Yi`TDWa~|VH)8q/=9!g߆2Y)?ND)%?Ǐ`k/sn:;O299yB=a[Ng 3˲N}vLNy;*?x?~L&=xyӴ~}q{qE*IQ^^ͧvü{Huu=R|>JyUlZV, B~/YF!Y\u_ݼF{_C)LD]m {H 0ihhadd nUkf3oٺCvE\)QJi+֥@tDJkB$1!Đr0XQ|q?d2) Ӣ_}qv-< FŊ߫%roppVBwü~JidY4:}L6M7f٬F "?71<2#?Jyy4뷢<_a7_=Q E=S1И/9{+93֮E{ǂw{))?maÆm(uLE#lïZ  ~d];+]h j?!|$F}*"4(v'8s<ŏUkm7^7no1w2ؗ}TrͿEk>p'8OB7d7R(A 9.*Mi^ͳ; eeUwS+C)uO@ =Sy]` }l8^ZzRXj[^iUɺ$tj))<sbDJfg=Pk_{xaKo1:-uyG0M ԃ\0Lvuy'ȱc2Ji AdyVgVh!{]/&}}ċJ#%d !+87<;qN޼Nفl|1N:8ya  8}k¾+-$4FiZYÔXk*I&'@iI99)HSh4+2G:tGhS^繿 Kتm0 вDk}֚+QT4;sC}rՅE,8CX-e~>G&'9xpW,%Fh,Ry56Y–hW-(v_,? ; qrBk4-V7HQ;ˇ^Gv1JVV%,ik;D_W!))+BoS4QsTM;gt+ndS-~:11Sgv!0qRVh!"Ȋ(̦Yl.]PQWgٳE'`%W1{ndΗBk|Ž7ʒR~,lnoa&:ü$ 3<a[CBݮwt"o\ePJ=Hz"_c^Z.#ˆ*x z̝grY]tdkP*:97YľXyBkD4N.C_[;F9`8& !AMO c `@BA& Ost\-\NX+Xp < !bj3C&QL+*&kAQ=04}cC!9~820G'PC9xa!w&bo_1 Sw"ܱ V )Yl3+ס2KoXOx]"`^WOy :3GO0g;%Yv㐫(R/r (s } u B &FeYZh0y> =2<Ϟc/ -u= c&׭,.0"g"7 6T!vl#sc>{u/Oh Bᾈ)۴74]x7 gMӒ"d]U)}" v4co[ ɡs 5Gg=XR14?5A}D "b{0$L .\4y{_fe:kVS\\O]c^W52LSBDM! C3Dhr̦RtArx4&agaN3Cf<Ԉp4~ B'"1@.b_/xQ} _߃҉/gٓ2Qkqp0շpZ2fԫYz< 4L.Cyυι1t@鎫Fe sYfsF}^ V}N<_`p)alٶ "(XEAVZ<)2},:Ir*#m_YӼ R%a||EƼIJ,,+f"96r/}0jE/)s)cjW#w'Sʯ5<66lj$a~3Kʛy 2:cZ:Yh))+a߭K::N,Q F'qB]={.]h85C9cr=}*rk?vwV렵ٸW Rs%}rNAkDv|uFLBkWY YkX מ|)1!$#3%y?pF<@<Rr0}: }\J [5FRxY<9"SQdE(Q*Qʻ)q1E0B_O24[U'],lOb ]~WjHޏTQ5Syu wq)xnw8~)c 쫬gٲߠ H% k5dƝk> kEj,0% b"vi2Wس_CuK)K{n|>t{P1򨾜j>'kEkƗBg*H%'_aY6Bn!TL&ɌOb{c`'d^{t\i^[uɐ[}q0lM˕G:‚4kb祔c^:?bpg… +37stH:0}en6x˟%/<]BL&* 5&fK9Mq)/iyqtA%kUe[ڛKN]Ě^,"`/ s[EQQm?|XJ߅92m]G.E΃ח U*Cn.j_)Tѧj̿30ڇ!A0=͜ar I3$C^-9#|pk!)?7.x9 @OO;WƝZBFU keZ75F6Tc6"ZȚs2y/1 ʵ:u4xa`C>6Rb/Yм)^=+~uRd`/|_8xbB0?Ft||Z\##|K 0>>zxv8۴吅q 8ĥ)"6>~\8:qM}#͚'ĉ#p\׶ l#bA?)|g g9|8jP(cr,BwV (WliVxxᡁ@0Okn;ɥh$_ckCgriv}>=wGzβ KkBɛ[˪ !J)h&k2%07δt}!d<9;I&0wV/ v 0<H}L&8ob%Hi|޶o&h1L|u֦y~󛱢8fٲUsւ)0oiFx2}X[zVYr_;N(w]_4B@OanC?gĦx>мgx>ΛToZoOMp>40>V Oy V9iq!4 LN,ˢu{jsz]|"R޻&'ƚ{53ўFu(<٪9:΋]B;)B>1::8;~)Yt|0(pw2N%&X,URBK)3\zz&}ax4;ǟ(tLNg{N|Ǽ\G#C9g$^\}p?556]/RP.90 k,U8/u776s ʪ_01چ|\N 0VV*3H鴃J7iI!wG_^ypl}r*jɤSR 5QN@ iZ#1ٰy;_\3\BQQ x:WJv츟ٯ$"@6 S#qe딇(/P( Dy~TOϻ<4:-+F`0||;Xl-"uw$Цi󼕝mKʩorz"mϺ$F:~E'ҐvD\y?Rr8_He@ e~O,T.(ފR*cY^m|cVR[8 JҡSm!ΆԨb)RHG{?MpqrmN>߶Y)\p,d#xۆWY*,l6]v0h15M˙MS8+EdI='LBJIH7_9{Caз*Lq,dt >+~ّeʏ?xԕ4bBAŚjﵫ!'\Ը$WNvKO}ӽmSşذqsOy?\[,d@'73'j%kOe`1.g2"e =YIzS2|zŐƄa\U,dP;jhhhaxǶ?КZ՚.q SE+XrbOu%\GتX(H,N^~]JyEZQKceTQ]VGYqnah;y$cQahT&QPZ*iZ8UQQM.qo/T\7X"u?Mttl2Xq(IoW{R^ ux*SYJ! 4S.Jy~ BROS[V|žKNɛP(L6V^|cR7i7nZW1Fd@ Ara{詑|(T*dN]Ko?s=@ |_EvF]׍kR)eBJc" MUUbY6`~V޴dJKß&~'d3i WWWWWW
Current Directory: /usr/share/doc/mrtg/contrib/rdlog2
Viewing File: /usr/share/doc/mrtg/contrib/rdlog2/rdlog2.c
/****************************************************************/ /* */ /* rdlog2.c (see readme.html for program explanation */ /* */ /* author : Philippe Simonet, sip00@vg.swissptt.ch */ /* */ /* change log : */ /* */ /* v. 1.00 : initial update (SIP) (02.12.97 */ /* */ /* */ /* */ /************************************************************************/ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <malloc.h> #include <time.h> #include "gd.h" #include "gdfonts.h" #define FALSE 0 #define TRUE 1 #define TEXT 1 #define RECT 2 #define POLY 3 #define COLOR 4 #define COLORDEF 5 #define LINK 6 #define COMPOUND 7 #define ENDCOMPOUND 8 #define GIFAREA 9 #define URL 10 #define IN 11 #define OUT 12 #define INOUT 13 #define UNKNOWN 99 #ifndef max #define max(a,b) ((a)>(b))?(a):(b) #endif #ifndef min #define min(a,b) ((a)<(b))?(a):(b) #endif int colorratetable[256]; int colortable[256] = { 0x000000, /* 0 BLACK */ 0xff0000, /* 1 BLUE */ 0x00ff00, /* 2 GREEN*/ 0xffff00, /* 3 CYAN */ 0x0000ff, /* 4 RED */ 0xff00ff, /* 5 MAGENTA */ 0x00ffff, /* 6 YELLOW */ 0xffffff, /* 7 WHITE */ 0x900000, /* 8 Blue4 */ 0xb00000, /* 9 Blue3 */ 0xd00000, /* 10 Blue2 */ 0xffce87, /* 11 LtBlue */ 0x009000, /* 12 Green4 */ 0x00b000, /* 13 Green3 */ 0x00d000, /* 14 Green2 */ 0x909000, /* 15 Cyan4 */ 0xb0b000, /* 16 Cyan3 */ 0xd0d000, /* 17 Cyan2 */ 0x000090, /* 18 Red4 */ 0x0000b0, /* 19 Red3 */ 0x0000d0, /* 20 Red2 */ 0x900090, /* 21 Magenta4 */ 0xb000b0, /* 22 Magenta3 */ 0xd000d0, /* 23 Magenta2 */ 0x003080, /* 24 Brown4 */ 0x0040a0, /* 25 Brown3 */ 0x0060c0, /* 26 Brown2 */ 0x8080ff, /* 27 Pink4 */ 0xa0a0ff, /* 28 Pink3 */ 0xc0c0ff, /* 29 Pink2 */ 0xe0e0ff, /* 30 Pink */ 0x00d7ff /* 31 gold */ }; /************************************************************************/ /* each of these entry contain the description of a graphical object */ struct sentry { int type; /* text, line, link, poly */ int depth; /* order in which it appears */ char * str; /* log file name, url, text */ int maxrate; /* max xfer rate */ int rate; /* max xfer rate */ int orientation; /* text orientation, ... */ int color; /* color */ int fillcolor; /* color */ int colorindex; /* color index */ int npoints; /* fig size */ int * coords; /* coordinates list */ struct sentry * next; /* next entry */ }; int xsize, ysize, rounds, xoffset, yoffset; struct sentry * pfirstentry, *pcurrententry, *pareaentry; /************************************************************************/ /* analyze command-line options */ static int optind = 0; /* Global argv index. */ static char *scan = NULL; /* Private scan pointer. */ static int scale = 15; int getopt1( int argc, char *argv[], char *optstring, char ** optarg ) { int c; /* return value */ char *place; char *index(); *optarg = NULL; /* check argument validity */ if (scan == NULL || *scan == '\0') { if (optind == 0) optind++; if (optind >= argc) return EOF; place = argv[optind]; if (place[0] != '-' || place[1] == '\0') return EOF; optind++; if (place[1] == '-' && place[2] == '\0') return EOF; scan = place+1; } c = *scan++; /* get option character */ place = strchr(optstring, c); if (place == NULL || c == ':') return '?'; /* set optarg if needed */ if (*++place == ':') { if (*scan != '\0') { *optarg = scan; scan = NULL; } else { *optarg = argv[optind], optind++; } } return c; } /************************************************************************/ /* computes a traffic in % by reading 'rounds' lines in a MRTG log file */ /* currently, it takes the maximum of the In or OUT traffic. */ void read_entry ( struct sentry * pentry) { FILE * logf; int i, j=0, k=0; logf = fopen ( pentry->str, "r" ); if ( pentry->maxrate == 0 ) { fprintf ( stderr, "Max rate for %s is null.\n", pentry->str ); return; } if ( logf != NULL ) { fscanf(logf, "%*d %d %d", &j, &k); /* get first line */ for ( i = 0; i < rounds; i ++ ) { /* computes mean */ fscanf(logf, "%*d %d %d %*d %*d", &j, &k); /* get line */ /*printf(" - [%d %d]\n", j, k);*/ switch (pentry->orientation) { case IN: pentry->rate += j; break; case OUT: pentry->rate += k; break; default: if ( j > k ) pentry->rate += j; else pentry->rate += k; break; } } /* computes the rate 0-9 */ pentry->rate = pentry->rate / rounds; /*printf ( "%s : %u, %u.\n", pentry->str, (pentry->maxrate*100)/pentry->maxrate, (pentry->rate*10)/pentry->maxrate );*/ pentry->rate = (pentry->rate * 10) / pentry->maxrate; if ( pentry->rate > 9 ) pentry->rate = 9; if ( pentry->rate < 0 ) pentry->rate = 0; fclose ( logf ); } else { fprintf ( stderr, "Cannot open file %s.\n", pentry->str ); }; } /************************************************************************/ /* in case of trouble ... */ void print_error ( void ) { fprintf ( stderr, "Read mrtg configuration files and convert them in gif format.\n" ); fprintf ( stderr, "Use :\n" ); fprintf ( stderr, " rdlog -i cfile -o gfile [-m mapfile] -r rounds\n" ); fprintf ( stderr, " ifile : input fig file name,\n" ); fprintf ( stderr, " gfile : output gif file (will be overwritten),\n" ); fprintf ( stderr, " mapfile : output map file (optional, will be overwritten),\n" ); fprintf ( stderr, " rounds : number of 5 min intervals to take.\n" ); } /************************************************************************/ /* free an 'entry' variable */ void free_entry (struct sentry * pentry) { if ( pentry!= NULL ) { if ( pentry->str != NULL ) free(pentry->str); pentry->str = NULL; if ( pentry->coords != NULL ) free(pentry->coords); pentry->coords = NULL; free(pentry); } } /************************************************************************/ /* print an entry for debug purpose */ void print_entry (struct sentry * pentry) { printf ( "Entry : " ); if ( pentry->str != NULL ) printf ( "str '%s' ", pentry->str ); printf ( ".\n type %i, maxrate %i, orientation %i, npoints %i, color %i, depth %i.\n", pentry->type,pentry->maxrate,pentry->orientation,pentry->npoints,pentry->color,pentry->depth ); } /************************************************************************/ int new_entry( void ) { struct sentry * pentry; if ( ( pentry = malloc ( sizeof (struct sentry) )) == NULL ) { fprintf ( stderr, "Error : memory allocation failure.\n" ); return ( FALSE ); } if ( pfirstentry == NULL ) { pfirstentry = pentry; } else { pcurrententry->next = pentry; } pentry->type = UNKNOWN; pentry->str = NULL; pentry->maxrate = 0; pentry->rate = 0; pentry->orientation = 0; pentry->color = 0; pentry->fillcolor = 0; pentry->depth = 0; pentry->colorindex = 0; pentry->npoints = 0; pentry->coords = NULL; pentry->next = NULL; pcurrententry = pentry; return ( TRUE ); } /************************************************************************/ #define r(color) ((color&0x0000ff)>>0) #define g(color) ((color&0x00ff00)>>8) #define b(color) ((color&0xff0000)>>16) #define rgb(color) ((color&0x0000ff)>>0),((color&0x00ff00)>>8),((color&0xff0000)>>16) /************************************************************************/ /* build a color or find the nearest color in the color table */ int find_color ( gdImagePtr graph, int color ) { int i_col; if ( (i_col = gdImageColorExact(graph,r(color), g(color), b(color))) == -1 ) { if ( (i_col = gdImageColorAllocate(graph,r(color), g(color), b(color))) == -1 ) { i_col = gdImageColorClosest(graph,r(color), g(color), b(color)); } } return (i_col); } /************************************************************************/ /* draw the gif file, based on the tentry desciption */ void draw_gif ( FILE * gif ) { #define c_blank 245,245,245 /* base colors */ #define c_light 194,194,194 #define c_dark 100,100,100 #define c_black 0,0,0 #define c_white 255,255,0 gdImagePtr graph; int i_light,i_dark,i_blank, i_black, i_white; int bkcolor; graph = gdImageCreate(xsize, ysize); /* the first color allocated will be the background color. */ bkcolor = colortable[pareaentry->fillcolor]; i_blank = gdImageColorAllocate(graph,rgb(bkcolor)); i_light = gdImageColorAllocate(graph,c_light); i_dark = gdImageColorAllocate(graph,c_dark); gdImageInterlace(graph, 1); i_black = gdImageColorAllocate(graph,c_black); i_white = gdImageColorAllocate(graph,c_white); /* draw the image border */ gdImageLine(graph,0,0,xsize-1,0,i_light); gdImageLine(graph,1,1,xsize-2,1,i_light); gdImageLine(graph,0,0,0,ysize-1,i_light); gdImageLine(graph,1,1,1,ysize-2,i_light); gdImageLine(graph,xsize-1,0,xsize-1,ysize-1,i_dark); gdImageLine(graph,0,ysize-1,xsize-1,ysize-1,i_dark); gdImageLine(graph,xsize-2,1,xsize-2,ysize-2,i_dark); gdImageLine(graph,1,ysize-2,xsize-2,ysize-2,i_dark); { /* date the graph */ struct tm *newtime; time_t aclock; time( &aclock ); /* Get time in seconds */ newtime = localtime( &aclock ); /* Convert time to struct */ /* tm form */ gdImageString(graph, gdFontSmall,3,3,asctime( newtime ),i_dark); }; while ( 1 ) { int i_col, i_col2, depth; struct sentry * pentry; /* find smallest depth */ pentry = pfirstentry; depth = -1; while ( pentry != NULL ) { if (pentry->depth > depth) { depth = pentry->depth; pcurrententry = pentry; } pentry = pentry->next; } if ( depth == -1 ) break; pcurrententry->depth = -1; /* draw this fig */ switch ( pcurrententry->type) { case RECT: i_col = find_color(graph, colortable[pcurrententry->color]); if ( pcurrententry->fillcolor != -1 ) { i_col2 = find_color(graph, colortable[pcurrententry->fillcolor]); gdImageFilledRectangle(graph, pcurrententry->coords[0], pcurrententry->coords[1], pcurrententry->coords[2], pcurrententry->coords[3],i_col2); } gdImageRectangle(graph, pcurrententry->coords[0], pcurrententry->coords[1], pcurrententry->coords[2], pcurrententry->coords[3],i_col); break; case TEXT: i_col = find_color(graph, colortable[pcurrententry->color]); if (pcurrententry->orientation == 0) { gdImageString(graph, gdFontSmall, pcurrententry->coords[0], pcurrententry->coords[1], pcurrententry->str, i_col ); } else { gdImageStringUp(graph, gdFontSmall, pcurrententry->coords[0], pcurrententry->coords[1], pcurrententry->str, i_col ); } break; case POLY: case LINK: { int x = pcurrententry->coords[0]; int y = pcurrententry->coords[1]; int x2, y2, j, k; gdImagePtr brush_2pix; if (pcurrententry->type == POLY) { i_col = find_color(graph, colortable[pcurrententry->color]); } else { brush_2pix = gdImageCreate(2,2); gdImageColorAllocate( brush_2pix, r(colortable[colorratetable[pcurrententry->rate]]), g(colortable[colorratetable[pcurrententry->rate]]), b(colortable[colorratetable[pcurrententry->rate]]) ); gdImageSetBrush(graph, brush_2pix); i_col = gdBrushed; } k = 2; for ( j = 1; j < pcurrententry->npoints; j ++ ) { x2 = pcurrententry->coords[k++]; y2 = pcurrententry->coords[k++]; gdImageLine(graph, x, y, x2, y2,i_col); x = x2; y = y2; }; if (pcurrententry->type == LINK) { gdImageDestroy(brush_2pix); }; } break; default: break; } pcurrententry = pcurrententry->next; } gdImageGif(graph, gif); gdImageDestroy(graph); } struct sfigrec { int type; char text[500]; int colorindex; int depth; int color; int fillcolor; int angle; int coords[500]; int npoints; }; /************************************************************************/ int getfig ( FILE * config, struct sfigrec * fig ) { char buf[1000], str[1000], *s; int i, n, type, color, colorindex, depth, pen_style, font, flags, x, y; int style, thickness, pen_color, fill_color, fill_style, join_style, cap_style, radius, fa, ba, npts; float tx_size, angle, style_val; fig->type = UNKNOWN; if ( fgets (buf, 1000, config ) == NULL ) { return ( TRUE ); } switch ( buf[0] ) { case '0': /* color ref */ n = sscanf(buf, "%*d %d #%06x", &colorindex, &color ); /*printf ( "colordef : %d, %d.\n", colorindex, color );*/ fig->type = COLORDEF; fig->color = ((color & 0xff0000)>>16) | (color & 0x00ff00) | ((color & 0x0000ff)<<16); fig->colorindex = colorindex; break; case '2': /* polyline */ n = sscanf(buf, "%*d%d%d%d%d%d%d%d%d%f%d%d%d%d%d%d", &type, &style, &thickness, &pen_color, &fill_color, &depth, &pen_style, &fill_style, &style_val, &join_style, &cap_style, &radius, &fa, &ba, &npts); /*puts ( buf );*/ /*printf ("type %d, style %d, thickness %d, pen_color %d, fill_color %d, depth %d, pen_style %d, fill_style %d, style_val %f, join_style %d, cap_style %d, radius %d, fa %d, ba %d, npts %d ", type, style, thickness, pen_color, fill_color, depth, pen_style, fill_style, style_val, join_style, cap_style, radius, fa, ba, npts);*/ fig->depth = depth; fig->color = pen_color; fig->npoints = npts; for ( i = 0; i < npts; i ++ ) { fscanf(config, "%d%d", &x, &y); fig->coords[i*2] = x; fig->coords[i*2+1] = y; /*printf ( "[%d %d] ", x, y );*/ } fig->type = POLY; if ( type == 2 ) { /* rectangle */ fig->type = RECT; if ( fill_style == -1 ) { fig->fillcolor = -1; } else { fig->fillcolor = fill_color; } x = min(fig->coords[0],fig->coords[4]); y = min(fig->coords[1],fig->coords[5]); fig->coords[2] = max(fig->coords[0],fig->coords[4]); fig->coords[3] = max(fig->coords[1],fig->coords[5]); fig->coords[0] = x; fig->coords[1] = y; fig->npoints = 2; } /*printf ( ".\n" );*/ break; case '4': /* text */ n = sscanf(buf, "%*d%d%d%d%d%d%f%f%d%*f%*f%d%d %[^\n]", &type, &color, &depth, &pen_style, &font, &tx_size, &angle, &flags, &x, &y, str); s = strstr ( str, "\\001" ); if ( s != NULL ) s[0] = 0; /*printf ( "text : type %d, color %d, depth %d, pen_style %d, font %d, ty_size %f, angle %f, flags %d, x %d, y %d, s [%s].\n", type, color, depth, pen_style, font, tx_size, angle, flags, x, y, str );*/ fig->type = TEXT; strcpy (fig->text, str); fig->depth = depth; fig->color = color; if ( angle < 1) { fig->angle = 0; fig->coords[0] = x; fig->coords[1] = y-150; } else { fig->angle = 1; fig->coords[0] = x-150; fig->coords[1] = y; } fig->npoints = 1; break; case '6': /* compound */ fig->type = COMPOUND; /*printf ( "compound.\n" );*/ break; case '-': /* compound end */ fig->type = ENDCOMPOUND; /*printf ( "end of compound.\n" );*/ break; default: break; } return ( FALSE ); } /************************************************************************/ void main ( int argc, char * argv[] ) { FILE *config = NULL, *gif = NULL, *map = NULL; char *sconfig = NULL, *sgif = NULL, *smap = NULL; char *optarg; int i; /* globals */ xsize = 100, ysize = 100; rounds = 6; do { /***************************************************************/ /* 0 : read program arguments */ while ( ( i = getopt1( argc, argv, "o:i:r:m:", &optarg ) ) != EOF ) { switch ( i ) { case 'i': sconfig = optarg; break; case 'o': sgif = optarg; break; case 'm': smap = optarg; break; case 'r': rounds = atoi (optarg); if ( rounds < 1 ) { print_error(); exit (0); }; break; case '?': print_error(); exit (0); break; default: break; } } if ( sconfig == NULL || sgif == NULL ) { print_error(); break; } /***************************************************************/ /* 1 : OPEN FILES */ config = fopen ( sconfig, "r" ); if ( config == NULL ) { fprintf ( stderr, "Error opening %s.\n", sconfig ); break; } gif = fopen ( sgif, "wb" ); if ( gif == NULL ) { fprintf ( stderr, "Error opening %s.\n", sgif ); fclose ( config ); break; } if ( smap != NULL ) { map = fopen ( smap, "w" ); if ( map == NULL ) { fprintf ( stderr, "Error opening %s.\n", sgif ); fclose ( config ); fclose ( gif ); break; } fprintf ( map, " <map name=\"map1\">\n" ); } /***************************************************************/ /* 2 : SCAN CONFIG FILE */ pcurrententry = NULL; pfirstentry = NULL; pareaentry = NULL; for ( i = 0; i < 256; i++ ) { colorratetable[i] = 0; } for ( i = 32; i < 256; i++ ) { colortable[i] = 0; } while ( TRUE ) { struct sfigrec figrec; /********************************************/ /* get one fig record */ if ( getfig ( config, &figrec ) == TRUE ) break; switch (figrec.type) { case COLORDEF: if ( figrec.colorindex < 256 ) colortable[figrec.colorindex] = figrec.color; /*printf ( "color table[%i] : %i.\n", figrec.colorindex, colortable[figrec.colorindex] );*/ break; case TEXT: if ( new_entry() == FALSE ) break; pcurrententry->type = UNKNOWN; pcurrententry->color = figrec.color; pcurrententry->depth = figrec.depth; if ( strncmp("color:", figrec.text, 6 ) == 0 ) { /* special 'color:' text */ i = atoi ( figrec.text+6 ); if ( i < 256 ) colorratetable[i] = figrec.color; /*printf ( "color rate[%i] : %i.\n", i, colorratetable[i] );*/ break; } if ( (pcurrententry->str = malloc ( strlen(figrec.text) + 1 )) == NULL ) { fprintf ( stderr, "Error : memory allocation failure.\n" ); break; } if ( (pcurrententry->coords = (int *)malloc(figrec.npoints * (sizeof (int)) * 2 )) == NULL ) { fprintf ( stderr, "Error : memory allocation failure.\n" ); break; } pcurrententry->type = TEXT; pcurrententry->npoints = figrec.npoints; pcurrententry->orientation = figrec.angle; strcpy (pcurrententry->str,figrec.text); memcpy (pcurrententry->coords,figrec.coords,figrec.npoints * (sizeof (int)) * 2); break; case POLY: case RECT: if ( new_entry() == FALSE ) break; pcurrententry->type = UNKNOWN; pcurrententry->depth = figrec.depth; pcurrententry->color = figrec.color; pcurrententry->fillcolor = figrec.fillcolor; if ( (pcurrententry->coords = (int *)malloc(figrec.npoints * (sizeof (int)) * 2 )) == NULL ) { fprintf ( stderr, "Error : memory allocation failure.\n" ); continue; } pcurrententry->type = figrec.type; pcurrententry->npoints = figrec.npoints; memcpy (pcurrententry->coords,figrec.coords,figrec.npoints * (sizeof (int)) * 2); break; case COMPOUND: /* compound must be links ... */ if ( new_entry() == FALSE ) break; do { if ( getfig ( config, &figrec ) == TRUE ) break; if ( figrec.type == ENDCOMPOUND ) break; if ( figrec.type == TEXT ) { /*printf (" txt %s.\n", figrec.text );*/ if ( strncmp("gifarea", figrec.text, 7 ) == 0 ) { pcurrententry->type = GIFAREA; pareaentry = pcurrententry; /*printf ( " gifarea : [%i / %i] ", pcurrententry->coords[0], pcurrententry->coords[1]); printf ( " [%i / %i].\n", pcurrententry->coords[2], pcurrententry->coords[3]);*/ } else if ( strncmp("url:", figrec.text, 4 ) == 0 ) { if ( (pcurrententry->str = malloc ( strlen(figrec.text) + 1 )) == NULL ) { fprintf ( stderr, "Error : memory allocation failure.\n" ); break; } pcurrententry->type = URL; strcpy (pcurrententry->str,figrec.text+4); /*printf (" url %s.\n", pcurrententry->str );*/ } else if ( strncmp("log:", figrec.text, 4 ) == 0 ) { char * s = figrec.text + 4; if ( s[0] == '>' ) { pcurrententry->orientation = OUT; s++; } else if ( s[0] == '<' ) { pcurrententry->orientation = IN; s++; } else { pcurrententry->orientation = INOUT; } if ( (pcurrententry->str = malloc ( strlen(s) + 1 )) == NULL ) { fprintf ( stderr, "Error : memory allocation failure.\n" ); break; } pcurrententry->type = LINK; strcpy (pcurrententry->str,s); /*printf (" str %s.\n", pcurrententry->str );*/ } else if ( strncmp("speed:", figrec.text, 6 ) == 0 ) { pcurrententry->maxrate = atoi ( figrec.text+6 ); /*printf (" max rate : %i.\n", pcurrententry->maxrate );*/ } } if ( (figrec.type == POLY) || (figrec.type == RECT) ) { pcurrententry->color = figrec.color; /* default color */ pcurrententry->depth = figrec.depth; pcurrententry->fillcolor = figrec.fillcolor; if ( (pcurrententry->coords = (int *)malloc(figrec.npoints * (sizeof (int)) * 2 )) == NULL ) { fprintf ( stderr, "Error : memory allocation failure.\n" ); break; } pcurrententry->npoints = figrec.npoints; memcpy (pcurrententry->coords,figrec.coords,figrec.npoints * (sizeof (int)) * 2); } } while ( 1 ); if ( pcurrententry->type==LINK && pcurrententry->coords != NULL ) { read_entry ( pcurrententry ); /*printf (" link : log : %s.log, max rate : %i.\n", pcurrententry->str, pcurrententry->maxrate );*/ } break; case ENDCOMPOUND: case UNKNOWN: default: break; } } /***************************************************************/ /* checks */ if ( pareaentry == NULL ) { fprintf ( stderr, "Error : no gif area specified.\n"); break; } xsize = (pareaentry->coords[2] - pareaentry->coords[0]); ysize = (pareaentry->coords[3] - pareaentry->coords[1]); xoffset = pareaentry->coords[0]; yoffset = pareaentry->coords[1]; /*printf ( "size : %i %i.\n", xsize, ysize ); printf ( "offset : %i %i.\n", xoffset, yoffset );*/ /***************************************************************/ /* do translations */ pcurrententry = pfirstentry; while ( pcurrententry != NULL ) { for (i = 0; i < pcurrententry->npoints; i ++) { pcurrententry->coords[i*2] -= xoffset; pcurrententry->coords[i*2+1] -= yoffset; pcurrententry->coords[i*2] /= scale; pcurrententry->coords[i*2+1] /= scale; } if ( smap != NULL ) { if ( pcurrententry->type==URL && pcurrententry->coords != NULL ) { fprintf ( map, " <area href=%s alt=\"%s\" shape=rect coords=\"%i,%i,%i,%i\">\n", pcurrententry->str,pcurrententry->str, pcurrententry->coords[0],pcurrententry->coords[1], pcurrententry->coords[2],pcurrententry->coords[3] ); } } pcurrententry = pcurrententry->next; } xsize /= scale; ysize /=scale; /***************************************************************/ /* 3 : draw gif file */ draw_gif ( gif ); /***************************************************************/ /* 4 : clean-up all */ { struct sentry * pentry; pcurrententry = pfirstentry; do { pentry = pcurrententry->next; free_entry(pcurrententry); pcurrententry = pentry; } while ( pentry != NULL ); } fclose ( gif ); fclose ( config ); if ( smap != NULL ) { /*<area href=lk311.html alt="lk311.html" shape=rect coords="240,12,270,24">*/ fprintf ( map, " </map>\n" ); fclose ( map ); } break; } while ( TRUE ); }