/* This modules is based on the params.c module from Samba, written by Karl Auer
- and much modifed by Christopher Hertel. */
+ and much modified by Christopher Hertel. */
/*
* This program is free software; you can redistribute it and/or modify
* beginning with either a semicolon (';') or a pound sign ('#').
*
* All whitespace in section names and parameter names is compressed
- * to single spaces. Leading and trailing whitespace is stipped from
+ * to single spaces. Leading and trailing whitespace is stripped from
* both names and values.
*
* Only the first equals sign in a parameter line is significant.
#include "rsync.h"
#include "ifuncs.h"
+#include "itypes.h"
/* -------------------------------------------------------------------------- **
* Constants...
static int Continuation( char *line, int pos )
/* ------------------------------------------------------------------------ **
- * Scan backards within a string to discover if the last non-whitespace
+ * Scan backwards within a string to discover if the last non-whitespace
* character is a line-continuation character ('\\').
*
* Input: line - A pointer to a buffer containing the string to be
{
bSize += BUFR_INC;
bufr = realloc_array( bufr, char, bSize );
- if( NULL == bufr )
- {
- rprintf(FLOG, "%s Memory re-allocation failure.", func);
- return( False );
- }
}
/* Handle a single character. */
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. */
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 );
}
}
/* 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 */
{
bSize += BUFR_INC;
bufr = realloc_array( bufr, char, bSize );
- if( NULL == bufr )
- {
- rprintf(FLOG, "%s Memory re-allocation failure.", func) ;
- return( False );
- }
}
switch( 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. */
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 );
}
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. */
{
}
/* Now parse the value. */
- c = EatWhitespace( InFile ); /* Again, trim leading whitespace. */
while( (EOF !=c) && (c > 0) )
{
{
bSize += BUFR_INC;
bufr = realloc_array( bufr, char, bSize );
- if( NULL == bufr )
- {
- rprintf(FLOG, "%s Memory re-allocation failure.", func) ;
- return( False );
- }
}
switch( c )
static int include_config(char *include, int manage_globals)
{
STRUCT_STAT sb;
+ char *match = manage_globals ? "*.conf" : "*.inc";
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)
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);
while ((di = readdir(d)) != NULL) {
char *dname = d_name(di);
- if (!wildmatch("*.conf", dname))
+ if (!wildmatch(match, dname))
continue;
bpp = EXPAND_ITEM_LIST(&conf_list, char *, 32);
pathjoin(buf, sizeof buf, include, dname);
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;
}
case '&': /* Handle directives */
the_sfunc = sfunc;
the_pfunc = pfunc;
- c = EatWhitespace( InFile );
c = Parameter( InFile, parse_directives, c );
if (c != 1)
return c;
static FILE *OpenConfFile( char *FileName )
/* ------------------------------------------------------------------------ **
- * Open a configuration file.
+ * Open a config file.
*
* Input: FileName - The pathname of the config file to be opened.
*
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);
}
{ /* allocate one, then parse, */
bSize = BUFR_INC; /* then free. */
bufr = new_array( char, bSize );
- if( NULL == bufr )
- {
- rprintf(FLOG, "%s memory allocation failure.\n", func);
- fclose(InFile);
- return( False );
- }
result = Parse( InFile, sfunc, pfunc );
free( bufr );
bufr = NULL;