Annotation of embedaddon/freevrrpd/vrrp_conf.c, revision 1.1
1.1 ! misho 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.10 2004/04/02 11:16:46 rival 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>