]> git.ipfire.org Git - thirdparty/sarg.git/blame - grepday.c
Use string pointers in getword instead of copying the strings
[thirdparty/sarg.git] / grepday.c
CommitLineData
25697a35 1/*
c37945ed
FM
2 * AUTHOR: Pedro Lineu Orso pedro.orso@gmail.com
3 * 1998, 2008
94ff9470 4 * SARG Squid Analysis Report Generator http://sarg.sourceforge.net
25697a35
GS
5 *
6 * SARG donations:
7 * please look at http://sarg.sourceforge.net/donations.php
8 * ---------------------------------------------------------------------
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
23 *
24 */
25
26#include "include/conf.h"
5f3cfd1d 27#include "include/defs.h"
25697a35 28
17c89803
FM
29#if defined(HAVE_GD) && defined(HAVE_ICONV_H) && defined(gdFTEX_Unicode)
30
c274f011
FM
31static int blue;
32static int white;
33static int lavender;
34static int darkblue;
35static int dimgray;
36static int goldenrod;
37static int goldenrod2;
38static int gray;
39static int silver;
40static int black;
41//static char *font1 = FONTDIR"/FreeSans.ttf";
42static char *font1 = FONTDIR"/DejaVuSans.ttf";
25697a35 43
25697a35
GS
44#include <iconv.h>
45#define SARGgdImageStringFT I18NgdImageStringFT
46
c274f011 47static char * I18NgdImageStringFT (gdImage * im, int *brect, int fg, char *fontlist,
d6e703cc 48 double ptsize, double angle, int x, int y, char *string)
25697a35 49{
1dd9dcec
FM
50 iconv_t localtoutf;
51 char *sstring, *str, *sstr, *retval;
52 size_t slen, sslen;
53
54 slen = strlen(string) + 1; // We must include string termination character
55 sslen = slen * 2; // We assume that UTF8 maximum 2 times large than local
56 sstring = (char *)malloc(sslen);
57 if (!sstring) {
db00db2d 58 fprintf(stderr, "SARG: %s (%zu):\n",text[59],sslen);
1dd9dcec
FM
59 exit(1);
60 }
25697a35 61
1dd9dcec
FM
62 str = (char *) string;
63 sstr = (char *) sstring;
25697a35 64
1dd9dcec
FM
65 localtoutf = iconv_open ("UTF-8", CharSet);
66 iconv (localtoutf, (ICONV_CONST char **)&str, &slen, &sstr, &sslen);
67 iconv_close (localtoutf);
25697a35 68
1dd9dcec
FM
69 retval = gdImageStringFTEx (im, brect, fg, fontlist, ptsize, angle, x, y, sstring, gdFTEX_Unicode);
70 free(sstring);
25697a35 71
1dd9dcec 72 return retval;
25697a35
GS
73}
74#else
75#define SARGgdImageStringFT gdImageStringFT
76#endif
77
17c89803 78#ifdef HAVE_GD
c274f011 79static void bar(int x1,long long int n)
1dd9dcec 80{
25697a35
GS
81 gdPoint points[4];
82 int brect[8];
83 int val=0, x;
32e71fa4 84 long long int num;
25697a35
GS
85 char v[15];
86
32e71fa4
FM
87 static const long long int limits[400]={0,500,1000,2000,3000,4000,
88 5000,6000,7000,8000,9000,10000,
89 20000,30000,40000,50000,70000,90000,
90 110000,130000,150000,170000,190000,210000,
91 230000,250000,280000,310000,340000,370000,
92 400000,430000,450000,460000,490000,500000,
93 550000,600000,650000,700000,750000,800000,
94 850000,900000,950000,1000000,1100000,1200000,
95 1300000,1400000,1500000,1600000,1700000,1800000,
96 1900000,2000000,2100000,2200000,2300000,2400000,
97 2500000,2600000,2700000,2800000,2900000,3000000,
98 3100000,3200000,3300000,3400000,3500000,3600000,
99 3700000,3800000,3900000,4000000,4100000,4200000,
100 4300000,4400000,4500000,4600000,4700000,4800000,
101 4900000,5000000,5100000,5200000,5300000,5400000,
102 5500000,5600000,5700000,5800000,5900000,6000000,
103 6100000,6200000,6300000,6400000,6500000,6600000,
104 6700000,6800000,6900000,7000000,7100000,7200000,
105 7300000,7400000,7500000,7600000,7700000,7800000,
106 7900000,8000000,8100000,8200000,8300000,8400000,
107 8500000,8600000,8700000,8800000,8900000,9000000,
108 9100000,9200000,9300000,9400000,9500000,9600000,
109 9700000,9800000,9900000,10000000,10500000,11000000,
110 11500000,12000000,12500000,13000000,13500000,14000000,
111 14500000,15000000,15500000,16000000,16500000,17000000,
112 17500000,18000000,18500000,19000000,19500000,20000000,
113 21000000,22000000,23000000,24000000,25000000,26000000,
114 27000000,28000000,29000000,30000000,31000000,32000000,
115 33000000,34000000,35000000,36000000,37000000,38000000,
116 39000000,40000000,41000000,42000000,43000000,44000000,
117 45000000,46000000,47000000,48000000,49000000,50000000,
118 51000000,52000000,53000000,54000000,55000000,56000000,
119 57000000,58000000,59000000,60000000,61000000,62000000,
120 63000000,64000000,65000000,66000000,67000000,68000000,
121 69000000,70000000,71000000,72000000,73000000,74000000,
122 75000000,76000000,77000000,78000000,79000000,80000000,
123 81000000,82000000,83000000,84000000,85000000,86000000,
124 87000000,88000000,89000000,90000000,91000000,92000000,
125 93000000,94000000,95000000,96000000,97000000,98000000,
126 99000000,100000000,110000000,120000000,130000000,140000000,
127 150000000,160000000,170000000,180000000,190000000,200000000,
128 210000000,220000000,230000000,240000000,250000000,260000000,
129 270000000,280000000,290000000,300000000,310000000,320000000,
130 330000000,340000000,350000000,360000000,370000000,380000000,
131 390000000,400000000,410000000,420000000,430000000,440000000,
132 450000000,460000000,470000000,480000000,490000000,500000000,
133 510000000,520000000,530000000,540000000,550000000,560000000,
134 570000000,580000000,590000000,600000000,610000000,620000000,
135 630000000,640000000,650000000,660000000,670000000,680000000,
136 690000000,700000000,710000000,720000000,730000000,740000000,
137 750000000,760000000,770000000,780000000,790000000,800000000,
138 810000000,820000000,830000000,840000000,850000000,860000000,
139 870000000,880000000,890000000,900000000,910000000,920000000,
140 930000000,940000000,950000000,960000000,970000000,980000000,
141 990000000LL,1000000000LL,1100000000LL,1200000000LL,1300000000LL,1400000000LL,
142 1500000000LL,1600000000LL,1700000000LL,1800000000LL,1900000000LL,2000000000LL,
143 2100000000LL,2200000000LL,2300000000LL,2400000000LL,2500000000LL,2600000000LL,
144 2700000000LL,2800000000LL,2900000000LL,3000000000LL,3100000000LL,3200000000LL,
145 3300000000LL,3400000000LL,3500000000LL,3600000000LL,3700000000LL,3800000000LL,
146 3900000000LL,4000000000LL,4100000000LL,4200000000LL,4300000000LL,4400000000LL,
147 4500000000LL,4600000000LL,4700000000LL,4800000000LL,4900000000LL,5000000000LL};
25697a35
GS
148
149 if(access(font1, R_OK) != 0) {
150 fprintf(stderr, "SARG: (grepday) Fontname: %s not found.\n",font1);
151 exit(1);
152 }
153
154 if(strcmp(GraphDaysBytesBarColor,"orange") == 0) {
155 color1 = gdImageColorAllocate(im, 255, 233, 142);
156 color2 = gdImageColorAllocate(im, 220, 163, 72);
157 color3 = gdImageColorAllocate(im, 255, 198, 107);
158 }
159 if(strcmp(GraphDaysBytesBarColor,"blue") == 0) {
160 color1 = gdImageColorAllocate(im, 62, 80, 167);
161 color2 = gdImageColorAllocate(im, 40, 51, 101);
162 color3 = gdImageColorAllocate(im, 57, 73, 150);
163 }
164 if(strcmp(GraphDaysBytesBarColor,"green") == 0) {
165 color1 = gdImageColorAllocate(im,120,166,129);
166 color2 = gdImageColorAllocate(im,84,113,82);
167 color3 = gdImageColorAllocate(im,158,223,167);
168 }
169 if(strcmp(GraphDaysBytesBarColor,"yellow") == 0) {
170 color1 = gdImageColorAllocate(im,185,185,10);
171 color2 = gdImageColorAllocate(im,111,111,10);
172 color3 = gdImageColorAllocate(im,166,166,10);
173 }
174 if(strcmp(GraphDaysBytesBarColor,"brown") == 0) {
175 color1 = gdImageColorAllocate(im,97,45,27);
176 color2 = gdImageColorAllocate(im,60,30,20);
177 color3 = gdImageColorAllocate(im,88,41,26);
178 }
179 if(strcmp(GraphDaysBytesBarColor,"red") == 0){
180 color1 = gdImageColorAllocate(im,185,10,10);
181 color2 = gdImageColorAllocate(im,111,10,10);
182 color3 = gdImageColorAllocate(im,166,10,10);
183 }
184
185 blue = gdImageColorAllocate(im, 0, 0, 255);
186 white = gdImageColorAllocate(im, 255, 255, 255);
1dd9dcec 187 dimgray = gdImageColorAllocate(im, 105, 105, 105);
25697a35
GS
188 goldenrod = gdImageColorAllocate(im, 234, 234, 174);
189 goldenrod2 = gdImageColorAllocate(im, 207, 181, 59);
190
191 num = n;
32e71fa4 192 val = 55;
25697a35 193 for(x=0; x<=366; x++) {
32e71fa4 194 if(limits[x] >= num) {
25697a35
GS
195 val = 425 - x;
196 break;
197 }
198 }
25697a35
GS
199
200 gdImageFilledRectangle(im, x1, val, x1+11, 425, color3);
201
202 points[0].x = x1+7;
203 points[0].y = val-5;
204 points[1].x = x1;
205 points[1].y = val;
206 points[2].x = x1+11;
207 points[2].y = val;
208 points[3].x = x1+17;
209 points[3].y = val-5;
210 gdImageFilledPolygon(im, points, 4, color1);
211
1dd9dcec 212 gdImageLine(im, x1+8, val-2, x1+8, val-10, dimgray);
25697a35
GS
213 gdImageFilledRectangle(im, x1-2, val-20, x1+18, val-10, goldenrod);
214 gdImageRectangle(im, x1-2, val-20, x1+18, val-10, goldenrod2);
215
216 snprintf(v,6,"%s",fixnum(num,0));
217
218 SARGgdImageStringFT(im,&brect[0],black,font1,6,0.0,x1-1,val-12,v);
1dd9dcec 219
25697a35
GS
220 points[0].x = x1+17;
221 points[0].y = val-5;
222 points[1].x = x1+11;
223 points[1].y = val;
224 points[2].x = x1+11;
225 points[2].y = 426;
226 points[3].x = x1+17;
227 points[3].y = 420;
228 gdImageFilledPolygon(im, points, 4, color2);
229
25697a35
GS
230 return;
231}
17c89803 232#endif
25697a35 233
32e71fa4 234void greport_day(const char *user)
25697a35 235{
17c89803 236#ifdef HAVE_GD
25697a35 237 FILE *fp_in, *pngout;
d6e703cc 238 int x, y;
c274f011 239 int x1;
25697a35
GS
240 int brect[8];
241 char wdirname[MAXLEN];
242 char graph[MAXLEN];
9c7c6346 243 char buf[MAXLEN];
25697a35
GS
244 char wuser[255];
245 char csort[255];
246 char data[20];
247 int count=0;
248 char oday[20];
249 char day[20];
250 char bytes[20];
120d768c 251 char ftime[128];
32e71fa4 252 long long int tot=0;
25697a35
GS
253 time_t t;
254 struct tm *local;
456d78a5 255 int cstatus;
c274f011 256 char s[15];
9c7c6346
FM
257 struct getwordstruct gwarea;
258 struct getwordstruct gwarea1;
c274f011 259
25697a35
GS
260 if(strcmp(Graphs,"yes") != 0) {
261 unlink(wdirname);
262 return;
263 }
264
265 im = gdImageCreate(720, 480);
266
1dd9dcec
FM
267 lavender = gdImageColorAllocate(im, 230, 230, 250);
268 white = gdImageColorAllocate(im, 255, 255, 255);
269 gray = gdImageColorAllocate(im, 192, 192, 192);
270 silver = gdImageColorAllocate(im, 211, 211, 211);
271 black = gdImageColorAllocate(im, 0, 0, 0);
272 blue = gdImageColorAllocate(im, 35, 35, 227);
273 dimgray = gdImageColorAllocate(im, 105, 105, 105);
25697a35
GS
274 darkblue = gdImageColorAllocate(im, 0, 0, 139);
275
276 gdImageRectangle(im, 0, 0, 719, 479, dimgray);
277 gdImageFilledRectangle(im, 60, 60, 700, 420, silver);
278
279 points[0].x = 50;
280 points[0].y = 65;
281 points[1].x = 50;
282 points[1].y = 425;
283 points[2].x = 60;
284 points[2].y = 420;
285 points[3].x = 60;
286 points[3].y = 60;
287 gdImageFilledPolygon(im, points, 4, gray);
288
289 points[0].x = 60;
290 points[0].y = 420;
291 points[1].x = 50;
292 points[1].y = 425;
293 points[2].x = 690;
294 points[2].y = 425;
295 points[3].x = 700;
296 points[3].y = 420;
297 gdImageFilledPolygon(im, points, 4, gray);
1dd9dcec
FM
298
299 gdImageLine(im, 50, 65, 50, 430, black);
300 gdImageLine(im, 45, 425, 690, 425, black);
301 gdImageLine(im, 50, 425, 60, 420, black);
302 gdImageLine(im, 60, 420, 60, 60, black);
303 gdImageLine(im, 700, 60, 700, 420, black);
304 gdImageLine(im, 690, 425, 700, 420, black);
25697a35
GS
305
306 for(x=415; x>=65; x=x-10) {
1dd9dcec
FM
307 gdImageLine(im, 50, x, 60, x-5, dimgray);
308 gdImageLine(im, 47, x, 50, x, dimgray);
25697a35
GS
309 }
310
311 for(x=60; x<=420; x=x+10)
1dd9dcec
FM
312 gdImageLine(im, 60, x, 700, x, dimgray);
313
314 gdImageLine(im, 60, 420, 700, 420, black);
25697a35
GS
315
316 for(x=70; x<=680; x=x+20)
1dd9dcec 317 gdImageLine(im, x, 425, x, 428, dimgray);
25697a35
GS
318
319 y=65;
320 for(x=1; x<=31; x++) {
321 sprintf(s,"%02d",x);
322 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,y,437,s);
323 y=y+20;
324 }
325
326 t = time(NULL);
327 local = localtime(&t);
328 if(strcmp(DateFormat,"u") == 0)
120d768c 329 strftime(ftime, sizeof(ftime), "%b/%d/%Y %H:%M", local);
25697a35 330 if(strcmp(DateFormat,"e") == 0)
120d768c 331 strftime(ftime, sizeof(ftime), "%d/%b/%Y-%H:%M", local);
25697a35 332
48864d28
FM
333 if(dotinuser && strchr(name,'_')) {
334 subs(name,sizeof(name),"_",".");
94ff9470
GS
335 }
336
25697a35
GS
337 SARGgdImageStringFT(im,&brect[0],darkblue,font1,7,0.0,620,470,ftime);
338 if(strcmp(ShowSargInfo,"yes") == 0) SARGgdImageStringFT(im,&brect[0],darkblue,font1,10,0.0,257,15,"SARG, ");
339 SARGgdImageStringFT(im,&brect[0],darkblue,font1,10,0.0,300,15,Title);
d6e703cc 340 sprintf(warea,"%s: %s",text[89],period);
25697a35
GS
341 SARGgdImageStringFT(im,&brect[0],darkblue,font1,9,0.0,300,27,warea);
342 sprintf(warea,"%s: %s",text[90],name);
343 SARGgdImageStringFT(im,&brect[0],darkblue,font1,9,0.0,300,38,warea);
344 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,418," 50K");
345 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,408,"250K");
346 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,398,"500K");
347 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,388," 1M");
348 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,378," 2M");
349 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,368," 3M");
350 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,358," 4M");
351 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,348," 5M");
352 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,338," 6M");
353 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,328," 7M");
354 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,318," 8M");
355 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,308," 9M");
356 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,298," 10M");
357 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,288," 15M");
358 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,278," 20M");
359 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,268," 30M");
360 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,258," 40M");
361 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,248," 50M");
362 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,238," 60M");
363 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,228," 70M");
364 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,218," 80M");
365 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,208," 90M");
366 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,198,"100M");
367 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,188,"200M");
368 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,178,"300M");
369 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,168,"400M");
370 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,158,"500M");
371 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,148,"600M");
372 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,138,"700M");
373 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,128,"800M");
374 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,118,"900M");
375 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,108," 1G");
376 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23, 98," 2G");
377 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23, 88," 3G");
378 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23, 78," 4G");
379 SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23, 68," 5G");
380 SARGgdImageStringFT(im,&brect[0],black,font1,10,3.14/2,20,248,text[93]);
381 SARGgdImageStringFT(im,&brect[0],black,font1,10,0.0,330,460,text[127]);
1dd9dcec 382
32e71fa4
FM
383 if (snprintf(graph,sizeof(graph),"%s/%s/graph_day.png",dirname,user)>=sizeof(graph)) {
384 fprintf(stderr, "SARG: user name too long for: %s/%s/graph_day.png\n",dirname,user);
385 exit(1);
386 }
387 if (snprintf(wdirname,sizeof(wdirname),"%s/%s.day",tmp,user)>=sizeof(wdirname)) {
388 fprintf(stderr, "SARG: user name too long for: %s/%s.day\n",tmp,user);
389 exit(1);
390 }
391 if (snprintf(tmp5,sizeof(tmp5),"%s/%s.graph",tmp,user)>=sizeof(tmp5)) {
392 fprintf(stderr, "SARG: user name too long for: %s/%s.graph\n",tmp,user);
393 exit(1);
394 }
25697a35 395
05b90947
FM
396 if(access(wdirname, R_OK) != 0) {
397 gdImageDestroy(im);
25697a35 398 return;
05b90947 399 }
25697a35 400
25697a35 401 if(strcmp(DateFormat,"e") == 0)
9a2efbd0 402 sprintf(csort,"sort -t\"/\" -k 1,1 -o \"%s\" \"%s\"",tmp5,wdirname);
120d768c
FM
403 else
404 sprintf(csort,"sort -t\"/\" -k 2,2 -o \"%s\" \"%s\"",tmp5,wdirname);
25697a35 405
456d78a5
FM
406 cstatus=system(csort);
407 if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
408 fprintf(stderr, "SARG: sort command return status %d\n",WEXITSTATUS(cstatus));
409 fprintf(stderr, "SARG: sort command: %s\n",csort);
410 exit(1);
411 }
25697a35
GS
412
413 if((fp_in=fopen(tmp5,"r"))==NULL) {
414 fprintf(stderr, "SARG: (grepday) %s: %s\n",text[8],tmp5);
415 exit(1);
416 }
417
418 if((pngout=fopen(graph,"wb"))==NULL) {
419 fprintf(stderr, "SARG: (grepday) %s: %s\n",text[8],graph);
420 exit(1);
421 }
422
423 strcpy(wuser,user);
424 if(strstr(wuser,"_") != 0)
425 fixip(wuser);
426
427 if(strcmp(Ip2Name,"yes") == 0)
428 if((str=(char *) strstr(name, ".")) != (char *) NULL) {
429 if((str=(char *) strstr(str+1, ".")) != (char *) NULL)
a1c55d8c 430 ip2name(wuser,sizeof(wuser));
25697a35
GS
431 }
432
936c9905 433 get_usertab_name(wuser,name,sizeof(name));
25697a35
GS
434
435 while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
9c7c6346
FM
436 fixendofline(buf);
437 getword_start(&gwarea,buf);
438 if (getword(data,sizeof(data),&gwarea,'\t')<0) {
439 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",tmp5);
440 exit(1);
441 }
442 getword_start(&gwarea1,data);
443 if (getword(day,sizeof(day),&gwarea1,'/')<0) {
4bcb77cf
FM
444 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",tmp5);
445 exit(1);
446 }
447 if(strcmp(DateFormat,"u") == 0) {
9c7c6346 448 if (getword(day,sizeof(day),&gwarea1,'/')<0) {
4bcb77cf
FM
449 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",tmp5);
450 exit(1);
451 }
452 }
25697a35
GS
453 if(!count) {
454 strcpy(oday,day);
455 count++;
456 }
9c7c6346 457 if (getword(bytes,sizeof(bytes),&gwarea,'\t')<0 || getword(bytes,sizeof(bytes),&gwarea,'\t')<0) {
4bcb77cf
FM
458 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",tmp5);
459 exit(1);
460 }
25697a35
GS
461
462 if(strcmp(oday,day) != 0) {
463 strcpy(warea,oday);
464 x1 = 44 +(atoi(oday) * 20);
c274f011 465 bar(x1,tot);
25697a35
GS
466 strcpy(oday,day);
467 tot=0;
d6e703cc
FM
468 }
469 tot=tot+my_atoll(bytes);
25697a35
GS
470 }
471
472 if(tot) {
473 x1 = 44 +(atoi(day) * 20);
c274f011 474 bar(x1,tot);
25697a35
GS
475 }
476
477 gdImagePng(im, pngout);
478 fclose(pngout);
479 gdImageDestroy(im);
480
481 fclose(fp_in);
482 unlink(wdirname);
483 unlink(tmp5);
1dd9dcec
FM
484
485#endif
d6e703cc 486
25697a35
GS
487 return;
488}
c274f011
FM
489
490void greport_cleanup(void)
491{
492#ifdef HAVE_GD
493 gdFontCacheShutdown();
494#endif
495}