X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fconf.c;h=01c3fcd90873081b16030f2dcd4d979087bdda7c;hp=2643785ce2d10035a4668d045d7eaad6c3242237;hb=44e9d6a2872fac55f7eb701ba576ed9f39a22e08;hpb=d3f889c8076dff9c00ebfe1459cb36425f8da41d diff --git a/src/conf.c b/src/conf.c index 2643785c..01c3fcd9 100644 --- a/src/conf.c +++ b/src/conf.c @@ -19,7 +19,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id: conf.c,v 1.9.4.38 2001/01/07 17:08:55 guus Exp $ + $Id: conf.c,v 1.9.4.42 2001/07/24 20:03:40 guus Exp $ */ #include "config.h" @@ -35,6 +35,7 @@ #include #include #include +#include #include #include /* for cp */ @@ -83,6 +84,7 @@ static internal_config_t hazahaza[] = { { "RestrictSubnets", config_restrictsubnets, TYPE_BOOL }, { "Subnet", config_subnet, TYPE_IP }, /* Use IPv4 subnets only for now */ { "TCPonly", config_tcponly, TYPE_BOOL }, + { "Mode", config_mode, TYPE_NAME }, { NULL, 0, 0 } }; @@ -228,7 +230,7 @@ int read_config_file(config_t **base, const char *fname) FILE *fp; char *buffer, *line; char *p, *q; - int i, lineno = 0; + int i, lineno = 0, ignore = 0; config_t *cfg; size_t bufsize; @@ -236,7 +238,7 @@ cp if((fp = fopen (fname, "r")) == NULL) { syslog(LOG_ERR, _("Cannot open config file %s: %m"), fname); - return -1; + return -3; } bufsize = 100; @@ -265,35 +267,44 @@ cp if(p[0] == '#') continue; /* comment: ignore */ - for(i = 0; hazahaza[i].name != NULL; i++) - if(!strcasecmp(hazahaza[i].name, p)) - break; - - if(!hazahaza[i].name) - { - syslog(LOG_ERR, _("Invalid variable name `%s' on line %d while reading config file %s"), - p, lineno, fname); - break; - } - - if(((q = strtok(NULL, "\t\n\r =")) == NULL) || q[0] == '#') - { - syslog(LOG_ERR, _("No value for variable `%s' on line %d while reading config file %s"), - hazahaza[i].name, lineno, fname); - break; - } - - cfg = add_config_val(base, hazahaza[i].argtype, q); - if(cfg == NULL) - { - syslog(LOG_ERR, _("Invalid value for variable `%s' on line %d while reading config file %s"), - hazahaza[i].name, lineno, fname); - break; - } - - cfg->which = hazahaza[i].which; - if(!config) - config = cfg; + if(!strcmp(p, "-----BEGIN")) + ignore = 1; + + if(ignore == 0) + { + for(i = 0; hazahaza[i].name != NULL; i++) + if(!strcasecmp(hazahaza[i].name, p)) + break; + + if(!hazahaza[i].name) + { + syslog(LOG_ERR, _("Invalid variable name `%s' on line %d while reading config file %s"), + p, lineno, fname); + break; + } + + if(((q = strtok(NULL, "\t\n\r =")) == NULL) || q[0] == '#') + { + syslog(LOG_ERR, _("No value for variable `%s' on line %d while reading config file %s"), + hazahaza[i].name, lineno, fname); + break; + } + + cfg = add_config_val(base, hazahaza[i].argtype, q); + if(cfg == NULL) + { + syslog(LOG_ERR, _("Invalid value for variable `%s' on line %d while reading config file %s"), + hazahaza[i].name, lineno, fname); + break; + } + + cfg->which = hazahaza[i].which; + if(!config) + config = cfg; + } + + if(!strcmp(p, "-----END")) + ignore = 0; } free(buffer); @@ -309,7 +320,7 @@ int read_server_config() cp asprintf(&fname, "%s/tinc.conf", confbase); x = read_config_file(&config, fname); - if(x == -1) /* System error */ + if(x == -1) /* System error: complain */ { syslog(LOG_ERR, _("Failed to read `%s': %m"), fname); @@ -462,7 +473,7 @@ check2: return 1; } -FILE *ask_and_safe_open(const char* filename, const char* what) +FILE *ask_and_safe_open(const char* filename, const char* what, const char* mode) { FILE *r; char *directory; @@ -485,7 +496,7 @@ FILE *ask_and_safe_open(const char* filename, const char* what) if((fn = readline(stdin, NULL, NULL)) == NULL) { - fprintf(stderr, _("Error while reading stdin: %m\n")); + fprintf(stderr, _("Error while reading stdin: %s\n"), strerror(errno)); return NULL; } @@ -509,14 +520,14 @@ FILE *ask_and_safe_open(const char* filename, const char* what) umask(0077); /* Disallow everything for group and other */ /* Open it first to keep the inode busy */ - if((r = fopen(fn, "w")) == NULL) + if((r = fopen(fn, mode)) == NULL) { - fprintf(stderr, _("Error opening file `%s': %m\n"), - fn); + fprintf(stderr, _("Error opening file `%s': %s\n"), + fn, strerror(errno)); free(fn); return NULL; } - + /* Then check the file for nasty attacks */ if(!is_safe_path(fn)) /* Do not permit any directories that are readable or writeable by other users. */ @@ -530,6 +541,6 @@ FILE *ask_and_safe_open(const char* filename, const char* what) } free(fn); - + return r; }