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

📄 file.c

📁 第二层隧道模块l2tp源码,开发环境为linux
💻 C
📖 第 1 页 / 共 3 页
字号:
    struct lns *n;    switch (context & ~CONTEXT_DEFAULT)    {    case CONTEXT_LAC:        l = (struct lac *) item;        return set_ip (word, value, &(l->localaddr));    case CONTEXT_LNS:        n = (struct lns *) item;        return set_ip (word, value, &(n->localaddr));    default:        snprintf (filerr, sizeof (filerr), "'%s' not valid in this context\n",                  word);        return -1;    }    return 0;}int set_remoteaddr (char *word, char *value, int context, void *item){    struct lac *l;    switch (context & ~CONTEXT_DEFAULT)    {    case CONTEXT_LAC:        l = (struct lac *) item;        return set_ip (word, value, &(l->remoteaddr));    default:        snprintf (filerr, sizeof (filerr), "'%s' not valid in this context\n",                  word);        return -1;    }    return 0;}int set_lns (char *word, char *value, int context, void *item){    struct hostent *hp;    struct lac *l;    struct host *ipr, *pos;    char *d;    switch (context & ~CONTEXT_DEFAULT)    {    case CONTEXT_LAC:#ifdef DEBUG_FILE        log (LOG_DEBUG, "set_lns: setting LNS to '%s'\n", value);#endif        l = (struct lac *) item;        d = strchr (value, ':');        if (d)        {            d[0] = 0;            d++;        }        hp = gethostbyname (value);        if (!hp)        {            snprintf (filerr, sizeof (filerr), "no such host '%s'\n", value);            return -1;        }        ipr = malloc (sizeof (struct host));        ipr->next = NULL;        pos = l->lns;        if (!pos)        {            l->lns = ipr;        }        else        {            while (pos->next)                pos = pos->next;            pos->next = ipr;        }        strncpy (ipr->hostname, value, sizeof (ipr->hostname));        if (d)            ipr->port = atoi (d);        else            ipr->port = UDP_LISTEN_PORT;        break;    default:        snprintf (filerr, sizeof (filerr), "'%s' not valid in this context\n",                  word);        return -1;    }    return 0;}int set_rand_sys (){    log(LOG_WARN, "The \"rand()\" function call is not a very good source"            "of randomness\n");   rand_source = RAND_SYS;    return 0;}int set_rand_dev (){    rand_source = RAND_DEV;    return 0;}int set_rand_egd (char *value){    log(LOG_WARN, "%s: not yet implemented!\n", __FUNCTION__);    rand_source = RAND_EGD;    return -1;}int set_rand_source (char *word, char *value, int context, void *item){    time_t seconds;    /*     * We're going to go ahead and seed the rand() function with srand()     * because even if we set the randomness source to dev or egd, they     * can fall back to sys if they fail, so we want to make sure we at     * least have *some* semblance of randomness available from the     * rand() function     */    /*     * This is a sucky random number seed...just the result from the     * time() call...but...the user requested to use the rand()     * function, which is a pretty sucky source of randomness     * regardless...at least we can get a almost sorta decent seed.  If     * you have any better suggestions for creating a seed...lemme know     * :/     */    seconds = time(NULL);    srand(seconds);     if (context != CONTEXT_GLOBAL)    {        log(LOG_WARN, "%s: %s not valid in context %d\n",                __FUNCTION__, word, context);        return -1;    }    /* WORKING HERE */    if (strlen(value) == 0)    {        snprintf(filerr, sizeof (filerr), "no randomness source specified\n");        return -1;    }    if (strncmp(value, "egd", 3) == 0)    {        return set_rand_egd(value);    }    else if (strncmp(value, "dev", 3) == 0)    {        return set_rand_dev();    }    else if (strncmp(value, "sys", 3) == 0)    {        return set_rand_sys();    }    else    {        log(LOG_WARN, "%s: %s is not a valid randomness source\n",                __FUNCTION__, value);        return -1;    }}int parse_config (FILE * f){    /* Read in the configuration file handed to us */    /* FIXME: I should check for incompatible options */    int context = 0;    char buf[STRLEN];    char *s, *d, *t;    int linenum = 0;    int def = 0;    struct keyword *kw;    void *data = NULL;    struct lns *tl;    struct lac *tc;    while (!feof (f))    {        fgets (buf, sizeof (buf), f);        if (feof (f))            break;        linenum++;        s = buf;        /* Strip comments */        while (*s && *s != ';')            s++;        *s = 0;        s = buf;        if (!strlen (buf))            continue;        while ((*s < 33) && *s)            s++;                /* Skip over beginning white space */        t = s + strlen (s);        while ((t >= s) && (*t < 33))            *(t--) = 0;         /* Ditch trailing white space */        if (!strlen (s))            continue;        if (s[0] == '[')        {            /* We've got a context description */            if (!(t = strchr (s, ']')))            {                log (LOG_CRIT, "parse_config: line %d: No closing bracket\n",                     linenum);                return -1;            }            t[0] = 0;            s++;            if ((d = strchr (s, ' ')))            {                /* There's a parameter */                d[0] = 0;                d++;            }            if (d && !strcasecmp (d, "default"))                def = CONTEXT_DEFAULT;            else                def = 0;            if (!strcasecmp (s, "global"))            {                context = CONTEXT_GLOBAL;#ifdef DEBUG_FILE                log (LOG_DEBUG,                     "parse_config: global context descriptor %s\n",                     d ? d : "");#endif                data = &gconfig;            }            else if (!strcasecmp (s, "lns"))            {                context = CONTEXT_LNS;                if (def)                {                    if (!deflns)                    {                        deflns = new_lns ();                        strncpy (deflns->entname, "default",                                 sizeof (deflns->entname));                    }                    data = deflns;                    continue;                }                data = NULL;                tl = lnslist;                if (d)                {                    while (tl)                    {                        if (!strcasecmp (d, tl->entname))                            break;                        tl = tl->next;                    }                    if (tl)                        data = tl;                }                if (!data)                {                    data = new_lns ();                    if (!data)                        return -1;                    ((struct lns *) data)->next = lnslist;                    lnslist = (struct lns *) data;                }                if (d)                    strncpy (((struct lns *) data)->entname,                             d, sizeof (((struct lns *) data)->entname));#ifdef DEBUG_FILE                log (LOG_DEBUG, "parse_config: lns context descriptor %s\n",                     d ? d : "");#endif            }            else if (!strcasecmp (s, "lac"))            {                context = CONTEXT_LAC;                if (def)                {                    if (!deflac)                    {                        deflac = new_lac ();                        strncpy (deflac->entname, "default",                                 sizeof (deflac->entname));                    }                    data = deflac;                    continue;                }                data = NULL;                tc = laclist;                if (d)                {                    while (tc)                    {                        if (!strcasecmp (d, tc->entname))                            break;                        tc = tc->next;                    }                    if (tc)                        data = tc;                }                if (!data)                {                    data = new_lac ();                    if (!data)                        return -1;                    ((struct lac *) data)->next = laclist;                    laclist = (struct lac *) data;                }                if (d)                    strncpy (((struct lac *) data)->entname,                             d, sizeof (((struct lac *) data)->entname));#ifdef DEBUG_FILE                log (LOG_DEBUG, "parse_config: lac context descriptor %s\n",                     d ? d : "");#endif            }            else            {                log (LOG_WARN,                     "parse_config: line %d: unknown context '%s'\n", linenum,                     s);                return -1;            }        }        else        {            if (!context)            {                log (LOG_WARN,                     "parse_config: line %d: data '%s' occurs with no context\n",                     linenum, s);                return -1;            }            if (!(t = strchr (s, '=')))            {                log (LOG_WARN, "parse_config: line %d: no '=' in data\n",                     linenum);                return -1;            }            d = t;            d--;            t++;            while ((d >= s) && (*d < 33))                d--;            d++;            *d = 0;            while (*t && (*t < 33))                t++;#ifdef DEBUG_FILE            log (LOG_DEBUG, "parse_config: field is %s, value is %s\n", s, t);#endif            /* Okay, bit twidling is done.  Let's handle this */            for (kw = words; kw->keyword; kw++)            {                if (!strcasecmp (s, kw->keyword))                {                    if (kw->handler (s, t, context | def, data))                    {                        log (LOG_WARN, "parse_config: line %d: %s", linenum,                             filerr);                        return -1;                    }                    break;                }            }            if (!kw->keyword)            {                log (LOG_CRIT, "parse_config: line %d: Unknown field '%s'\n",                     linenum, s);                return -1;            }        }    }    return 0;}struct keyword words[] = {    {"port", &set_port},    {"rand source", &set_rand_source},    {"auth file", &set_authfile},    {"exclusive", &set_exclusive},    {"autodial", &set_autodial},    {"redial", &set_redial},    {"redial timeout", &set_rtimeout},    {"lns", &set_lns},    {"max redials", &set_rmax},    {"access control", &set_accesscontrol},    {"force userspace", &set_userspace},    {"ip range", &set_iprange},    {"no ip range", &set_iprange},    {"lac", &set_lac},    {"no lac", &set_lac},    {"local ip", &set_localaddr},    {"remote ip", &set_remoteaddr},    {"defaultroute", &set_defaultroute},    {"length bit", &set_lbit},    {"hidden bit", &set_hbit},    {"require pap", &set_papchap},    {"require chap", &set_papchap},    {"require authentication", &set_papchap},    {"require auth", &set_papchap},    {"refuse pap", &set_papchap},    {"refuse chap", &set_papchap},    {"refuse authentication", &set_papchap},    {"refuse auth", &set_papchap},    {"unix authentication", &set_passwdauth},    {"unix auth", &set_passwdauth},    {"name", &set_authname},    {"hostname", &set_hostname},    {"ppp debug", &set_debug},    {"pppoptfile", &set_pppoptfile},    {"call rws", &set_rws},    {"tunnel rws", &set_rws},    {"flow bit", &set_flow},    {"challenge", &set_challenge},    {NULL, NULL}};

⌨️ 快捷键说明

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