summaryrefslogtreecommitdiff
path: root/accel-pptpd/radius/req.c
diff options
context:
space:
mode:
Diffstat (limited to 'accel-pptpd/radius/req.c')
-rw-r--r--accel-pptpd/radius/req.c63
1 files changed, 39 insertions, 24 deletions
diff --git a/accel-pptpd/radius/req.c b/accel-pptpd/radius/req.c
index d03ea9ae..ae761547 100644
--- a/accel-pptpd/radius/req.c
+++ b/accel-pptpd/radius/req.c
@@ -1,14 +1,21 @@
#include <stdlib.h>
-#include <sys/scket.h>
+#include <string.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
#include "triton.h"
+#include "log.h"
#include "radius.h"
static int rad_req_read(struct triton_md_handler_t *h);
-static void rd_req_timeout(struct triton_timer_t *t);
+static void rad_req_timeout(struct triton_timer_t *t);
-struct rad_req_t *rad_rec_alloc(struct radius_pd_t *rpd, int code, const char *username);
+struct rad_req_t *rad_rec_alloc(struct radius_pd_t *rpd, int code, const char *username)
{
struct rad_req_t *req = malloc(sizeof(*req));
@@ -22,14 +29,14 @@ struct rad_req_t *rad_rec_alloc(struct radius_pd_t *rpd, int code, const char *u
req->pack.len = 20;
req->hnd.fd = -1;
req->hnd.read = rad_req_read;
- req->hnd.timeout.exoire = rad_req_timeout;
+ req->timeout.expire = rad_req_timeout;
if (rad_req_add_str(req, "User-Name", username, strlen(username)))
goto out_err;
if (conf_nas_identifier)
if (rad_req_add_str(req, "NAS-Identifier", conf_nas_identifier, strlen(conf_nas_identifier)))
goto out_err;
- if (rad_req_add_int(req, "NAS-Port-Id", rpd->ppp->unit_idx, 4))
+ if (rad_req_add_int(req, "NAS-Port-Id", rpd->ppp->unit_idx))
goto out_err;
if (rad_req_add_str(req, "NAS-Port-Type", "Sync", 4))
goto out_err;
@@ -39,9 +46,13 @@ struct rad_req_t *rad_rec_alloc(struct radius_pd_t *rpd, int code, const char *u
goto out_err;
return req;
+
+out_err:
+ rad_req_free(req);
+ return NULL;
}
-void rad_rec_free(struct rad_req_t *)
+void rad_rec_free(struct rad_req_t *req)
{
}
@@ -60,17 +71,17 @@ int rad_req_send(struct rad_req_t *req)
if (conf_nas_ip_address) {
addr.sin_family = AF_INET;
- addr.sin_addr.s_addr = htonl(conf_nas_ip_address);
+ addr.sin_addr.s_addr = htonl(inet_addr(conf_nas_ip_address));
if (bind(req->hnd.fd, (struct sockaddr *) &addr, sizeof(addr))) {
log_error("radius:bind: %s\n", strerror(errno));
goto out_err;
}
}
- addr.sin_addr.s_addr = htonl(req->server_name);
+ addr.sin_addr.s_addr = htonl(inet_addr(req->server_name));
addr.sin_port = htons(req->server_port);
- if (connect(req->hnd.fd (struct sockaddr *) &addr, sizeof(addr))) {
+ if (connect(req->hnd.fd, (struct sockaddr *) &addr, sizeof(addr))) {
log_error("radius:connect: %s\n", strerror(errno));
goto out_err;
}
@@ -113,7 +124,7 @@ int rad_req_add_int(struct rad_req_t *req, const char *name, int val)
struct rad_req_attr_t *ra;
struct rad_dict_attr_t *attr;
- if (req->len + 2 + 4 >= REQ_LENGTH_MAX)
+ if (req->pack.len + 2 + 4 >= REQ_LENGTH_MAX)
return -1;
attr = rad_dict_find_attr(name);
@@ -125,9 +136,10 @@ int rad_req_add_int(struct rad_req_t *req, const char *name, int val)
return -1;
ra->attr = attr;
+ ra->len = 4;
ra->val.integer = val;
list_add_tail(&ra->entry, &req->pack.attrs);
- req->len += 2 + 4;
+ req->pack.len += 2 + 4;
return 0;
}
@@ -137,7 +149,7 @@ int rad_req_add_str(struct rad_req_t *req, const char *name, const char *val, in
struct rad_req_attr_t *ra;
struct rad_dict_attr_t *attr;
- if (req->len + 2 + len >= REQ_LENGTH_MAX)
+ if (req->pack.len + 2 + len >= REQ_LENGTH_MAX)
return -1;
attr = rad_dict_find_attr(name);
@@ -149,9 +161,10 @@ int rad_req_add_str(struct rad_req_t *req, const char *name, const char *val, in
return -1;
ra->attr = attr;
- ra->val.string = stdrdup(val);
+ ra->len = len;
+ ra->val.string = strdup(val);
list_add_tail(&ra->entry, &req->pack.attrs);
- req->len += 2 + len;
+ req->pack.len += 2 + len;
return 0;
}
@@ -162,7 +175,7 @@ int rad_req_add_val(struct rad_req_t *req, const char *name, const char *val, in
struct rad_dict_attr_t *attr;
struct rad_dict_value_t *v;
- if (req->len + 2 + len >= REQ_LENGTH_MAX)
+ if (req->pack.len + 2 + len >= REQ_LENGTH_MAX)
return -1;
attr = rad_dict_find_attr(name);
@@ -178,9 +191,10 @@ int rad_req_add_val(struct rad_req_t *req, const char *name, const char *val, in
return -1;
ra->attr = attr;
+ ra->len = len;
ra->val = v->val;
- list_add_tail(&ra->entry, &req->attrs.pack);
- req->len += 2 + len;
+ list_add_tail(&ra->entry, &req->pack.attrs);
+ req->pack.len += 2 + len;
return 0;
}
@@ -189,21 +203,22 @@ static int rad_req_read(struct triton_md_handler_t *h)
{
struct rad_req_t *req = container_of(h, typeof(*req), hnd);
- req->answer = rad_packet_recv(h->hnd.fd);
+ req->reply = rad_packet_recv(h->fd);
+
+ return 0;
}
-static void rd_req_timeout(struct triton_timer_t *t)
+static void rad_req_timeout(struct triton_timer_t *t)
{
}
-int rad_req_wait(struct rad_req_t *req)
+int rad_req_wait(struct rad_req_t *req, int timeout)
{
- if (triton_md_register_handler(req->rpd->ppp->ctrl->ctx, &req->hnd))
- return -1;
+ triton_md_register_handler(req->rpd->ppp->ctrl->ctx, &req->hnd);
if (triton_md_enable_handler(&req->hnd, MD_MODE_READ))
return -1;
- req->timeout.period = conf_timeout * 1000;
- if (triton_timer_add(&req->timeout))
+ req->timeout.period = timeout * 1000;
+ if (triton_timer_add(req->rpd->ppp->ctrl->ctx, &req->timeout, 0))
return -1;
triton_ctx_schedule(&req->hnd, &req->timeout);