1.1 --- a/librazor/atomic-emulate.c Tue Sep 09 15:27:12 2014 +0100
1.2 +++ b/librazor/atomic-emulate.c Fri Oct 03 12:26:22 2014 +0100
1.3 @@ -240,7 +240,7 @@
1.4 * unwritable directory and take one step back.
1.5 */
1.6 char *s, *abspath, saved;
1.7 - int len;
1.8 + int len, can_step_back = 0;
1.9
1.10 abspath = absolute_path(path);
1.11 if (!abspath) {
1.12 @@ -249,11 +249,15 @@
1.13 }
1.14
1.15 if (stat(abspath, &buf) < 0) {
1.16 - atomic->error = razor_error_new_posix(abspath);
1.17 - free(abspath);
1.18 - return -1;
1.19 - }
1.20 - filesystem = buf.st_dev;
1.21 + if (errno == ENOENT)
1.22 + filesystem = 0;
1.23 + else {
1.24 + atomic->error = razor_error_new_posix(abspath);
1.25 + free(abspath);
1.26 + return -1;
1.27 + }
1.28 + } else
1.29 + filesystem = buf.st_dev;
1.30
1.31 len = strlen(abspath);
1.32 while(len > 1 && (s = strrchr(abspath, '/'))) {
1.33 @@ -267,19 +271,27 @@
1.34 }
1.35
1.36 if (stat(abspath, &buf) < 0) {
1.37 - atomic->error = razor_error_new_posix(abspath);
1.38 - free(abspath);
1.39 - return -1;
1.40 - }
1.41 + if (errno == ENOENT)
1.42 + continue;
1.43 + else {
1.44 + atomic->error = razor_error_new_posix(abspath);
1.45 + free(abspath);
1.46 + return -1;
1.47 + }
1.48 + } else if (!filesystem)
1.49 + filesystem = buf.st_dev;
1.50
1.51 if (buf.st_dev != filesystem || access(abspath, W_OK)) {
1.52 - if (s == abspath)
1.53 - s[1] = saved;
1.54 - else
1.55 - s[0] = '/';
1.56 + if (can_step_back) {
1.57 + if (s == abspath)
1.58 + s[1] = saved;
1.59 + else
1.60 + s[0] = '/';
1.61 + }
1.62 len = strlen(abspath);
1.63 break;
1.64 - }
1.65 + } else
1.66 + can_step_back = 1;
1.67 }
1.68
1.69 if (len == 1)