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>