diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2007-09-04 19:46:00 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2007-09-04 19:46:00 +0000 |
commit | 4f3506f536f7efb34e5b3b823ac030d89e3bd5e1 (patch) | |
tree | cf0b6a580b35e91b9961836a62383cb50449ce94 /src/config.c | |
parent | f874c8c3e461fb326887273334f1dffebbbe4179 (diff) | |
download | wydawca-4f3506f536f7efb34e5b3b823ac030d89e3bd5e1.tar.gz wydawca-4f3506f536f7efb34e5b3b823ac030d89e3bd5e1.tar.bz2 |
Update
git-svn-id: file:///svnroot/wydawca/trunk@311 6bb4bd81-ecc2-4fd4-a2d4-9571d19c0d33
Diffstat (limited to 'src/config.c')
-rw-r--r-- | src/config.c | 88 |
1 files changed, 66 insertions, 22 deletions
diff --git a/src/config.c b/src/config.c index 023f2a1..f1a4d9f 100644 --- a/src/config.c +++ b/src/config.c @@ -484,6 +484,7 @@ cfg_directory (gsc_config_file_t *file, char *kw, char *val, void *unused) char *word; struct directory_pair dpair; static struct gsc_config_keyword keywords[] = { + { "include", cfg_include_handler }, { "source", cfg_source }, { "destination", cfg_destination }, { "file-sweep-time", cfg_file_sweep_time }, @@ -514,7 +515,18 @@ cfg_directory (gsc_config_file_t *file, char *kw, char *val, void *unused) gsc_config_parse_block (file, &dpair, keywords, "end"); - if (test_dir (dpair.source_dir, &ec)) + if (!dpair.source_dir) + { + file->error_msg (file->file_name, file->line, "source is not given"); + file->error_count++; + } + else if (!dpair.dest_dir) + { + file->error_msg (file->file_name, file->line, + "destination is not given"); + file->error_count++; + } + else if (test_dir (dpair.source_dir, &ec)) { if (ec) file->error_msg (file->file_name, file->line, @@ -627,6 +639,7 @@ cfg_sql (gsc_config_file_t *file, char *kw, char *val, void *unused) { struct sqlconn sql; static struct gsc_config_keyword keywords[] = { + { "include", cfg_include_handler }, { "host", cfg_sql_host }, { "database", cfg_sql_database }, { "user", cfg_sql_user }, @@ -834,7 +847,52 @@ end_marker_p (const char *buf, const char *word, size_t wlen) } return 0; } - + +static int +_cfg_recursive_raw_read (gsc_config_file_t *file, struct obstack *stk, + char *word, size_t wlen, int skip_initial_ws) +{ + while (getline (&file->buf, &file->size, file->fp) > 0) + { + char *p = file->buf; + + file->line++; + + if (skip_initial_ws) + skip_hws (p); + + if (end_marker_p (p, word, wlen)) + { + obstack_1grow (stk, 0); + return 0; + } + else if (strlen (p) > 7 && memcmp (p, "include", 7) == 0 + && (p[7] == ' ' || p[8] == '\t')) + { + gsc_config_file_t new_file; + + p += 7; + skip_hws (p); + trim (p); + if (cfg_include_start (&new_file, file, p) == 0) + { + int rc = _cfg_recursive_raw_read (&new_file, stk, + word, wlen, skip_initial_ws); + cfg_include_stop (&new_file); + if (rc == 0) + return 0; + } + } + else + { + if (*p == '>') + p++; + obstack_grow (stk, p, strlen (p)); + } + } + return 1; +} + static int _cfg_raw_read (gsc_config_file_t *file, char *val, struct obstack *stk) { @@ -853,29 +911,14 @@ _cfg_raw_read (gsc_config_file_t *file, char *val, struct obstack *stk) word++; } wlen = strlen (word); - - while (getline (&buf, &size, file->fp) > 0) + + if (_cfg_recursive_raw_read (file, stk, word, wlen, skip_initial_ws)) { - char *p = buf; - - file->line++; - - if (skip_initial_ws) - skip_hws (p); - if (end_marker_p (p, word, wlen)) - { - obstack_1grow (stk, 0); - free (buf); - return 0; - } - obstack_grow (stk, p, strlen (p)); + file->error_msg (file->file_name, start_line, "missing end marker"); + file->error_count++; } - - file->error_msg (file->file_name, start_line, "missing end marker"); - file->error_count++; - return 1; } - + static void cfg_admin_stat_message (gsc_config_file_t *file, char *kw, char *val, void *unused) @@ -976,6 +1019,7 @@ cfg_user_message (gsc_config_file_t *file, char *kw, char *val, void *unused) static struct gsc_config_keyword kw_handler[] = { + { "include", cfg_include_handler }, { "syslog-tag", cfg_syslog_tag }, { "syslog-facility", cfg_syslog_facility }, { "syslog-print-priority", cfg_syslog_print_priority }, |