#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)
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;
}
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);
}