Mercurial > geeqie
comparison src/secure_save.c @ 311:8a6650589829
Preserve permissions of the destination file when using secure save.
author | zas_ |
---|---|
date | Fri, 11 Apr 2008 16:02:33 +0000 |
parents | 4b25b3b30f35 |
children | a955b7fd626b |
comparison
equal
deleted
inserted
replaced
310:4b25b3b30f35 | 311:8a6650589829 |
---|---|
9 * This software comes with no warranty of any kind, use at your own risk! | 9 * This software comes with no warranty of any kind, use at your own risk! |
10 */ | 10 */ |
11 | 11 |
12 #include <glib/gstdio.h> | 12 #include <glib/gstdio.h> |
13 #include <errno.h> | 13 #include <errno.h> |
14 #include <utime.h> | |
14 | 15 |
15 #include "main.h" | 16 #include "main.h" |
16 #include "secure_save.h" | 17 #include "secure_save.h" |
17 | 18 |
18 /* ABOUT SECURE SAVE */ | 19 /* ABOUT SECURE SAVE */ |
79 secsave_errno = SS_ERR_OUT_OF_MEM; | 80 secsave_errno = SS_ERR_OUT_OF_MEM; |
80 goto end; | 81 goto end; |
81 } | 82 } |
82 | 83 |
83 ssi->secure_save = TRUE; | 84 ssi->secure_save = TRUE; |
85 ssi->preserve_perms = TRUE; | |
84 | 86 |
85 ssi->file_name = g_strdup(file_name); | 87 ssi->file_name = g_strdup(file_name); |
86 if (!ssi->file_name) { | 88 if (!ssi->file_name) { |
87 secsave_errno = SS_ERR_OUT_OF_MEM; | 89 secsave_errno = SS_ERR_OUT_OF_MEM; |
88 goto free_f; | 90 goto free_f; |
254 secsave_errno = SS_ERR_OTHER; | 256 secsave_errno = SS_ERR_OTHER; |
255 goto free; | 257 goto free; |
256 } | 258 } |
257 | 259 |
258 if (ssi->secure_save && ssi->file_name && ssi->tmp_file_name) { | 260 if (ssi->secure_save && ssi->file_name && ssi->tmp_file_name) { |
261 struct stat st; | |
262 | |
259 /* FIXME: Race condition on ssi->file_name. The file | 263 /* FIXME: Race condition on ssi->file_name. The file |
260 * named ssi->file_name may have changed since | 264 * named ssi->file_name may have changed since |
261 * secure_open() call (where we stat() file and | 265 * secure_open() call (where we stat() file and |
262 * more..). */ | 266 * more..). */ |
267 #ifndef NO_UNIX_SOFTLINKS | |
268 if (g_lstat(ssi->file_name, &st) == 0) | |
269 #else | |
270 if (g_stat(ssi->file_name, &st) == 0) | |
271 #endif | |
272 { | |
273 /* set the dest file attributes to that of source (ignoring errors) */ | |
274 if (ssi->preserve_perms) | |
275 { | |
276 chown(ssi->tmp_file_name, st.st_uid, st.st_gid); | |
277 chmod(ssi->tmp_file_name, st.st_mode); | |
278 } | |
279 | |
280 if (ssi->preserve_mtime) | |
281 { | |
282 struct utimbuf tb; | |
283 | |
284 tb.actime = st.st_atime; | |
285 tb.modtime = st.st_mtime; | |
286 utime(ssi->tmp_file_name, &tb); | |
287 } | |
288 } | |
263 if (debug > 2) g_printf("rename %s -> %s", ssi->tmp_file_name, ssi->file_name); | 289 if (debug > 2) g_printf("rename %s -> %s", ssi->tmp_file_name, ssi->file_name); |
264 if (g_rename(ssi->tmp_file_name, ssi->file_name) == -1) { | 290 if (g_rename(ssi->tmp_file_name, ssi->file_name) == -1) { |
265 ret = errno; | 291 ret = errno; |
266 secsave_errno = SS_ERR_RENAME; | 292 secsave_errno = SS_ERR_RENAME; |
267 goto free; | 293 goto free; |