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.
This commit is contained in:
Oswald Buddenhagen 2013-03-24 11:10:59 +01:00
parent 312f4be4b2
commit da5ce5d8f4
2 changed files with 14 additions and 3 deletions

View File

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

View File

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