Fix build for tarball
[cascardo/f2fchat.git] / message.c
index 25b5160..1d6c22e 100644 (file)
--- a/message.c
+++ b/message.c
@@ -18,6 +18,7 @@
 
 #include "message.h"
 #include "friend.h"
+#include "menu.h"
 #include <glib.h>
 #include <gio/gio.h>
 
 gboolean ping_timeout(gpointer data)
 {
        struct friend *friend = data;
+       friend_timeout(friend);
        return G_SOURCE_REMOVE;
 }
 
 static GIOChannel *uchannel;
 static GSocket *gusock;
 
-static void command(char *buffer, size_t len)
+static void command(char *buffer, size_t len, GSocketAddress *address)
 {
-       printf("message from loopback: %d %.*s\n", len, len, buffer);
+       gchar **args;
+       args = g_strsplit(buffer, " ", -1);
+       if (args == NULL)
+               return;
+       menu_run(args, address);
+       g_strfreev(args);
 }
 
 gboolean message_incoming(GIOChannel *channel, GIOCondition cond, gpointer data)
@@ -47,24 +54,29 @@ gboolean message_incoming(GIOChannel *channel, GIOCondition cond, gpointer data)
                gusock = g_socket_new_from_fd(g_io_channel_unix_get_fd(channel), NULL);
        }
        len = g_socket_get_available_bytes(gusock);
-       buffer = g_malloc(len);
+       if (len <= 0) {
+               goto out;
+       }
+       buffer = g_malloc(len + 1);
        len = g_socket_receive_from(gusock, &address, buffer, len, NULL, NULL);
+       buffer[len] = 0;
        iaddress = g_inet_socket_address_get_address(G_INET_SOCKET_ADDRESS(address));
        if (g_inet_address_get_is_loopback(iaddress)) {
-               command(buffer, len);
+               command(buffer, len, address);
        } else {
                struct friend *friend;
                uint16_t port = g_inet_socket_address_get_port(G_INET_SOCKET_ADDRESS(address));
                friend = friend_get_by_address(iaddress, port);
                if (friend) {
                        printf("got message from %s\n", friend_get_name(friend));
-                       g_source_remove_by_user_data(friend);
+                       friend_got_message(friend, buffer, len);
                } else {
                        printf("could not find friend from address %s\n", g_inet_address_to_string(iaddress));
                }
        }
        g_object_unref(address);
        g_free(buffer);
+out:
        return TRUE;
 }
 
@@ -77,7 +89,16 @@ int message_init(GSocket *sock)
 
 int ping(struct friend *friend)
 {
+       int err;
        char ping[5] = "PING";
-       friend_send_message(friend, ping, 4);
-       g_timeout_add(2000, ping_timeout, friend);
+       err = friend_send_message(friend, ping, 4);
+       if (!err)
+               g_timeout_add(2000, ping_timeout, friend);
+       return err;
+}
+
+int pong(struct friend *friend)
+{
+       char pong[5] = "PONG";
+       return friend_send_message(friend, pong, 4);
 }