فهرست منبع

make path expansion match docu: paths are relative to ~

the current behavior of being relative to the current directory sort of
makes no sense, and contradicts the docu.
Oswald Buddenhagen 12 سال پیش
والد
کامیت
da5ce5d8f4
2فایلهای تغییر یافته به همراه14 افزوده شده و 3 حذف شده
  1. 1 1
      src/config.c
  2. 13 2
      src/util.c

+ 1 - 1
src/config.c

@@ -219,7 +219,7 @@ getopt_helper( conffile_t *cfile, int *cops, int ops[], char **sync_state )
 		while ((arg = get_arg( cfile, ARG_OPTIONAL, 0 )));
 		ops[M] |= XOP_HAVE_CREATE;
 	} else if (!strcasecmp( "SyncState", cfile->cmd ))
-		*sync_state = expand_strdup( cfile->val );
+		*sync_state = !strcmp( cfile->val, "*" ) ? nfstrdup( "*" ) : expand_strdup( cfile->val );
 	else
 		return 0;
 	return 1;

+ 13 - 2
src/util.c

@@ -337,24 +337,35 @@ expand_strdup( const char *s )
 	if (*s == '~') {
 		s++;
 		if (!*s) {
+		  rethome:
 			p = 0;
 			q = Home;
 		} else if (*s == '/') {
-			p = s;
+			p = s + 1;
 			q = Home;
 		} else {
 			if ((p = strchr( s, '/' ))) {
 				r = my_strndup( s, (int)(p - s) );
 				pw = getpwnam( r );
 				free( r );
+				p++;
 			} else
 				pw = getpwnam( s );
 			if (!pw)
 				return 0;
 			q = pw->pw_dir;
 		}
-		nfasprintf( &r, "%s%s", q, p ? p : "" );
+		if (!p)
+			return nfstrdup( q );
+	  retjoin:
+		nfasprintf( &r, "%s/%s", q, p );
 		return r;
+	} else if (*s != '/') {
+		if (*s == '.' && !s[1])
+			goto rethome;
+		p = s;
+		q = Home;
+		goto retjoin;
 	} else
 		return nfstrdup( s );
 }