Annotation of embedaddon/miniupnpd/options.c, revision 1.1

1.1     ! misho       1: /* $Id: options.c,v 1.20 2008/10/06 13:22:02 nanard Exp $ */
        !             2: /* MiniUPnP project
        !             3:  * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
        !             4:  * author: Ryan Wagoner
        !             5:  * (c) 2006 Thomas Bernard 
        !             6:  * This software is subject to the conditions detailed
        !             7:  * in the LICENCE file provided within the distribution */
        !             8: 
        !             9: #include <stdio.h>
        !            10: #include <string.h>
        !            11: #include <stdlib.h>
        !            12: #include <ctype.h>
        !            13: #include <syslog.h>
        !            14: #include "options.h"
        !            15: #include "upnppermissions.h"
        !            16: #include "upnpglobalvars.h"
        !            17: 
        !            18: struct option * ary_options = NULL;
        !            19: int num_options = 0;
        !            20: 
        !            21: static const struct {
        !            22:        enum upnpconfigoptions id;
        !            23:        const char * name;
        !            24: } optionids[] = {
        !            25:        { UPNPEXT_IFNAME, "ext_ifname" },
        !            26:        { UPNPEXT_IP,   "ext_ip" },
        !            27:        { UPNPLISTENING_IP, "listening_ip" },
        !            28:        { UPNPPORT, "port" },
        !            29:        { UPNPBITRATE_UP, "bitrate_up" },
        !            30:        { UPNPBITRATE_DOWN, "bitrate_down" },
        !            31:        { UPNPPRESENTATIONURL, "presentation_url" },
        !            32:        { UPNPNOTIFY_INTERVAL, "notify_interval" },
        !            33:        { UPNPSYSTEM_UPTIME, "system_uptime" },
        !            34:        { UPNPPACKET_LOG, "packet_log" },
        !            35:        { UPNPUUID, "uuid"},
        !            36:        { UPNPSERIAL, "serial"},
        !            37:        { UPNPMODEL_NUMBER, "model_number"},
        !            38:        { UPNPCLEANTHRESHOLD, "clean_ruleset_threshold"},
        !            39:        { UPNPCLEANINTERVAL, "clean_ruleset_interval"},
        !            40: #ifdef USE_NETFILTER
        !            41:        { UPNPFORWARDCHAIN, "upnp_forward_chain"},
        !            42:        { UPNPNATCHAIN, "upnp_nat_chain"},
        !            43: #endif
        !            44: #ifdef ENABLE_NATPMP
        !            45:        { UPNPENABLENATPMP, "enable_natpmp"},
        !            46: #endif
        !            47:        { UPNPENABLE, "enable_upnp"},
        !            48: #ifdef USE_PF
        !            49:        { UPNPQUEUE, "queue"},
        !            50:        { UPNPTAG, "tag"},
        !            51: #endif
        !            52: #ifdef PF_ENABLE_FILTER_RULES
        !            53:        { UPNPQUICKRULES, "quickrules" },
        !            54: #endif
        !            55: #ifdef ENABLE_LEASEFILE
        !            56:        { UPNPLEASEFILE, "lease_file"},
        !            57: #endif
        !            58:        { UPNPMINISSDPDSOCKET, "minissdpdsocket"},
        !            59:        { UPNPSECUREMODE, "secure_mode"}
        !            60: };
        !            61: 
        !            62: int
        !            63: readoptionsfile(const char * fname)
        !            64: {
        !            65:        FILE *hfile = NULL;
        !            66:        char buffer[1024];
        !            67:        char *equals;
        !            68:        char *name;
        !            69:        char *value;
        !            70:        char *t;
        !            71:        int linenum = 0;
        !            72:        int i;
        !            73:        enum upnpconfigoptions id;
        !            74: 
        !            75:        if(!fname || (strlen(fname) == 0))
        !            76:                return -1;
        !            77: 
        !            78:        memset(buffer, 0, sizeof(buffer));
        !            79: 
        !            80: #ifdef DEBUG
        !            81:        printf("Reading configuration from file %s\n", fname);
        !            82: #endif
        !            83: 
        !            84:        if(!(hfile = fopen(fname, "r")))
        !            85:                return -1;
        !            86: 
        !            87:        if(ary_options != NULL)
        !            88:        {
        !            89:                free(ary_options);
        !            90:                num_options = 0;
        !            91:        }
        !            92: 
        !            93:        while(fgets(buffer, sizeof(buffer), hfile))
        !            94:        {
        !            95:                linenum++;
        !            96:                t = strchr(buffer, '\n'); 
        !            97:                if(t)
        !            98:                {
        !            99:                        *t = '\0';
        !           100:                        t--;
        !           101:                        while((t >= buffer) && isspace(*t))
        !           102:                        {
        !           103:                                *t = '\0';
        !           104:                                t--;
        !           105:                        }
        !           106:                }
        !           107:        
        !           108:                /* skip leading whitespaces */
        !           109:                name = buffer;
        !           110:                while(isspace(*name))
        !           111:                        name++;
        !           112: 
        !           113:                /* check for comments or empty lines */
        !           114:                if(name[0] == '#' || name[0] == '\0') continue;
        !           115: 
        !           116:                /* check for UPnP permissions rule */
        !           117:                if(0 == memcmp(name, "allow", 5) || 0 == memcmp(name, "deny", 4))
        !           118:                {
        !           119:                        upnppermlist = realloc(upnppermlist,
        !           120:                                               sizeof(struct upnpperm) * (num_upnpperm+1));
        !           121:                        /* parse the rule */
        !           122:                        if(read_permission_line(upnppermlist + num_upnpperm, name) >= 0)
        !           123:                        {
        !           124:                                num_upnpperm++;
        !           125:                        }
        !           126:                        else
        !           127:                        {
        !           128:                                fprintf(stderr, "parsing error file %s line %d : %s\n",
        !           129:                                        fname, linenum, name);
        !           130:                        }
        !           131:                        continue;
        !           132:                }
        !           133:                if(!(equals = strchr(name, '=')))
        !           134:                {
        !           135:                        fprintf(stderr, "parsing error file %s line %d : %s\n",
        !           136:                                fname, linenum, name);
        !           137:                        continue;
        !           138:                }
        !           139: 
        !           140:                /* remove ending whitespaces */
        !           141:                for(t=equals-1; t>name && isspace(*t); t--)
        !           142:                        *t = '\0';
        !           143: 
        !           144:                *equals = '\0';
        !           145:                value = equals+1;
        !           146: 
        !           147:                /* skip leading whitespaces */
        !           148:                while(isspace(*value))
        !           149:                        value++;
        !           150: 
        !           151:                id = UPNP_INVALID;
        !           152:                for(i=0; i<sizeof(optionids)/sizeof(optionids[0]); i++)
        !           153:                {
        !           154:                        /*printf("%2d %2d %s %s\n", i, optionids[i].id, name,
        !           155:                               optionids[i].name); */
        !           156: 
        !           157:                        if(0 == strcmp(name, optionids[i].name))
        !           158:                        {
        !           159:                                id = optionids[i].id;
        !           160:                                break;
        !           161:                        }
        !           162:                }
        !           163: 
        !           164:                if(id == UPNP_INVALID)
        !           165:                {
        !           166:                        fprintf(stderr, "parsing error file %s line %d : %s=%s\n",
        !           167:                                fname, linenum, name, value);
        !           168:                }
        !           169:                else
        !           170:                {
        !           171:                        num_options += 1;
        !           172:                        ary_options = (struct option *) realloc(ary_options, num_options * sizeof(struct option));
        !           173: 
        !           174:                        ary_options[num_options-1].id = id;
        !           175:                        strncpy(ary_options[num_options-1].value, value, MAX_OPTION_VALUE_LEN);
        !           176:                }
        !           177: 
        !           178:        }
        !           179:        
        !           180:        fclose(hfile);
        !           181:        
        !           182:        return 0;
        !           183: }
        !           184: 
        !           185: void
        !           186: freeoptions(void)
        !           187: {
        !           188:        if(ary_options)
        !           189:        {
        !           190:                free(ary_options);
        !           191:                ary_options = NULL;
        !           192:                num_options = 0;
        !           193:        }
        !           194: }
        !           195: 

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