26RCSID(
"$Id: 48cf66937f7edaf737fcbb778f26405dcc934452 $")
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) {
162 r =
lo_read(fd, &hdr,
sizeof(hdr));
163 if (r <= 0)
return r;
169 data_len = ntohl(hdr.
length);
170 if (data_len == 0)
return 0;
171 if (data_len > UINT32_MAX) data_len = UINT32_MAX;
174 fprintf(stderr,
"CONDUIT R %zu length %zu\n", *pconduit, data_len);
181 if (outlen > data_len) outlen = data_len;
184 if (r <= 0)
return r;
190 while (data_len > outlen) {
194 discard = data_len - outlen;
195 if (discard >
sizeof(junk)) discard =
sizeof(junk);
197 r =
lo_read(fd, junk, discard);
215 r = write(fd,
buffer, total);
222 if (errno == EINTR)
continue;
240 if (outlen > UINT32_MAX) {
241 fr_strerror_printf(
"Data to write to conduit (%zu bytes) exceeds maximum length", outlen);
248 if (!outlen)
return 0;
252 .length = htonl(outlen),
256 fprintf(stderr,
"CONDUIT W %zu length %zu\n", conduit, outlen);
262 r =
lo_write(fd, &hdr,
sizeof(hdr));
263 if (r <= 0)
return r;
269 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