From 51a52e1b014d5237581f74379916b8ce92cafef7 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Fri, 1 Sep 1995 14:06:35 +0000 Subject: [PATCH] Split of work into more files. --- index/Makefile | 6 +- index/dir.c | 12 +- index/extract.c | 174 +++++++++++++++++++++++++++ index/index.h | 15 ++- index/main.c | 349 +++---------------------------------------------------- index/trav.c | 292 ++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 505 insertions(+), 343 deletions(-) create mode 100644 index/extract.c create mode 100644 index/trav.c diff --git a/index/Makefile b/index/Makefile index 8f22a45..f658e9b 100644 --- a/index/Makefile +++ b/index/Makefile @@ -1,13 +1,13 @@ -# Copyright (C) 1994, Index Data I/S +# Copyright (C) 1995, Index Data I/S # All rights reserved. # Sebastian Hammer, Adam Dickmeiss -# $Id: Makefile,v 1.2 1995-09-01 10:30:23 adam Exp $ +# $Id: Makefile,v 1.3 1995-09-01 14:06:35 adam Exp $ SHELL=/bin/sh INCLUDE=-I../include TPROG1=index DEFS=$(INCLUDE) -O = main.o dir.o +O = main.o dir.o trav.o extract.o CPP=cc -E all: $(TPROG1) diff --git a/index/dir.c b/index/dir.c index 7c59200..4228825 100644 --- a/index/dir.c +++ b/index/dir.c @@ -1,10 +1,13 @@ /* - * Copyright (C) 1994, Index Data I/S + * Copyright (C) 1995, Index Data I/S * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: dir.c,v $ - * Revision 1.2 1995-09-01 10:57:07 adam + * Revision 1.3 1995-09-01 14:06:35 adam + * Split of work into more files. + * + * Revision 1.2 1995/09/01 10:57:07 adam * Minor changes. * * Revision 1.1 1995/09/01 10:34:51 adam @@ -46,6 +49,9 @@ struct dir_entry *dir_open (const char *rep) } while ((dent = readdir (dir))) { + if (strcmp (dent->d_name, ".") == 0 || + strcmp (dent->d_name, "..") == 0) + continue; if (idx == entry_max-1) { struct dir_entry *entry_n; @@ -55,7 +61,7 @@ struct dir_entry *dir_open (const char *rep) log (LOG_FATAL|LOG_ERRNO, "malloc"); exit (1); } - memcpy (entry_n, entry, entry_max * sizeof(*entry)); + memcpy (entry_n, entry, idx * sizeof(*entry)); free (entry); entry = entry_n; entry_max += 100; diff --git a/index/extract.c b/index/extract.c new file mode 100644 index 0000000..34cb68b --- /dev/null +++ b/index/extract.c @@ -0,0 +1,174 @@ +/* + * Copyright (C) 1995, Index Data I/S + * All rights reserved. + * Sebastian Hammer, Adam Dickmeiss + * + * $Log: extract.c,v $ + * Revision 1.1 1995-09-01 14:06:35 adam + * Split of work into more files. + * + */ +#include +#include +#include +#include +#include + +#include +#include "index.h" + +#define KEY_BUF_SIZE 100000 + +static Dict file_idx; +static SYSNO sysno_next; +static int key_fd = -1; +static char *key_buf; +static int key_offset; + +void key_open (const char *fname) +{ + void *file_key; + if (key_fd != -1) + return; + if ((key_fd = open (fname, O_RDWR|O_CREAT, 0666)) == -1) + { + log (LOG_FATAL|LOG_ERRNO, "Creat %s", fname); + exit (1); + } + if (!(key_buf = malloc (KEY_BUF_SIZE))) + { + log (LOG_FATAL|LOG_ERRNO, "malloc"); + exit (1); + } + key_offset = 0; + if (!(file_idx = dict_open ("fileidx", 10, 1))) + { + log (LOG_FATAL, "dict_open fail of %s", "fileidx"); + exit (1); + } + file_key = dict_lookup (file_idx, "."); + if (file_key) + memcpy (&sysno_next, (char*)file_key+1, sizeof(sysno_next)); + else + sysno_next = 1; +} + +void key_close (void) +{ + if (key_fd == -1) + return; + close (key_fd); + dict_insert (file_idx, ".", sizeof(sysno_next), &sysno_next); + dict_close (file_idx); + key_fd = -1; +} + +void key_flush (void) +{ + size_t i = 0; + int w; + + while (i < key_offset) + { + w = write (key_fd, key_buf + i, key_offset - i); + if (w == -1) + { + log (LOG_FATAL|LOG_ERRNO, "Write key fail"); + exit (1); + } + i += w; + } + key_offset = 0; +} + +void key_write (int cmd, struct it_key *k, const char *str) +{ + char x = cmd; + size_t slen = strlen(str); + + if (key_offset + sizeof(*k) + slen >= KEY_BUF_SIZE - 2) + key_flush (); + memcpy (key_buf + key_offset, &x, 1); + key_offset++; + memcpy (key_buf + key_offset, k, sizeof(*k)); + key_offset += sizeof(*k); + memcpy (key_buf + key_offset, str, slen+1); + key_offset += slen+1; +} + +void text_extract (SYSNO sysno, int cmd, const char *fname) +{ + FILE *inf; + struct it_key k; + int seqno = 1; + int c; + char w[256]; + + log (LOG_DEBUG, "Text extract of %d", sysno); + k.sysno = sysno; + inf = fopen (fname, "r"); + if (!inf) + { + log (LOG_WARN|LOG_ERRNO, "open %s", fname); + return; + } + while ((c=getc (inf)) != EOF) + { + int i = 0; + while (i < 254 && c != EOF && isalnum(c)) + { + w[i++] = c; + c = getc (inf); + } + if (i) + { + w[i] = 0; + + k.seqno = seqno++; + k.field = 0; + key_write (cmd, &k, w); + } + if (c == EOF) + break; + } + fclose (inf); +} + +void file_extract (int cmd, const char *fname, const char *kname) +{ + int i; + char ext[128]; + SYSNO sysno; + char ext_res[128]; + const char *file_type; + void *file_info; + + log (LOG_DEBUG, "%c %s k=%s", cmd, fname, kname); + for (i = strlen(fname); --i >= 0; ) + if (fname[i] == '/') + { + strcpy (ext, ""); + break; + } + else if (fname[i] == '.') + { + strcpy (ext, fname+i+1); + break; + } + sprintf (ext_res, "fileExtension.%s", ext); + if (!(file_type = res_get (common_resource, ext_res))) + return; + + file_info = dict_lookup (file_idx, kname); + if (!file_info) + { + sysno = sysno_next++; + dict_insert (file_idx, kname, sizeof(sysno), &sysno); + } + else + memcpy (&sysno, (char*) file_info+1, sizeof(sysno)); + if (!strcmp (file_type, "text")) + text_extract (sysno, cmd, fname); +} + + diff --git a/index/index.h b/index/index.h index 149c141..22c8419 100644 --- a/index/index.h +++ b/index/index.h @@ -1,10 +1,13 @@ /* - * Copyright (C) 1994, Index Data I/S + * Copyright (C) 1995, Index Data I/S * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: index.h,v $ - * Revision 1.2 1995-09-01 10:30:24 adam + * Revision 1.3 1995-09-01 14:06:35 adam + * Split of work into more files. + * + * Revision 1.2 1995/09/01 10:30:24 adam * More work on indexing. Not working yet. * * Revision 1.1 1995/08/31 14:50:24 adam @@ -29,3 +32,11 @@ struct dir_entry { struct dir_entry *dir_open (const char *rep); void dir_sort (struct dir_entry *e); void dir_free (struct dir_entry **e_p); +void repository (int cmd, const char *rep, const char *base_path); + +void file_extract (int cmd, const char *fname, const char *kname); + +void key_open (const char *fname); +void key_close (void); +void key_flush (void); +void key_write (int cmd, struct it_key *k, const char *str); diff --git a/index/main.c b/index/main.c index 358b0a9..7127c84 100644 --- a/index/main.c +++ b/index/main.c @@ -1,10 +1,13 @@ /* - * Copyright (C) 1994, Index Data I/S + * Copyright (C) 1995, Index Data I/S * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: main.c,v $ - * Revision 1.3 1995-09-01 10:57:07 adam + * Revision 1.4 1995-09-01 14:06:36 adam + * Split of work into more files. + * + * Revision 1.3 1995/09/01 10:57:07 adam * Minor changes. * * Revision 1.2 1995/09/01 10:30:24 adam @@ -17,349 +20,19 @@ #include #include #include -#include -#include -#include -#include #include #include "index.h" char *prog; -static int key_fd = -1; -#define KEY_BUF_SIZE 100000 -static char *key_buf; -int key_offset; -SYSNO sysno_next; -Dict file_idx; -static char *base_path = NULL; - -void key_open (const char *fname) -{ - void *file_key; - if (key_fd != -1) - return; - if ((key_fd = open (fname, O_RDWR|O_CREAT, 0666)) == -1) - { - log (LOG_FATAL|LOG_ERRNO, "Creat %s", fname); - exit (1); - } - if (!(key_buf = malloc (KEY_BUF_SIZE))) - { - log (LOG_FATAL|LOG_ERRNO, "malloc"); - exit (1); - } - key_offset = 0; - if (!(file_idx = dict_open ("fileidx", 10, 1))) - { - log (LOG_FATAL, "dict_open fail of %s", "fileidx"); - exit (1); - } - file_key = dict_lookup (file_idx, "."); - if (file_key) - memcpy (&sysno_next, (char*)file_key+1, sizeof(sysno_next)); - else - sysno_next = 1; -} - -void key_close (void) -{ - if (key_fd == -1) - return; - close (key_fd); - dict_insert (file_idx, ".", sizeof(sysno_next), &sysno_next); - dict_close (file_idx); - key_fd = -1; -} - -void key_flush (void) -{ - size_t i = 0; - int w; - - while (i < key_offset) - { - w = write (key_fd, key_buf + i, key_offset - i); - if (w == -1) - { - log (LOG_FATAL|LOG_ERRNO, "Write key fail"); - exit (1); - } - i += w; - } - key_offset = 0; -} - -void key_write (int cmd, struct it_key *k, const char *str) -{ - char x = cmd; - size_t slen = strlen(str); - - if (key_offset + sizeof(*k) + slen >= KEY_BUF_SIZE - 2) - key_flush (); - memcpy (key_buf + key_offset, &x, 1); - key_offset++; - memcpy (key_buf + key_offset, k, sizeof(*k)); - key_offset += sizeof(*k); - memcpy (key_buf + key_offset, str, slen+1); - key_offset += slen+1; -} - -void text_extract (SYSNO sysno, int cmd, const char *fname) -{ - FILE *inf; - struct it_key k; - int seqno = 1; - int c; - char w[256]; - - log (LOG_DEBUG, "Text extract of %d", sysno); - k.sysno = sysno; - inf = fopen (fname, "r"); - if (!inf) - { - log (LOG_WARN|LOG_ERRNO, "open %s", fname); - return; - } - while ((c=getc (inf)) != EOF) - { - int i = 0; - while (i < 254 && c != EOF && isalnum(c)) - { - w[i++] = c; - c = getc (inf); - } - if (i) - { - w[i] = 0; - - k.seqno = seqno++; - k.field = 0; - key_write (cmd, &k, w); - } - if (c == EOF) - break; - } - fclose (inf); -} - -void file_extract (int cmd, struct stat *fs, const char *fname, - const char *kname) -{ - int i; - char ext[128]; - SYSNO sysno; - char ext_res[128]; - const char *file_type; - void *file_info; - - log (LOG_DEBUG, "%c %s k=%s", cmd, fname, kname); - return; - for (i = strlen(fname); --i >= 0; ) - if (fname[i] == '/') - { - strcpy (ext, ""); - break; - } - else if (fname[i] == '.') - { - strcpy (ext, fname+i+1); - break; - } - sprintf (ext_res, "fileExtension.%s", ext); - if (!(file_type = res_get (common_resource, ext_res))) - return; - - file_info = dict_lookup (file_idx, fname); - if (!file_info) - { - sysno = sysno_next++; - dict_insert (file_idx, fname, sizeof(sysno), &sysno); - } - else - memcpy (&sysno, (char*) file_info+1, sizeof(sysno)); - if (!strcmp (file_type, "text")) - text_extract (sysno, cmd, fname); -} - -static void repository_extract_r (int cmd, char *rep) -{ - struct dir_entry *e; - int i; - struct stat fs; - size_t rep_len = strlen (rep); - - e = dir_open (rep); - if (!e) - return; - if (rep[rep_len-1] != '/') - rep[rep_len] = '/'; - else - --rep_len; - for (i=0; e[i].name; i++) - { - if (!strcmp (e[i].name, ".") || !strcmp (e[i].name, "..")) - continue; - strcpy (rep +rep_len+1, e[i].name); - stat (rep, &fs); - switch (fs.st_mode & S_IFMT) - { - case S_IFREG: - file_extract (cmd, &fs, rep, rep); - break; - case S_IFDIR: - repository_extract_r (cmd, rep); - break; - } - } - dir_free (&e); -} - -void repository_update_r (int cmd, char *dst, char *src); - -void repository_add_tree (int cmd, char *dst, char *src) -{ - mkdir (dst, 0755); - repository_update_r (cmd, dst, src); -} - -void repository_del_tree (int cmd, char *dst, char *src) -{ - log (LOG_DEBUG, "rmdir of %s", dst); -} - -void repository_update_r (int cmd, char *dst, char *src) -{ - struct dir_entry *e_dst, *e_src; - int i_dst = 0, i_src = 0; - struct stat fs_dst, fs_src; - size_t dst_len = strlen (dst); - size_t src_len = strlen (src); - - e_dst = dir_open (dst); - e_src = dir_open (src); - - if (!e_dst && !e_src) - return; - if (!e_dst) - repository_add_tree (cmd, dst, src); - else if (!e_src) - repository_del_tree (cmd, dst, src); - - dir_sort (e_src); - dir_sort (e_dst); - - if (src[src_len-1] != '/') - src[src_len] = '/'; - else - --src_len; - if (dst[dst_len-1] != '/') - dst[dst_len] = '/'; - else - --dst_len; - while (e_dst[i_dst].name || e_src[i_src].name) - { - int sd; - - if (e_dst[i_dst].name && e_src[i_src].name) - sd = strcmp (e_dst[i_dst].name, e_src[i_src].name); - else if (e_src[i_src].name) - sd = 1; - else - sd = -1; - - if (sd == 0) - { - strcpy (dst +dst_len+1, e_dst[i_dst].name); - strcpy (src +src_len+1, e_src[i_src].name); - - /* check type, date, length */ - - if (strcmp (e_dst[i_dst].name, ".") && - strcmp (e_dst[i_dst].name, "..")) - { - stat (dst, &fs_dst); - stat (src, &fs_src); - - switch (fs_dst.st_mode & S_IFMT) - { - case S_IFREG: - if (fs_src.st_mtime != fs_dst.st_mtime) - { - file_extract ('d', &fs_dst, dst, dst); - file_extract ('a', &fs_src, src, dst); - } - break; - case S_IFDIR: - repository_update_r (cmd, dst, src); - break; - } - } - i_src++; - i_dst++; - } - else if (sd > 0) - { - strcpy (dst +dst_len+1, e_src[i_src].name); - strcpy (src +src_len+1, e_src[i_src].name); - - stat (src, &fs_src); - switch (fs_src.st_mode & S_IFMT) - { - case S_IFREG: - file_extract ('a', &fs_src, src, dst); - break; - case S_IFDIR: - repository_add_tree (cmd, dst, src); - break; - } - i_src++; - } - else - { - strcpy (dst +dst_len+1, e_dst[i_dst].name); - strcpy (src +src_len+1, e_dst[i_dst].name); - - stat (dst, &fs_dst); - switch (fs_dst.st_mode & S_IFMT) - { - case S_IFREG: - file_extract ('d', &fs_dst, dst, dst); - break; - case S_IFDIR: - repository_del_tree (cmd, dst, src); - break; - } - i_dst++; - } - } - dir_free (&e_dst); - dir_free (&e_src); -} - -void repository_traverse (int cmd, const char *rep) -{ - char rep_tmp1[2048]; - char rep_tmp2[2048]; - - strcpy (rep_tmp1, rep); - if (base_path) - { - strcpy (rep_tmp2, base_path); - repository_update_r (cmd, rep_tmp2, rep_tmp1); - } - else - repository_extract_r (cmd, rep_tmp1); -} - - int main (int argc, char **argv) { int ret; int cmd = 0; char *arg; - char *base_name; + char *base_name = NULL; + char *base_path = NULL; prog = *argv; while ((ret = options ("r:v:", argv, argc, &arg)) != -2) @@ -396,7 +69,7 @@ int main (int argc, char **argv) else { key_open ("keys.tmp"); - repository_traverse (cmd, arg); + repository (cmd, arg, base_path); cmd = 0; } } @@ -414,6 +87,12 @@ int main (int argc, char **argv) exit (1); } } + if (!base_name) + { + fprintf (stderr, "index [-v log] [-r repository] " + "base cmd1 dir1 cmd2 dir2 ...\n"); + exit (1); + } key_flush (); key_close (); exit (0); diff --git a/index/trav.c b/index/trav.c new file mode 100644 index 0000000..27a803c --- /dev/null +++ b/index/trav.c @@ -0,0 +1,292 @@ +/* + * Copyright (C) 1995, Index Data I/S + * All rights reserved. + * Sebastian Hammer, Adam Dickmeiss + * + * $Log: trav.c,v $ + * Revision 1.1 1995-09-01 14:06:36 adam + * Split of work into more files. + * + */ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "index.h" + +static void repository_extract_r (int cmd, char *rep) +{ + struct dir_entry *e; + int i; + struct stat fs; + size_t rep_len = strlen (rep); + + e = dir_open (rep); + if (!e) + return; + if (rep[rep_len-1] != '/') + rep[rep_len] = '/'; + else + --rep_len; + for (i=0; e[i].name; i++) + { + strcpy (rep +rep_len+1, e[i].name); + stat (rep, &fs); + switch (fs.st_mode & S_IFMT) + { + case S_IFREG: + file_extract (cmd, rep, rep); + break; + case S_IFDIR: + repository_extract_r (cmd, rep); + break; + } + } + dir_free (&e); +} + +void copy_file (const char *dst, const char *src) +{ + int d_fd = open (dst, O_WRONLY|O_CREAT, 0666); + int s_fd = open (src, O_RDONLY); + char *buf; + size_t i, r, w; + + if (d_fd == -1) + { + log (LOG_FATAL|LOG_ERRNO, "Cannot create %s", dst); + exit (1); + } + if (s_fd == -1) + { + log (LOG_FATAL|LOG_ERRNO, "Cannot open %s", src); + exit (1); + } + if (!(buf = malloc (4096))) + { + log (LOG_FATAL|LOG_ERRNO, "malloc"); + exit (1); + } + while ((r=read (s_fd, buf, 4096))>0) + for (w = 0; w < r; w += i) + { + i = write (d_fd, buf + w, r - w); + if (i == -1) + { + log (LOG_FATAL|LOG_ERRNO, "write"); + exit (1); + } + } + if (r) + { + log (LOG_FATAL|LOG_ERRNO, "read"); + exit (1); + } + free (buf); + close (d_fd); + close (s_fd); +} + +void del_file (const char *dst) +{ + unlink (dst); +} + +void del_dir (const char *dst) +{ + log (LOG_DEBUG, "rmdir of %s", dst); + if (rmdir (dst) == -1) + log (LOG_ERRNO|LOG_WARN, "rmdir"); +} + +void repository_update_r (int cmd, char *dst, char *src); + +void repository_add_tree (int cmd, char *dst, char *src) +{ + mkdir (dst, 0755); + repository_update_r (cmd, dst, src); +} + +void repository_del_tree (int cmd, char *dst, char *src) +{ + size_t dst_len = strlen (dst); + size_t src_len = strlen (src); + struct dir_entry *e_dst; + int i_dst = 0; + struct stat fs_dst; + + e_dst = dir_open (dst); + + dir_sort (e_dst); + + if (src[src_len-1] != '/') + src[src_len] = '/'; + else + --src_len; + if (dst[dst_len-1] != '/') + dst[dst_len] = '/'; + else + --dst_len; + while (e_dst[i_dst].name) + { + strcpy (dst +dst_len+1, e_dst[i_dst].name); + strcpy (src +src_len+1, e_dst[i_dst].name); + + stat (dst, &fs_dst); + switch (fs_dst.st_mode & S_IFMT) + { + case S_IFREG: + file_extract ('d', dst, dst); + del_file (dst); + break; + case S_IFDIR: + repository_del_tree (cmd, dst, src); + break; + } + i_dst++; + } + dir_free (&e_dst); + if (dst_len > 0) + { + dst[dst_len] = '\0'; + del_dir (dst); + } +} + +void repository_update_r (int cmd, char *dst, char *src) +{ + struct dir_entry *e_dst, *e_src; + int i_dst = 0, i_src = 0; + struct stat fs_dst, fs_src; + size_t dst_len = strlen (dst); + size_t src_len = strlen (src); + + e_dst = dir_open (dst); + e_src = dir_open (src); + + if (!e_dst && !e_src) + return; + if (!e_dst) + { + dir_free (&e_src); + repository_add_tree (cmd, dst, src); + return; + } + else if (!e_src) + { + dir_free (&e_dst); + repository_del_tree (cmd, dst, src); + return; + } + + dir_sort (e_src); + dir_sort (e_dst); + + if (src[src_len-1] != '/') + src[src_len] = '/'; + else + --src_len; + if (dst[dst_len-1] != '/') + dst[dst_len] = '/'; + else + --dst_len; + while (e_dst[i_dst].name || e_src[i_src].name) + { + int sd; + + if (e_dst[i_dst].name && e_src[i_src].name) + sd = strcmp (e_dst[i_dst].name, e_src[i_src].name); + else if (e_src[i_src].name) + sd = 1; + else + sd = -1; + + if (sd == 0) + { + strcpy (dst +dst_len+1, e_dst[i_dst].name); + strcpy (src +src_len+1, e_src[i_src].name); + + /* check type, date, length */ + + stat (dst, &fs_dst); + stat (src, &fs_src); + + switch (fs_dst.st_mode & S_IFMT) + { + case S_IFREG: + if (fs_src.st_ctime > fs_dst.st_ctime) + { + file_extract ('d', dst, dst); + file_extract ('a', src, dst); + copy_file (dst, src); + } + break; + case S_IFDIR: + repository_update_r (cmd, dst, src); + break; + } + i_src++; + i_dst++; + } + else if (sd > 0) + { + strcpy (dst +dst_len+1, e_src[i_src].name); + strcpy (src +src_len+1, e_src[i_src].name); + + stat (src, &fs_src); + switch (fs_src.st_mode & S_IFMT) + { + case S_IFREG: + file_extract ('a', src, dst); + copy_file (dst, src); + break; + case S_IFDIR: + repository_add_tree (cmd, dst, src); + break; + } + i_src++; + } + else + { + strcpy (dst +dst_len+1, e_dst[i_dst].name); + strcpy (src +src_len+1, e_dst[i_dst].name); + + stat (dst, &fs_dst); + switch (fs_dst.st_mode & S_IFMT) + { + case S_IFREG: + file_extract ('d', dst, dst); + del_file (dst); + break; + case S_IFDIR: + repository_del_tree (cmd, dst, src); + break; + } + i_dst++; + } + } + dir_free (&e_dst); + dir_free (&e_src); +} + +void repository (int cmd, const char *rep, const char *base_path) +{ + char rep_tmp1[2048]; + char rep_tmp2[2048]; + + strcpy (rep_tmp1, rep); + if (base_path) + { + strcpy (rep_tmp2, base_path); + repository_update_r (cmd, rep_tmp2, rep_tmp1); + } + else + repository_extract_r (cmd, rep_tmp1); +} + -- 1.7.10.4