]>
git.ipfire.org Git - thirdparty/sarg.git/blob - index.c
2 * SARG Squid Analysis Report Generator http://sarg.sourceforge.net
6 * please look at http://sarg.sourceforge.net/donations.php
8 * http://sourceforge.net/projects/sarg/forums/forum/363374
9 * ---------------------------------------------------------------------
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.
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.
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.
27 #include "include/conf.h"
28 #include "include/defs.h"
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
);
38 struct dirent
*direntp
;
41 if(LastLog
> 0) mklastlog(outdir
);
43 if(Index
== INDEX_NO
) {
44 sprintf(wdir
,"%sindex.html",outdir
);
45 if(access(wdir
, R_OK
) == 0) unlink(wdir
);
49 if(debug
) debuga(_("Making index.html\n"));
51 // convert any old report hierarchy
52 if ((dirp
= opendir(outdir
)) == NULL
) {
53 debuga(_("Failed to open directory %s - %s\n"),outdir
,strerror(errno
));
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
);
61 date_index_to_file_index(direntp
->d_name
);
66 if(IndexTree
== INDEX_TREE_DATE
) {
73 static void make_date_index(void)
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
];
83 char monthindex
[MAXLEN
];
84 char monthdir
[MAXLEN
];
85 char monthname1
[9], monthname2
[9];
88 char dayindex
[MAXLEN
];
103 sprintf(yearindex
,"%sindex.html",outdir
);
106 if ((dirp
= opendir(outdir
)) == NULL
) {
107 debuga(_("Failed to open directory %s - %s\n"),outdir
,strerror(errno
));
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])) {
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.
120 if (year
>yearsort
[0]) {
121 for (i
=1 ; i
<nyears
&& year
>yearsort
[i
] ; i
++)
122 yearsort
[i
-1]=yearsort
[i
];
126 for (i
=nyears
; i
>0 && year
<yearsort
[i
-1] ; i
--) {
127 yearsort
[i
]=yearsort
[i
-1];
135 order
=(strcmp(IndexSortOrder
,"A") == 0) ? 1 : -1;
137 if((fp_ou
=fopen(yearindex
,"w"))==NULL
) {
138 debuga(_("(index) Cannot open file %s - %s\n"),yearindex
,strerror(errno
));
141 write_html_header(fp_ou
,0,ngettext("SARG report","SARG reports",nyears
),HTML_JS_NONE
);
142 close_html_header(fp_ou
);
143 fputs("<div class=\"index\"><table cellpadding=\"1\" cellspacing=\"2\">\n",fp_ou
);
144 fprintf(fp_ou
,"<tr><th class=\"header_l\">%s</th>",_("YEAR"));
145 if (IndexFields
& INDEXFIELDS_DIRSIZE
)
146 fprintf(fp_ou
,"<th class=\"header_l\">%s</th>",_("SIZE"));
147 fputs("</tr>\n",fp_ou
);
148 for (y
=0 ; y
<nyears
; y
++) {
152 year
=yearsort
[nyears
-1-y
];
153 sprintf(yearnum
,"%04d",year
);
154 fprintf(fp_ou
,"<tr><td class=\"data2\"><a href=\"%s/index.html\">%s</a></td>",yearnum
,yearnum
);
155 if (IndexFields
& INDEXFIELDS_DIRSIZE
)
156 fprintf(fp_ou
,"<td class=\"data2\">%s</td>",get_size(outdir
,yearnum
));
157 fputs("</tr>\n",fp_ou
);
158 sprintf(yeardir
,"%s%s",outdir
,yearnum
);
161 if ((dirp2
= opendir(yeardir
)) == NULL
) {
162 debuga(_("Failed to open directory %s - %s\n"),yeardir
,strerror(errno
));
165 while ((direntp2
= readdir( dirp2
)) != NULL
) {
166 if(!isdigit(direntp2
->d_name
[0]) || !isdigit(direntp2
->d_name
[1])) continue;
168 if (sscanf(direntp2
->d_name
,"%d%n",&m1
,&i
)!=1 || m1
<=0 || m1
>12 || i
<0) continue;
169 if (direntp2
->d_name
[i
]=='-') {
170 if (sscanf(direntp2
->d_name
+i
+1,"%d",&m2
)!=1 || m2
<m1
|| m2
>12) continue;
171 } else if (direntp2
->d_name
[i
]!='\0') {
176 if (nmonths
>=sizeof(monthsort
)/sizeof(monthsort
[0])) {
177 debuga(_("Too many month directories in %s\nSupernumerary entries are ignored\n"),yeardir
);
181 for (i
=nmonths
; i
>0 && month
<monthsort
[i
-1] ; i
--) {
182 monthsort
[i
]=monthsort
[i
-1];
188 sprintf(monthindex
,"%s/index.html",yeardir
);
189 if((fp_ou2
=fopen(monthindex
,"w"))==NULL
) {
190 debuga(_("(index) Cannot open file %s - %s\n"),monthindex
,strerror(errno
));
193 snprintf(title
,sizeof(title
),ngettext("SARG: report for %04d","SARG: reports for %04d",nmonths
),year
);
194 write_html_header(fp_ou2
,1,title
,HTML_JS_NONE
);
195 close_html_header(fp_ou2
);
196 fputs("<div class=\"index\"><table cellpadding=\"1\" cellspacing=\"2\">\n<tr><td></td><td></td></tr>\n",fp_ou2
);
197 fprintf(fp_ou2
,"<tr><th class=\"header_l\">%s/%s</th></tr>\n",_("YEAR"),_("MONTH"));
198 for (m
=0 ; m
<nmonths
; m
++) {
202 month
=monthsort
[nmonths
-1-m
];
204 if(month
% 16 != 0) {
206 sprintf(monthnum
,"%02d-%02d",m1
,m2
);
207 sprintf(monthname1
,"%02d",m1
);
208 sprintf(monthname2
,"%02d",m2
);
209 name_month(monthname1
,sizeof(monthname1
));
210 name_month(monthname2
,sizeof(monthname2
));
211 sprintf(nmonth
,"%s-%s",monthname1
,monthname2
);
213 sprintf(nmonth
,"%02d",m1
);
214 sprintf(monthnum
,"%02d",m1
);
215 name_month(nmonth
,sizeof(nmonth
));
217 fprintf(fp_ou2
,"<tr><td class=\"data2\"><a href=\"%s/index.html\">%s %s</a></td></tr>\n",monthnum
,yearnum
,nmonth
);
219 sprintf(monthdir
,"%s/%s",yeardir
,monthnum
);
222 if ((dirp3
= opendir(monthdir
)) == NULL
) {
223 debuga(_("Failed to open directory %s - %s\n"),monthdir
,strerror(errno
));
226 while ((direntp3
= readdir( dirp3
)) != NULL
) {
227 if(!isdigit(direntp3
->d_name
[0]) && !isdigit(direntp3
->d_name
[1])) continue;
229 if (sscanf(direntp3
->d_name
,"%d%n",&d1
,&i
)!=1 || d1
<=0 || d1
>31 || i
<0) continue;
230 if (direntp3
->d_name
[i
]=='-') {
231 if (sscanf(direntp3
->d_name
+i
+1,"%d",&d2
)!=1 || d2
<d1
|| d2
>31) continue;
232 } else if (direntp3
->d_name
[i
]!='\0') {
237 if (ndays
>=sizeof(daysort
)/sizeof(daysort
[0])) {
238 debuga(_("Too many day directories in %s\nSupernumerary entries are ignored\n"),monthdir
);
242 for (i
=ndays
; i
>0 && day
<daysort
[i
-1] ; i
--) {
243 daysort
[i
]=daysort
[i
-1];
249 sprintf(dayindex
,"%s/index.html",monthdir
);
250 if((fp_ou3
=fopen(dayindex
,"w"))==NULL
) {
251 debuga(_("(index) Cannot open file %s - %s\n"),dayindex
,strerror(errno
));
254 snprintf(title
,sizeof(title
),ngettext("SARG: report for %04d/%02d","SARG: reports for %04d/%02d",ndays
),year
,month
);
255 write_html_header(fp_ou3
,2,title
,HTML_JS_NONE
);
256 close_html_header(fp_ou3
);
257 fputs("<div class=\"index\"><table cellpadding=\"1\" cellspacing=\"2\">\n<tr><td></td><td></td></tr>\n",fp_ou3
);
258 fprintf(fp_ou3
,"<tr><th class=\"header_l\">%s/%s/%s</th></tr>\n",_("YEAR"),_("MONTH"),_("DAYS"));
259 for (d
=0 ; d
<ndays
; d
++) {
263 day
=daysort
[ndays
-1-d
];
267 sprintf(daynum
,"%02d-%02d",d1
,d2
);
269 sprintf(daynum
,"%02d",d1
);
271 fprintf(fp_ou3
,"<tr><td class=\"data2\"><a href=\"%s/index.html\">%s %s %s</a></td></tr>\n",daynum
,yearnum
,nmonth
,daynum
);
273 fputs("</table></div>\n",fp_ou3
);
274 if (write_html_trailer(fp_ou3
)<0)
275 debuga(_("Write error in the index %s\n"),dayindex
);
276 if (fclose(fp_ou3
)==EOF
)
277 debuga(_("Failed to close the index file %s - %s\n"),dayindex
,strerror(errno
));
279 fputs("</table></div>\n",fp_ou2
);
280 if (write_html_trailer(fp_ou2
)<0)
281 debuga(_("Write error in the index %s\n"),monthindex
);
282 if (fclose(fp_ou2
)==EOF
)
283 debuga(_("Failed to close the index file %s - %s\n"),monthindex
,strerror(errno
));
286 fputs("</table></div>\n",fp_ou
);
287 if (write_html_trailer(fp_ou
)<0)
288 debuga(_("Write error in the index %s\n"),yearindex
);
289 if (fclose(fp_ou
)==EOF
)
290 debuga(_("Failed to close the index file %s - %s\n"),yearindex
,strerror(errno
));
293 static void make_file_index(void)
295 #define MAX_CREATION_DATE 15
298 struct dirent
*direntp
;
302 char day
[6], mon
[8], year
[40], hour
[10];
303 long long int tbytes
;
305 int iyear
, imonth
, iday
, ihour
, iminute
, isecond
, idst
;
311 struct getwordstruct gwarea
;
314 int year
, month
, day
, sortnum
;
315 char creationdate
[MAX_CREATION_DATE
];
318 } **sortlist
, *item
, **tempsort
;
320 sprintf(wdir
,"%sindex.html",outdir
);
322 order
=(strcmp(IndexSortOrder
,"A") == 0) ? 1 : -1;
324 if ((dirp
= opendir(outdir
)) == NULL
) {
325 debuga(_("Failed to open directory %s - %s\n"),outdir
,strerror(errno
));
332 while ((direntp
= readdir( dirp
)) != NULL
) {
333 if (strchr(direntp
->d_name
,'-') == 0) continue;
334 item
=malloc(sizeof(*item
));
336 debuga(_("not enough memory to sort the index\n"));
339 if(strcmp(df
,"u") == 0) {
340 item
->year
=atoi(direntp
->d_name
);
341 item
->month
=conv_month(direntp
->d_name
+4);
342 item
->day
=atoi(direntp
->d_name
+7);
344 item
->year
=atoi(direntp
->d_name
+5);
345 item
->month
=conv_month(direntp
->d_name
+2);
346 item
->day
=atoi(direntp
->d_name
);
348 item
->sortnum
=(item
->year
*16+item
->month
)*32+item
->day
;
349 obtdate(outdir
,direntp
->d_name
,data
);
350 if (sscanf(data
,"%d-%d-%d %d:%d:%d %d",&iyear
,&imonth
,&iday
,&ihour
,&iminute
,&isecond
,&idst
)==7) {
351 formatdate(data
,sizeof(data
),iyear
,imonth
,iday
,ihour
,iminute
,isecond
,idst
);
352 snprintf(item
->creationdate
,sizeof(item
->creationdate
),"%04d%02d%02d%02d%02d%02d",iyear
,imonth
,iday
,ihour
,iminute
,isecond
);
355 Old code to parse a date stored by sarg before 2.2.6.1 in the sarg-date file of each report directory.
357 getword_start(&gwarea
,data
);
358 if (getword_skip(16,&gwarea
,' ')<0) {
359 debuga(_("Maybe you have a broken week day in your %s%s/sarg-date file\n"),outdir
,direntp
->d_name
);
362 if (getword_multisep(mon
,sizeof(mon
),&gwarea
,' ')<0) {
363 debuga(_("Maybe you have a broken month in your %s%s/sarg-date file\n"),outdir
,direntp
->d_name
);
366 if (getword_multisep(day
,sizeof(day
),&gwarea
,' ')<0) {
367 debuga(_("Maybe you have a broken day in your %s%s/sarg-date file\n"),outdir
,direntp
->d_name
);
370 if (getword_multisep(hour
,sizeof(hour
),&gwarea
,' ')<0) {
371 debuga(_("Maybe you have a broken time in your %s%s/sarg-date file\n"),outdir
,direntp
->d_name
);
375 if (getword_multisep(year
,sizeof(year
),&gwarea
,' ')<0) {
376 debuga(_("Maybe you have a broken year in your %s%s/sarg-date file\n"),outdir
,direntp
->d_name
);
379 } while (year
[0] && !isdigit(year
[0])); //skip time zone information with spaces until the year is found
380 if (sscanf(hour
,"%d:%d:%d",&ihour
,&iminute
,&isecond
)!=3) {
381 debuga(_("Maybe you have a broken time in your %s%s/sarg-date file\n"),outdir
,direntp
->d_name
);
384 buildymd(day
,mon
,year
,ftime
);
385 snprintf(item
->creationdate
,sizeof(item
->creationdate
),"%s%02d%02d%02d",ftime
, ihour
, iminute
, isecond
);
387 item
->dirname
=strdup(direntp
->d_name
);
388 if (!item
->dirname
) {
389 debuga(_("Not enough memory to store the directory name \"%s\" in the index\n"),direntp
->d_name
);
392 strncpy(item
->date
,data
,sizeof(item
->date
));
393 if (nsort
+1>nallocated
) {
395 tempsort
=realloc(sortlist
,nallocated
*sizeof(*item
));
397 debuga(_("not enough memory to sort the index\n"));
402 for (i
=nsort
; i
>0 ; i
--) {
403 if (item
->sortnum
>sortlist
[i
-1]->sortnum
) break;
404 if (item
->sortnum
==sortlist
[i
-1]->sortnum
) {
405 if (strcmp(item
->creationdate
,sortlist
[i
-1]->creationdate
)>=0) break;
407 sortlist
[i
]=sortlist
[i
-1];
415 if((fp_ou
=fopen(wdir
,"w"))==NULL
) {
416 debuga(_("(index) Cannot open file %s\n"),wdir
);
419 write_html_header(fp_ou
,0,ngettext("SARG report","SARG reports",nsort
),HTML_JS_SORTTABLE
);
420 close_html_header(fp_ou
);
421 fputs("<div class=\"index\"><table cellpadding=\"1\" cellspacing=\"2\"",fp_ou
);
422 if (SortTableJs
[0]) fputs(" class=\"sortable\"",fp_ou
);
424 fprintf(fp_ou
,"<thead><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></thead>\n",_("FILE/PERIOD"),_("CREATION DATE"),_("USERS"),_("BYTES"),_("AVERAGE"));
425 for (i
=0 ; i
<nsort
; i
++) {
429 item
=sortlist
[nsort
-i
-1];
430 tuser
=obtuser(outdir
,item
->dirname
);
431 obttotal(outdir
,item
->dirname
,tuser
,&tbytes
,&media
);
432 fputs("<tr><td class=\"data2\"",fp_ou
);
433 if (SortTableJs
[0]) fprintf(fp_ou
," sorttable_customkey=\"%d\"",item
->sortnum
);
434 fprintf(fp_ou
,"><a href='%s/%s'>%s</a></td>",item
->dirname
,ReplaceIndex
,item
->dirname
);
435 fputs("<td class=\"data2\"",fp_ou
);
436 if (SortTableJs
[0]) fprintf(fp_ou
," sorttable_customkey=\"%s\"",item
->creationdate
);
437 fprintf(fp_ou
,">%s</td>",item
->date
);
438 fprintf(fp_ou
,"<td class=\"data\">%d</td>",tuser
);
439 fputs("<td class=\"data\"",fp_ou
);
440 if (SortTableJs
[0]) fprintf(fp_ou
," sorttable_customkey=\"%"PRId64
"\"",(int64_t)tbytes
);
441 fprintf(fp_ou
,">%s</td>",fixnum(tbytes
,1));
442 fputs("<td class=\"data\"",fp_ou
);
443 if (SortTableJs
[0]) fprintf(fp_ou
," sorttable_customkey=\"%"PRId64
"\"",(int64_t)media
);
444 fprintf(fp_ou
,">%s</td></tr>\n",fixnum(media
,1));
446 fputs("</table></div>\n",fp_ou
);
447 if (write_html_trailer(fp_ou
)<0)
448 debuga(_("Write error in the index %s\n"),wdir
);
449 if (fclose(fp_ou
)==EOF
)
450 debuga(_("Failed to close the index file %s - %s\n"),wdir
,strerror(errno
));
453 for (i
=0 ; i
<nsort
; i
++) {
454 free(sortlist
[i
]->dirname
);
461 static void file_index_to_date_index(const char *entry
)
463 int y1
, y2
, m1
, m2
, d1
, d2
;
468 char olddir
[MAXLEN
], newdir
[MAXLEN
];
470 if(strlen(entry
) < 19) return;
474 memset(sm1
,0,sizeof(sm1
));
475 memset(sm2
,0,sizeof(sm2
));
479 if(strcmp(df
,"u") == 0) {
480 for (j
=0 ; entry
[i
] && isdigit(entry
[i
]) ; j
++)
481 y1
=y1
*10+(entry
[i
++]-'0');
483 for (j
=0 ; j
<sizeof(sm1
)-1 && entry
[i
] && isalpha(entry
[i
]) ; j
++)
487 for (j
=0 ; entry
[i
] && isdigit(entry
[i
]) ; j
++)
488 d1
=d1
*10+(entry
[i
++]-'0');
491 if (entry
[i
++]!='-') return;
493 for (j
=0 ; entry
[i
] && isdigit(entry
[i
]) ; j
++)
494 y2
=y2
*10+(entry
[i
++]-'0');
496 for (j
=0 ; j
<sizeof(sm2
)-1 && entry
[i
] && isalpha(entry
[i
]) ; j
++)
500 for (j
=0 ; entry
[i
] && isdigit(entry
[i
]) ; j
++)
501 d2
=d2
*10+(entry
[i
++]-'0');
503 } else if(strcmp(df
,"e") == 0) {
504 for (j
=0 ; entry
[i
] && isdigit(entry
[i
]) ; j
++)
505 d1
=d1
*10+(entry
[i
++]-'0');
507 for (j
=0 ; j
<sizeof(sm1
)-1 && entry
[i
] && isalpha(entry
[i
]) ; j
++)
511 for (j
=0 ; entry
[i
] && isdigit(entry
[i
]) ; j
++)
512 y1
=y1
*10+(entry
[i
++]-'0');
515 if (entry
[i
++]!='-') return;
517 for (j
=0 ; entry
[i
] && isdigit(entry
[i
]) ; j
++)
518 d2
=d2
*10+(entry
[i
++]-'0');
520 for (j
=0 ; j
<sizeof(sm2
)-1 && entry
[i
] && isalpha(entry
[i
]) ; j
++)
524 for (j
=0 ; entry
[i
] && isdigit(entry
[i
]) ; j
++)
525 y2
=y2
*10+(entry
[i
++]-'0');
532 ndirlen
=sprintf(newdir
,"%s%04d",outdir
,y1
);
533 if(access(newdir
, R_OK
) != 0) mkdir(newdir
,0755);
534 if(m1
!= m2
) ndirlen
+=sprintf(newdir
+ndirlen
,"/%02d-%02d",m1
,m2
);
535 else ndirlen
+=sprintf(newdir
+ndirlen
,"/%02d",m1
);
536 if(access(newdir
, R_OK
) != 0) mkdir(newdir
,0755);
538 if(d1
!=d2
) ndirlen
+=sprintf(newdir
+ndirlen
,"/%02d-%02d",d1
,d2
);
539 else ndirlen
+=sprintf(newdir
+ndirlen
,"/%02d",d1
);
541 sprintf(olddir
,"%s%s",outdir
,entry
);
542 if (rename(olddir
,newdir
)) {
543 debuga(_("(index) rename error from \"%s\" to \"%s\" - %s\n"),olddir
,newdir
,strerror(errno
));
547 strcpy(newdir
+monthlen
,"/images");
548 if(access(newdir
, R_OK
) != 0) {
550 char linkdir
[MAXLEN
];
552 sprintf(linkdir
,"%simages",outdir
);
553 if (symlink(linkdir
,newdir
)) {
554 debuga(_("failed to create link \"%s\" to \"%s\" - %s\n"),linkdir
,newdir
,strerror(errno
));
561 sprintf(cmd
,"ln -s \"%simages\" \"%s/images\"",outdir
,newdir
);
563 if (!WIFEXITED(cstatus
) || WEXITSTATUS(cstatus
)) {
564 debuga(_("command return status %d\n"),WEXITSTATUS(cstatus
));
565 debuga(_("command: %s\n"),cmd
);
572 static void date_index_to_file_index(const char *entry
)
580 const char *sm1
, *sm2
;
582 char newdir
[MAXLEN
], olddir
[MAXLEN
];
584 struct dirent
*direntp2
;
585 struct dirent
*direntp3
;
587 if(strlen(entry
) != 4) return;
590 if (sscanf(entry
,"%d%n",&y1
,&next
)!=1 || next
<0 || entry
[next
]) return;
592 val1len
=snprintf(val1
,sizeof(val1
),"%s%s",outdir
,entry
);
593 dirp2
= opendir(val1
);
595 while ((direntp2
= readdir( dirp2
)) != NULL
) {
596 if(!isdigit(direntp2
->d_name
[0]) || !isdigit(direntp2
->d_name
[1])) continue;
598 str
=direntp2
->d_name
;
600 for (j
=0 ; j
<2 && str
[i
] && isdigit(str
[i
]) ; j
++)
601 m1
=(m1
*10)+(str
[i
++]-'0');
603 sm1
=conv_month_name(m1
);
607 for (j
=0 ; j
<2 && str
[i
] && isdigit(str
[i
]) ; j
++)
608 m2
=(m2
*10)+(str
[i
++]-'0');
610 sm2
=conv_month_name(m2
);
611 } else if (!str
[i
]) {
617 sprintf(val1
+val1len
,"/%s",direntp2
->d_name
);
618 dirp3
= opendir(val1
);
619 if (!dirp3
) continue;
620 while ((direntp3
= readdir( dirp3
)) != NULL
) {
621 if(!isdigit(direntp3
->d_name
[0]) || !isdigit(direntp3
->d_name
[1])) continue;
623 str
=direntp3
->d_name
;
625 for (j
=0 ; str
[i
] && isdigit(str
[i
]) ; j
++)
626 d1
=d1
*10+(str
[i
++]-'0');
631 for (j
=0 ; str
[i
] && isdigit(str
[i
]) ; j
++)
632 d2
=d2
*10+(str
[i
++]-'0');
634 } else if (!str
[i
]) {
640 if(strcmp(df
,"u") == 0) sprintf(newdir
,"%s%04d%s%02d-%04d%s%02d",outdir
,y1
,sm1
,d1
,y1
,sm2
,d2
);
641 else if(strcmp(df
,"e") == 0) sprintf(newdir
,"%s%02d%s%04d-%02d%s%04d",outdir
,d1
,sm1
,y1
,d2
,sm2
,y1
);
643 sprintf(olddir
,"%s%04d/%s/%s",outdir
,y1
,direntp2
->d_name
,direntp3
->d_name
);
644 if(rename(olddir
,newdir
)) {
645 debuga(_("(index) rename error from \"%s\" to \"%s\" - %s\n"),olddir
,newdir
,strerror(errno
));
654 \bug The links to the images in the reports are broken after moving the directories
655 as the the HTML files are not at the right level for the images any more.