Omit CVS Id. Update copyright year.
[idzebra-moved-to-github.git] / index / update_path.c
1 /* This file is part of the Zebra server.
2    Copyright (C) 1995-2008 Index Data
3
4 Zebra is free software; you can redistribute it and/or modify it under
5 the terms of the GNU General Public License as published by the Free
6 Software Foundation; either version 2, or (at your option) any later
7 version.
8
9 Zebra is distributed in the hope that it will be useful, but WITHOUT ANY
10 WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
18 */
19
20 #include <stdio.h>
21 #include <assert.h>
22 #include <sys/types.h>
23 #ifdef WIN32
24 #include <io.h>
25 #define S_ISREG(x) (x & _S_IFREG)
26 #define S_ISDIR(x) (x & _S_IFDIR)
27 #endif
28 #if HAVE_UNISTD_H
29 #include <unistd.h>
30 #endif
31 #include <direntz.h>
32 #include <fcntl.h>
33 #include <time.h>
34
35 #include "index.h"
36
37 static void repositoryExtractR(ZebraHandle zh, char *rep, int level,
38                                enum zebra_recctrl_action_t action)
39 {
40     struct dir_entry *e;
41     int i;
42     size_t rep_len = strlen(rep);
43
44     e = dir_open(rep, zh->path_reg, zh->m_follow_links);
45     if (!e)
46         return;
47     yaz_log(YLOG_LOG, "dir %s", rep);
48     if (rep[rep_len-1] != '/')
49         rep[rep_len] = '/';
50     else
51         --rep_len;
52     
53     for (i=0; e[i].name; i++)
54     {
55         char *ecp;
56         strcpy(rep +rep_len+1, e[i].name);
57         if ((ecp = strrchr(e[i].name, '/')))
58             *ecp = '\0';
59
60         switch (e[i].kind)
61         {
62         case dirs_file:
63             zebra_extract_file(zh, NULL, rep, action);
64             break;
65         case dirs_dir:
66             repositoryExtractR(zh, rep, level+1, action);
67             break;
68         }
69     }
70     dir_free(&e);
71
72 }
73
74 void repositoryShow(ZebraHandle zh, const char *path)
75 {
76     char src[1024];
77     int src_len;
78     struct dirs_entry *dst;
79     Dict dict;
80     struct dirs_info *di;
81
82     if (!(dict = dict_open_res(zh->reg->bfs, FMATCH_DICT, 50, 0, 0, zh->res)))
83     {
84         yaz_log(YLOG_FATAL, "dict_open fail of %s", FMATCH_DICT);
85         return;
86     }
87     
88     strncpy(src, path, sizeof(src)-1);
89     src[sizeof(src)-1]='\0';
90     src_len = strlen(src);
91     
92     if (src_len && src[src_len-1] != '/')
93     {
94         src[src_len] = '/';
95         src[++src_len] = '\0';
96     }
97     
98     di = dirs_open(dict, src, zh->m_flag_rw);
99     
100     while ((dst = dirs_read(di)))
101         yaz_log(YLOG_LOG, "%s", dst->path);
102     dirs_free(&di);
103     dict_close(dict);
104 }
105
106 static void repositoryExtract(ZebraHandle zh,
107                               const char *path,
108                               enum zebra_recctrl_action_t action)
109
110 {
111     struct stat sbuf;
112     char src[1024];
113     int ret;
114
115     assert (path);
116
117     if (zh->path_reg && !yaz_is_abspath(path))
118     {
119         strcpy(src, zh->path_reg);
120         strcat(src, "/");
121     }
122     else
123         *src = '\0';
124     strcat(src, path);
125     ret = zebra_file_stat(src, &sbuf, zh->m_follow_links);
126
127     strcpy(src, path);
128
129     if (ret == -1)
130         yaz_log(YLOG_WARN|YLOG_ERRNO, "Cannot access path %s", src);
131     else if (S_ISREG(sbuf.st_mode))
132         zebra_extract_file(zh, NULL, src, action);
133     else if (S_ISDIR(sbuf.st_mode))
134         repositoryExtractR(zh, src, 0, action);
135     else
136         yaz_log(YLOG_WARN, "Skipping path %s", src);
137 }
138
139
140 ZEBRA_RES zebra_update_from_path(ZebraHandle zh, const char *path, 
141                                  enum zebra_recctrl_action_t action)
142 {
143     if (!strcmp(path, "") || !strcmp(path, "-"))
144     {
145         char src[1024];
146         
147         while (scanf("%1020s", src) == 1)
148             repositoryExtract(zh, src, action);
149     }
150     else
151         repositoryExtract(zh, path, action);
152     return ZEBRA_OK;
153 }
154
155 /*
156  * Local variables:
157  * c-basic-offset: 4
158  * indent-tabs-mode: nil
159  * End:
160  * vim: shiftwidth=4 tabstop=8 expandtab
161  */
162