From ffa474615098fd1bffecac8fc6d617223a4a1744 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Wed, 24 Sep 2014 23:22:11 +0200 Subject: added simple UDP protocol --- src/sydra.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/sydra.c b/src/sydra.c index c7503b6..624ce2e 100644 --- a/src/sydra.c +++ b/src/sydra.c @@ -459,6 +459,13 @@ static void udp_remove_client(struct sockaddr_storage *addr, socklen_t addrlen, g_free(name); } +#define UDP_PROTO_MAGIC "SYDRA:" +#define UDP_PROTO_MAGIC_LEN (sizeof(UDP_PROTO_MAGIC)-1) +#define UDP_PROTO_CMD_ADD_CLIENT "add_client\n" +#define UDP_PROTO_CMD_ADD_CLIENT_LEN (sizeof(UDP_PROTO_CMD_ADD_CLIENT)-1) +#define UDP_PROTO_CMD_RM_CLIENT "remove_client\n" +#define UDP_PROTO_CMD_RM_CLIENT_LEN (sizeof(UDP_PROTO_CMD_RM_CLIENT)-1) + static gboolean on_udp_desc_ready(gint fd, GIOCondition cond, gpointer user_data) { struct udp_sink* sink = (struct udp_sink*)user_data; @@ -469,7 +476,7 @@ static gboolean on_udp_desc_ready(gint fd, GIOCondition cond, gpointer user_data struct sockaddr_storage addr; socklen_t addrlen = sizeof(addr); - char buf[2048]; + u_int8_t buf[2048]; ssize_t bytes = recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr *)&addr, &addrlen); if(bytes < 1) { if(errno == EINTR) @@ -479,11 +486,20 @@ static gboolean on_udp_desc_ready(gint fd, GIOCondition cond, gpointer user_data return FALSE; } - // TODO: parse real packet format - if(buf[0] == 'a') { + if(bytes < UDP_PROTO_MAGIC_LEN || memcmp(UDP_PROTO_MAGIC, buf, UDP_PROTO_MAGIC_LEN)) { + log_printf(DEBUG, "client discovery: ignoring invalid incoming packet"); + return TRUE; + } + + u_int8_t* cmd = &(buf[UDP_PROTO_MAGIC_LEN]); + if(bytes == (UDP_PROTO_MAGIC_LEN+UDP_PROTO_CMD_ADD_CLIENT_LEN) && + !memcmp(UDP_PROTO_CMD_ADD_CLIENT, cmd, UDP_PROTO_CMD_ADD_CLIENT_LEN)) { udp_add_client(&addr, addrlen, sink); - } else { + } else if(bytes == (UDP_PROTO_MAGIC_LEN+UDP_PROTO_CMD_RM_CLIENT_LEN) && + !memcmp(UDP_PROTO_CMD_RM_CLIENT, cmd, UDP_PROTO_CMD_RM_CLIENT_LEN)) { udp_remove_client(&addr, addrlen, sink); + } else { + log_printf(DEBUG, "client discovery: ignoring invalid command"); } return TRUE; } -- cgit v1.2.3