diff --git a/src/config.c b/src/config.c index 9e4f766..e7bbe4f 100644 --- a/src/config.c +++ b/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; diff --git a/src/util.c b/src/util.c index ba05efa..8a7a9d3 100644 --- a/src/util.c +++ b/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 ); }