RPM: store libs in %{_libdir}
[idzebra-moved-to-github.git] / index / update_path.c
1 /* This file is part of the Zebra server.
2    Copyright (C) 1994-2011 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 #if HAVE_CONFIG_H
21 #include <config.h>
22 #endif
23 #include <stdio.h>
24 #include <assert.h>
25 #include <sys/types.h>
26 #ifdef WIN32
27 #include <io.h>
28 #define S_ISREG(x) (x & _S_IFREG)
29 #define S_ISDIR(x) (x & _S_IFDIR)
30 #endif
31 #if HAVE_UNISTD_H
32 #include <unistd.h>
33 #endif
34 #include <direntz.h>
35 #include <fcntl.h>
36 #include <time.h>
37
38 #include "index.h"
39
40 static void repositoryExtractR(ZebraHandle zh, char *rep, int level,
41                                enum zebra_recctrl_action_t action)
42 {
43     struct dir_entry *e;
44     int i;
45     size_t rep_len = strlen(rep);
46
47     e = dir_open(rep, zh->path_reg, zh->m_follow_links);
48     if (!e)
49         return;
50     yaz_log(YLOG_LOG, "dir %s", rep);
51     if (rep[rep_len-1] != '/')
52         rep[rep_len] = '/';
53     else
54         --rep_len;
55     
56     for (i=0; e[i].name; i++)
57     {
58         char *ecp;
59         strcpy(rep +rep_len+1, e[i].name);
60         if ((ecp = strrchr(e[i].name, '/')))
61             *ecp = '\0';
62
63         switch (e[i].kind)
64         {
65         case dirs_file:
66             zebra_extract_file(zh, NULL, rep, action);
67             break;
68         case dirs_dir:
69             repositoryExtractR(zh, rep, level+1, action);
70             break;
71         }
72     }
73     dir_free(&e);
74
75 }
76
77 void repositoryShow(ZebraHandle zh, const char *path)
78 {
79     char src[1024];
80     int src_len;
81     struct dirs_entry *dst;
82     Dict dict;
83     struct dirs_info *di;
84
85     if (!(dict = dict_open_res(zh->reg->bfs, FMATCH_DICT, 50, 0, 0, zh->res)))
86     {
87         yaz_log(YLOG_FATAL, "dict_open fail of %s", FMATCH_DICT);
88         return;
89     }
90     
91     strncpy(src, path, sizeof(src)-1);
92     src[sizeof(src)-1]='\0';
93     src_len = strlen(src);
94     
95     if (src_len && src[src_len-1] != '/')
96     {
97         src[src_len] = '/';
98         src[++src_len] = '\0';
99     }
100     
101     di = dirs_open(dict, src, zh->m_flag_rw);
102     
103     while ((dst = dirs_read(di)))
104         yaz_log(YLOG_LOG, "%s", dst->path);
105     dirs_free(&di);
106     dict_close(dict);
107 }
108
109 static void repositoryExtract(ZebraHandle zh,
110                               const char *path,
111                               enum zebra_recctrl_action_t action)
112
113 {
114     struct stat sbuf;
115     char src[1024];
116     int ret;
117
118     assert (path);
119
120     if (zh->path_reg && !yaz_is_abspath(path))
121     {
122         strcpy(src, zh->path_reg);
123         strcat(src, "/");
124     }
125     else
126         *src = '\0';
127     strcat(src, path);
128     ret = zebra_file_stat(src, &sbuf, zh->m_follow_links);
129
130     strcpy(src, path);
131
132     if (ret == -1)
133         yaz_log(YLOG_WARN|YLOG_ERRNO, "Cannot access path %s", src);
134     else if (S_ISREG(sbuf.st_mode))
135         zebra_extract_file(zh, NULL, src, action);
136     else if (S_ISDIR(sbuf.st_mode))
137         repositoryExtractR(zh, src, 0, action);
138     else
139         yaz_log(YLOG_WARN, "Skipping path %s", src);
140 }
141
142
143 ZEBRA_RES zebra_update_from_path(ZebraHandle zh, const char *path, 
144                                  enum zebra_recctrl_action_t action)
145 {
146     if (!strcmp(path, "") || !strcmp(path, "-"))
147     {
148         char src[1024];
149         
150         while (scanf("%1020s", src) == 1)
151             repositoryExtract(zh, src, action);
152     }
153     else
154         repositoryExtract(zh, path, action);
155     return ZEBRA_OK;
156 }
157
158 /*
159  * Local variables:
160  * c-basic-offset: 4
161  * c-file-style: "Stroustrup"
162  * indent-tabs-mode: nil
163  * End:
164  * vim: shiftwidth=4 tabstop=8 expandtab
165  */
166