⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keywords.c

📁 This a good VPN source
💻 C
字号:
/* * FreeS/WAN config file parser (keywords.c) * Copyright (C) 2003 Michael Richardson <mcr@sandelman.ottawa.on.ca> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License * for more details. * * RCSID $Id: keywords.c,v 1.12 2004/12/02 16:26:02 ken Exp $ */#define DEBUG#include <sys/queue.h>#include <string.h>#include <assert.h>#include <stdlib.h>#ifndef _OPENSWAN_H#include <openswan.h>#include "constants.h"#endif#include "parser.h"#include "keywords.h"#include "parser.tab.h"#include "parserlast.h"/* * Values for failureshunt={passthrough, drop, reject, none} */struct keyword_enum_value kw_failureshunt_values[]={    { "none",        POLICY_FAIL_NONE },    { "passthrough", POLICY_FAIL_PASS },    { "drop",        POLICY_FAIL_DROP },    { "reject",      POLICY_FAIL_REJECT },};struct keyword_enum_values kw_failureshunt_list=    { kw_failureshunt_values, sizeof(kw_failureshunt_values)/sizeof(struct keyword_enum_value)};/* * Values for keyexchange= */struct keyword_enum_value kw_keyexchange_values[]={    { "ike",  KH_IKE },};struct keyword_enum_values kw_keyexchange_list=    { kw_keyexchange_values, sizeof(kw_keyexchange_values)/sizeof(struct keyword_enum_value)};/* * Values for authby={rsasig, secret} */struct keyword_enum_value kw_authby_values[]={    { "rsasig",    POLICY_RSASIG},    { "secret",    POLICY_PSK},};struct keyword_enum_values kw_authby_list=    { kw_authby_values, sizeof(kw_authby_values)/sizeof(struct keyword_enum_value)};/* * Values for dpdaction={hold,clear} */struct keyword_enum_value kw_dpdaction_values[]={    { "hold",    DPD_ACTION_HOLD},    { "clear",   DPD_ACTION_CLEAR},};struct keyword_enum_values kw_dpdaction_list=    { kw_dpdaction_values, sizeof(kw_dpdaction_values)/sizeof(struct keyword_enum_value)};/* * Values for auto={add,start,route,ignore} */struct keyword_enum_value kw_auto_values[]={    { "ignore", STARTUP_NO },    { "add",    STARTUP_ADD },    { "route",  STARTUP_ROUTE },    { "start",  STARTUP_START },};struct keyword_enum_values kw_auto_list=    { kw_auto_values, sizeof(kw_auto_values)/sizeof(struct keyword_enum_value)};/* * Values for type={tunnel,transport,udpencap} */struct keyword_enum_value kw_type_values[]={    { "tunnel",    KS_TUNNEL },    { "transport", KS_TRANSPORT },    { "udpencap",  KS_UDPENCAP },    { "passthrough", KS_PASSTHROUGH },    { "udp",       KS_UDPENCAP },    { "pass",      KS_PASSTHROUGH },    { "reject",    KS_REJECT },    { "drop",      KS_DROP },};struct keyword_enum_values kw_type_list=    { kw_type_values, sizeof(kw_type_values)/sizeof(struct keyword_enum_value)};/* * Values for rsasigkey={%dnsondemand, %dns, literal } */struct keyword_enum_value kw_rsasigkey_values[]={    { "",             PUBKEY_PREEXCHANGED },    { "%dns",         PUBKEY_DNS },    { "%dnsondemand", PUBKEY_DNSONDEMAND },};struct keyword_enum_values kw_rsasigkey_list=    { kw_rsasigkey_values, sizeof(kw_rsasigkey_values)/sizeof(struct keyword_enum_value)};/* * Values for right= and left= */extern struct keyword_enum_values kw_host_list;struct keyword_enum_value kw_plutodebug_values[]={    { "none",     DBG_NONE },    { "all",      DBG_ALL },    { "raw",      DBG_RAW },    { "crypt",    DBG_CRYPT },    { "parsing",  DBG_PARSING },    { "emitting", DBG_EMITTING },    { "control",  DBG_CONTROL },    { "lifecycle", DBG_LIFECYCLE },    { "klips",    DBG_KLIPS },    { "dns",      DBG_DNS },    { "oppo",     DBG_OPPO },    { "controlmore", DBG_CONTROLMORE },    { "private",  DBG_PRIVATE },    { "x509",  DBG_X509 },    { "impair-delay-adns-key-answer", IMPAIR_DELAY_ADNS_KEY_ANSWER },    { "impair-delay-adns-txt-answer", IMPAIR_DELAY_ADNS_TXT_ANSWER },    { "impair-bust-mi2", IMPAIR_BUST_MI2 },    { "impair-bust-mr2", IMPAIR_BUST_MR2 },};struct keyword_enum_values kw_plutodebug_list=    { kw_plutodebug_values, sizeof(kw_plutodebug_values)/sizeof(struct keyword_enum_value)};struct keyword_enum_value kw_klipsdebug_values[]={    { "all",      LRANGE(KDF_XMIT, KDF_COMP) },    { "none",     0 },    { "verbose",  LELEM(KDF_VERBOSE) },    { "xmit",     LELEM(KDF_XMIT) },    { "tunnel-xmit", LELEM(KDF_XMIT) },    { "netlink",  LELEM(KDF_NETLINK) },    { "xform",    LELEM(KDF_XFORM) },    { "eroute",   LELEM(KDF_EROUTE) },    { "spi",      LELEM(KDF_SPI) },    { "radij",    LELEM(KDF_RADIJ) },    { "esp",      LELEM(KDF_ESP) },    { "ah",       LELEM(KDF_AH) },    { "rcv",      LELEM(KDF_RCV) },    { "tunnel",   LELEM(KDF_TUNNEL) },    { "pfkey",    LELEM(KDF_PFKEY) },    { "comp",     LELEM(KDF_COMP) },};struct keyword_enum_values kw_klipsdebug_list=    { kw_klipsdebug_values, sizeof(kw_klipsdebug_values)/sizeof(struct keyword_enum_value)};    struct keyword_def ipsec_conf_keywords_v2[]={    {"interfaces",     kv_config, kt_string,    KSF_INTERFACES,NOT_ENUM},    {"forwardcontrol", kv_config, kt_bool,      KBF_FORWARDCONTROL,NOT_ENUM},    {"myid",           kv_config, kt_string,    KSF_MYID,NOT_ENUM},    {"syslog",         kv_config, kt_string,    KSF_SYSLOG,NOT_ENUM},    {"klipsdebug",     kv_config, kt_list,      KBF_KLIPSDEBUG, &kw_klipsdebug_list},    {"plutodebug",     kv_config, kt_list,      KBF_PLUTODEBUG, &kw_plutodebug_list},    {"plutoopts",      kv_config, kt_string,    KSF_PLUTOOPTS,NOT_ENUM},    {"plutostderrlog", kv_config, kt_filename,  KSF_PLUTOSTDERRLOG,NOT_ENUM},    {"plutorestartoncrash", kv_config, kt_bool, KBF_PLUTORESTARTONCRASH,NOT_ENUM},    {"dumpdir",        kv_config, kt_dirname,   KSF_DUMPDIR,NOT_ENUM},    {"manualstart",    kv_config, kt_string,    KSF_MANUALSTART,NOT_ENUM},    {"pluto",          kv_config, kt_filename,  KSF_PLUTO, NOT_ENUM},    {"plutowait",      kv_config, kt_bool,      KBF_PLUTOWAIT,NOT_ENUM},    {"prepluto",       kv_config, kt_filename,  KSF_PREPLUTO,NOT_ENUM},    {"postpluto",      kv_config, kt_filename,  KSF_POSTPLUTO,NOT_ENUM},    {"fragicmp",       kv_config, kt_bool,      KBF_FRAGICMP,NOT_ENUM},    {"hidetos",        kv_config, kt_bool,      KBF_HIDETOS,NOT_ENUM},    {"rp_filter",      kv_config, kt_enum,      KBF_RPFILTER,NOT_ENUM},    {"uniqueids",      kv_config, kt_bool,      KBF_UNIQUEIDS,NOT_ENUM},    {"overridemtu",    kv_config, kt_number,    KBF_OVERRIDEMTU,NOT_ENUM},    {"nocrsend",       kv_config, kt_bool,      KBF_NOCRSEND,NOT_ENUM},    {"strictcrlpolicy",kv_config, kt_enum,      KBF_STRICTCRLPOLICY,NOT_ENUM},    {"crlcheckinterval",kv_config,kt_time,      KBF_CRLCHECKINTERVAL,NOT_ENUM},#ifdef NAT_TRAVERSAL    {"virtual_private",kv_config,kt_string,     KSF_VIRTUALPRIVATE,NOT_ENUM},    {"nat_traversal", kv_config,kt_bool,        KBF_NATTRAVERSAL, NOT_ENUM},#endif    {"nhelpers",kv_config,kt_number, KBF_NHELPERS, NOT_ENUM},    /* this is "left=" and "right=" */    {"",               kv_conn|kv_leftright, kt_loose_enum, KSCF_IP, &kw_host_list},      {"esp",            kv_conn|kv_leftright|kv_manual, kt_string, KSCF_ESP,NOT_ENUM},    {"ike",            kv_conn|kv_auto, kt_string, KSCF_IKE,NOT_ENUM},    {"subnet",         kv_conn|kv_leftright, kt_subnet, KSCF_SUBNET,NOT_ENUM},     {"sourceip",       kv_conn|kv_leftright, kt_ipaddr, KSCF_SOURCEIP,NOT_ENUM},     {"nexthop",        kv_conn|kv_leftright, kt_ipaddr, KSCF_NEXTHOP,NOT_ENUM},    {"firewall",       kv_conn|kv_leftright, kt_bool,   KNCF_FIREWALL,NOT_ENUM},    {"updown",         kv_conn|kv_leftright, kt_filename, KSCF_UPDOWN,NOT_ENUM},    {"id",             kv_conn|kv_leftright, kt_idtype, KSCF_ID,NOT_ENUM},    {"rsasigkey",      kv_conn|kv_leftright, kt_rsakey, KSCF_RSAKEY1, &kw_rsasigkey_list},    {"rsasigkey2",     kv_conn|kv_leftright, kt_rsakey, KSCF_RSAKEY2, &kw_rsasigkey_list},    {"spibase",        kv_conn|kv_auto|kv_leftright, kt_number, KNCF_SPIBASE,NOT_ENUM},    {"cert",           kv_conn|kv_leftright, kt_filename, KSCF_CERT,NOT_ENUM},    {"ca",             kv_conn|kv_leftright, kt_string, KSCF_CA,NOT_ENUM},    {"subnetwithin",   kv_conn|kv_leftright, kt_string, KSCF_SUBNETWITHIN,NOT_ENUM},    {"protoport",      kv_conn|kv_leftright, kt_string, KSCF_PROTOPORT,NOT_ENUM},    {"auto",           kv_conn,         kt_enum,   KBF_AUTO,        &kw_auto_list},    {"also",           kv_conn,         kt_appendstring, KSF_ALSO,NOT_ENUM},    {"alsoflip",       kv_conn,         kt_string, KSF_ALSOFLIP,NOT_ENUM},    {"type",           kv_conn,         kt_enum,   KBF_TYPE,        &kw_type_list},    {"authby",         kv_conn|kv_auto, kt_string, KBF_AUTHBY,      &kw_authby_list},    {"keyexchange",    kv_conn|kv_auto, kt_enum,   KBF_KEYEXCHANGE, &kw_keyexchange_list},    {"pfs",            kv_conn|kv_auto, kt_bool,   KBF_PFS,          NOT_ENUM},    {"keylife",        kv_conn|kv_auto, kt_time,   KBF_SALIFETIME,NOT_ENUM},    {"lifetime",       kv_conn|kv_auto, kt_time,   KBF_SALIFETIME,NOT_ENUM},    {"salifetime",     kv_conn|kv_auto, kt_time,   KBF_SALIFETIME,NOT_ENUM},    {"rekey",          kv_conn|kv_auto, kt_bool,   KBF_REKEY, NOT_ENUM},    {"rekeymargin",    kv_conn|kv_auto, kt_time,   KBF_REKEYMARGIN,NOT_ENUM},    {"rekeyfuzz",      kv_conn|kv_auto, kt_time,   KBF_REKEYFUZZ,NOT_ENUM},    {"compress",       kv_conn|kv_auto, kt_bool,   KBF_COMPRESS,NOT_ENUM},    {"keyingtries",    kv_conn|kv_auto, kt_number, KBF_KEYINGTRIES,NOT_ENUM},    {"ikelifetime",    kv_conn|kv_auto, kt_time,   KBF_IKELIFETIME,NOT_ENUM},    {"disablearrivalcheck", kv_conn|kv_auto, kt_invertbool, KBF_ARRIVALCHECK,NOT_ENUM},    {"failureshunt",   kv_conn|kv_auto, kt_enum,   KBF_FAILURESHUNT, &kw_failureshunt_list},    /* DPD */     {"dpddelay", kv_conn|kv_auto,kt_number, KNCF_DPDDELAY, NOT_ENUM},    {"dpdtimeout", kv_conn|kv_auto,kt_number,KNCF_DPDTIMEOUT , NOT_ENUM},    {"dpdaction", kv_conn|kv_auto,kt_enum, KSCF_DPDACTION , &kw_dpdaction_list},    /* aggr/xauth/modeconfig */     {"aggrmode", kv_conn|kv_auto, kt_invertbool, KNCF_AGGRMODE , NOT_ENUM},    {"xauthserver", kv_conn|kv_leftright, kt_invertbool, KNCF_XAUTHSERVER , NOT_ENUM},    {"xauthclient", kv_conn|kv_leftright, kt_invertbool, KNCF_XAUTHCLIENT, NOT_ENUM},    {"modecfgserver", kv_conn|kv_leftright, kt_invertbool, KNCF_MODECONFIGSERVER, NOT_ENUM},    {"modecfgclient", kv_conn|kv_leftright, kt_invertbool, KNCF_MODECONFIGCLIENT, NOT_ENUM},    {"modecfgpull", kv_conn|kv_auto, kt_invertbool, KNCF_MODECONFIGPULL , NOT_ENUM},    /* things for manual keying only */    {"spi",            kv_conn|kv_leftright|kv_manual, kt_number, KNCF_SPI,NOT_ENUM},    {"espenckey",      kv_conn|kv_leftright|kv_manual, kt_bitstring, KSCF_ESPENCKEY,NOT_ENUM},    {"espauthkey",     kv_conn|kv_leftright|kv_manual, kt_bitstring, KSCF_ESPAUTHKEY,NOT_ENUM},    {"espreplay_window",kv_conn|kv_leftright|kv_manual, kt_number, KNCF_ESPREPLAYWINDOW,NOT_ENUM},     {NULL, 0, 0, 0, NOT_ENUM}};const int ipsec_conf_keywords_v2_count = sizeof(ipsec_conf_keywords_v2)/sizeof(struct keyword_def);/* * look for one of the above tokens, and set the value up right. *  * if we don't find it, then strdup() the string and return a string * */   /* type is really "token" type, which is actually int */int parser_find_keyword(const char *s, YYSTYPE *lval){    struct keyword_def *k;    bool keyleft;    int  keywordtype;    keyleft=FALSE;    k = ipsec_conf_keywords_v2;    while(k->keyname != NULL) {	if(strcasecmp(s, k->keyname) == 0)	{	    break;	}	if(k->validity & kv_leftright)	{	    if(strncasecmp(s, "left", 4)==0	       && strcasecmp(s+4, k->keyname)==0)	    {		keyleft=TRUE;		break;	    }	    else if(strncasecmp(s, "right", 5)==0		    && strcasecmp(s+5, k->keyname)==0)	    {		keyleft=FALSE;		break;	    }	}		k++;    }    /* if we found nothing */    if(k->keyname == NULL) {	lval->s = strdup(s);	return STRING;    }    switch(k->type)    {    case kt_percent:	keywordtype = PERCENTWORD;	break;    case kt_time:	keywordtype = TIMEWORD;	break;    case kt_bool:	keywordtype = BOOLWORD;	break;    default:	keywordtype = KEYWORD;	break;    }    /* else, set up llval.k to point, and return KEYWORD */    lval->k.keydef = k;    lval->k.keyleft = keyleft;    return keywordtype;}unsigned int parser_enum_list(struct keyword_def *kd, const char *s, bool list){    char *piece;    char *scopy;    int   numfound, kevcount;    struct keyword_enum_value *kev;    unsigned int valresult;    char complaintbuf[80];    assert(kd->type == kt_list || kd->type == kt_enum);    scopy = strdup(s);    valresult = 0;    /*     * split up the string into comma seperated pieces, and look each piece up in the     * value list provided in the definition.     */    numfound=0;    while((piece = strsep(&scopy, ":, \t")) != NULL)    {	/* discard empty strings */	if(strlen(piece) == 0) {	    continue;	}	assert(kd->validenum != NULL);	for(kevcount = kd->validenum->valuesize, kev = kd->validenum->values;	    kevcount > 0 && strcasecmp(piece, kev->name)!=0;	    kev++, kevcount--);	/* if we found something */	if(kevcount != 0)	{	    /* count it */	    numfound++;	    valresult |= kev->value;	}	else	{   /* we didn't find anything, complain */	    snprintf(complaintbuf, sizeof(complaintbuf)		     , "%s: %d: keyword %s, invalid value: %s"		     , parser_cur_filename(), parser_cur_lineno()		     , kd->keyname, piece);	 	    if(warningsarefatal)	    {		fprintf(stderr, "ERROR: %s\n", complaintbuf);		exit(1);	    }	    else	    {		fprintf(stderr, "WARNING: %s\n", complaintbuf);	    }	}    }    if(numfound > 1 && !list)    {	snprintf(complaintbuf, sizeof(complaintbuf)		 , "%s: %d: keyword %s accepts only one value, not %s"		 , parser_cur_filename(), parser_cur_lineno()		 , kd->keyname, scopy);	if(warningsarefatal)	{	    fprintf(stderr, "ERROR: %s\n", complaintbuf);	    free(scopy);	    exit(1);	}	else	{	    fprintf(stderr, "WARNING: %s\n", complaintbuf);	    valresult=0;	}    }    free(scopy);    return valresult;}	unsigned int parser_loose_enum(struct keyword *k, const char *s){    struct keyword_def *kd = k->keydef;    int   kevcount;    struct keyword_enum_value *kev;    unsigned int valresult;    assert(kd->type == kt_loose_enum || kd->type == kt_rsakey);    assert(kd->validenum != NULL && kd->validenum->values != NULL);    for(kevcount = kd->validenum->valuesize, kev = kd->validenum->values;	kevcount > 0 && strcasecmp(s, kev->name)!=0;	kev++, kevcount--);    /* if we found something */    if(kevcount != 0)    {	assert(kev->value != 0);	valresult = kev->value;	k->string = NULL;	return valresult;    }    k->string = strdup(s);    return 255;}/* * Local Variables: * c-basic-offset:4 * c-style: pluto * End: */	    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -