4 * Copyright (C) 2002, Sean Egan <bj91704@binghamton.edu>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 /* Somewhat inspired by XMMS:
23 * Copyright (C) 1998-2002 Peter Alm, Mikael Alm, Olle Hallnas,
24 * Thomas Nilsson and 4Front Technologies
25 * Copyright (C) 1999-2002 Haavard Kvaalen
28 /* This provides code for connecting to a Gaim socket and communicating with
29 * it. It will eventually be made a library once the core and ui are split. */
31 #include <sys/types.h>
32 #include <sys/socket.h>
36 #include "gaim-socket.h"
38 void cui_send_packet (int fd
, struct gaim_cui_packet
*p
) {
39 int len
= sizeof(p
->type
) + sizeof(p
->subtype
) + sizeof(p
->length
) + p
->length
;
40 char *pack
= g_malloc(len
);
42 memcpy (a
, &(p
->type
), sizeof(p
->type
));
43 a
= a
+ sizeof(p
->type
);
44 memcpy (a
, &(p
->subtype
), sizeof(p
->subtype
));
45 a
= a
+ sizeof(p
->subtype
);
46 memcpy (a
, &(p
->length
), sizeof(p
->length
));
47 a
= a
+ sizeof(p
->length
);
48 memcpy (a
, p
->data
, p
->length
);
54 void cui_packet_append_string(struct gaim_cui_packet
*p
, char *str
) {
55 int len
= p
->length
+ strlen(str
);
56 char *k
= g_malloc(len
);
57 memcpy(k
, p
->data
, p
->length
);
58 memcpy(k
+ p
->length
, str
, strlen(str
));
65 void cui_packet_append_char(struct gaim_cui_packet
*p
, char c
) {
66 int len
= p
->length
+ sizeof(char);
67 char *k
= g_malloc(len
);
68 memcpy(k
, p
->data
, p
->length
);
76 void cui_packet_append_raw(struct gaim_cui_packet
*p
, char *str
, int len
) {
77 int lent
= p
->length
+ len
;
78 char *k
= g_malloc(lent
);
79 memcpy(k
, p
->data
, p
->length
);
80 memcpy(k
+ p
->length
, str
, len
);
87 struct gaim_cui_packet
*cui_packet_new(guchar type
, guchar subtype
) {
88 struct gaim_cui_packet
*p
= g_new0(struct gaim_cui_packet
, 1);
96 void cui_packet_free(struct gaim_cui_packet
*p
) {
102 struct gaim_cui_packet
*cui_read_packet(int fd
) {
103 struct gaim_cui_packet
*p
= g_new0(struct gaim_cui_packet
, 1);
106 if (!(read(fd
, &p
->type
, sizeof(p
->type
)))) {
112 if (!(read(fd
, &p
->subtype
, sizeof(p
->subtype
)))) {
118 if (!(read(fd
, &p
->length
, sizeof(p
->length
)))) {
124 data
= g_malloc(p
->length
);
125 if (!(read(fd
, data
, p
->length
))) {
134 /* copied directly from xmms_connect_to_session */
135 gint
gaim_connect_to_session(gint session
)
138 uid_t stored_uid
, euid
;
139 struct sockaddr_un saddr
;
141 if ((fd
= socket(AF_UNIX
, SOCK_STREAM
, 0)) != -1)
143 saddr
.sun_family
= AF_UNIX
;
144 stored_uid
= getuid();
147 sprintf(saddr
.sun_path
, "%s/gaim_%s.%d", g_get_tmp_dir(), g_get_user_name(), session
);
148 setreuid(stored_uid
, euid
);
149 if (connect(fd
, (struct sockaddr
*) &saddr
, sizeof (saddr
)) != -1)
156 gboolean
gaim_session_exists(int sess
)
158 struct gaim_cui_packet
*pack
= NULL
;
160 int fd
= gaim_connect_to_session(sess
);
162 pack
= cui_packet_new(CUI_TYPE_META
, CUI_META_PING
);
163 cui_send_packet(fd
, pack
);
164 cui_packet_free(pack
);