2 * Copyright (C) 1994, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.3 1995-09-01 10:57:07 adam
10 * Revision 1.2 1995/09/01 10:30:24 adam
11 * More work on indexing. Not working yet.
13 * Revision 1.1 1995/08/31 14:50:24 adam
14 * New simple file index tool.
21 #include <sys/types.h>
30 static int key_fd = -1;
31 #define KEY_BUF_SIZE 100000
36 static char *base_path = NULL;
38 void key_open (const char *fname)
43 if ((key_fd = open (fname, O_RDWR|O_CREAT, 0666)) == -1)
45 log (LOG_FATAL|LOG_ERRNO, "Creat %s", fname);
48 if (!(key_buf = malloc (KEY_BUF_SIZE)))
50 log (LOG_FATAL|LOG_ERRNO, "malloc");
54 if (!(file_idx = dict_open ("fileidx", 10, 1)))
56 log (LOG_FATAL, "dict_open fail of %s", "fileidx");
59 file_key = dict_lookup (file_idx, ".");
61 memcpy (&sysno_next, (char*)file_key+1, sizeof(sysno_next));
71 dict_insert (file_idx, ".", sizeof(sysno_next), &sysno_next);
72 dict_close (file_idx);
81 while (i < key_offset)
83 w = write (key_fd, key_buf + i, key_offset - i);
86 log (LOG_FATAL|LOG_ERRNO, "Write key fail");
94 void key_write (int cmd, struct it_key *k, const char *str)
97 size_t slen = strlen(str);
99 if (key_offset + sizeof(*k) + slen >= KEY_BUF_SIZE - 2)
101 memcpy (key_buf + key_offset, &x, 1);
103 memcpy (key_buf + key_offset, k, sizeof(*k));
104 key_offset += sizeof(*k);
105 memcpy (key_buf + key_offset, str, slen+1);
106 key_offset += slen+1;
109 void text_extract (SYSNO sysno, int cmd, const char *fname)
117 log (LOG_DEBUG, "Text extract of %d", sysno);
119 inf = fopen (fname, "r");
122 log (LOG_WARN|LOG_ERRNO, "open %s", fname);
125 while ((c=getc (inf)) != EOF)
128 while (i < 254 && c != EOF && isalnum(c))
139 key_write (cmd, &k, w);
147 void file_extract (int cmd, struct stat *fs, const char *fname,
154 const char *file_type;
157 log (LOG_DEBUG, "%c %s k=%s", cmd, fname, kname);
159 for (i = strlen(fname); --i >= 0; )
165 else if (fname[i] == '.')
167 strcpy (ext, fname+i+1);
170 sprintf (ext_res, "fileExtension.%s", ext);
171 if (!(file_type = res_get (common_resource, ext_res)))
174 file_info = dict_lookup (file_idx, fname);
177 sysno = sysno_next++;
178 dict_insert (file_idx, fname, sizeof(sysno), &sysno);
181 memcpy (&sysno, (char*) file_info+1, sizeof(sysno));
182 if (!strcmp (file_type, "text"))
183 text_extract (sysno, cmd, fname);
186 static void repository_extract_r (int cmd, char *rep)
191 size_t rep_len = strlen (rep);
196 if (rep[rep_len-1] != '/')
200 for (i=0; e[i].name; i++)
202 if (!strcmp (e[i].name, ".") || !strcmp (e[i].name, ".."))
204 strcpy (rep +rep_len+1, e[i].name);
206 switch (fs.st_mode & S_IFMT)
209 file_extract (cmd, &fs, rep, rep);
212 repository_extract_r (cmd, rep);
219 void repository_update_r (int cmd, char *dst, char *src);
221 void repository_add_tree (int cmd, char *dst, char *src)
224 repository_update_r (cmd, dst, src);
227 void repository_del_tree (int cmd, char *dst, char *src)
229 log (LOG_DEBUG, "rmdir of %s", dst);
232 void repository_update_r (int cmd, char *dst, char *src)
234 struct dir_entry *e_dst, *e_src;
235 int i_dst = 0, i_src = 0;
236 struct stat fs_dst, fs_src;
237 size_t dst_len = strlen (dst);
238 size_t src_len = strlen (src);
240 e_dst = dir_open (dst);
241 e_src = dir_open (src);
243 if (!e_dst && !e_src)
246 repository_add_tree (cmd, dst, src);
248 repository_del_tree (cmd, dst, src);
253 if (src[src_len-1] != '/')
257 if (dst[dst_len-1] != '/')
261 while (e_dst[i_dst].name || e_src[i_src].name)
265 if (e_dst[i_dst].name && e_src[i_src].name)
266 sd = strcmp (e_dst[i_dst].name, e_src[i_src].name);
267 else if (e_src[i_src].name)
274 strcpy (dst +dst_len+1, e_dst[i_dst].name);
275 strcpy (src +src_len+1, e_src[i_src].name);
277 /* check type, date, length */
279 if (strcmp (e_dst[i_dst].name, ".") &&
280 strcmp (e_dst[i_dst].name, ".."))
285 switch (fs_dst.st_mode & S_IFMT)
288 if (fs_src.st_mtime != fs_dst.st_mtime)
290 file_extract ('d', &fs_dst, dst, dst);
291 file_extract ('a', &fs_src, src, dst);
295 repository_update_r (cmd, dst, src);
304 strcpy (dst +dst_len+1, e_src[i_src].name);
305 strcpy (src +src_len+1, e_src[i_src].name);
308 switch (fs_src.st_mode & S_IFMT)
311 file_extract ('a', &fs_src, src, dst);
314 repository_add_tree (cmd, dst, src);
321 strcpy (dst +dst_len+1, e_dst[i_dst].name);
322 strcpy (src +src_len+1, e_dst[i_dst].name);
325 switch (fs_dst.st_mode & S_IFMT)
328 file_extract ('d', &fs_dst, dst, dst);
331 repository_del_tree (cmd, dst, src);
341 void repository_traverse (int cmd, const char *rep)
346 strcpy (rep_tmp1, rep);
349 strcpy (rep_tmp2, base_path);
350 repository_update_r (cmd, rep_tmp2, rep_tmp1);
353 repository_extract_r (cmd, rep_tmp1);
357 int main (int argc, char **argv)
365 while ((ret = options ("r:v:", argv, argc, &arg)) != -2)
373 common_resource = res_open (base_name);
374 if (!common_resource)
376 log (LOG_FATAL, "Cannot open resource `%s'", base_name);
380 else if(cmd == 0) /* command */
382 if (!strcmp (arg, "add"))
386 else if (!strcmp (arg, "del"))
392 log (LOG_FATAL, "Unknown command: %s", arg);
398 key_open ("keys.tmp");
399 repository_traverse (cmd, arg);
405 log_init (log_mask_str(arg), prog, NULL);
413 log (LOG_FATAL, "Unknown option '-%s'", arg);