2 * Copyright (C) 2013 Thadeu Lima de Souza Cascardo <cascardo@cascardo.info>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 3 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27 gboolean ping_timeout(gpointer data)
29 struct friend *friend = data;
30 friend_timeout(friend);
31 return G_SOURCE_REMOVE;
34 static GIOChannel *uchannel;
35 static GSocket *gusock;
37 static void command(char *buffer, size_t len, GSocketAddress *address)
40 args = g_strsplit(buffer, " ", -1);
43 menu_run(args, address);
47 gboolean message_incoming(GIOChannel *channel, GIOCondition cond, gpointer data)
51 GSocketAddress *address;
52 GInetAddress *iaddress;
54 gusock = g_socket_new_from_fd(g_io_channel_unix_get_fd(channel), NULL);
56 len = g_socket_get_available_bytes(gusock);
60 buffer = g_malloc(len + 1);
61 len = g_socket_receive_from(gusock, &address, buffer, len, NULL, NULL);
63 iaddress = g_inet_socket_address_get_address(G_INET_SOCKET_ADDRESS(address));
64 if (g_inet_address_get_is_loopback(iaddress)) {
65 command(buffer, len, address);
67 struct friend *friend;
68 uint16_t port = g_inet_socket_address_get_port(G_INET_SOCKET_ADDRESS(address));
69 friend = friend_get_by_address(iaddress, port);
71 printf("got message from %s\n", friend_get_name(friend));
72 friend_got_message(friend, buffer, len);
74 printf("could not find friend from address %s\n", g_inet_address_to_string(iaddress));
77 g_object_unref(address);
83 int message_init(GSocket *sock)
85 uchannel = g_io_channel_unix_new(g_socket_get_fd(sock));
86 g_io_add_watch(uchannel, G_IO_IN, message_incoming, NULL);
90 int ping(struct friend *friend)
93 char ping[5] = "PING";
94 err = friend_send_message(friend, ping, 4);
96 g_timeout_add(2000, ping_timeout, friend);
100 int pong(struct friend *friend)
102 char pong[5] = "PONG";
103 return friend_send_message(friend, pong, 4);