Lines 17-22
Link Here
|
17 |
*/ |
17 |
*/ |
18 |
|
18 |
|
19 |
#include <config.h> |
19 |
#include <config.h> |
|
|
20 |
#include <limits.h> |
20 |
#include <stdlib.h> |
21 |
#include <stdlib.h> |
21 |
#include <string.h> |
22 |
#include <string.h> |
22 |
#include <stddef.h> |
23 |
#include <stddef.h> |
Lines 27-35
Link Here
|
27 |
#include <dirent.h> |
28 |
#include <dirent.h> |
28 |
#include <scrollkeeper.h> |
29 |
#include <scrollkeeper.h> |
29 |
|
30 |
|
30 |
#define PATHLEN 256 |
|
|
31 |
|
32 |
|
33 |
/* |
31 |
/* |
34 |
* Create a directory. Send errors to appropriate places (STDOUT and log |
32 |
* Create a directory. Send errors to appropriate places (STDOUT and log |
35 |
* file) according to command-line flags. |
33 |
* file) according to command-line flags. |
Lines 55-87
Link Here
|
55 |
*/ |
53 |
*/ |
56 |
int sk_mkdir_with_parents(char *fullpath, mode_t options, char outputprefs) |
54 |
int sk_mkdir_with_parents(char *fullpath, mode_t options, char outputprefs) |
57 |
{ |
55 |
{ |
58 |
char path[1024]; |
56 |
char *path; |
59 |
char slash[]="/"; |
57 |
char slash[]="/"; |
60 |
char delim[]="/"; |
58 |
char delim[]="/"; |
61 |
char *token, *pathcopy; |
59 |
char *token, *pathcopy; |
62 |
struct stat buf; |
60 |
struct stat buf; |
|
|
61 |
int path_max = 4096; |
62 |
#ifdef PATH_MAX |
63 |
path_max = PATH_MAX; |
64 |
#else |
65 |
path_max = pathconf (full_path, _PC_PATH_MAX); |
66 |
if (path_max <= 0) path_max = 4096; |
67 |
#endif |
63 |
|
68 |
|
64 |
pathcopy = strdup(fullpath); /* Copy b/c strtok edits the string it operates on */ |
69 |
pathcopy = strdup(fullpath); /* Copy b/c strtok edits the string it operates on */ |
|
|
70 |
|
71 |
if (!pathcopy) { |
72 |
sk_message(outputprefs, SKOUT_DEFAULT, SKOUT_QUIET, "", |
73 |
_("Could not init vars : %s\n"),strerror(errno)); |
74 |
return 2; |
75 |
} |
76 |
|
77 |
path = (char *) malloc (path_max); |
78 |
if (!path) { |
79 |
sk_message(outputprefs, SKOUT_DEFAULT, SKOUT_QUIET, "", |
80 |
_("Could not init vars : %s\n"),strerror(errno)); |
81 |
free (pathcopy); |
82 |
return 2; |
83 |
} |
84 |
|
65 |
path[0] = '\0'; /* Initialize with end of string null character */ |
85 |
path[0] = '\0'; /* Initialize with end of string null character */ |
66 |
if (pathcopy[0] == slash[0]) sprintf(path, "/"); /* preserve any starting slash */ |
86 |
if (pathcopy[0] == slash[0]) sprintf(path, "/"); /* preserve any starting slash */ |
67 |
|
87 |
|
68 |
token = strtok (pathcopy, delim); |
88 |
token = strtok (pathcopy, delim); |
69 |
delim[0]=slash[0]; |
89 |
delim[0]=slash[0]; |
70 |
while(token != NULL) { |
90 |
while(token != NULL) { |
|
|
91 |
|
71 |
if (strlen(path) == 0 || ((strlen(path) == 1) && (path[0] == slash[0]))) { |
92 |
if (strlen(path) == 0 || ((strlen(path) == 1) && (path[0] == slash[0]))) { |
72 |
sprintf(path, "%s%s", path, token); |
93 |
strncat (path, token, path_max); |
73 |
} else { |
94 |
} else { |
74 |
sprintf(path, "%s/%s", path, token); |
95 |
strncat (path, "/", path_max); |
|
|
96 |
strncat (path, token, path_max); |
75 |
} |
97 |
} |
|
|
98 |
|
76 |
if (stat(path, &buf) == -1) { |
99 |
if (stat(path, &buf) == -1) { |
77 |
if (sk_mkdir(path, options, outputprefs) != 0) { |
100 |
if (sk_mkdir(path, options, outputprefs) != 0) { |
|
|
101 |
free (pathcopy); |
102 |
free (path); |
78 |
return 1; |
103 |
return 1; |
79 |
} |
104 |
} |
80 |
} |
105 |
} |
|
|
106 |
|
81 |
delim[0]=slash[0]; |
107 |
delim[0]=slash[0]; |
82 |
token = strtok (NULL, delim); |
108 |
token = strtok (NULL, delim); |
83 |
} |
109 |
} |
84 |
|
110 |
|
|
|
111 |
free (pathcopy); |
112 |
free (path); |
85 |
return 0; |
113 |
return 0; |
86 |
} |
114 |
} |
87 |
|
115 |
|
Lines 93-104
Link Here
|
93 |
int create_database_directory(char *scrollkeeper_dir, char *scrollkeeper_data_dir, char outputprefs) |
121 |
int create_database_directory(char *scrollkeeper_dir, char *scrollkeeper_data_dir, char outputprefs) |
94 |
{ |
122 |
{ |
95 |
DIR *dir; |
123 |
DIR *dir; |
96 |
char source_path[PATHLEN], target_path[PATHLEN]; |
124 |
char *source_path = NULL, *target_path = NULL; |
97 |
struct dirent *dir_ent; |
125 |
struct dirent *dir_ent; |
98 |
struct stat buf; |
126 |
struct stat buf; |
99 |
int empty; |
127 |
int empty; |
100 |
char *data_dir, dirname[PATHLEN]; |
128 |
char *data_dir, *dirname = NULL; |
101 |
|
129 |
|
|
|
130 |
int path_max = 4096; |
131 |
#ifdef PATH_MAX |
132 |
path_max = PATH_MAX; |
133 |
#else |
134 |
path_max = pathconf (source_path, _PC_PATH_MAX); |
135 |
if (path_max <= 0) path_max = 4096; |
136 |
#endif |
137 |
|
138 |
source_path = (char *) malloc (path_max); |
139 |
if (!source_path) { |
140 |
sk_message(outputprefs, SKOUT_DEFAULT, SKOUT_QUIET, "", |
141 |
_("Could not init vars : %s\n"),strerror(errno)); |
142 |
return 2; |
143 |
} |
144 |
|
145 |
target_path = (char *) malloc (path_max); |
146 |
if (!target_path) { |
147 |
sk_message(outputprefs, SKOUT_DEFAULT, SKOUT_QUIET, "", |
148 |
_("Could not init vars : %s\n"),strerror(errno)); |
149 |
free (source_path); |
150 |
return 2; |
151 |
} |
152 |
|
153 |
dirname = (char *) malloc (path_max); |
154 |
if (!dirname) { |
155 |
sk_message(outputprefs, SKOUT_DEFAULT, SKOUT_QUIET, "", |
156 |
_("Could not init vars : %s\n"),strerror(errno)); |
157 |
free (source_path); |
158 |
free (target_path); |
159 |
return 2; |
160 |
} |
161 |
|
102 |
/* check if it's empty */ |
162 |
/* check if it's empty */ |
103 |
|
163 |
|
104 |
empty = 1; |
164 |
empty = 1; |
Lines 106-111
Link Here
|
106 |
if (dir == NULL) { |
166 |
if (dir == NULL) { |
107 |
if (sk_mkdir_with_parents(scrollkeeper_dir, S_IRUSR|S_IWUSR|S_IRGRP| |
167 |
if (sk_mkdir_with_parents(scrollkeeper_dir, S_IRUSR|S_IWUSR|S_IRGRP| |
108 |
S_IROTH|S_IXUSR|S_IXGRP|S_IXOTH, outputprefs) != 0) { |
168 |
S_IROTH|S_IXUSR|S_IXGRP|S_IXOTH, outputprefs) != 0) { |
|
|
169 |
free (source_path); |
170 |
free (target_path); |
171 |
free (dirname); |
109 |
return 1; |
172 |
return 1; |
110 |
} |
173 |
} |
111 |
dir = opendir(scrollkeeper_dir); |
174 |
dir = opendir(scrollkeeper_dir); |
Lines 121-131
Link Here
|
121 |
} |
184 |
} |
122 |
closedir(dir); |
185 |
closedir(dir); |
123 |
|
186 |
|
124 |
if (!empty) |
187 |
if (!empty) { |
|
|
188 |
free (source_path); |
189 |
free (target_path); |
190 |
free (dirname); |
125 |
return 0; |
191 |
return 0; |
|
|
192 |
} |
126 |
|
193 |
|
127 |
data_dir = malloc((strlen(scrollkeeper_data_dir)+strlen("/Templates")+1)* |
194 |
data_dir = malloc((strlen(scrollkeeper_data_dir)+strlen("/Templates")+1)* |
128 |
sizeof(char)); |
195 |
sizeof(char)); |
|
|
196 |
if (!data_dir) { |
197 |
sk_message(outputprefs, SKOUT_DEFAULT, SKOUT_QUIET, "", |
198 |
_("Could not init vars : %s\n"),strerror(errno)); |
199 |
free (source_path); |
200 |
free (target_path); |
201 |
free (dirname); |
202 |
return 0; |
203 |
} |
204 |
|
129 |
check_ptr(data_dir, "scrollkeeper-install"); |
205 |
check_ptr(data_dir, "scrollkeeper-install"); |
130 |
sprintf(data_dir, "%s/Templates", scrollkeeper_data_dir); |
206 |
sprintf(data_dir, "%s/Templates", scrollkeeper_data_dir); |
131 |
|
207 |
|
Lines 138-175
Link Here
|
138 |
if (dir_ent->d_name[0] == '.') |
214 |
if (dir_ent->d_name[0] == '.') |
139 |
continue; |
215 |
continue; |
140 |
|
216 |
|
141 |
snprintf(source_path, PATHLEN, "%s/%s", data_dir, dir_ent->d_name); |
217 |
snprintf(source_path, path_max, "%s/%s", data_dir, dir_ent->d_name); |
142 |
|
218 |
|
143 |
lstat(source_path, &buf); |
219 |
lstat(source_path, &buf); |
144 |
|
220 |
|
145 |
if (S_ISDIR(buf.st_mode)) /* copy the directory */ |
221 |
if (S_ISDIR(buf.st_mode)) /* copy the directory */ |
146 |
{ |
222 |
{ |
147 |
char source_file[PATHLEN], target_file[PATHLEN]; |
223 |
char *source_file, *target_file; |
|
|
224 |
|
225 |
source_file = (char *)malloc(path_max); |
226 |
if (!source_file) { |
227 |
sk_message(outputprefs, SKOUT_DEFAULT, SKOUT_QUIET, "", |
228 |
_("Could not init vars : %s\n"),strerror(errno)); |
229 |
free (source_path); |
230 |
free (target_path); |
231 |
free (dirname); |
232 |
return 2; |
233 |
} |
148 |
|
234 |
|
149 |
snprintf(dirname, PATHLEN, "%s/%s", scrollkeeper_dir, dir_ent->d_name); |
235 |
target_file = (char *)malloc(path_max); |
|
|
236 |
if (!target_file) { |
237 |
sk_message(outputprefs, SKOUT_DEFAULT, SKOUT_QUIET, "", |
238 |
_("Could not init vars : %s\n"),strerror(errno)); |
239 |
free (source_file); |
240 |
free (source_path); |
241 |
free (target_path); |
242 |
free (dirname); |
243 |
return 2; |
244 |
} |
245 |
|
246 |
snprintf(dirname, path_max, "%s/%s", scrollkeeper_dir, dir_ent->d_name); |
150 |
mkdir(dirname, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH|S_IXUSR|S_IXGRP|S_IXOTH); |
247 |
mkdir(dirname, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH|S_IXUSR|S_IXGRP|S_IXOTH); |
151 |
|
248 |
|
152 |
snprintf(source_file, PATHLEN, "%s/scrollkeeper_cl.xml", source_path); |
249 |
snprintf(source_file, path_max, "%s/scrollkeeper_cl.xml", source_path); |
153 |
snprintf(target_file, PATHLEN, "%s/%s/scrollkeeper_cl.xml", |
250 |
snprintf(target_file, path_max, "%s/%s/scrollkeeper_cl.xml", |
154 |
scrollkeeper_dir, dir_ent->d_name); |
251 |
scrollkeeper_dir, dir_ent->d_name); |
155 |
copy_file(source_file, target_file); |
252 |
copy_file(source_file, target_file); |
156 |
snprintf(target_file, PATHLEN, "%s/%s/scrollkeeper_extended_cl.xml", |
253 |
snprintf(target_file, path_max, "%s/%s/scrollkeeper_extended_cl.xml", |
157 |
scrollkeeper_dir, dir_ent->d_name); |
254 |
scrollkeeper_dir, dir_ent->d_name); |
158 |
copy_file(source_file, target_file); |
255 |
copy_file(source_file, target_file); |
|
|
256 |
free (source_file); |
257 |
free (target_file); |
159 |
} |
258 |
} |
160 |
else /* link the directory */ |
259 |
else /* link the directory */ |
161 |
{ |
260 |
{ |
162 |
char *target_locale; |
261 |
char *target_locale; |
163 |
char aux_path[PATHLEN]; |
262 |
char *aux_path; |
|
|
263 |
|
264 |
aux_path = (char *)malloc(path_max); |
265 |
if (!aux_path) { |
266 |
sk_message(outputprefs, SKOUT_DEFAULT, SKOUT_QUIET, "", |
267 |
_("Could not init vars : %s\n"),strerror(errno)); |
268 |
free (source_path); |
269 |
free (target_path); |
270 |
free (dirname); |
271 |
return 2; |
272 |
} |
164 |
|
273 |
|
165 |
realpath(source_path, aux_path); |
274 |
realpath(source_path, aux_path); |
166 |
target_locale = strrchr(aux_path, '/'); |
275 |
target_locale = strrchr(aux_path, '/'); |
167 |
target_locale++; |
276 |
target_locale++; |
168 |
|
277 |
|
169 |
snprintf(source_path, PATHLEN, "%s/%s", scrollkeeper_dir, dir_ent->d_name); |
278 |
snprintf(source_path, path_max, "%s/%s", scrollkeeper_dir, dir_ent->d_name); |
170 |
snprintf(target_path, PATHLEN, "%s", target_locale); |
279 |
snprintf(target_path, path_max, "%s", target_locale); |
171 |
|
280 |
|
172 |
symlink(target_path, source_path); |
281 |
symlink(target_path, source_path); |
|
|
282 |
free (aux_path); |
173 |
} |
283 |
} |
174 |
} |
284 |
} |
175 |
|
285 |
|
Lines 178-188
Link Here
|
178 |
|
288 |
|
179 |
/* create TOC and index directory */ |
289 |
/* create TOC and index directory */ |
180 |
|
290 |
|
181 |
snprintf(dirname, PATHLEN, "%s/TOC", scrollkeeper_dir); |
291 |
snprintf(dirname, path_max, "%s/TOC", scrollkeeper_dir); |
182 |
mkdir(dirname, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH|S_IXUSR|S_IXGRP|S_IXOTH); |
292 |
mkdir(dirname, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH|S_IXUSR|S_IXGRP|S_IXOTH); |
183 |
|
293 |
|
184 |
snprintf(dirname, PATHLEN, "%s/index", scrollkeeper_dir); |
294 |
snprintf(dirname, path_max, "%s/index", scrollkeeper_dir); |
185 |
mkdir(dirname, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH|S_IXUSR|S_IXGRP|S_IXOTH); |
295 |
mkdir(dirname, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH|S_IXUSR|S_IXGRP|S_IXOTH); |
|
|
296 |
|
297 |
free (source_path); |
298 |
free (target_path); |
299 |
free (dirname); |
186 |
return 0; |
300 |
return 0; |
187 |
} |
301 |
} |
188 |
|
302 |
|