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