diff --git a/src/config.c b/src/config.c index d8f9b52..c671c30 100644 --- a/src/config.c +++ b/src/config.c @@ -163,7 +163,7 @@ getopt_helper( conffile_t *cfile, int *cops, int *mops, int *sops, char **sync_s while ((arg = next_arg( &cfile->rest ))); *mops |= 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 6fb43c2..4f6a353 100644 --- a/src/util.c +++ b/src/util.c @@ -303,24 +303,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 ); }