Prechádzať zdrojové kódy

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 rokov pred
rodič
commit
da5ce5d8f4
2 zmenil súbory, kde vykonal 14 pridanie a 3 odobranie
  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 );
 }