diff options
author | Linus Nordberg <linus@nordu.net> | 2010-09-13 17:27:40 +0200 |
---|---|---|
committer | Linus Nordberg <linus@nordu.net> | 2010-09-13 17:27:40 +0200 |
commit | 23dfea91ef5e921da0b09d91004436a7d8715c42 (patch) | |
tree | 3ef5ba7681bbe664efb51064f29adc5cec2778b7 /lib/examples/blocking.c | |
parent | 8455dc9801730e599510c92cdb3e05da351aa7a5 (diff) |
First stab at a working blocking example.
Diffstat (limited to 'lib/examples/blocking.c')
-rw-r--r-- | lib/examples/blocking.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/lib/examples/blocking.c b/lib/examples/blocking.c new file mode 100644 index 0000000..f72eab4 --- /dev/null +++ b/lib/examples/blocking.c @@ -0,0 +1,69 @@ +/* Example usage of libradsec-base, using blocking i/o. */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <stdint.h> +#include "blocking.h" + +struct rs_packet * +next_packet (const struct rs_config *ctx, int fd) +{ + uint8_t hdr[RS_HEADER_LEN]; + uint8_t *buf; + size_t len; + struct rs_packet *p; + ssize_t n; + + /* Read fixed length header. */ + n = 0; + while (n < RS_HEADER_LEN) + n += read (fd, hdr, RS_HEADER_LEN - n); + + p = rs_packet_new (ctx, hdr, &len); + fprintf (stderr, "DEBUG: got header, total packet len is %d\n", + len + RS_HEADER_LEN); + if (p) + { + buf = malloc (len); + if (buf) + { + n = 0; + while (n < len) + n += read (fd, buf, len - n); + p = rs_packet_parse (ctx, &p, buf, len); + free (buf); + } + else + rs_packet_free (ctx, &p); + } + + return p; +} + +int +send_packet(const struct rs_config *ctx, int fd, struct rs_packet *p) +{ + uint8_t *buf = NULL; + ssize_t n = -20; /* Arbitrary packet size -- a guess. */ + + while (n < 0) + { + buf = realloc (buf, -n); + if (buf == NULL) + return -1; + n = rs_packet_serialize (p, buf, -n); + } + + while (n) + { + ssize_t count = write (fd, buf, n); + if (count == -1) + return -1; + n -= count; + } + + free (buf); + rs_packet_free (ctx, &p); + return 0; +} |