/
gnome-socket-applet.c
86 lines (70 loc) · 2.32 KB
/
gnome-socket-applet.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <string.h>
#include <stdlib.h>
#include <panel-applet.h>
#include <gtk/gtk.h>
#include <gtk/gtklabel.h>
#include <pthread.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <resolv.h>
/* Pipe state */
typedef struct {
PanelApplet *applet;
GtkLabel *label;
} socket_data;
/* Thread running, reading from the socket */
void *socket_thread(void *pthread_data) {
socket_data *data = (socket_data *) pthread_data;
int buffer_size = 1024;
char *buffer = malloc(buffer_size);
int sock_fd;
struct sockaddr_in self;
/* Create the socket */
sock_fd = socket(AF_INET, SOCK_STREAM, 0);
/* Initialize address/port structure */
bzero(&self, sizeof(self));
self.sin_family = AF_INET;
self.sin_port = htons(atoi(getenv("GNOME_SOCKET_APPLET_PORT")));
self.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
/* Bind and listen */
bind(sock_fd, (struct sockaddr *) &self, sizeof(self));
listen(sock_fd, 20);
/* Forever... */
while(1) {
int client_fd;
struct sockaddr_in client_addr;
int client_addr_size = sizeof(client_addr);
/* Accept the socket */
client_fd = accept(sock_fd,
(struct sockaddr *) &client_addr, &client_addr_size);
if(client_fd != -1) {
int result;
/* Receive and set text */
bzero(buffer, buffer_size);
result = recv(client_fd, buffer, buffer_size - 1, 0);
if(result > 0) gtk_label_set_text(data->label, buffer);
close(client_fd);
}
}
close(sock_fd);
free(buffer);
}
static gboolean socket_applet_fill(PanelApplet *applet, const gchar *iid,
gpointer g_data) {
GtkWidget *label;
pthread_t thread;
socket_data *data = malloc(sizeof(socket_data));
if (strcmp (iid, "OAFIID:GnomeSocketApplet") != 0)
return FALSE;
label = gtk_label_new("Waiting for connection...");
gtk_container_add(GTK_CONTAINER (applet), label);
gtk_widget_show_all(GTK_WIDGET (applet));
/* Start the socket */
data->applet = applet;
data->label = (GtkLabel *) label;
pthread_create(&thread, NULL, socket_thread, data);
return TRUE;
}
PANEL_APPLET_BONOBO_FACTORY(
"OAFIID:GnomeSocketApplet_Factory", PANEL_TYPE_APPLET,
"Gnome Socket Applet", "0", socket_applet_fill, NULL);