File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / freevrrpd / vrrp_conf.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Jun 14 12:01:54 2017 UTC (7 years ago) by misho
Branches: freevrrpd, MAIN
CVS tags: v1_1, HEAD
freevrrpd 1.1

    1: /*
    2:  * Copyright (c) 2001,2002 Sebastien Petit <spe@bsdfr.org>
    3:  *
    4:  * Redistribution and use in source forms, with and without modification,
    5:  * are permitted provided that the following conditions are met:
    6:  * 1. Redistributions of source code must retain the above copyright notice,
    7:  *    this list of conditions and the following disclaimer.
    8:  * 2. Redistributions in binary form must reproduce the above copyright notice,
    9:  *    this list of conditions and the following disclaimer in the documentation
   10:  *    and/or other materials provided with the distribution. Obviously, it
   11:  *    would be nice if you gave credit where credit is due but requiring it
   12:  *    would be too onerous.
   13:  * 3. All advertising materials mentioning features or use of this software
   14:  *    must display the following acknowledgement:
   15:  *      This product includes software developed by Sebastien Petit.
   16:  * 4. Neither the name of its contributors may be used to endorse or promote
   17:  *    products derived from this software without specific prior written
   18:  *    permission.
   19:  *
   20:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   21:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   22:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   23:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   24:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   25:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   26:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   27:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   28:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   29:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   30:  * SUCH DAMAGE.
   31:  *
   32:  * $Id: vrrp_conf.c,v 1.1.1.1 2017/06/14 12:01:54 misho Exp $
   33:  */
   34: 
   35: #include <errno.h>
   36: #include "vrrp_conf.h"
   37: 
   38: int 
   39: vrrp_conf_ident_option_arg(char *chaine, char *option, char *arg)
   40: {
   41: 	int             i = 0;
   42: 	char           *ptr;
   43: 
   44: 	while (isalpha(chaine[i]) && chaine[i] != 0) {
   45: 		i++;
   46: 		if (i > 1022) {
   47: 			syslog(LOG_ERR, "a bad line was found in your configuration file (line > 1024 char), exiting...");
   48: 			exit(-1);
   49: 		}
   50: 	}
   51: 	if (!i) {
   52: 		syslog(LOG_ERR, "a bad line was found in your configuration file: %s\n", chaine);
   53: 		exit(-1);
   54: 	}
   55: 	strncpy(option, chaine, i);
   56: 	option[i] = '\0';
   57: 	while (chaine[i] != '=' && chaine[i] != 0) {
   58: 		i++;
   59: 		if (i > 1021) {
   60: 			syslog(LOG_ERR, "a bad line was found in your configuration file (line > 1024 char), exiting...");
   61: 			exit(-1);
   62: 		}
   63: 	}
   64: 	i++;
   65: 	while (chaine[i] == ' ' && chaine[i] != 0) {
   66: 		i++;
   67: 		if (i > 1021) {
   68: 			syslog(LOG_ERR, "a bad line was found in your configuration file (line > 1024 char), exiting...");
   69: 			exit(-1);
   70: 		}
   71: 	}
   72: 	ptr = &chaine[i];
   73: 	strncpy(arg, ptr, strlen(chaine) - i);
   74: 	if (arg[strlen(chaine) - i - 1] == '\n')
   75: 		i++;
   76: 	arg[strlen(chaine) - i] = '\0';
   77: 
   78: 	return 0;
   79: }
   80: 
   81: char          **
   82: vrrp_conf_split_args(char *args, char delimiter)
   83: {
   84: 	char          **tabargs;
   85: 	int             i, j, nbargs = 0;
   86: 	char           *ptr;
   87: 
   88: 	tabargs = (char **)malloc(sizeof(char *) * VRRP_CONF_MAX_ARGS);
   89: 	bzero(tabargs, sizeof(char **) * VRRP_CONF_MAX_ARGS);
   90: 	if (!tabargs) {
   91: 		syslog(LOG_ERR, "cannot malloc memory : %s", strerror(errno));
   92: 		exit(EXIT_FAILURE);
   93: 	}
   94: 	i = 0;
   95: 	while (i < strlen(args)) {
   96: 		ptr = &args[i];
   97: 		j = 0;
   98: 		while (ptr[j] != delimiter && ptr[j] != 0) {
   99: 			i++;
  100: 			j++;
  101: 		}
  102: 		tabargs[nbargs] = (char *)calloc(j + 1, 1);
  103: 		strncpy(tabargs[nbargs], ptr, j);
  104: 		i++;
  105: 		while (!isalnum(args[i]) && args[i] != '.' && args[i] != '/' && args[i])
  106: 			i++;
  107: 		nbargs++;
  108: 		if (nbargs >= VRRP_CONF_MAX_ARGS) {
  109: 			syslog(LOG_ERR, "too many arguments in the configuration file");
  110: 			exit(EXIT_FAILURE);
  111: 		}
  112: 	}
  113: 
  114: 	return tabargs;
  115: }
  116: 
  117: void 
  118: vrrp_conf_freeargs(char **temp)
  119: {
  120: 	int             i = 0;
  121: 
  122: 	while (temp[i]) {
  123: 		free(temp[i]);
  124: 		temp[i] = NULL;
  125: 		i++;
  126: 	}
  127: 	free(temp);
  128: 
  129: 	return;
  130: }
  131: 
  132: FILE           *
  133: vrrp_conf_open_file(char *name)
  134: {
  135: 	FILE           *stream;
  136: 	struct stat     st;
  137: 
  138: 	stream = fopen(name, "r");
  139: 	if (! stream) {
  140: 		syslog(LOG_ERR, "cannot open configuration file %s: %s", name, strerror(errno));
  141: 		return NULL;
  142: 	}
  143: 	if (lstat(name, &st) == -1) {
  144: 		syslog(LOG_ERR, "cannot call lstat(): %s", strerror(errno));
  145: 		fclose(stream);
  146: 		return NULL;
  147: 	}
  148: 	if ((st.st_mode & S_IFMT) != S_IFREG) {
  149: 		syslog(LOG_ERR, "%s is not a regular file", name);
  150: 		fclose(stream);
  151: 		return NULL;
  152: 	}
  153: 
  154: 	return stream;
  155: }
  156: 
  157: char 
  158: vrrp_conf_close_file(FILE * stream)
  159: {
  160: 	if (fclose(stream) == EOF) {
  161: 		syslog(LOG_ERR, "can't close the file stream FILE *stream: %s\n", strerror(errno));
  162: 		return -1;
  163: 	}
  164: 	return 0;
  165: }
  166: 
  167: char 
  168: vrrp_conf_lecture_fichier(struct vrrp_vr * vr, FILE * stream)
  169: {
  170: 	char            ligne[1024] = "#";
  171: 	char          **temp;
  172: 	char          **temp2;
  173: 	char          **temp3;
  174: 	char            option[1024], arg[1024];
  175: 	int             i, j;
  176: 	fpos_t          pos;
  177: 	int		optok;
  178: 
  179: 	fgetpos(stream, &pos);
  180: 	if (!pos) {
  181: 		while (ligne[0] == '#' || ligne[0] == 0 || ligne[0] == '\n')
  182: 			fgets(ligne, 1024, stream);
  183: 		if (strncmp(ligne, "[VRID]", 6)) {
  184: 			syslog(LOG_ERR, "configuration file error ! cannot see [VRID] section");
  185: 			return -1;
  186: 		}
  187: 		fgets(ligne, 1024, stream);
  188: 	}
  189: 	while (!feof(stream) && strncmp(ligne, "[VRID]", 6)) {
  190: 		if (ligne[0] != 0 && ligne[0] != '\n' && ligne[0] != '#') {
  191: 			if (feof(stream))
  192: 				break;
  193: 			vrrp_conf_ident_option_arg(ligne, option, arg);
  194: 			optok = 0;
  195: 			if (!strcmp(option, "addr")) {
  196: 				temp = vrrp_conf_split_args(arg, ',');
  197: 				i = 0;
  198: 				while (temp[i])
  199: 					i++;
  200: 				vr->vr_ip = (struct vrrp_vip *) calloc(i, sizeof(struct vrrp_vip) + 1);
  201: 				vr->vr_netmask = (u_int *) calloc(i, sizeof(u_int) + 1);
  202: 				i = 0;
  203: 				while (temp[i] && (i < VRRP_CONF_MAX_ARGS)) {
  204: 					temp2 = vrrp_conf_split_args(temp[i], ':');
  205: 					if (temp2[1]) {
  206: 						vr->vr_ip[i].if_name = (char *)calloc(IFNAMSIZ + 1, 1);
  207: 						strncpy(vr->vr_ip[i].if_name, temp2[0], IFNAMSIZ);
  208: 						temp3 = vrrp_conf_split_args(temp2[1], '/');
  209: 					}
  210: 					else
  211: 						temp3 = vrrp_conf_split_args(temp2[0], '/');
  212: 					j = 0;
  213: 					while (temp3[j])
  214: 						j++;
  215: 					if (j != 2) {
  216: 						syslog(LOG_ERR, "bad value in the configuration file for addr option: %s", arg);
  217: 						exit(-1);
  218: 					}
  219: 					vr->vr_ip[i].addr.s_addr = inet_addr(temp3[0]);
  220: 					vr->vr_netmask[i] = atoi(temp3[1]);
  221: 					i++;
  222: 					vrrp_conf_freeargs(temp3);
  223: 					vrrp_conf_freeargs(temp2);
  224: 				}
  225: 				vr->cnt_ip = i;
  226: 				vrrp_conf_freeargs(temp);
  227: 				optok = 1;
  228: 			}
  229: 			if (!strcmp(option, "interface")) {
  230: 				temp = vrrp_conf_split_args(arg, ',');
  231: 				if (!(vr->vr_if = vrrp_misc_search_if_entry(temp[0]))) {
  232: 					vr->vr_if = (struct vrrp_if *)calloc(1, sizeof(struct vrrp_if));
  233: 					strncpy(vr->vr_if->if_name, temp[0], sizeof(vr->vr_if->if_name));
  234: 				}
  235: 				vrrp_conf_freeargs(temp);
  236: 				optok = 1;
  237: 			}
  238: 			if (!strcmp(option, "monitoredcircuits")) {
  239: 				if (! strcmp(arg, "yes"))
  240: 					vr->useMonitoredCircuits = 1;
  241: 				else {
  242: 					if (! strcmp(arg, "no"))
  243: 						vr->useMonitoredCircuits = 0;
  244: 					else {
  245: 						syslog(LOG_ERR, "bad value for useMonitoredCircuits: %s", arg);
  246: 						exit(-1);
  247: 					}
  248: 				}
  249: 				optok = 1;
  250: 			}
  251: 			if (!strcmp(option, "serverid")) {
  252: 				vr->vr_id = atoi(arg);
  253: 				optok = 1;
  254: 			}
  255: 			if (!strcmp(option, "carriertimeout")) {
  256: 				if (vr->vr_if)
  257: 					vr->vr_if->carrier_timeout = atoi(arg);
  258: 				else
  259: 					syslog(LOG_ERR, "'carriertimeout' must be specified after 'interface'");
  260: 				optok = 1;
  261: 			}
  262: 			if (!strcmp(option, "spanningtreelatency")) {
  263: 				vr->spanningTreeLatency = atoi(arg);
  264: 				optok = 1;
  265: 			}
  266: 			if (!strcmp(option, "priority")) {
  267: 				temp = vrrp_conf_split_args(arg, ',');
  268: 				vr->priority = atoi(temp[0]);
  269: 				vrrp_conf_freeargs(temp);
  270: 				optok = 1;
  271: 			}
  272: 			if (!strcmp(option, "password")) {
  273: 				temp = vrrp_conf_split_args(arg, ',');
  274: 				vr->password = (char *)calloc(8, 1);
  275: 				strncpy(vr->password, temp[0], 8);
  276: 				vrrp_conf_freeargs(temp);
  277: 				vr->auth_type = 1;
  278: 				optok = 1;
  279: 			}
  280: 			if (!strcmp(option, "masterscript")) {
  281: 				vr->master_script = (char *)calloc(strlen(arg)+1, 1);
  282: 				strncpy(vr->master_script, arg, strlen(arg));
  283: 				optok = 1;
  284: 			}
  285: 			if (!strcmp(option, "backupscript")) {
  286: 				vr->backup_script = (char *)calloc(strlen(arg)+1, 1);
  287: 				strncpy(vr->backup_script, arg, strlen(arg));
  288: 				optok = 1;
  289: 			}
  290: 			if (! strcmp(option, "vridsdep")) {
  291: 				temp = vrrp_conf_split_args(arg, ',');
  292: 				i = 0;
  293: 				while (temp[i]) i++;
  294: 				vr->vridsdeps = (int *)calloc(i+1, sizeof(int));
  295: 				i = 0;
  296: 				while (temp[i]) {
  297: 					vr->vridsdeps[i] = atoi(temp[i]);
  298: 					i++;
  299: 				}
  300: 				vr->vridsdeps[i] = -1;
  301: 				vrrp_conf_freeargs(temp);
  302: 				optok = 1;
  303: 			}
  304: 			if (!strcmp(option, "useIKE")) {
  305: 				if (! strcmp(arg, "yes"))
  306: 					vr->useIKE = 1;
  307: 				else {
  308: 					if (! strcmp(arg, "no"))
  309: 						vr->useIKE = 0;
  310: 					else {
  311: 						syslog(LOG_ERR, "bad value for useIKE: %s", arg);
  312: 						exit(-1);
  313: 					}
  314: 				}
  315: 				optok = 1;
  316: 			}
  317: 			if (!strcmp(option, "AHencryption")) {
  318: 				if (! strcmp(arg, "yes")) {
  319: 					vr->AHencryption = 1;
  320: 				        vr->auth_type = 2;
  321: 				} else {
  322: 					if (! strcmp(arg, "no"))
  323: 						vr->AHencryption = 0;
  324: 					else {
  325: 						syslog(LOG_ERR, "bad value for AHencryption: %s", arg);
  326: 						exit(-1);
  327: 					}
  328: 				}
  329: 				optok = 1;
  330: 			}
  331: 			if (!strcmp(option, "presharedkey")) {
  332: 				if (vr->password) {
  333: 					syslog(LOG_ERR, "you cannot use presharedkey option with password option");
  334: 					exit(-1);
  335: 				}
  336: 				vr->password = (char *)calloc(strlen(arg)+1, 1);
  337: 				strncpy(vr->password, arg, strlen(arg));
  338: 				optok = 1;
  339: 			}
  340: 			if (!strcmp(option, "MCClearErrorsCount")) {
  341: 				vr->monitoredCircuitsClearErrorsCount = atoi(arg);
  342: 				optok = 1;
  343: 			}
  344: 			if (! optok)
  345: 				syslog(LOG_ERR, "option '%s' unknown on configuration file, ignoring it", option);
  346: 		}
  347: 		fgets(ligne, 1024, stream);
  348: 	}
  349: 	if (feof(stream))
  350: 		return 1;
  351: 
  352: 	return 0;
  353: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>