summaryrefslogtreecommitdiff
path: root/accel-pptpd/radius/radius.c
diff options
context:
space:
mode:
authorDmitry Kozlov <xeb@mail.ru>2010-10-27 20:50:15 +0400
committerDmitry Kozlov <xeb@mail.ru>2010-10-27 20:50:15 +0400
commit04a57e858bed078548c4c8715aa3d35ba81401ae (patch)
tree3b692c1ac3769dfc117c4680121e1652f140d6fe /accel-pptpd/radius/radius.c
parent0d2a0aafea94e33cfaa19948eb7e4dd1e62fce5e (diff)
downloadaccel-ppp-04a57e858bed078548c4c8715aa3d35ba81401ae.tar.gz
accel-ppp-04a57e858bed078548c4c8715aa3d35ba81401ae.zip
radius: implemented Class, Termination-Action attributes
Diffstat (limited to 'accel-pptpd/radius/radius.c')
-rw-r--r--accel-pptpd/radius/radius.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/accel-pptpd/radius/radius.c b/accel-pptpd/radius/radius.c
index f24724f..9f50ded 100644
--- a/accel-pptpd/radius/radius.c
+++ b/accel-pptpd/radius/radius.c
@@ -45,9 +45,10 @@ static struct ipdb_t ipdb;
static mempool_t rpd_pool;
-void rad_proc_attrs(struct rad_req_t *req)
+int rad_proc_attrs(struct rad_req_t *req)
{
struct rad_attr_t *attr;
+ int res = 0;
list_for_each_entry(attr, &req->reply->attrs, entry) {
if (attr->vendor)
@@ -68,8 +69,22 @@ void rad_proc_attrs(struct rad_req_t *req)
case Session_Timeout:
req->rpd->session_timeout.expire_tv.tv_sec = attr->val.integer;
break;
+ case Class:
+ req->rpd->class = _malloc(attr->len);
+ if (!req->rpd->class) {
+ log_emerg("radius: out of memory\n");
+ return -1;
+ }
+ memcpy(req->rpd->class, attr->val.octets, attr->len);
+ req->rpd->class_len = attr->len;
+ break;
+ case Termination_Action:
+ if (attr->val.integer != 0)
+ res = -1;
}
}
+
+ return res;
}
static int check(struct pwdb_t *pwdb, struct ppp_t *ppp, const char *username, int type, va_list _args)
@@ -177,6 +192,9 @@ static void ppp_finished(struct ppp_t *ppp)
if (rpd->session_timeout.tpd)
triton_timer_del(&rpd->session_timeout);
+ if (rpd->class)
+ _free(rpd->class);
+
list_del(&rpd->pd.entry);
mempool_free(rpd);