24 RCSID(
"$Id: 757ccd24897015159c05f2cfbe4cd4236e01a18e $")
26 #include <freeradius-devel/radiusd.h>
27 #include <freeradius-devel/channel.h>
35 static ssize_t
lo_read(
int fd,
void *inbuf,
size_t buflen)
41 for (total = 0; total < buflen; total +=
r) {
42 r = read(fd, p + total, buflen - total);
47 if (errno == EINTR)
continue;
65 uint8_t *buffer = inbuf;
71 if (buflen <=
sizeof(hdr)) {
79 if (have_read <
sizeof(hdr)) {
82 r =
lo_read(fd, buffer + have_read,
sizeof(hdr) - have_read);
87 if (have_read <
sizeof(hdr))
return have_read;
94 memcpy(&hdr, buffer,
sizeof(hdr));
95 data_len = ntohl(hdr.
length);
100 if ((
sizeof(hdr) + data_len) > buflen) {
108 buflen =
sizeof(hdr) + data_len;
110 r =
lo_read(fd, buffer + have_read, buflen - have_read);
111 if (r <= 0)
return r;
115 if (have_read == buflen) {
116 *pchannel = ntohl(hdr.
channel);
117 *outbuf = buffer +
sizeof(hdr);
129 uint8_t *buffer = inbuf;
135 r =
lo_read(fd, &hdr,
sizeof(hdr));
136 if (r <= 0)
return r;
141 *pchannel = ntohl(hdr.
channel);
142 data_len = ntohl(hdr.
length);
145 fprintf(stderr,
"CHANNEL R %zu length %zu\n", *pchannel, data_len);
152 if (buflen > data_len) buflen = data_len;
154 r =
lo_read(fd, buffer, buflen);
155 if (r <= 0)
return r;
161 while (data_len > buflen) {
165 discard = data_len - buflen;
166 if (discard >
sizeof(junk)) discard =
sizeof(junk);
168 r =
lo_read(fd, junk, discard);
177 static ssize_t
lo_write(
int fd,
void const *inbuf,
size_t buflen)
181 uint8_t
const *buffer = inbuf;
186 r = write(fd, buffer, total);
193 if (errno == EINTR)
continue;
209 uint8_t
const *buffer = inbuf;
212 hdr.
length = htonl(buflen);
215 fprintf(stderr,
"CHANNEL W %zu length %zu\n", channel, buflen);
221 r =
lo_write(fd, &hdr,
sizeof(hdr));
222 if (r <= 0)
return r;
228 if (r <= 0)
return r;
ssize_t fr_channel_read(int fd, fr_channel_type_t *pchannel, void *inbuf, size_t buflen)
static ssize_t lo_read(int fd, void *inbuf, size_t buflen)
static ssize_t lo_write(int fd, void const *inbuf, size_t buflen)
ssize_t fr_channel_write(int fd, fr_channel_type_t channel, void const *inbuf, size_t buflen)
struct rchannel_t rchannel_t
ssize_t fr_channel_drain(int fd, fr_channel_type_t *pchannel, void *inbuf, size_t buflen, uint8_t **outbuf, size_t have_read)