summaryrefslogtreecommitdiffstats
path: root/src/daemon/main.c
diff options
context:
space:
mode:
authorGravatar Gediminas Jakutis <gediminas@varciai.lt> 2019-06-07 17:13:13 +0300
committerGravatar Gediminas Jakutis <gediminas@varciai.lt> 2019-06-07 17:13:13 +0300
commit30513e7a89cc2f9283458100dea298770c7d18de (patch)
tree244ce464f2f8a363418c4e9f256f7958f771a979 /src/daemon/main.c
parent75c92f6776a69c1dddee3ee63af5d59e89184828 (diff)
downloadusurpation-30513e7a89cc2f9283458100dea298770c7d18de.tar.gz
usurpation-30513e7a89cc2f9283458100dea298770c7d18de.tar.bz2
usurpation-30513e7a89cc2f9283458100dea298770c7d18de.zip
refactor server/client discovery to use TLVs.
Signed-off-by: Gediminas Jakutis <gediminas@varciai.lt>
Diffstat (limited to 'src/daemon/main.c')
-rw-r--r--src/daemon/main.c37
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();
}