2 * Copyright (C) 1994, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.2 1995-09-01 10:30:24 adam
8 * More work on indexing. Not working yet.
10 * Revision 1.1 1995/08/31 14:50:24 adam
11 * New simple file index tool.
18 #include <sys/types.h>
27 static int key_fd = -1;
28 #define KEY_BUF_SIZE 100000
33 static char *base_path = NULL;
35 void key_open (const char *fname)
40 if ((key_fd = open (fname, O_RDWR|O_CREAT, 0666)) == -1)
42 log (LOG_FATAL|LOG_ERRNO, "Creat %s", fname);
45 if (!(key_buf = malloc (KEY_BUF_SIZE)))
47 log (LOG_FATAL|LOG_ERRNO, "malloc");
51 if (!(file_idx = dict_open ("fileidx", 10, 1)))
53 log (LOG_FATAL, "dict_open fail of %s", "fileidx");
56 file_key = dict_lookup (file_idx, ".");
58 memcpy (&sysno_next, (char*)file_key+1, sizeof(sysno_next));
68 dict_insert (file_idx, ".", sizeof(sysno_next), &sysno_next);
69 dict_close (file_idx);
78 while (i < key_offset)
80 w = write (key_fd, key_buf + i, key_offset - i);
83 log (LOG_FATAL|LOG_ERRNO, "Write key fail");
91 void key_write (int cmd, struct it_key *k, const char *str)
94 size_t slen = strlen(str);
96 if (key_offset + sizeof(*k) + slen >= KEY_BUF_SIZE - 2)
98 memcpy (key_buf + key_offset, &x, 1);
100 memcpy (key_buf + key_offset, k, sizeof(*k));
101 key_offset += sizeof(*k);
102 memcpy (key_buf + key_offset, str, slen+1);
103 key_offset += slen+1;
106 void text_extract (SYSNO sysno, int cmd, const char *fname)
114 log (LOG_DEBUG, "Text extract of %d", sysno);
116 inf = fopen (fname, "r");
119 log (LOG_WARN|LOG_ERRNO, "open %s", fname);
122 while ((c=getc (inf)) != EOF)
125 while (i < 254 && c != EOF && isalnum(c))
136 key_write (cmd, &k, w);
144 void file_extract (int cmd, struct stat *fs, const char *fname)
150 const char *file_type;
153 log (LOG_DEBUG, "%c %s", cmd, fname);
155 for (i = strlen(fname); --i >= 0; )
161 else if (fname[i] == '.')
163 strcpy (ext, fname+i+1);
166 sprintf (ext_res, "fileExtension.%s", ext);
167 if (!(file_type = res_get (common_resource, ext_res)))
170 file_info = dict_lookup (file_idx, fname);
173 sysno = sysno_next++;
174 dict_insert (file_idx, fname, sizeof(sysno), &sysno);
177 memcpy (&sysno, (char*) file_info+1, sizeof(sysno));
178 if (!strcmp (file_type, "text"))
179 text_extract (sysno, cmd, fname);
182 static void repository_extract_r (int cmd, char *rep)
187 size_t rep_len = strlen (rep);
192 if (rep[rep_len-1] != '/')
196 for (i=0; e[i].name; i++)
198 if (!strcmp (e[i].name, ".") || !strcmp (e[i].name, ".."))
200 strcpy (rep +rep_len+1, e[i].name);
202 switch (fs.st_mode & S_IFMT)
205 file_extract (cmd, &fs, rep);
208 repository_extract_r (cmd, rep);
215 void repository_update_r (int cmd, char *dst, char *src);
217 void repository_add_tree (int cmd, char *dst, char *src)
220 repository_update_r (cmd, dst, src);
223 void repository_del_tree (int cmd, char *dst, char *src)
225 log (LOG_DEBUG, "rmdir of %s", dst);
228 void repository_update_r (int cmd, char *dst, char *src)
230 struct dir_entry *e_dst, *e_src;
231 int i_dst = 0, i_src = 0;
232 struct stat fs_dst, fs_src;
233 size_t dst_len = strlen (dst);
234 size_t src_len = strlen (src);
236 e_dst = dir_open (dst);
237 e_src = dir_open (src);
239 if (!e_dst && !e_src)
242 repository_add_tree (cmd, dst, src);
244 repository_del_tree (cmd, dst, src);
249 if (src[src_len-1] != '/')
253 if (dst[dst_len-1] != '/')
257 while (e_dst[i_dst].name && e_src[i_src].name)
259 int sd = strcmp (e_dst[i_dst].name, e_src[i_src].name);
261 strcpy (dst +dst_len+1, e_dst[i_dst].name);
262 strcpy (src +src_len+1, e_src[i_src].name);
266 /* check type, date, length */
271 switch (fs_dst.st_mode & S_IFMT)
274 if (fs_src.st_mtime != fs_dst.st_mtime)
276 file_extract ('a', &fs_src, src);
277 file_extract ('d', &fs_dst, dst);
281 repository_update_r (cmd, dst, src);
290 switch (fs_src.st_mode & S_IFMT)
293 file_extract ('a', &fs_src, src);
296 repository_add_tree (cmd, dst, src);
304 switch (fs_dst.st_mode & S_IFMT)
307 file_extract ('d', &fs_dst, dst);
310 repository_del_tree (cmd, dst, src);
320 void repository_traverse (int cmd, const char *rep)
325 strcpy (rep_tmp1, rep);
328 strcpy (rep_tmp2, base_path);
329 repository_update_r (cmd, rep_tmp2, rep_tmp1);
332 repository_extract_r (cmd, rep_tmp1);
336 int main (int argc, char **argv)
344 while ((ret = options ("r:v:", argv, argc, &arg)) != -2)
352 common_resource = res_open (base_name);
353 if (!common_resource)
355 log (LOG_FATAL, "Cannot open resource `%s'", base_name);
359 else if(cmd == 0) /* command */
361 if (!strcmp (arg, "add"))
365 else if (!strcmp (arg, "del"))
371 log (LOG_FATAL, "Unknown command: %s", arg);
377 key_open ("keys.tmp");
378 repository_traverse (cmd, arg);
384 log_init (log_mask_str(arg), prog, NULL);
392 log (LOG_FATAL, "Unknown option '-%s'", arg);