diff options
Diffstat (limited to 'src/daemon/main.c')
-rw-r--r-- | src/daemon/main.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/src/daemon/main.c b/src/daemon/main.c index 37b1a51..07da36d 100644 --- a/src/daemon/main.c +++ b/src/daemon/main.c @@ -28,6 +28,8 @@ #include "net.h" #include "purple.h" #include "proto_stdio.h" +#include "tlv.h" +#include "utils.h" static struct _state { int nd; @@ -56,7 +58,7 @@ int main(int argc, char **argv) } } else { if (proto_stdio_init() && setting_verbose()) { - fprintf(stderr, "libpurple initialization failed\n"); + fprintf(stderr, "stdio interface initialization failed\n"); } } @@ -77,15 +79,45 @@ int main(int argc, char **argv) /* TODO: semi-stub */ static int __main_loop(const struct timespec * const iter_len) { + struct tlv field; + struct tlv_packet pack; struct timespec t; + char *buf = NULL; + size_t recvsize; int ret = A_OK; t = *iter_len; + tlv_init(&field, HEARTBEAT); + field.data = strdup(heartbeat_server); + field.head.size = sizeof(heartbeat_server); + tlv_packet_init(&pack); + tlv_pack(&pack, &field); + tlv_packet_finalize(&pack); + tlv_destroy(&field); + + /* flush any pending discovery packets from the socker, + * as those can be quite numerous on startup. + */ + net_flush_read_buffer(__progstate.nd); - while (!ret) { + while (ret != ERROR) { + ret = net_getlastdata(__progstate.nd, &buf, &recvsize); + + if (ret == A_OK) { + /* we're only sending one TLV per packet as of now, + * so no need to save the pointer for further parsing + */ + ret = tlv_get(buf, &field, NULL); + if (ret == A_OK && field.head.type == HEARTBEAT && !(strcmp(field.data, heartbeat_device))) { + /* error checking? what error checking? */ + ret = net_send(__progstate.nd, pack.data, pack.cursor + 1); + } + } nanosleep(&t, NULL); } + tlv_packet_destroy(&pack); + return ret; } @@ -94,5 +126,6 @@ static void cleanup(void) purple_close(); proto_stdio_close(); net_close(__progstate.nd); + __progstate.nd = 0; settings_cleanup(); } |