From 582831a44735b7abbb83aca5287ef988294b0b71 Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Sun, 27 Jul 2008 16:05:18 -0700 Subject: [PATCH] - Don't require a daemon config &directive to use an equal sign. - Improved some daemon-config error messages. --- loadparm.c | 2 +- params.c | 50 ++++++++++++++++++++++++++++++++------------------ rsyncd.conf.yo | 34 +++++++++++++++++++--------------- 3 files changed, 52 insertions(+), 34 deletions(-) diff --git a/loadparm.c b/loadparm.c index 3515358e..bc33b901 100644 --- a/loadparm.c +++ b/loadparm.c @@ -761,7 +761,7 @@ BOOL set_dparams(int syntax_check_only) *equal = '\0'; if (syntax_check_only) { if (map_parameter(params[j]) < 0) { - rprintf(FCLIENT, "Unknown parameter \"%s\"\n", params[j]); + rprintf(FERROR, "Unknown parameter \"%s\"\n", params[j]); *equal = '='; return False; } diff --git a/params.c b/params.c index ff8ca96d..aa79953f 100644 --- a/params.c +++ b/params.c @@ -225,7 +225,7 @@ static BOOL Section( FILE *InFile, BOOL (*sfunc)(char *) ) bufr[end] = '\0'; if( 0 == end ) /* Don't allow an empty name. */ { - rprintf(FLOG, "%s Empty section name in configuration file.\n", func ); + rprintf(FLOG, "%s Empty section name in config file.\n", func ); return( False ); } if( !sfunc( bufr ) ) /* Got a valid name. Deal with it. */ @@ -238,7 +238,7 @@ static BOOL Section( FILE *InFile, BOOL (*sfunc)(char *) ) if( i < 0 ) { bufr[end] = '\0'; - rprintf(FLOG, "%s Badly formed line in configuration file: %s\n", + rprintf(FLOG, "%s Badly formed line in config file: %s\n", func, bufr ); return( False ); } @@ -263,7 +263,7 @@ static BOOL Section( FILE *InFile, BOOL (*sfunc)(char *) ) } /* We arrive here if we've met the EOF before the closing bracket. */ - rprintf(FLOG, "%s Unexpected EOF in the configuration file: %s\n", func, bufr ); + rprintf(FLOG, "%s Unexpected EOF in the config file: %s\n", func, bufr ); return( False ); } /* Section */ @@ -317,13 +317,12 @@ static BOOL Parameter( FILE *InFile, BOOL (*pfunc)(char *, char *), int c ) case '=': /* Equal sign marks end of param name. */ if( 0 == end ) /* Don't allow an empty name. */ { - rprintf(FLOG, "%s Invalid parameter name in config. file.\n", func ); + rprintf(FLOG, "%s Invalid parameter name in config file.\n", func ); return( False ); } bufr[end++] = '\0'; /* Mark end of string & advance. */ - i = end; /* New string starts here. */ - vstart = end; /* New string is parameter value. */ - bufr[i] = '\0'; /* New string is nul, for now. */ + i = vstart = end; /* New string starts here. */ + c = EatWhitespace(InFile); break; case '\n': /* Find continuation char, else error. */ @@ -331,7 +330,7 @@ static BOOL Parameter( FILE *InFile, BOOL (*pfunc)(char *, char *), int c ) if( i < 0 ) { bufr[end] = '\0'; - rprintf(FLOG, "%s Ignoring badly formed line in configuration file: %s\n", + rprintf(FLOG, "%s Ignoring badly formed line in config file: %s\n", func, bufr ); return( True ); } @@ -345,6 +344,19 @@ static BOOL Parameter( FILE *InFile, BOOL (*pfunc)(char *, char *), int c ) rprintf(FLOG, "%s Unexpected end-of-file at: %s\n", func, bufr ); return( True ); + case ' ': + case '\t': + /* A directive divides at the first space or tab. */ + if (*bufr == '&') { + bufr[end++] = '\0'; + i = vstart = end; + c = EatWhitespace(InFile); + if (c == '=') + c = EatWhitespace(InFile); + break; + } + /* FALL THROUGH */ + default: if( isspace( c ) ) /* One ' ' per whitespace region. */ { @@ -362,7 +374,6 @@ static BOOL Parameter( FILE *InFile, BOOL (*pfunc)(char *, char *), int c ) } /* Now parse the value. */ - c = EatWhitespace( InFile ); /* Again, trim leading whitespace. */ while( (EOF !=c) && (c > 0) ) { @@ -418,8 +429,10 @@ static int include_config(char *include, int manage_globals) STRUCT_STAT sb; int ret; - if (do_stat(include, &sb) < 0) + if (do_stat(include, &sb) < 0) { + rsyserr(FLOG, errno, "unable to stat config file \"%s\"", include); return 0; + } if (S_ISREG(sb.st_mode)) { if (manage_globals && the_sfunc) @@ -434,8 +447,10 @@ static int include_config(char *include, int manage_globals) size_t j; DIR *d; - if (!(d = opendir(include))) + if (!(d = opendir(include))) { + rsyserr(FLOG, errno, "unable to open config dir \"%s\"", include); return 0; + } memset(&conf_list, 0, sizeof conf_list); @@ -476,11 +491,11 @@ static int include_config(char *include, int manage_globals) static int parse_directives(char *name, char *val) { - if (strcasecmp(name, "include") == 0) + if (strcasecmp(name, "&include") == 0) return include_config(val, 1); - if (strcasecmp(name, "merge") == 0) + if (strcasecmp(name, "&merge") == 0) return include_config(val, 0); - rprintf(FLOG, "Unknown directive: &%s.\n", name); + rprintf(FLOG, "Unknown directive: %s.\n", name); return 0; } @@ -541,7 +556,6 @@ static int Parse( FILE *InFile, case '&': /* Handle directives */ the_sfunc = sfunc; the_pfunc = pfunc; - c = EatWhitespace( InFile ); c = Parameter( InFile, parse_directives, c ); if (c != 1) return c; @@ -560,7 +574,7 @@ static int Parse( FILE *InFile, static FILE *OpenConfFile( char *FileName ) /* ------------------------------------------------------------------------ ** - * Open a configuration file. + * Open a config file. * * Input: FileName - The pathname of the config file to be opened. * @@ -575,14 +589,14 @@ static FILE *OpenConfFile( char *FileName ) if( NULL == FileName || 0 == *FileName ) { - rprintf(FLOG, "%s No configuration filename specified.\n", func); + rprintf(FLOG, "%s No config filename specified.\n", func); return( NULL ); } OpenedFile = fopen( FileName, "r" ); if( NULL == OpenedFile ) { - rsyserr(FLOG, errno, "unable to open configuration file \"%s\"", + rsyserr(FLOG, errno, "unable to open config file \"%s\"", FileName); } diff --git a/rsyncd.conf.yo b/rsyncd.conf.yo index f6f34a6e..43ee429a 100644 --- a/rsyncd.conf.yo +++ b/rsyncd.conf.yo @@ -630,13 +630,17 @@ manpagesection(CONFIG DIRECTIVES) There are currently two config directives available that allow a config file to incorporate the contents of other files: bf(&include) and bf(&merge). Both allow a reference to either a file or a directory. They differ in how -segregated the file's contents are considered to be. The bf(&include) -directive treats each file as more distinct, with each one inheriting the -defaults of the parent file, and starting the parameter parsing as -globals/defaults. The bf(&merge) directive, on the other hand, treats the -file's contents as if it were simply inserted in place of the directive, and -thus it can contain parameters that can be set inside a parent file's module -settings, or whatever you like. +segregated the file's contents are considered to be. + +The bf(&include) directive treats each file as more distinct, with each one +inheriting the defaults of the parent file, starting the parameter parsing +as globals/defaults, and leaving the defaults unchanged for the parsing of +the rest of the parent file. + +The bf(&merge) directive, on the other hand, treats the file's contents as +if it were simply inserted in place of the directive, and thus it can set +parameters in a module started in another file, can affect the defaults for +other files, etc. When an bf(&include) or bf(&merge) directive refers to a directory, it will read in all the bf(*.conf) files contained inside that directory (without any @@ -644,23 +648,23 @@ recursive scanning), with the files sorted into alpha order. So, if you have a directory named "rsyncd.d" with the files "foo.conf", "bar.conf", and "baz.conf" inside it, this directive: -verb( &include = /path/rsyncd.d ) +verb( &include /path/rsyncd.d ) would be the same as this set of directives: -verb( &include = /path/rsyncd.d/bar.conf - &include = /path/rsyncd.d/baz.conf - &include = /path/rsyncd.d/foo.conf ) +verb( &include /path/rsyncd.d/bar.conf + &include /path/rsyncd.d/baz.conf + &include /path/rsyncd.d/foo.conf ) except that it adjusts as files are added and removed from the directory. The advantage of the bf(&include) directive is that you can define one or more -modules in a separate file with only the defaults you set in the parent file -affecting it, so you don't need to worry about the settings of a prior include -file changing a default. For instance, this is a useful /etc/rsyncd.conf file: +modules in a separate file without worrying about unintended side-effects +between the self-contained module files. For instance, this is a useful +/etc/rsyncd.conf file: verb( port = 873 - log file = /path/rsync.log + log file = /var/log/rsync.log pid file = /var/lock/rsync.lock &include /etc/rsyncd.d ) -- 2.34.1