]> git.ipfire.org Git - thirdparty/sarg.git/blob - index.c
Fix the creation of a report for only one user with command line option -u
[thirdparty/sarg.git] / index.c
1 /*
2 * SARG Squid Analysis Report Generator http://sarg.sourceforge.net
3 * 1998, 2010
4 *
5 * SARG donations:
6 * please look at http://sarg.sourceforge.net/donations.php
7 * Support:
8 * http://sourceforge.net/projects/sarg/forums/forum/363374
9 * ---------------------------------------------------------------------
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
24 *
25 */
26
27 #include "include/conf.h"
28 #include "include/defs.h"
29
30 static void make_date_index(void);
31 static void make_file_index(void);
32 static void file_index_to_date_index(const char *entry);
33 static void date_index_to_file_index(const char *entry);
34
35 void make_index(void)
36 {
37 DIR *dirp;
38 struct dirent *direntp;
39 char wdir[MAXLEN];
40
41 if(LastLog > 0) mklastlog(outdir);
42
43 if(Index == INDEX_NO) {
44 sprintf(wdir,"%sindex.html",outdir);
45 if(access(wdir, R_OK) == 0) unlink(wdir);
46 return;
47 }
48
49 if(debug) debuga(_("Making index.html\n"));
50
51 // convert any old report hierarchy
52 if ((dirp = opendir(outdir)) == NULL) {
53 debuga(_("Failed to open directory %s - %s\n"),outdir,strerror(errno));
54 exit(EXIT_FAILURE);
55 }
56 while ((direntp = readdir( dirp )) != NULL) {
57 if(isdigit(direntp->d_name[0]) && isdigit(direntp->d_name[1])) {
58 if(IndexTree == INDEX_TREE_DATE)
59 file_index_to_date_index(direntp->d_name);
60 else
61 date_index_to_file_index(direntp->d_name);
62 }
63 }
64 closedir(dirp);
65
66 if(IndexTree == INDEX_TREE_DATE) {
67 make_date_index();
68 } else {
69 make_file_index();
70 }
71 }
72
73 static void make_date_index(void)
74 {
75 FILE *fp_ou, *fp_ou2, *fp_ou3;
76 DIR *dirp, *dirp2, *dirp3;
77 struct dirent *direntp;
78 struct dirent *direntp2;
79 struct dirent *direntp3;
80 char yearindex[MAXLEN];
81 char yeardir[MAXLEN];
82 char yearnum[10];
83 char monthindex[MAXLEN];
84 char monthdir[MAXLEN];
85 char monthname1[9], monthname2[9];
86 char nmonth[30];
87 char monthnum[10];
88 char dayindex[MAXLEN];
89 char daynum[10];
90 char title[80];
91 int yearsort[150];
92 int nyears;
93 int year;
94 int monthsort[144];
95 int nmonths;
96 int m1, m2, month;
97 int daysort[31*31];
98 int ndays;
99 int d1, d2, day;
100 int i, y, m, d;
101 int order;
102
103 sprintf(yearindex,"%sindex.html",outdir);
104
105 nyears=0;
106 if ((dirp = opendir(outdir)) == NULL) {
107 debuga(_("Failed to open directory %s - %s\n"),outdir,strerror(errno));
108 exit(EXIT_FAILURE);
109 }
110 while ((direntp = readdir( dirp )) != NULL) {
111 if(strlen(direntp->d_name) > 4 || !isdigit(direntp->d_name[0]) || !isdigit(direntp->d_name[1]) ||
112 !isdigit(direntp->d_name[2]) || !isdigit(direntp->d_name[3])) continue;
113 year=atoi(direntp->d_name);
114 if (nyears>=sizeof(yearsort)/sizeof(yearsort[0])) {
115 /*
116 If too many years are listed in the directory, we ignore the earliest years. The yearsort array
117 is big enough to accomodate the most ambitious use of sarg but this safety is added to prevent
118 a crash should the directory be polluted by other entries.
119 */
120 if (year>yearsort[0]) {
121 for (i=1 ; i<nyears && year>yearsort[i] ; i++)
122 yearsort[i-1]=yearsort[i];
123 yearsort[i-1]=year;
124 }
125 } else {
126 for (i=nyears ; i>0 && year<yearsort[i-1] ; i--) {
127 yearsort[i]=yearsort[i-1];
128 }
129 yearsort[i]=year;
130 nyears++;
131 }
132 }
133 closedir( dirp );
134
135 order=(strcmp(IndexSortOrder,"A") == 0) ? 1 : -1;
136
137 if((fp_ou=fopen(yearindex,"w"))==NULL) {
138 debuga(_("(index) Cannot open file %s - %s\n"),yearindex,strerror(errno));
139 exit(EXIT_FAILURE);
140 }
141 write_html_header(fp_ou,0,ngettext("SARG report","SARG reports",nyears));
142 close_html_header(fp_ou);
143 fputs("<div class=\"index\"><table cellpadding=\"1\" cellspacing=\"2\">\n<tr><td></td><td></td></tr>\n",fp_ou);
144 fprintf(fp_ou,"<tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr>\n",_("YEAR"),_("SIZE"));
145 for (y=0 ; y<nyears ; y++) {
146 if (order>0)
147 year=yearsort[y];
148 else
149 year=yearsort[nyears-1-y];
150 sprintf(yearnum,"%04d",year);
151 fprintf(fp_ou,"<tr><td class=\"data2\"><a href=\"%s/index.html\">%s</a></td><td class=\"data2\">%s</td></tr>\n",yearnum,yearnum,get_size(outdir,yearnum));
152 sprintf(yeardir,"%s%s",outdir,yearnum);
153 // Year dir
154 nmonths=0;
155 if ((dirp2 = opendir(yeardir)) == NULL) {
156 debuga(_("Failed to open directory %s - %s\n"),yeardir,strerror(errno));
157 exit(EXIT_FAILURE);
158 }
159 while ((direntp2 = readdir( dirp2 )) != NULL) {
160 if(!isdigit(direntp2->d_name[0]) || !isdigit(direntp2->d_name[1])) continue;
161 i=-1;
162 if (sscanf(direntp2->d_name,"%d%n",&m1,&i)!=1 || m1<=0 || m1>12 || i<0) continue;
163 if (direntp2->d_name[i]=='-') {
164 if (sscanf(direntp2->d_name+i+1,"%d",&m2)!=1 || m2<m1 || m2>12) continue;
165 } else if (direntp2->d_name[i]!='\0') {
166 continue;
167 } else {
168 m2=0;
169 }
170 if (nmonths>=sizeof(monthsort)/sizeof(monthsort[0])) {
171 debuga(_("Too many month directories in %s\nSupernumerary entries are ignored\n"),yeardir);
172 break;
173 }
174 month=m1*16+m2;
175 for (i=nmonths ; i>0 && month<monthsort[i-1] ; i--) {
176 monthsort[i]=monthsort[i-1];
177 }
178 monthsort[i]=month;
179 nmonths++;
180 }
181 closedir(dirp2);
182 sprintf(monthindex,"%s/index.html",yeardir);
183 if((fp_ou2=fopen(monthindex,"w"))==NULL) {
184 debuga(_("(index) Cannot open file %s - %s\n"),monthindex,strerror(errno));
185 exit(EXIT_FAILURE);
186 }
187 snprintf(title,sizeof(title),ngettext("SARG: report for %04d","SARG: reports for %04d",nmonths),year);
188 write_html_header(fp_ou2,1,title);
189 close_html_header(fp_ou2);
190 fputs("<div class=\"index\"><table cellpadding=\"1\" cellspacing=\"2\">\n<tr><td></td><td></td></tr>\n",fp_ou2);
191 fprintf(fp_ou2,"<tr><th class=\"header_l\">%s/%s</th></tr>\n",_("YEAR"),_("MONTH"));
192 for (m=0 ; m<nmonths ; m++) {
193 if (order>0)
194 month=monthsort[m];
195 else
196 month=monthsort[nmonths-1-m];
197 m1=month / 16;
198 if(month % 16 != 0) {
199 m2=month % 16;
200 sprintf(monthnum,"%02d-%02d",m1,m2);
201 sprintf(monthname1,"%02d",m1);
202 sprintf(monthname2,"%02d",m2);
203 name_month(monthname1,sizeof(monthname1));
204 name_month(monthname2,sizeof(monthname2));
205 sprintf(nmonth,"%s-%s",monthname1,monthname2);
206 } else {
207 sprintf(nmonth,"%02d",m1);
208 sprintf(monthnum,"%02d",m1);
209 name_month(nmonth,sizeof(nmonth));
210 }
211 fprintf(fp_ou2,"<tr><td class=\"data2\"><a href=\"%s/index.html\">%s %s</a></td></tr>\n",monthnum,yearnum,nmonth);
212
213 sprintf(monthdir,"%s/%s",yeardir,monthnum);
214 // month dir
215 ndays=0;
216 if ((dirp3 = opendir(monthdir)) == NULL) {
217 debuga(_("Failed to open directory %s - %s\n"),monthdir,strerror(errno));
218 exit(EXIT_FAILURE);
219 }
220 while ((direntp3 = readdir( dirp3 )) != NULL) {
221 if(!isdigit(direntp3->d_name[0]) && !isdigit(direntp3->d_name[1])) continue;
222 i=-1;
223 if (sscanf(direntp3->d_name,"%d%n",&d1,&i)!=1 || d1<=0 || d1>31 || i<0) continue;
224 if (direntp3->d_name[i]=='-') {
225 if (sscanf(direntp3->d_name+i+1,"%d",&d2)!=1 || d2<d1 || d2>31) continue;
226 } else if (direntp3->d_name[i]!='\0') {
227 continue;
228 } else {
229 d2=0;
230 }
231 if (ndays>=sizeof(daysort)/sizeof(daysort[0])) {
232 debuga(_("Too many day directories in %s\nSupernumerary entries are ignored\n"),monthdir);
233 break;
234 }
235 day=d1*32+d2;
236 for (i=ndays ; i>0 && day<daysort[i-1] ; i--) {
237 daysort[i]=daysort[i-1];
238 }
239 daysort[i]=day;
240 ndays++;
241 }
242 closedir(dirp3);
243 sprintf(dayindex,"%s/index.html",monthdir);
244 if((fp_ou3=fopen(dayindex,"w"))==NULL) {
245 debuga(_("(index) Cannot open file %s - %s\n"),dayindex,strerror(errno));
246 exit(EXIT_FAILURE);
247 }
248 snprintf(title,sizeof(title),ngettext("SARG: report for %04d/%02d","SARG: reports for %04d/%02d",ndays),year,month);
249 write_html_header(fp_ou3,2,title);
250 close_html_header(fp_ou3);
251 fputs("<div class=\"index\"><table cellpadding=\"1\" cellspacing=\"2\">\n<tr><td></td><td></td></tr>\n",fp_ou3);
252 fprintf(fp_ou3,"<tr><th class=\"header_l\">%s/%s/%s</th></tr>\n",_("YEAR"),_("MONTH"),_("DAYS"));
253 for (d=0 ; d<ndays ; d++) {
254 if (order>0)
255 day=daysort[d];
256 else
257 day=daysort[ndays-1-d];
258 d1=day / 32;
259 if(day % 32 != 0) {
260 d2=day % 32;
261 sprintf(daynum,"%02d-%02d",d1,d2);
262 } else {
263 sprintf(daynum,"%02d",d1);
264 }
265 fprintf(fp_ou3,"<tr><td class=\"data2\"><a href=\"%s/index.html\">%s %s %s</a></td></tr>\n",daynum,yearnum,nmonth,daynum);
266 }
267 fputs("</table></div>\n",fp_ou3);
268 if (write_html_trailer(fp_ou3)<0)
269 debuga(_("Write error in the index %s\n"),dayindex);
270 if (fclose(fp_ou3)==EOF)
271 debuga(_("Failed to close the index file %s - %s\n"),dayindex,strerror(errno));
272 }
273 fputs("</table></div>\n",fp_ou2);
274 if (write_html_trailer(fp_ou2)<0)
275 debuga(_("Write error in the index %s\n"),monthindex);
276 if (fclose(fp_ou2)==EOF)
277 debuga(_("Failed to close the index file %s - %s\n"),monthindex,strerror(errno));
278 }
279
280 fputs("</table></div>\n",fp_ou);
281 if (write_html_trailer(fp_ou)<0)
282 debuga(_("Write error in the index %s\n"),yearindex);
283 if (fclose(fp_ou)==EOF)
284 debuga(_("Failed to close the index file %s - %s\n"),yearindex,strerror(errno));
285 }
286
287 static void make_file_index(void)
288 {
289 #define MAX_CREATION_DATE 15
290 #define MAX_DIR_NAME 128
291 FILE *fp_ou;
292 DIR *dirp;
293 struct dirent *direntp;
294 char wdir[MAXLEN];
295 char data[80];
296 char tbytes[20];
297 char media[20];
298 char ftime[128];
299 char day[6], mon[8], year[40], hour[10];
300 int iyear, imonth, iday, ihour, iminute, isecond, idst;
301 int nsort;
302 int nallocated;
303 int order;
304 int i;
305 int tuser;
306 struct getwordstruct gwarea;
307 struct sortstruct
308 {
309 int year, month, day, sortnum;
310 char creationdate[MAX_CREATION_DATE];
311 char dirname[MAX_DIR_NAME];
312 char date[60];
313 } **sortlist, *item, **tempsort;
314
315 sprintf(wdir,"%sindex.html",outdir);
316
317 order=(strcmp(IndexSortOrder,"A") == 0) ? 1 : -1;
318
319 if ((dirp = opendir(outdir)) == NULL) {
320 debuga(_("Failed to open directory %s - %s\n"),outdir,strerror(errno));
321 exit(EXIT_FAILURE);
322 }
323
324 nsort=0;
325 nallocated=0;
326 sortlist=NULL;
327 while ((direntp = readdir( dirp )) != NULL) {
328 if (strchr(direntp->d_name,'-') == 0) continue;
329 if (strlen(direntp->d_name)>MAX_DIR_NAME) continue;
330 item=malloc(sizeof(*item));
331 if (!item) {
332 debuga(_("not enough memory to sort the index\n"));
333 exit(EXIT_FAILURE);
334 }
335 if(strcmp(df,"u") == 0) {
336 item->year=atoi(direntp->d_name);
337 item->month=conv_month(direntp->d_name+4);
338 item->day=atoi(direntp->d_name+7);
339 } else {
340 item->year=atoi(direntp->d_name+5);
341 item->month=conv_month(direntp->d_name+2);
342 item->day=atoi(direntp->d_name);
343 }
344 item->sortnum=(item->year*16+item->month)*32+item->day;
345 obtdate(outdir,direntp->d_name,data);
346 if (sscanf(data,"%d-%d-%d %d:%d:%d %d",&iyear,&imonth,&iday,&ihour,&iminute,&isecond,&idst)==7) {
347 formatdate(data,sizeof(data),iyear,imonth,iday,ihour,iminute,isecond,idst);
348 snprintf(item->creationdate,sizeof(item->creationdate),"%04d%02d%02d%02d%02d%02d",iyear,imonth,iday,ihour,iminute,isecond);
349 } else {
350 /*
351 Old code to parse a date stored by sarg before 2.2.6.1 in the sarg-date file of each report directory.
352 */
353 getword_start(&gwarea,data);
354 if (getword_skip(16,&gwarea,' ')<0) {
355 debuga(_("Maybe you have a broken week day in your %s%s/sarg-date file\n"),outdir,direntp->d_name);
356 exit(EXIT_FAILURE);
357 }
358 if (getword_multisep(mon,sizeof(mon),&gwarea,' ')<0) {
359 debuga(_("Maybe you have a broken month in your %s%s/sarg-date file\n"),outdir,direntp->d_name);
360 exit(EXIT_FAILURE);
361 }
362 if (getword_multisep(day,sizeof(day),&gwarea,' ')<0) {
363 debuga(_("Maybe you have a broken day in your %s%s/sarg-date file\n"),outdir,direntp->d_name);
364 exit(EXIT_FAILURE);
365 }
366 if (getword_multisep(hour,sizeof(hour),&gwarea,' ')<0) {
367 debuga(_("Maybe you have a broken time in your %s%s/sarg-date file\n"),outdir,direntp->d_name);
368 exit(EXIT_FAILURE);
369 }
370 do {
371 if (getword_multisep(year,sizeof(year),&gwarea,' ')<0) {
372 debuga(_("Maybe you have a broken year in your %s%s/sarg-date file\n"),outdir,direntp->d_name);
373 exit(EXIT_FAILURE);
374 }
375 } while (year[0] && !isdigit(year[0])); //skip time zone information with spaces until the year is found
376 if (sscanf(hour,"%d:%d:%d",&ihour,&iminute,&isecond)!=3) {
377 debuga(_("Maybe you have a broken time in your %s%s/sarg-date file\n"),outdir,direntp->d_name);
378 exit(EXIT_FAILURE);
379 }
380 buildymd(day,mon,year,ftime);
381 snprintf(item->creationdate,sizeof(item->creationdate),"%s%02d%02d%02d",ftime, ihour, iminute, isecond);
382 }
383 strcpy(item->dirname,direntp->d_name);
384 strncpy(item->date,data,sizeof(item->date));
385 if (nsort+1>nallocated) {
386 nallocated+=10;
387 tempsort=realloc(sortlist,nallocated*sizeof(*item));
388 if (!tempsort) {
389 debuga(_("not enough memory to sort the index\n"));
390 exit(EXIT_FAILURE);
391 }
392 sortlist=tempsort;
393 }
394 for (i=nsort ; i>0 ; i--) {
395 if (item->sortnum>sortlist[i-1]->sortnum) break;
396 if (item->sortnum==sortlist[i-1]->sortnum) {
397 if (strcmp(item->creationdate,sortlist[i-1]->creationdate)>=0) break;
398 }
399 sortlist[i]=sortlist[i-1];
400 }
401 sortlist[i]=item;
402 nsort++;
403 }
404
405 closedir( dirp );
406
407 if((fp_ou=fopen(wdir,"w"))==NULL) {
408 debuga(_("(index) Cannot open file %s\n"),wdir);
409 exit(EXIT_FAILURE);
410 }
411 write_html_header(fp_ou,0,ngettext("SARG report","SARG reports",nsort));
412 close_html_header(fp_ou);
413 fputs("<div class=\"index\"><table cellpadding=\"1\" cellspacing=\"2\">\n<tr><td></td><td></td></tr>\n",fp_ou);
414 fprintf(fp_ou,"<tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr>\n",_("FILE/PERIOD"),_("CREATION DATE"),_("USERS"),_("BYTES"),_("AVERAGE"));
415 for (i=0 ; i<nsort ; i++) {
416 if (order>0)
417 item=sortlist[i];
418 else
419 item=sortlist[nsort-i-1];
420 tuser=obtuser(outdir,item->dirname);
421 obttotal(outdir,item->dirname,tbytes,tuser,media);
422 fprintf(fp_ou,"<tr><td class=\"data2\"><a href='%s/%s'>%s</a></td><td class=\"data2\">%s</td><td class=\"data\">%d</td><td class=\"data\">%s</td><td class=\"data\">%s</td></tr>\n",item->dirname,ReplaceIndex,item->dirname,item->date,tuser,tbytes,media);
423 }
424 fputs("</table></div>\n",fp_ou);
425 if (write_html_trailer(fp_ou)<0)
426 debuga(_("Write error in the index %s\n"),wdir);
427 if (fclose(fp_ou)==EOF)
428 debuga(_("Failed to close the index file %s - %s\n"),wdir,strerror(errno));
429
430 if (sortlist) {
431 for (i=0 ; i<nsort ; i++)
432 free(sortlist[i]);
433 free(sortlist);
434 }
435 }
436
437 static void file_index_to_date_index(const char *entry)
438 {
439 int y1, y2, m1, m2, d1, d2;
440 int i, j;
441 int ndirlen;
442 int monthlen;
443 char sm1[8], sm2[8];
444 char olddir[MAXLEN], newdir[MAXLEN];
445
446 if(strlen(entry) < 19) return;
447
448 y1=0;
449 y2=0;
450 memset(sm1,0,sizeof(sm1));
451 memset(sm2,0,sizeof(sm2));
452 d1=0;
453 d2=0;
454 i=0;
455 if(strcmp(df,"u") == 0) {
456 for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
457 y1=y1*10+(entry[i++]-'0');
458 if (j!=4) return;
459 for (j=0 ; j<sizeof(sm1)-1 && entry[i] && isalpha(entry[i]) ; j++)
460 sm1[j]=entry[i++];
461 if (j!=3) return;
462 sm1[j]='\0';
463 for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
464 d1=d1*10+(entry[i++]-'0');
465 if (j!=2) return;
466
467 if (entry[i++]!='-') return;
468
469 for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
470 y2=y2*10+(entry[i++]-'0');
471 if (j!=4) return;
472 for (j=0 ; j<sizeof(sm2)-1 && entry[i] && isalpha(entry[i]) ; j++)
473 sm2[j]=entry[i++];
474 if (j!=3) return;
475 sm2[j]='\0';
476 for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
477 d2=d2*10+(entry[i++]-'0');
478 if (j!=2) return;
479 } else if(strcmp(df,"e") == 0) {
480 for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
481 d1=d1*10+(entry[i++]-'0');
482 if (j!=2) return;
483 for (j=0 ; j<sizeof(sm1)-1 && entry[i] && isalpha(entry[i]) ; j++)
484 sm1[j]=entry[i++];
485 if (j!=3) return;
486 sm1[j]='\0';
487 for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
488 y1=y1*10+(entry[i++]-'0');
489 if (j!=4) return;
490
491 if (entry[i++]!='-') return;
492
493 for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
494 d2=d2*10+(entry[i++]-'0');
495 if (j!=2) return;
496 for (j=0 ; j<sizeof(sm2)-1 && entry[i] && isalpha(entry[i]) ; j++)
497 sm2[j]=entry[i++];
498 if (j!=3) return;
499 sm2[j]='\0';
500 for (j=0 ; entry[i] && isdigit(entry[i]) ; j++)
501 y2=y2*10+(entry[i++]-'0');
502 if (j!=4) return;
503 } else
504 return;
505
506 m1=conv_month(sm1);
507 m2=conv_month(sm2);
508 ndirlen=sprintf(newdir,"%s%04d",outdir,y1);
509 if(access(newdir, R_OK) != 0) mkdir(newdir,0755);
510 if(m1 != m2) ndirlen+=sprintf(newdir+ndirlen,"/%02d-%02d",m1,m2);
511 else ndirlen+=sprintf(newdir+ndirlen,"/%02d",m1);
512 if(access(newdir, R_OK) != 0) mkdir(newdir,0755);
513 monthlen=ndirlen;
514 if(d1!=d2) ndirlen+=sprintf(newdir+ndirlen,"/%02d-%02d",d1,d2);
515 else ndirlen+=sprintf(newdir+ndirlen,"/%02d",d1);
516
517 sprintf(olddir,"%s%s",outdir,entry);
518 if (rename(olddir,newdir)) {
519 debuga(_("(index) rename error from \"%s\" to \"%s\" - %s\n"),olddir,newdir,strerror(errno));
520 exit(EXIT_FAILURE);
521 }
522
523 strcpy(newdir+monthlen,"/images");
524 if(access(newdir, R_OK) != 0) {
525 #ifdef HAVE_SYMLINK
526 char linkdir[MAXLEN];
527
528 sprintf(linkdir,"%simages",outdir);
529 if (symlink(linkdir,newdir)) {
530 debuga(_("failed to create link \"%s\" to \"%s\" - %s\n"),linkdir,newdir,strerror(errno));
531 exit(EXIT_FAILURE);
532 }
533 #else
534 char cmd[MAXLEN];
535 int cstatus;
536
537 sprintf(cmd,"ln -s \"%simages\" \"%s/images\"",outdir,newdir);
538 cstatus=system(cmd);
539 if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
540 debuga(_("command return status %d\n"),WEXITSTATUS(cstatus));
541 debuga(_("command: %s\n"),cmd);
542 exit(EXIT_FAILURE);
543 }
544 #endif
545 }
546 }
547
548 static void date_index_to_file_index(const char *entry)
549 {
550 int y1, next;
551 int m1, m2;
552 int d1, d2;
553 int val1len;
554 int i, j;
555 char val1[MAXLEN];
556 const char *sm1, *sm2;
557 char *str;
558 char newdir[MAXLEN], olddir[MAXLEN];
559 DIR *dirp2, *dirp3;
560 struct dirent *direntp2;
561 struct dirent *direntp3;
562
563 if(strlen(entry) != 4) return;
564
565 next=-1;
566 if (sscanf(entry,"%d%n",&y1,&next)!=1 || next<0 || entry[next]) return;
567
568 val1len=snprintf(val1,sizeof(val1),"%s%s",outdir,entry);
569 dirp2 = opendir(val1);
570 if (!dirp2) return;
571 while ((direntp2 = readdir( dirp2 )) != NULL) {
572 if(!isdigit(direntp2->d_name[0]) || !isdigit(direntp2->d_name[1])) continue;
573 i=0;
574 str=direntp2->d_name;
575 m1=0;
576 for (j=0 ; j<2 && str[i] && isdigit(str[i]) ; j++)
577 m1=(m1*10)+(str[i++]-'0');
578 if (j>=2) continue;
579 sm1=conv_month_name(m1);
580 if (str[i]=='-') {
581 i++;
582 m2=0;
583 for (j=0 ; j<2 && str[i] && isdigit(str[i]) ; j++)
584 m2=(m2*10)+(str[i++]-'0');
585 if (j>=2) continue;
586 sm2=conv_month_name(m2);
587 } else if (!str[i]) {
588 sm2=sm1;
589 } else {
590 continue;
591 }
592
593 sprintf(val1+val1len,"/%s",direntp2->d_name);
594 dirp3 = opendir(val1);
595 if (!dirp3) continue;
596 while ((direntp3 = readdir( dirp3 )) != NULL) {
597 if(!isdigit(direntp3->d_name[0]) || !isdigit(direntp3->d_name[1])) continue;
598 i=0;
599 str=direntp3->d_name;
600 d1=0;
601 for (j=0 ; str[i] && isdigit(str[i]) ; j++)
602 d1=d1*10+(str[i++]-'0');
603 if (j!=2) continue;
604 if (str[i]=='-') {
605 i++;
606 d2=0;
607 for (j=0 ; str[i] && isdigit(str[i]) ; j++)
608 d2=d2*10+(str[i++]-'0');
609 if (j!=2) continue;
610 } else if (!str[i]) {
611 d2=d1;
612 } else {
613 continue;
614 }
615
616 if(strcmp(df,"u") == 0) sprintf(newdir,"%s%04d%s%02d-%04d%s%02d",outdir,y1,sm1,d1,y1,sm2,d2);
617 else if(strcmp(df,"e") == 0) sprintf(newdir,"%s%02d%s%04d-%02d%s%04d",outdir,d1,sm1,y1,d2,sm2,y1);
618 else continue;
619 sprintf(olddir,"%s%04d/%s/%s",outdir,y1,direntp2->d_name,direntp3->d_name);
620 if(rename(olddir,newdir)) {
621 debuga(_("(index) rename error from \"%s\" to \"%s\" - %s\n"),olddir,newdir,strerror(errno));
622 exit(EXIT_FAILURE);
623 }
624 }
625 closedir( dirp3 );
626 }
627 closedir( dirp2 );
628
629 /*!
630 \bug The links to the images in the reports are broken after moving the directories
631 as the the HTML files are not at the right level for the images any more.
632 */
633 }
634