diff options
Diffstat (limited to 'accel-pptpd/radius/req.c')
-rw-r--r-- | accel-pptpd/radius/req.c | 63 |
1 files changed, 39 insertions, 24 deletions
diff --git a/accel-pptpd/radius/req.c b/accel-pptpd/radius/req.c index d03ea9a..ae76154 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); |