Compare response address with friend address.
authorThadeu Lima de Souza Cascardo <cascardo@cascardo.info>
Wed, 9 Oct 2013 21:49:56 +0000 (18:49 -0300)
committerThadeu Lima de Souza Cascardo <cascardo@cascardo.info>
Wed, 9 Oct 2013 21:49:56 +0000 (18:49 -0300)
friend.c
friend.h
message.c

index f749b4d..7386f83 100644 (file)
--- a/friend.c
+++ b/friend.c
@@ -60,9 +60,22 @@ struct cache {
        GList *friends;
 };
 
+static struct cache *ucache;
+
+struct friend *friend_get_by_address(GInetAddress *address)
+{
+       GList *l;
+       for (l = g_list_first(ucache->friends); l != NULL; l = g_list_next(l)) {
+               struct friend *friend = l->data;
+               if (g_inet_address_equal(g_inet_socket_address_get_address(friend->saddr), address))
+                       return friend;
+       }
+       return NULL;
+}
+
 int create_cache(struct cache **cache)
 {
-       *cache = g_slice_new0(struct cache);
+       ucache = *cache = g_slice_new0(struct cache);
        (*cache)->friends = NULL;
        return 0;
 }
index b120fa1..c92814d 100644 (file)
--- a/friend.h
+++ b/friend.h
@@ -21,6 +21,7 @@
 
 #include <sys/types.h>
 #include <stdint.h>
+#include <gio/gio.h>
 
 int sock_init(void);
 
@@ -33,5 +34,6 @@ int load_cache(struct cache *cache, char *fname);
 int store_cache(struct cache *cache, char *fname);
 
 int friend_send_message(struct friend *friend, char *buffer, size_t len);
+struct friend *friend_get_by_address(GInetAddress *address);
 
 #endif
index 1a66892..35b5d1c 100644 (file)
--- a/message.c
+++ b/message.c
@@ -52,6 +52,11 @@ 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;
+               friend = friend_get_by_address(iaddress);
+               if (friend);
+                       g_source_remove_by_user_data(friend);
        }
        g_object_unref(address);
        g_free(buffer);