26RCSID(
"$Id: a17f14f905d184bf05cf64066dff72a11de89e6b $")
28#include <freeradius-devel/util/debug.h>
29#include <freeradius-devel/util/math.h>
30#include <freeradius-devel/util/strerror.h>
42 for (total = 0; (
size_t)total < outlen; ) {
43 r = read(fd, p + total, outlen - total);
44 if (r == 0)
return total;
51#if defined(EWOULDBLOCK) && (EWOULDBLOCK != EAGAIN)
79 void *
out,
size_t outlen,
size_t *leftover,
bool *want_more)
85 size_t offset = *leftover;
90 if (outlen <=
sizeof(hdr)) {
100 if (offset <
sizeof(hdr)) {
102 if (r <= 0)
return r;
111 if (offset <
sizeof(hdr))
return 0;
118 memcpy(&hdr,
buffer,
sizeof(hdr));
119 data_len = ntohl(hdr.
length);
127 if (data_len > (outlen -
sizeof(hdr))) {
135 outlen =
sizeof(hdr) + data_len;
138 if (r <= 0)
return r;
142 if (offset == outlen) {
165 r =
lo_read(fd, &hdr,
sizeof(hdr));
166 if (r <= 0)
return r;
173 data_len = ntohl(hdr.
length);
174 if (data_len == 0)
return 0;
175 if (data_len > UINT32_MAX) data_len = UINT32_MAX;
178 fprintf(stderr,
"CONDUIT R %zu length %zu\n", *pconduit, data_len);
185 if (outlen > data_len) outlen = data_len;
188 if (r <= 0)
return r;
194 while (data_len > outlen) {
198 discard = data_len - outlen;
199 if (discard >
sizeof(junk)) discard =
sizeof(junk);
201 r =
lo_read(fd, junk, discard);
219 r = write(fd,
buffer, total);
226 if (errno == EINTR)
continue;
244 if (outlen > UINT32_MAX) {
245 fr_strerror_printf(
"Data to write to conduit (%zu bytes) exceeds maximum length", outlen);
252 if (!outlen)
return 0;
256 .length = htonl(outlen),
260 fprintf(stderr,
"CONDUIT W %zu length %zu\n", conduit, outlen);
266 r =
lo_write(fd, &hdr,
sizeof(hdr));
267 if (r <= 0)
return r;
273 if (r <= 0)
return r;
static int const char char buffer[256]
static ssize_t lo_write(int fd, void const *out, size_t outlen)
ssize_t fr_conduit_write(int fd, fr_conduit_type_t conduit, void const *out, size_t outlen)
static ssize_t lo_read(int fd, void *out, size_t outlen)
ssize_t fr_conduit_read_async(int fd, fr_conduit_type_t *pconduit, void *out, size_t outlen, size_t *leftover, bool *want_more)
ssize_t fr_conduit_read(int fd, fr_conduit_type_t *pconduit, void *out, size_t outlen)
API to provide distinct communication conduits for the radmin protocol.
#define fr_cond_assert(_x)
Calls panic_action ifndef NDEBUG, else logs error and evaluates to value of _x.
#define fr_add(_out, _a, _b)
Adds two integers.
#define fr_strerror_printf(_fmt,...)
Log to thread local error buffer.
static fr_sbuff_err_t char ** out