1 #include <stdio.h>
2 #include <string.h>
3 #include <unistd.h>
4 #include <errno.h>
5 #include <sys/types.h>
6 #include <sys/stat.h>
7 #include <time.h>
8 #include "vars.h"
9
write_cache(int section,char * urls_name,char * cache_name)10 int write_cache(int section,char *urls_name,char *cache_name)
11 {
12 char etmp[ML_ETMP];
13 FILE *fp;
14 int i;
15 char **table;
16 struct stat url_time;
17
18
19 #ifdef DEBUG_WRITE_CACHE
20 fprintf(stderr,"Write cache for %s from %s to file %s\n",redir[section]->name,urls_name,cache_name);
21 #endif
22
23 /*** Generate pointer table for cache ***/
24
25 // Allocate memory
26 table=(char **)malloc((1+redir[section]->ban_urls_count)*sizeof(char *));
27 if (table==NULL)
28 {
29 err_mes("MAKE-CACHE: ERROR: Can't allocate memory\n");
30 exit(-1);
31 }
32 // set first pointer to zero
33 table[0]=0;
34
35 // Set other pointer
36 for (i=1;i<redir[section]->ban_urls_count;i++)
37 table[i]=table[i-1]+(int)strlen(redir[section]->ban_urls[i-1])+1;
38
39
40 // Open file
41 if ((fp=fopen(cache_name,"wb"))==NULL)
42 { // Open error
43 sprintf(etmp,"MAKE-CACHE: ERROR: Can't open file %s (for write): %s\n",cache_name,strerror(errno));
44 err_mes(etmp);
45 exit(-1);
46 }
47
48 // Get urls file modify time
49 if (stat(urls_name, &url_time)<0)
50 { // Stat error
51 sprintf(etmp,"MAKE-CACHE: ERROR: Can't stat file %s, skip: %s",urls_name,strerror(errno));
52 err_mes(etmp);
53 exit(-1);
54 }
55 #ifdef DEBUG_WRITE_CACHE
56 fprintf (stderr," urls file modify time: %s\n",ctime(&url_time.st_mtime));
57 #endif
58
59 // Write modify time
60 if (fwrite(&url_time.st_mtime,1,sizeof(time_t),fp)<1)
61 { // Write error
62 sprintf(etmp,"MAKE-CACHE: ERROR: Can't write to file %s: %s\n",cache_name,strerror(errno));
63 err_mes(etmp);
64 exit(-1);
65 }
66
67 // Write ban_urls_count
68 if (fwrite(&redir[section]->ban_urls_count,1,sizeof(redir[section]->ban_urls_count),fp)<1)
69 { // Write error
70 sprintf(etmp,"MAKE-CACHE: ERROR: Can't write to file %s: %s\n",cache_name,strerror(errno));
71 err_mes(etmp);
72 exit(-1);
73 }
74
75 // Write pointers table
76 if (redir[section]->ban_urls_count)
77 if (fwrite(&table[0],redir[section]->ban_urls_count,sizeof(table[i]),fp)<1)
78 { // Write error
79 sprintf(etmp,"MAKE-CACHE: ERROR: Can't write to file %s: %s\n",cache_name,strerror(errno));
80 err_mes(etmp);
81 exit(-1);
82 }
83
84 #ifdef DEBUG_WRITE_CACHE
85 // print pointer table
86 for(i=0;i<redir[section]->ban_urls_count;i++)
87 fprintf(stderr,"%i %p\n",i,table[i]);
88 #endif
89
90
91 // Write ban_urls data
92 for (i=0; i<redir[section]->ban_urls_count; i++)
93 if (fwrite(redir[section]->ban_urls[i],1,strlen(redir[section]->ban_urls[i])+1,fp)<1)
94 { // Write error
95 sprintf(etmp,"MAKE-CACHE: ERROR: Can't write to file %s: %s\n",cache_name,strerror(errno));
96 err_mes(etmp);
97 exit(-1);
98 }
99 fclose(fp);
100
101 #ifdef DEBUG_WRITE_CACHE
102 fprintf(stderr,"write %i elements to cache\n",redir[section]->ban_urls_count);
103 #endif
104
105 return(0);
106 }
107
108