diff options
author | Kozlov Dmitry <dima@server> | 2010-10-14 11:28:17 +0400 |
---|---|---|
committer | Kozlov Dmitry <dima@server> | 2010-10-14 11:28:17 +0400 |
commit | 763fe9e3ba0faeea25cc423152a065900f901a53 (patch) | |
tree | d3772cac139507699746461afc16a26e20065f21 /accel-pptpd/radius/packet.c | |
parent | 80e8ec99aeffcec505165f099f68d0fb2903e12b (diff) | |
download | accel-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.c | 17 |
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) |