summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--accel-pppd/extra/chap-secrets.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/accel-pppd/extra/chap-secrets.c b/accel-pppd/extra/chap-secrets.c
index f99bd0b..becb687 100644
--- a/accel-pppd/extra/chap-secrets.c
+++ b/accel-pppd/extra/chap-secrets.c
@@ -43,6 +43,7 @@ struct cs_pd_t
struct ipv4db_item_t ip;
char *passwd;
char *rate;
+ char *pool;
};
#ifdef CRYPTO_OPENSSL
@@ -122,14 +123,16 @@ static struct cs_pd_t *create_pd(struct ap_session *ses, const char *username)
FILE *f;
char *buf;
char *ptr[5];
- int n, i;
+ int n;
struct cs_pd_t *pd;
+ struct in_addr in;
#ifdef CRYPTO_OPENSSL
char username_hash[EVP_MAX_MD_SIZE * 2 + 1];
uint8_t hash[EVP_MAX_MD_SIZE];
struct hash_chain *hc;
EVP_MD_CTX *md_ctx = NULL;
char c;
+ int i;
#endif
if (!conf_chap_secrets)
@@ -229,8 +232,12 @@ found:
}
pd->ip.addr = conf_gw_ip_address;
- if (n >= 3 && ptr[2][0] != '*')
- pd->ip.peer_addr = inet_addr(ptr[2]);
+ if (n >= 3 && !strchr("*-!", ptr[2][0])) {
+ if (inet_aton(ptr[2], &in))
+ pd->ip.peer_addr = in.s_addr;
+ else
+ pd->pool = _strdup(ptr[2]);
+ }
pd->ip.mask = conf_netmask;
pd->ip.owner = &ipdb;
@@ -269,6 +276,8 @@ static void ev_ses_finished(struct ap_session *ses)
_free(pd->passwd);
if (pd->rate)
_free(pd->rate);
+ if (pd->pool)
+ _free(pd->pool);
_free(pd);
}
@@ -300,7 +309,12 @@ static struct ipv4db_item_t *get_ip(struct ap_session *ses)
if (!pd)
return NULL;
- if (!pd->ip.peer_addr)
+ if (pd->pool) {
+ if (ses->ipv4_pool_name)
+ _free(ses->ipv4_pool_name);
+ ses->ipv4_pool_name = _strdup(pd->pool);
+ return NULL;
+ } else if (!pd->ip.peer_addr)
return NULL;
if (!ses->ctrl->ppp)