librazor/atomic-emulate.c
changeset 456 bae5adee8c8c
parent 447 0a5e583393e1
child 458 3f841a46eab5
     1.1 --- a/librazor/atomic-emulate.c	Tue Sep 09 15:27:12 2014 +0100
     1.2 +++ b/librazor/atomic-emulate.c	Fri Oct 17 09:57:19 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)