summaryrefslogtreecommitdiff
path: root/accel-pptpd/radius/packet.c
diff options
context:
space:
mode:
authorKozlov Dmitry <dima@server>2010-10-14 11:28:17 +0400
committerKozlov Dmitry <dima@server>2010-10-14 11:28:17 +0400
commit763fe9e3ba0faeea25cc423152a065900f901a53 (patch)
treed3772cac139507699746461afc16a26e20065f21 /accel-pptpd/radius/packet.c
parent80e8ec99aeffcec505165f099f68d0fb2903e12b (diff)
downloadaccel-ppp-763fe9e3ba0faeea25cc423152a065900f901a53.tar.gz
accel-ppp-763fe9e3ba0faeea25cc423152a065900f901a53.zip
various bug fixed and improvements
Diffstat (limited to 'accel-pptpd/radius/packet.c')
-rw-r--r--accel-pptpd/radius/packet.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/accel-pptpd/radius/packet.c b/accel-pptpd/radius/packet.c
index e3d4cfc0..0277e5f3 100644
--- a/accel-pptpd/radius/packet.c
+++ b/accel-pptpd/radius/packet.c
@@ -97,7 +97,7 @@ int rad_packet_build(struct rad_packet_t *pack, uint8_t *RA)
return 0;
}
-struct rad_packet_t *rad_packet_recv(int fd, struct sockaddr_in *addr)
+int rad_packet_recv(int fd, struct rad_packet_t **p, struct sockaddr_in *addr)
{
struct rad_packet_t *pack;
struct rad_attr_t *attr;
@@ -107,9 +107,11 @@ struct rad_packet_t *rad_packet_recv(int fd, struct sockaddr_in *addr)
int n, id, len, vendor_id;
socklen_t addr_len = sizeof(*addr);
+ *p = NULL;
+
pack = rad_packet_alloc(0);
if (!pack)
- return NULL;
+ return 0;
pack->buf = _malloc(REQ_LENGTH_MAX);
if (!pack->buf) {
@@ -123,8 +125,9 @@ struct rad_packet_t *rad_packet_recv(int fd, struct sockaddr_in *addr)
else
n = read(fd, pack->buf, REQ_LENGTH_MAX);
if (n < 0) {
- if (errno == EINTR)
- continue;
+ rad_packet_free(pack);
+ if (errno == EAGAIN)
+ return -1;
log_ppp_error("radius:packet:read: %s\n", strerror(errno));
goto out_err;
}
@@ -219,11 +222,13 @@ struct rad_packet_t *rad_packet_recv(int fd, struct sockaddr_in *addr)
n -= 2 + len;
}
- return pack;
+ *p = pack;
+
+ return 0;
out_err:
rad_packet_free(pack);
- return NULL;
+ return 0;
}
void rad_packet_free(struct rad_packet_t *pack)