Respond pings with pongs.
[cascardo/f2fchat.git] / message.c
index 7c73006..8c6dafd 100644 (file)
--- a/message.c
+++ b/message.c
@@ -26,6 +26,7 @@
 gboolean ping_timeout(gpointer data)
 {
        struct friend *friend = data;
+       friend_timeout(friend);
        return G_SOURCE_REMOVE;
 }
 
@@ -52,22 +53,41 @@ gboolean message_incoming(GIOChannel *channel, GIOCondition cond, gpointer data)
        iaddress = g_inet_socket_address_get_address(G_INET_SOCKET_ADDRESS(address));
        if (g_inet_address_get_is_loopback(iaddress)) {
                command(buffer, len);
+       } 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));
+                       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);
        return TRUE;
 }
 
-int message_init(int sock)
+int message_init(GSocket *sock)
 {
-       uchannel = g_io_channel_unix_new(sock);
+       uchannel = g_io_channel_unix_new(g_socket_get_fd(sock));
        g_io_add_watch(uchannel, G_IO_IN, message_incoming, NULL);
        return 0;
 }
 
 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);
 }