Imported Debian patch 2.23.05-1
[hcoop/zz_old/debian/webalizer.git] / debian / patches / 05_apache_logio.diff
CommitLineData
dc9c5d88
FAW
1From: Jose Carlos Medeiros <debian@psabs.com.br>
2Subject: Added logio support for new apache2 mod_logio logfiles
3
4Origin: http://www.rexursive.com/software/apache.html
5
6This is based on previous patch [1] already adapted from the original patch [2]
7to integrate with other patches in debian package.
8A fix for upstream patch [3] is integrated.
9The patch was ported to webalizer 2.21-02
10by Julien Viard de Galbert <julien@vdg.blogsite.org>
11And later adapted to webalizer 2.23-03 with the help
12from Pim van den Berg <pim@nethuis.nl>, Thanks !
13
14 1: 05_apache_logio.dpatch by Jose Carlos Medeiros <debian@psabs.com.br>
15 2: ftp://ftp.rexursive.com/pub/webalizer/webalizer-in-out.patch.gz
16 3: ftp://ftp.rexursive.com/pub/webalizer/webalizer-in-out-fix.patch.gz
17
18Index: webalizer/README.FIRST
19===================================================================
20--- webalizer.orig/README.FIRST 2011-04-18 23:54:32.000000000 +0200
21+++ webalizer/README.FIRST 2011-04-18 23:56:44.000000000 +0200
22@@ -19,3 +19,12 @@
23 in the subject. Please do not send HTML formatted e-mails or e-mail
24 containing HTML tags as my mail server will reject them. Thanks!
25
26+################### SUMMARY 05_apache_logio ##########################
27+
28+##################
29+# This Webalizer 2.01-10 patch intoduces necessary logic for presenting the
30+# numbers collected by mod_logio in the reports. There are no special
31+# configuration options required, just patch the Webalizer, configure it
32+# with the options you prefer, build it, install it and use it.
33+##################
34+
35Index: webalizer/graphs.c
36===================================================================
37--- webalizer.orig/graphs.c 2011-04-18 23:54:32.000000000 +0200
38+++ webalizer/graphs.c 2011-04-18 23:56:44.000000000 +0200
39@@ -51,6 +51,8 @@
40 #define FILECOLOR file_or_blue /* files */
41 #define SITECOLOR site_or_orange /* sites */
42 #define KBYTECOLOR kbyte_or_red /* KBytes */
43+#define IKBYTECOLOR file_or_blue /* In KBytes */
44+#define OKBYTECOLOR hit_or_green /* Out KBytes */
45 #define PAGECOLOR page_or_cyan /* Files */
46 #define VISITCOLOR visit_or_yellow /* Visits */
47
48@@ -106,7 +108,7 @@
49 {
50
51 /* local variables */
52- int i,j,x1,y1,x2;
53+ int i,j,k,x1,y1,x2;
54 int s_mth,s_year=0;
55 float cw,cs,co,ci;
56
57@@ -139,10 +141,24 @@
58 {
59 /* Kbytes Legend */
60 i = (strlen(msg_h_xfer)*6);
61- gdImageString(im,gdFontSmall,491-i,237,
62+ j = (strlen(msg_h_ixfer)*6);
63+ k = (strlen(msg_h_oxfer)*6);
64+ gdImageString(im,gdFontSmall,491-i-j-k-24,237,
65 (unsigned char *)msg_h_xfer,dkgrey);
66- gdImageString(im,gdFontSmall,490-i,236,
67+ gdImageString(im,gdFontSmall,490-i-j-k-24,236,
68 (unsigned char *)msg_h_xfer,KBYTECOLOR);
69+ gdImageString(im,gdFontSmall,491-k-j-21,237,"/",dkgrey);
70+ gdImageString(im,gdFontSmall,490-k-j-21,236,"/",black);
71+ gdImageString(im,gdFontSmall,491-k-j-12,237,
72+ (unsigned char *)msg_h_ixfer,dkgrey);
73+ gdImageString(im,gdFontSmall,490-k-j-12,236,
74+ (unsigned char *)msg_h_ixfer,IKBYTECOLOR);
75+ gdImageString(im,gdFontSmall,491-k-9,237,"/",dkgrey);
76+ gdImageString(im,gdFontSmall,490-k-9,236,"/",black);
77+ gdImageString(im,gdFontSmall,491-k,237,
78+ (unsigned char *)msg_h_oxfer,dkgrey);
79+ gdImageString(im,gdFontSmall,490-k,236,
80+ (unsigned char *)msg_h_oxfer,OKBYTECOLOR);
81
82 /* Sites/Visits Legend */
83 i = (strlen(msg_h_visits)*6);
84@@ -303,28 +319,56 @@
85 }
86
87 fmaxval=0.0;
88- for (i=s_mth; i<HISTSIZE; i++)
89+ for (i=s_mth; i<HISTSIZE; i++){
90 if (data[i].xfer > fmaxval) fmaxval = data[i].xfer;
91+ if (data[i].ixfer > fmaxval) fmaxval = data[i].ixfer;
92+ if (data[i].oxfer > fmaxval) fmaxval = data[i].oxfer;
93+ }
94 if (fmaxval <= 0.0) fmaxval = 1.0;
95 sprintf(maxvaltxt, "%.0f", fmaxval);
96 gdImageStringUp(im, gdFontSmall,493,130+(strlen(maxvaltxt)*6),
97 (unsigned char *)maxvaltxt,black);
98
99- cs = 180.0/graph_mths; cw = (cs/2)+(co/2);
100- ci = 308+((cw-co)/2);
101+ cs = 180.0/graph_mths; cw = (cs/2);
102+ co = (36/graph_mths<1)?1:36/graph_mths;
103+ ci = 308+((cw-2*co)/2);
104
105 /* xfer */
106 for (i=s_mth; i<HISTSIZE; i++)
107 {
108 percent = ((float)data[i].xfer / (float)fmaxval);
109 if (percent <= 0.0) continue;
110- x1 = ci+ ((i-s_mth)*cs);
111+ x1 = ci + ((i-s_mth)*cs);
112 x2 = x1 + cw;
113 y1 = 232 - (percent * 98);
114 gdImageFilledRectangle(im, x1, y1, x2, 232, KBYTECOLOR);
115 if (cw>2) gdImageRectangle(im, x1, y1, x2, 232, black);
116 }
117
118+ /* ixfer */
119+ for (i=s_mth; i<HISTSIZE; i++)
120+ {
121+ percent = ((float)data[i].ixfer / (float)fmaxval);
122+ if (percent <= 0.0) continue;
123+ x1 = ci + co + ((i-s_mth)*cs);
124+ x2 = x1 + cw;
125+ y1 = 232 - (percent * 98);
126+ gdImageFilledRectangle(im, x1, y1, x2, 232, IKBYTECOLOR);
127+ if (cw>2) gdImageRectangle(im, x1, y1, x2, 232, black);
128+ }
129+
130+ /* oxfer */
131+ for (i=s_mth; i<HISTSIZE; i++)
132+ {
133+ percent = ((float)data[i].oxfer / (float)fmaxval);
134+ if (percent <= 0.0) continue;
135+ x1 = ci + co + co + ((i-s_mth)*cs);
136+ x2 = x1 + cw;
137+ y1 = 232 - (percent * 98);
138+ gdImageFilledRectangle(im, x1, y1, x2, 232, OKBYTECOLOR);
139+ if (cw>2) gdImageRectangle(im, x1, y1, x2, 232, black);
140+ }
141+
142 /* stat the file */
143 if ( !(lstat(fname, &out_stat)) )
144 {
145@@ -365,8 +409,10 @@
146 u_int64_t data2[31], /* data2 (files) */
147 u_int64_t data3[31], /* data3 (sites) */
148 double data4[31], /* data4 (kbytes) */
149- u_int64_t data5[31], /* data5 (views) */
150- u_int64_t data6[31]) /* data6 (visits) */
151+ double data5[31], /* data4 (kbytes) */
152+ double data6[31], /* data4 (kbytes) */
153+ u_int64_t data7[31], /* data5 (views) */
154+ u_int64_t data8[31]) /* data6 (visits) */
155 {
156
157 /* local variables */
158@@ -415,7 +461,7 @@
159 {
160 if (data1[i] > maxval) maxval = data1[i]; /* get max val */
161 if (data2[i] > maxval) maxval = data2[i];
162- if (data5[i] > maxval) maxval = data5[i];
163+ if (data7[i] > maxval) maxval = data7[i];
164 }
165 if (maxval <= 0) maxval = 1;
166 sprintf(maxvaltxt, "%llu", maxval);
167@@ -425,22 +471,36 @@
168 if (graph_legend) /* Print color coded legends? */
169 {
170 /* Kbytes Legend */
171+ i=(strlen(msg_h_xfer)*6);
172+ j=(strlen(msg_h_ixfer)*6);
173 gdImageStringUp(im,gdFontSmall,494,376,
174 (unsigned char *)msg_h_xfer,dkgrey);
175 gdImageStringUp(im,gdFontSmall,493,375,
176 (unsigned char *)msg_h_xfer,KBYTECOLOR);
177+ gdImageStringUp(im,gdFontSmall,494,376-i-3,"/",dkgrey);
178+ gdImageStringUp(im,gdFontSmall,493,375-i-3,"/",black);
179+ gdImageStringUp(im,gdFontSmall,494,376-i-12,
180+ (unsigned char *)msg_h_ixfer,dkgrey);
181+ gdImageStringUp(im,gdFontSmall,493,375-i-12,
182+ (unsigned char *)msg_h_ixfer,IKBYTECOLOR);
183+ gdImageStringUp(im,gdFontSmall,494,376-i-j-15,"/",dkgrey);
184+ gdImageStringUp(im,gdFontSmall,493,375-i-j-15,"/",black);
185+ gdImageStringUp(im,gdFontSmall,494,376-i-j-24,
186+ (unsigned char *)msg_h_oxfer,dkgrey);
187+ gdImageStringUp(im,gdFontSmall,493,375-i-j-24,
188+ (unsigned char *)msg_h_oxfer,OKBYTECOLOR);
189
190 /* Sites/Visits Legend */
191 i = (strlen(msg_h_sites)*6);
192- gdImageStringUp(im,gdFontSmall,494,276,
193+ gdImageStringUp(im,gdFontSmall,494,256,
194 (unsigned char *)msg_h_sites,dkgrey);
195- gdImageStringUp(im,gdFontSmall,493,275,
196+ gdImageStringUp(im,gdFontSmall,493,255,
197 (unsigned char *)msg_h_sites,SITECOLOR);
198- gdImageStringUp(im,gdFontSmall,494,276-i-3,(unsigned char *)"/",dkgrey);
199- gdImageStringUp(im,gdFontSmall,493,275-i-3,(unsigned char *)"/",black);
200- gdImageStringUp(im,gdFontSmall,494,276-i-12,
201+ gdImageStringUp(im,gdFontSmall,494,256-i-3,(unsigned char *)"/",dkgrey);
202+ gdImageStringUp(im,gdFontSmall,493,255-i-3,(unsigned char *)"/",black);
203+ gdImageStringUp(im,gdFontSmall,494,256-i-12,
204 (unsigned char *)msg_h_visits,dkgrey);
205- gdImageStringUp(im,gdFontSmall,493,275-i-12,
206+ gdImageStringUp(im,gdFontSmall,493,255-i-12,
207 (unsigned char *)msg_h_visits,VISITCOLOR);
208
209 /* Pages/Files/Hits Legend */
210@@ -489,11 +549,11 @@
211 gdImageRectangle(im, x1, y1, x2, 176, black);
212 }
213
214- /* data5 */
215+ /* data7 */
216 for (i=0; i<31; i++)
217 {
218- if (data5[i]==0) continue;
219- percent = ((float)data5[i] / (float)maxval);
220+ if (data7[i]==0) continue;
221+ percent = ((float)data7[i] / (float)maxval);
222 if (percent <= 0.0) continue;
223 x1 = 29 + (i*15);
224 x2 = x1 + 7;
225@@ -507,7 +567,7 @@
226 for (i=0; i<31; i++)
227 {
228 if (data3[i]>maxval) maxval = data3[i];
229- if (data6[i]>maxval) maxval = data6[i];
230+ if (data8[i]>maxval) maxval = data8[i];
231 }
232 if (maxval <= 0) maxval = 1;
233 sprintf(maxvaltxt, "%llu", maxval);
234@@ -517,7 +577,7 @@
235 /* data 6 */
236 for (i=0; i<31; i++)
237 {
238- percent = ((float)data6[i] / (float)maxval);
239+ percent = ((float)data8[i] / (float)maxval);
240 if (percent <= 0.0) continue;
241 x1 = 25 + (i*15);
242 x2 = x1 + 8;
243@@ -538,26 +598,55 @@
244 gdImageRectangle(im, x1, y1, x2, 276, black);
245 }
246
247- /* data4 */
248+ /* xfer */
249 fmaxval=0.0;
250- for (i=0; i<31; i++)
251+ for (i=0; i<31; i++){
252 if (data4[i]>fmaxval) fmaxval = data4[i];
253+ if (data5[i]>fmaxval) fmaxval = data5[i];
254+ if (data6[i]>fmaxval) fmaxval = data6[i];
255+ }
256 if (fmaxval <= 0.0) fmaxval = 1.0;
257 sprintf(maxvaltxt, "%.0f", fmaxval/1024);
258 gdImageStringUp(im, gdFontSmall,8,280+(strlen(maxvaltxt)*6),
259 (unsigned char *)maxvaltxt, black);
260
261+ /* data4 */
262 for (i=0; i<31; i++)
263 {
264 percent = data4[i] / fmaxval;
265 if (percent <= 0.0) continue;
266- x1 = 26 + (i*15);
267- x2 = x1 + 10;
268+ x1 = 25 + (i*15);
269+ x2 = x1 + 7;
270 y1 = 375 - ( percent * 91 );
271 gdImageFilledRectangle(im, x1, y1, x2, 375, KBYTECOLOR);
272 gdImageRectangle(im, x1, y1, x2, 375, black);
273 }
274
275+ /* data5 */
276+ for (i=0; i<31; i++)
277+ {
278+ percent = data5[i] / fmaxval;
279+ if (percent <= 0.0) continue;
280+ x1 = 27 + (i*15);
281+ x2 = x1 + 7;
282+ y1 = 375 - ( percent * 91 );
283+ gdImageFilledRectangle(im, x1, y1, x2, 375, IKBYTECOLOR);
284+ gdImageRectangle(im, x1, y1, x2, 375, black);
285+ }
286+
287+ /* data6 */
288+ for (i=0; i<31; i++)
289+ {
290+ percent = data6[i] / fmaxval;
291+ if (percent <= 0.0) continue;
292+ x1 = 29 + (i*15);
293+ x2 = x1 + 7;
294+ y1 = 375 - ( percent * 91 );
295+ gdImageFilledRectangle(im, x1, y1, x2, 375, OKBYTECOLOR);
296+ gdImageRectangle(im, x1, y1, x2, 375, black);
297+ }
298+
299+
300 /* stat the file */
301 if ( !(lstat(fname, &out_stat)) )
302 {
303Index: webalizer/graphs.h
304===================================================================
305--- webalizer.orig/graphs.h 2011-04-18 23:54:32.000000000 +0200
306+++ webalizer/graphs.h 2011-04-18 23:56:44.000000000 +0200
307@@ -2,7 +2,8 @@
308 #define _GRAPHS_H
309
310 extern int month_graph6(char *, char *, int, int, u_int64_t *,
311- u_int64_t *, u_int64_t *, double *, u_int64_t *, u_int64_t *);
312+ u_int64_t *, u_int64_t *, double *, double *, double *, u_int64_t *,
313+ u_int64_t *);
314 extern int year_graph6x(char *, char *, struct hist_rec *);
315 extern int day_graph3(char *, char *, u_int64_t *, u_int64_t *, u_int64_t *);
316 extern int pie_chart(char *, char *, u_int64_t, u_int64_t *, char **);
317Index: webalizer/hashtab.c
318===================================================================
319--- webalizer.orig/hashtab.c 2011-04-18 23:54:39.000000000 +0200
320+++ webalizer/hashtab.c 2011-04-18 23:56:44.000000000 +0200
321@@ -155,6 +155,8 @@
322 u_int64_t count, /* hit count */
323 u_int64_t file, /* File flag */
324 double xfer, /* xfer size */
325+ double ixfer, /* in xfer size */
326+ double oxfer, /* out xfer size */
327 u_int64_t *ctr, /* counter */
328 u_int64_t visit, /* visits */
329 u_int64_t tstamp,/* timestamp */
330@@ -177,6 +179,8 @@
331 nptr->count = count;
332 nptr->files = file;
333 nptr->xfer = xfer;
334+ nptr->ixfer = ixfer;
335+ nptr->oxfer = oxfer;
336 nptr->next = NULL;
337 htab[hval] = nptr;
338 if (type!=OBJ_GRP) (*ctr)++;
339@@ -219,9 +223,11 @@
340 if ((type==cptr->flag)||((type!=OBJ_GRP)&&(cptr->flag!=OBJ_GRP)))
341 {
342 /* found... bump counter */
343- cptr->count+=count;
344- cptr->files+=file;
345- cptr->xfer +=xfer;
346+ cptr->count +=count;
347+ cptr->files +=file;
348+ cptr->xfer +=xfer;
349+ cptr->ixfer +=ixfer;
350+ cptr->oxfer +=oxfer;
351
352 if (ispage(log_rec.url))
353 {
354@@ -253,6 +259,8 @@
355 nptr->count = count;
356 nptr->files = file;
357 nptr->xfer = xfer;
358+ nptr->ixfer = ixfer;
359+ nptr->oxfer = oxfer;
360 nptr->next = htab[hval];
361 htab[hval]=nptr;
362 if (type!=OBJ_GRP) (*ctr)++;
363@@ -361,6 +369,7 @@
364 /*********************************************/
365
366 int put_unode(char *str, int type, u_int64_t count, double xfer,
367+ double ixfer, double oxfer,
368 u_int64_t *ctr, u_int64_t entry, u_int64_t exit, UNODEPTR *htab)
369 {
370 UNODEPTR cptr,nptr;
371@@ -378,6 +387,8 @@
372 nptr->flag = type;
373 nptr->count= count;
374 nptr->xfer = xfer;
375+ nptr->ixfer= ixfer;
376+ nptr->oxfer= oxfer;
377 nptr->next = NULL;
378 nptr->entry= entry;
379 nptr->exit = exit;
380@@ -395,8 +406,10 @@
381 if ((type==cptr->flag)||((type!=OBJ_GRP)&&(cptr->flag!=OBJ_GRP)))
382 {
383 /* found... bump counter */
384- cptr->count+=count;
385- cptr->xfer += xfer;
386+ cptr->count +=count;
387+ cptr->xfer += xfer;
388+ cptr->ixfer += ixfer;
389+ cptr->oxfer += oxfer;
390 return 0;
391 }
392 }
393@@ -408,6 +421,8 @@
394 nptr->flag = type;
395 nptr->count= count;
396 nptr->xfer = xfer;
397+ nptr->ixfer= ixfer;
398+ nptr->oxfer= oxfer;
399 nptr->next = htab[hval];
400 nptr->entry= entry;
401 nptr->exit = exit;
402@@ -846,6 +861,8 @@
403 u_int64_t count, /* hit count */
404 u_int64_t file, /* File flag */
405 double xfer, /* xfer size */
406+ double ixfer, /* in xfer size */
407+ double oxfer, /* out xfer size */
408 u_int64_t *ctr, /* counter */
409 u_int64_t visit, /* visits */
410 u_int64_t tstamp,/* timestamp */
411@@ -867,6 +884,8 @@
412 nptr->count = count;
413 nptr->files = file;
414 nptr->xfer = xfer;
415+ nptr->ixfer = ixfer;
416+ nptr->oxfer = oxfer;
417 nptr->next = NULL;
418 htab[hval] = nptr;
419 if (type!=OBJ_GRP) (*ctr)++;
420@@ -893,9 +912,11 @@
421 if ((type==cptr->flag)||((type!=OBJ_GRP)&&(cptr->flag!=OBJ_GRP)))
422 {
423 /* found... bump counter */
424- cptr->count+=count;
425- cptr->files+=file;
426- cptr->xfer +=xfer;
427+ cptr->count +=count;
428+ cptr->files +=file;
429+ cptr->xfer +=xfer;
430+ cptr->ixfer +=ixfer;
431+ cptr->oxfer +=oxfer;
432
433 if (ispage(log_rec.url))
434 {
435@@ -915,6 +936,8 @@
436 nptr->count = count;
437 nptr->files = file;
438 nptr->xfer = xfer;
439+ nptr->ixfer = ixfer;
440+ nptr->oxfer = oxfer;
441 nptr->next = htab[hval];
442 htab[hval] = nptr;
443 if (type!=OBJ_GRP) (*ctr)++;
444Index: webalizer/hashtab.h
445===================================================================
446--- webalizer.orig/hashtab.h 2011-04-18 23:54:32.000000000 +0200
447+++ webalizer/hashtab.h 2011-04-18 23:56:44.000000000 +0200
448@@ -32,6 +32,8 @@
449 u_int64_t tstamp;
450 char *lasturl;
451 double xfer;
452+ double ixfer;
453+ double oxfer;
454 struct hnode *next; };
455
456 struct unode { char *string; /* url hash table structure */
457@@ -41,6 +43,8 @@
458 u_int64_t entry; /* entry page counter */
459 u_int64_t exit; /* exit page counter */
460 double xfer; /* xfer size in bytes */
461+ double ixfer; /* in xfer size in bytes */
462+ double oxfer; /* out xfer size in bytes */
463 struct unode *next; }; /* pointer to next node */
464
465 struct rnode { char *string; /* referrer hash table struct */
466@@ -64,6 +68,8 @@
467 u_int64_t visit;
468 u_int64_t tstamp;
469 double xfer;
470+ double ixfer;
471+ double oxfer;
472 struct inode *next; };
473
474 extern HNODEPTR sm_htab[MAXHASH]; /* hash tables */
475@@ -77,11 +83,11 @@
476 extern DNODEPTR host_table[MAXHASH]; /* DNS resolver table */
477 #endif
478
479-extern int put_hnode(char *, int, u_int64_t, u_int64_t, double,
480+extern int put_hnode(char *, int, u_int64_t, u_int64_t, double, double, double,
481 u_int64_t *, u_int64_t, u_int64_t, char *, HNODEPTR *);
482-extern int put_unode(char *, int, u_int64_t, double, u_int64_t *,
483+extern int put_unode(char *, int, u_int64_t, double, double, double, u_int64_t *,
484 u_int64_t, u_int64_t, UNODEPTR *);
485-extern int put_inode(char *, int, u_int64_t, u_int64_t, double,
486+extern int put_inode(char *, int, u_int64_t, u_int64_t, double, double, double,
487 u_int64_t *, u_int64_t, u_int64_t, INODEPTR *);
488 extern int put_rnode(char *, int, u_int64_t, u_int64_t *, RNODEPTR *);
489 extern int put_anode(char *, int, u_int64_t, u_int64_t *, ANODEPTR *);
490Index: webalizer/lang.h
491===================================================================
492--- webalizer.orig/lang.h 2011-04-18 23:54:32.000000000 +0200
493+++ webalizer/lang.h 2011-04-18 23:56:44.000000000 +0200
494@@ -108,6 +108,8 @@
495 extern char *msg_h_files ;
496 extern char *msg_h_sites ;
497 extern char *msg_h_xfer ;
498+extern char *msg_h_ixfer ;
499+extern char *msg_h_oxfer ;
500 extern char *msg_h_hname ;
501 extern char *msg_h_url ;
502 extern char *msg_h_agent ;
503@@ -132,6 +134,8 @@
504 extern char *msg_mtot_th ;
505 extern char *msg_mtot_tf ;
506 extern char *msg_mtot_tx ;
507+extern char *msg_mtot_ix ;
508+extern char *msg_mtot_ox ;
509 extern char *msg_mtot_us ;
510 extern char *msg_mtot_ur ;
511 extern char *msg_mtot_ua ;
512@@ -144,6 +148,8 @@
513 extern char *msg_mtot_msd;
514 extern char *msg_mtot_mvd;
515 extern char *msg_mtot_mkd;
516+extern char *msg_mtot_ikd;
517+extern char *msg_mtot_okd;
518 extern char *msg_mtot_rc ;
519
520 extern char *msg_dtot_ds ;
521Index: webalizer/lang/webalizer_lang.catalan
522===================================================================
523--- webalizer.orig/lang/webalizer_lang.catalan 2011-04-18 23:54:39.000000000 +0200
524+++ webalizer/lang/webalizer_lang.catalan 2011-04-18 23:56:44.000000000 +0200
525@@ -224,7 +224,9 @@
526 char *msg_h_visits= "Visites";
527 char *msg_h_files = "Fitxers";
528 char *msg_h_sites = "Navegadors";
529-char *msg_h_xfer = "KBytes";
530+char *msg_h_xfer = "kB F";
531+char *msg_h_ixfer = "kB In";
532+char *msg_h_oxfer = "kB Out";
533 char *msg_h_hname = "Visitant";
534 char *msg_h_url = "URL";
535 char *msg_h_agent = "Navegador";
536@@ -251,6 +253,8 @@
537 char *msg_mtot_th = "Accessos totals";
538 char *msg_mtot_tf = "Fitxers totals";
539 char *msg_mtot_tx = "KBytes totals";
540+char *msg_mtot_ix = "In KBytes totals";
541+char *msg_mtot_ox = "Out KBytes totals";
542 char *msg_mtot_us = "Servidors totals";
543 char *msg_mtot_ur = "Referents totals";
544 char *msg_mtot_ua = "Navegadors totals";
545@@ -263,6 +267,8 @@
546 char *msg_mtot_msd= "Servidors per dia";
547 char *msg_mtot_mvd= "Visites per dia";
548 char *msg_mtot_mkd= "KBytes per dia";
549+char *msg_mtot_ikd= "In KBytes per dia";
550+char *msg_mtot_okd= "Out KBytes per dia";
551 char *msg_mtot_rc = "Accessos segons codi de resposta";
552
553 /* daily total table */
554Index: webalizer/lang/webalizer_lang.chinese
555===================================================================
556--- webalizer.orig/lang/webalizer_lang.chinese 2011-04-18 23:54:32.000000000 +0200
557+++ webalizer/lang/webalizer_lang.chinese 2011-04-18 23:56:44.000000000 +0200
558@@ -218,7 +218,9 @@
559 char *msg_h_visits= "Visits";
560