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

📄 file.c

📁 第二层隧道模块l2tp源码,开发环境为linux
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * Layer Two Tunnelling Protocol Daemon * Copyright (C) 1998 Adtran, Inc. * Copyright (C) 2002 Jeff McAdams * * Mark Spencer * * This software is distributed under the terms * of the GPL, which you should have received * along with this source. * * File format handling * */#include <stdio.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <netdb.h>#include <netinet/in.h>#include <time.h>#include <sys/types.h>#include <sys/socket.h>#include "l2tp.h"struct lns *lnslist;struct lac *laclist;struct lns *deflns;struct lac *deflac;struct global gconfig;char filerr[STRLEN];int parse_config (FILE *);struct keyword words[];int init_config (){    FILE *f;    int returnedValue;    gconfig.port = UDP_LISTEN_PORT;    lnslist = NULL;    laclist = NULL;    deflac = (struct lac *) malloc (sizeof (struct lac));    f = fopen (gconfig.configfile, "r");    if (!f)     {        f = fopen (gconfig.altconfigfile, "r");        if (f)        {            strncpy (gconfig.authfile, gconfig.altauthfile,             	sizeof (gconfig.authfile));        }        else        {            log (LOG_CRIT, "%s: Unable to open config file %s or %s\n",                 __FUNCTION__, gconfig.configfile, gconfig.altconfigfile);            return -1;        }    }    returnedValue = parse_config (f);    fclose (f);    return (returnedValue);    filerr[0] = 0;}struct lns *new_lns (){    struct lns *tmp;    tmp = (struct lns *) malloc (sizeof (struct lns));    if (!tmp)    {        log (LOG_CRIT, "%s: Unable to allocate memory for new LNS\n",             __FUNCTION__);        return NULL;    }    tmp->next = NULL;    tmp->exclusive = 0;    tmp->localaddr = 0;    tmp->tun_rws = DEFAULT_RWS_SIZE;    tmp->call_rws = DEFAULT_RWS_SIZE;    tmp->hbit = 0;    tmp->lbit = 0;    tmp->authpeer = 0;    tmp->authself = -1;    tmp->authname[0] = 0;    tmp->peername[0] = 0;    tmp->hostname[0] = 0;    tmp->entname[0] = 0;    tmp->range = NULL;    tmp->lacs = NULL;    tmp->passwdauth = 0;    tmp->pap_require = 0;    tmp->pap_refuse = 0;    tmp->chap_require = 0;    tmp->chap_refuse = 0;    tmp->idle = 0;    tmp->pridns = 0;    tmp->secdns = 0;    tmp->priwins = 0;    tmp->secwins = 0;    tmp->proxyarp = 0;    tmp->proxyauth = 0;    tmp->challenge = 0;    tmp->debug = 0;    tmp->pppoptfile[0] = 0;    tmp->t = NULL;    return tmp;}struct lac *new_lac (){    struct lac *tmp;    tmp = (struct lac *) malloc (sizeof (struct lac));    if (!tmp)    {        log (LOG_CRIT, "%s: Unable to allocate memory for lac entry!\n",             __FUNCTION__);        return NULL;    }    tmp->next = NULL;    tmp->rsched = NULL;    tmp->localaddr = 0;    tmp->remoteaddr = 0;    tmp->lns = 0;    tmp->tun_rws = DEFAULT_RWS_SIZE;    tmp->call_rws = DEFAULT_RWS_SIZE;    tmp->hbit = 0;    tmp->lbit = 0;    tmp->authpeer = 0;    tmp->authself = -1;    tmp->authname[0] = 0;    tmp->peername[0] = 0;    tmp->hostname[0] = 0;    tmp->entname[0] = 0;    tmp->pap_require = 0;    tmp->pap_refuse = 0;    tmp->chap_require = 0;    tmp->chap_refuse = 0;    tmp->t = NULL;    tmp->redial = 0;    tmp->rtries = 0;    tmp->rmax = 0;    tmp->challenge = 0;    tmp->autodial = 0;    tmp->rtimeout = 30;    tmp->active = 0;    tmp->debug = 0;    tmp->pppoptfile[0] = 0;    tmp->defaultroute = 0;    return tmp;}int yesno (char *value){    if (!strcasecmp (value, "yes") || !strcasecmp (value, "y") ||        !strcasecmp (value, "true"))        return 1;    else if (!strcasecmp (value, "no") || !strcasecmp (value, "n") ||             !strcasecmp (value, "false"))        return 0;    else        return -1;}int set_boolean (char *word, char *value, int *ptr){    int val;#ifdef DEBUG_FILE    log (LOG_DEBUG, "set_%s: %s  flag to '%s'\n", word, word, value);#endif /* ; */    if ((val = yesno (value)) < 0)    {        snprintf (filerr, sizeof (filerr), "%s must be 'yes' or 'no'\n",                  word);        return -1;    }    *ptr = val;    return 0;}int set_int (char *word, char *value, int *ptr){    int val;#ifdef DEBUG_FILE    log (LOG_DEBUG, "set_%s: %s  flag to '%s'\n", word, word, value);#endif /* ; */    if ((val = atoi (value)) < 0)    {        snprintf (filerr, sizeof (filerr), "%s must be a number\n", word);        return -1;    }    *ptr = val;    return 0;}int set_string (char *word, char *value, char *ptr, int len){#ifdef DEBUG_FILE    log (LOG_DEBUG, "set_%s: %s  flag to '%s'\n", word, word, value);#endif /* ; */    strncpy (ptr, value, len);    return 0;}int set_port (char *word, char *value, int context, void *item){    switch (context & ~CONTEXT_DEFAULT)    {    case CONTEXT_GLOBAL:#ifdef DEBUG_FILE        log (LOG_DEBUG, "set_port: Setting global port number to %s\n",             value);#endif        set_int (word, value, &(((struct global *) item)->port));        break;    default:        snprintf (filerr, sizeof (filerr), "'%s' not valid in this context\n",                  word);        return -1;    }    return 0;}int set_rtimeout (char *word, char *value, int context, void *item){    if (atoi (value) < 1)    {        snprintf (filerr, sizeof (filerr),                  "rtimeout value must be at least 1\n");        return -1;    }    switch (context & ~CONTEXT_DEFAULT)    {    case CONTEXT_LAC:#ifdef DEBUG_FILE        log (LOG_DEBUG, "set_rtimeout: Setting redial timeout to %s\n",             value);#endif        set_int (word, value, &(((struct lac *) item)->rtimeout));        break;    default:        snprintf (filerr, sizeof (filerr), "'%s' not valid in this context\n",                  word);        return -1;    }    return 0;}int set_rws (char *word, char *value, int context, void *item){    if (atoi (value) < -1)    {        snprintf (filerr, sizeof (filerr),                  "receive window size must be at least -1\n");        return -1;    }    switch (context & ~CONTEXT_DEFAULT)    {    case CONTEXT_LAC:        if (word[0] == 'c')            set_int (word, value, &(((struct lac *) item)->call_rws));        if (word[0] == 't')        {            set_int (word, value, &(((struct lac *) item)->tun_rws));            if (((struct lac *) item)->tun_rws < 1)            {                snprintf (filerr, sizeof (filerr),                          "receive window size for tunnels must be at least 1\n");                return -1;            }        }        break;    case CONTEXT_LNS:        if (word[0] == 'c')            set_int (word, value, &(((struct lns *) item)->call_rws));        if (word[0] == 't')        {            set_int (word, value, &(((struct lns *) item)->tun_rws));            if (((struct lns *) item)->tun_rws < 1)            {                snprintf (filerr, sizeof (filerr),                          "receive window size for tunnels must be at least 1\n");                return -1;            }        }        break;    default:        snprintf (filerr, sizeof (filerr), "'%s' not valid in this context\n",                  word);        return -1;    }    return 0;}int set_rmax (char *word, char *value, int context, void *item){    if (atoi (value) < 1)    {        snprintf (filerr, sizeof (filerr), "rmax value must be at least 1\n");        return -1;    }    switch (context & ~CONTEXT_DEFAULT)    {    case CONTEXT_LAC:#ifdef DEBUG_FILE        log (LOG_DEBUG, "set_rmax: Setting max redials to %s\n", value);#endif        set_int (word, value, &(((struct lac *) item)->rmax));        break;    default:        snprintf (filerr, sizeof (filerr), "'%s' not valid in this context\n",                  word);        return -1;    }    return 0;}int set_authfile (char *word, char *value, int context, void *item){    if (!strlen (value))    {        snprintf (filerr, sizeof (filerr),                  "no filename specified for authentication\n");        return -1;    }    switch (context & ~CONTEXT_DEFAULT)    {    case CONTEXT_GLOBAL:#ifdef DEBUG_FILE        log (LOG_DEBUG, "set_authfile: Setting global auth file to '%s'\n",             value);#endif /* ; */        strncpy (((struct global *) item)->authfile, value,                 sizeof (((struct global *)item)->authfile));        break;    default:        snprintf (filerr, sizeof (filerr), "'%s' not valid in this context\n",                  word);        return -1;    }    return 0;}int set_autodial (char *word, char *value, int context, void *item){    switch (context & ~CONTEXT_DEFAULT)    {    case CONTEXT_LAC:        if (set_boolean (word, value, &(((struct lac *) item)->autodial)))            return -1;        break;    default:        snprintf (filerr, sizeof (filerr), "'%s' not valid in this context\n",                  word);        return -1;    }    return 0;}int set_flow (char *word, char *value, int context, void *item){    int v;    set_boolean (word, value, &v);    if (v < 0)        return -1;    switch (context & ~CONTEXT_DEFAULT)    {    case CONTEXT_LAC:        if (v)        {            if (((struct lac *) item)->call_rws < 0)                ((struct lac *) item)->call_rws = 0;        }        else        {            ((struct lac *) item)->call_rws = -1;        }        break;    case CONTEXT_LNS:        if (v)        {            if (((struct lns *) item)->call_rws < 0)                ((struct lns *) item)->call_rws = 0;        }        else        {            ((struct lns *) item)->call_rws = -1;        }        break;    default:        snprintf (filerr, sizeof (filerr), "'%s' not valid in this context\n",                  word);        return -1;    }    return 0;}int set_defaultroute (char *word, char *value, int context, void *item){    switch (context & ~CONTEXT_DEFAULT)    {    case CONTEXT_LAC:        if (set_boolean (word, value, &(((struct lac *) item)->defaultroute)))            return -1;        break;    default:        snprintf (filerr, sizeof (filerr), "'%s' not valid in this context\n",                  word);

⌨️ 快捷键说明

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