summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKrzysztof Klinikowski <kkszysiu@gmail.com>2010-03-06 16:51:30 +0000
committerKrzysztof Klinikowski <kkszysiu@gmail.com>2010-03-06 16:51:30 +0000
commit9b893fb1b2370eb326ba369687304e4a03285fb7 (patch)
treeac6402af9cbc3d207d21c668d7c455a31cdedf99
parente5636788d00d18a0b0ea71d3880e2db026185fca (diff)
downloadpidgin-cpw.rekkanoryo.ggupdate.tar.gz
Finish making libgadu compile on Windows. Fixes #10542 finally!cpw.rekkanoryo.ggupdate
committer: John Bailey <rekkanoryo@rekkanoryo.org>
-rw-r--r--libpurple/protocols/gg/Makefile.mingw1
-rw-r--r--libpurple/protocols/gg/buddylist.c2
-rw-r--r--libpurple/protocols/gg/gg.c73
-rw-r--r--libpurple/protocols/gg/lib/events.c6
-rw-r--r--libpurple/protocols/gg/lib/libgadu.c6
-rw-r--r--libpurple/protocols/gg/lib/libgadu.h1
-rw-r--r--libpurple/protocols/gg/lib/resolver.c323
7 files changed, 383 insertions, 29 deletions
diff --git a/libpurple/protocols/gg/Makefile.mingw b/libpurple/protocols/gg/Makefile.mingw
index d147398c23..43ce4044ed 100644
--- a/libpurple/protocols/gg/Makefile.mingw
+++ b/libpurple/protocols/gg/Makefile.mingw
@@ -50,6 +50,7 @@ C_SRC = \
lib/pubdir.c \
lib/pubdir50.c \
lib/resolver.c \
+ lib/sha1.c \
buddylist.c \
confer.c \
gg.c \
diff --git a/libpurple/protocols/gg/buddylist.c b/libpurple/protocols/gg/buddylist.c
index f83e6b0fad..4bad0c6228 100644
--- a/libpurple/protocols/gg/buddylist.c
+++ b/libpurple/protocols/gg/buddylist.c
@@ -82,7 +82,7 @@ void ggp_buddylist_load(PurpleConnection *gc, char *buddylist)
gchar **users_tbl;
int i;
char *utf8buddylist = charset_convert(buddylist, "CP1250", "UTF-8");
-
+
/* Don't limit the number of records in a buddylist. */
users_tbl = g_strsplit(utf8buddylist, "\r\n", -1);
diff --git a/libpurple/protocols/gg/gg.c b/libpurple/protocols/gg/gg.c
index 21f2a136d3..2ec6a8983d 100644
--- a/libpurple/protocols/gg/gg.c
+++ b/libpurple/protocols/gg/gg.c
@@ -1000,8 +1000,8 @@ static void ggp_generic_status_handler(PurpleConnection *gc, uin_t uin,
int status, const char *descr)
{
gchar *from;
- const char *st;
gchar *msg;
+ const char *st;
gchar *avatarurl;
PurpleUtilFetchUrlData *url_data;
@@ -1018,29 +1018,37 @@ static void ggp_generic_status_handler(PurpleConnection *gc, uin_t uin,
switch (status) {
case GG_STATUS_NOT_AVAIL:
case GG_STATUS_NOT_AVAIL_DESCR:
- st = "offline";
+ st = purple_primitive_get_id_from_type(PURPLE_STATUS_OFFLINE);
+ break;
+ case GG_STATUS_FFC:
+ case GG_STATUS_FFC_DESCR:
+ st = purple_primitive_get_id_from_type(PURPLE_STATUS_AVAILABLE);
break;
case GG_STATUS_AVAIL:
case GG_STATUS_AVAIL_DESCR:
- st = "available";
+ st = purple_primitive_get_id_from_type(PURPLE_STATUS_AVAILABLE);
break;
case GG_STATUS_BUSY:
case GG_STATUS_BUSY_DESCR:
- st = "away";
+ st = purple_primitive_get_id_from_type(PURPLE_STATUS_AWAY);
break;
+ case GG_STATUS_DND:
+ case GG_STATUS_DND_DESCR:
+ st = purple_primitive_get_id_from_type(PURPLE_STATUS_UNAVAILABLE);
case GG_STATUS_BLOCKED:
/* user is blocking us.... */
st = "blocked";
break;
default:
- st = "available";
+ st = purple_primitive_get_id_from_type(PURPLE_STATUS_AVAILABLE);
purple_debug_info("gg",
"GG_EVENT_NOTIFY: Unknown status: %d\n", status);
break;
}
purple_debug_info("gg", "st = %s\n", st);
- msg = charset_convert(descr, "CP1250", "UTF-8");
+ //msg = charset_convert(descr, "CP1250", "UTF-8");
+ msg = g_strdup_printf("%s", descr);
purple_prpl_got_user_status(purple_connection_get_account(gc),
from, st, "message", msg, NULL);
g_free(from);
@@ -1078,6 +1086,12 @@ static const char *ggp_status_by_id(unsigned int id)
case GG_STATUS_AVAIL_DESCR:
st = _("Available");
break;
+ case GG_STATUS_FFC:
+ case GG_STATUS_FFC_DESCR:
+ return _("Chatty");
+ case GG_STATUS_DND:
+ case GG_STATUS_DND_DESCR:
+ return _("Do Not Disturb");
case GG_STATUS_BUSY:
case GG_STATUS_BUSY_DESCR:
st = _("Away");
@@ -1347,8 +1361,11 @@ static void ggp_recv_message_handler(PurpleConnection *gc, const struct gg_event
from = g_strdup_printf("%lu", (unsigned long int)ev->event.msg.sender);
+ /*
tmp = charset_convert((const char *)ev->event.msg.message,
"CP1250", "UTF-8");
+ */
+ tmp = g_strdup_printf("%s", ev->event.msg.message);
purple_str_strip_char(tmp, '\r');
msg = g_markup_escape_text(tmp, -1);
g_free(tmp);
@@ -1562,7 +1579,7 @@ static void ggp_callback_recv(gpointer _gc, gint fd, PurpleInputCondition cond)
purple_debug_info("gg", "notify_pre: (%d) status: %d\n",
ev->event.notify->uin,
- ev->event.notify->status);
+ GG_S(ev->event.notify->status));
n = (ev->type == GG_EVENT_NOTIFY) ? ev->event.notify
: ev->event.notify_descr.notify;
@@ -1573,17 +1590,17 @@ static void ggp_callback_recv(gpointer _gc, gint fd, PurpleInputCondition cond)
purple_debug_info("gg",
"notify: (%d) status: %d; descr: %s\n",
- n->uin, n->status, descr ? descr : "(null)");
+ n->uin, GG_S(n->status), descr ? descr : "(null)");
ggp_generic_status_handler(gc,
- n->uin, n->status, descr);
+ n->uin, GG_S(n->status), descr);
}
}
break;
case GG_EVENT_NOTIFY60:
purple_debug_info("gg",
"notify60_pre: (%d) status=%d; version=%d; descr=%s\n",
- ev->event.notify60->uin, ev->event.notify60->status,
+ ev->event.notify60->uin, GG_S(ev->event.notify60->status),
ev->event.notify60->version,
ev->event.notify60->descr ? ev->event.notify60->descr : "(null)");
@@ -1602,7 +1619,7 @@ static void ggp_callback_recv(gpointer _gc, gint fd, PurpleInputCondition cond)
break;
case GG_EVENT_STATUS:
purple_debug_info("gg", "status: (%d) status=%d; descr=%s\n",
- ev->event.status.uin, ev->event.status.status,
+ ev->event.status.uin, GG_S(ev->event.status.status),
ev->event.status.descr ? ev->event.status.descr : "(null)");
ggp_generic_status_handler(gc, ev->event.status.uin,
@@ -1611,12 +1628,12 @@ static void ggp_callback_recv(gpointer _gc, gint fd, PurpleInputCondition cond)
case GG_EVENT_STATUS60:
purple_debug_info("gg",
"status60: (%d) status=%d; version=%d; descr=%s\n",
- ev->event.status60.uin, ev->event.status60.status,
+ ev->event.status60.uin, GG_S(ev->event.status60.status),
ev->event.status60.version,
ev->event.status60.descr ? ev->event.status60.descr : "(null)");
ggp_generic_status_handler(gc, ev->event.status60.uin,
- ev->event.status60.status, ev->event.status60.descr);
+ GG_S(ev->event.status60.status), ev->event.status60.descr);
break;
case GG_EVENT_USERLIST:
if (ev->event.userlist.type == GG_USERLIST_GET_REPLY) {
@@ -1829,6 +1846,16 @@ static GList *ggp_status_types(PurpleAccount *account)
NULL);
types = g_list_append(types, type);
+ /*
+ * New statuses for GG 8.0 like PoGGadaj ze mna (not yet because
+ * libpurple can't support Chatty status) and Nie przeszkadzac
+ */
+ type = purple_status_type_new_with_attrs(
+ PURPLE_STATUS_UNAVAILABLE, NULL, NULL, TRUE, TRUE, FALSE,
+ "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING),
+ NULL);
+ types = g_list_append(types, type);
+
/*
* This status is necessary to display guys who are blocking *us*.
*/
@@ -1930,6 +1957,9 @@ static void ggp_login(PurpleAccount *account)
presence = purple_account_get_presence(account);
status = purple_presence_get_active_status(presence);
+ glp->encoding = GG_ENCODING_UTF8;
+ glp->protocol_features = (GG_FEATURE_STATUS80|GG_FEATURE_DND_FFC);
+
glp->async = 1;
glp->status = ggp_to_gg_status(status, &glp->status_descr);
glp->tls = 0;
@@ -2100,8 +2130,11 @@ static int ggp_send_im(PurpleConnection *gc, const char *who, const char *msg,
plain = purple_unescape_html(msg);
}
+ /*
tmp = charset_convert(plain, "UTF-8", "CP1250");
-
+ */
+ tmp = g_strdup_printf("%s", plain);
+
if (tmp && (format_length - sizeof(struct gg_msg_richtext))) {
if(gg_send_message_richtext(info->session, GG_CLASS_CHAT, ggp_str_to_uin(who), (unsigned char *)tmp, format, format_length) < 0) {
ret = -1;
@@ -2160,6 +2193,9 @@ static int ggp_to_gg_status(PurpleStatus *status, char **msg)
} else if (strcmp(status_id, "away") == 0) {
new_status = GG_STATUS_BUSY;
new_status_descr = GG_STATUS_BUSY_DESCR;
+ } else if (strcmp(status_id, "unavailable") == 0) {
+ new_status = GG_STATUS_DND;
+ new_status_descr = GG_STATUS_DND_DESCR;
} else if (strcmp(status_id, "invisible") == 0) {
new_status = GG_STATUS_INVISIBLE;
new_status_descr = GG_STATUS_INVISIBLE_DESCR;
@@ -2177,9 +2213,12 @@ static int ggp_to_gg_status(PurpleStatus *status, char **msg)
new_msg = purple_status_get_attr_string(status, "message");
if(new_msg) {
+ /*
char *tmp = purple_markup_strip_html(new_msg);
*msg = charset_convert(tmp, "UTF-8", "CP1250");
g_free(tmp);
+ */
+ *msg = purple_markup_strip_html(new_msg);
return new_status_descr;
} else {
@@ -2279,7 +2318,8 @@ static int ggp_chat_send(PurpleConnection *gc, int id, const char *message, Purp
GGPInfo *info = gc->proto_data;
GGPChat *chat = NULL;
GList *l;
- char *msg, *plain;
+ /* char *msg, *plain; */
+ gchar *msg;
uin_t *uins;
int count = 0;
@@ -2310,9 +2350,12 @@ static int ggp_chat_send(PurpleConnection *gc, int id, const char *message, Purp
uins[count++] = uin;
}
+ /*
plain = purple_unescape_html(message);
msg = charset_convert(plain, "UTF-8", "CP1250");
g_free(plain);
+ */
+ msg = purple_unescape_html(message);
gg_send_message_confer(info->session, GG_CLASS_CHAT, count, uins,
(unsigned char *)msg);
g_free(msg);
diff --git a/libpurple/protocols/gg/lib/events.c b/libpurple/protocols/gg/lib/events.c
index cac52ca67e..b382362842 100644
--- a/libpurple/protocols/gg/lib/events.c
+++ b/libpurple/protocols/gg/lib/events.c
@@ -1143,13 +1143,12 @@ static int gg_watch_fd_connected(struct gg_session *sess, struct gg_event *e)
case GG_NOTIFY_REPLY80:
{
struct gg_notify_reply80 *n = (void*) p;
- unsigned int length = h->length, i = 0;
+ int length = h->length, i = 0;
gg_debug_session(sess, GG_DEBUG_MISC, "// gg_watch_fd_connected() received a notify reply\n");
e->type = GG_EVENT_NOTIFY60;
e->event.notify60 = malloc(sizeof(*e->event.notify60));
-
if (!e->event.notify60) {
gg_debug_session(sess, GG_DEBUG_MISC, "// gg_watch_fd_connected() not enough memory for notify data\n");
goto fail;
@@ -1160,7 +1159,7 @@ static int gg_watch_fd_connected(struct gg_session *sess, struct gg_event *e)
while (length >= sizeof(struct gg_notify_reply80)) {
uint32_t descr_len;
char *tmp;
-
+
e->event.notify60[i].uin = gg_fix32(n->uin);
e->event.notify60[i].status = gg_fix32(n->status);
e->event.notify60[i].remote_ip = n->remote_ip;
@@ -1170,6 +1169,7 @@ static int gg_watch_fd_connected(struct gg_session *sess, struct gg_event *e)
e->event.notify60[i].version = 0x00; /* not-supported */
e->event.notify60[i].time = 0; /* not-supported */
+
descr_len = gg_fix32(n->descr_len);
length -= sizeof(struct gg_notify_reply80);
diff --git a/libpurple/protocols/gg/lib/libgadu.c b/libpurple/protocols/gg/lib/libgadu.c
index 3f2e2b1742..313afd23fc 100644
--- a/libpurple/protocols/gg/lib/libgadu.c
+++ b/libpurple/protocols/gg/lib/libgadu.c
@@ -29,6 +29,7 @@
*/
#include "libgadu.h"
+#include "libgadu-config.h"
#include "libgadu-internal.h"
#include <sys/types.h>
@@ -411,8 +412,7 @@ void *gg_recv_packet(struct gg_session *sess)
{
struct gg_header h;
char *buf = NULL;
- int ret = 0;
- unsigned int offset, size = 0;
+ int ret = 0, offset, size = 0;
gg_debug_session(sess, GG_DEBUG_FUNCTION, "** gg_recv_packet(%p);\n", sess);
@@ -609,7 +609,7 @@ int gg_send_packet(struct gg_session *sess, int type, ...)
h->length = gg_fix32(tmp_length - sizeof(struct gg_header));
if ((gg_debug_level & GG_DEBUG_DUMP)) {
- unsigned int i;
+ int i;
gg_debug_session(sess, GG_DEBUG_DUMP, "// gg_send_packet(0x%.2x)", gg_fix32(h->type));
for (i = 0; i < tmp_length; ++i)
diff --git a/libpurple/protocols/gg/lib/libgadu.h b/libpurple/protocols/gg/lib/libgadu.h
index 52a1ce033f..163e4f3e25 100644
--- a/libpurple/protocols/gg/lib/libgadu.h
+++ b/libpurple/protocols/gg/lib/libgadu.h
@@ -179,6 +179,7 @@ typedef enum {
GG_RESOLVER_DEFAULT = 0, /**< Domyślny sposób rozwiązywania nazw (jeden z poniższych) */
GG_RESOLVER_FORK, /**< Rozwiązywanie nazw bazujące na procesach */
GG_RESOLVER_PTHREAD, /**< Rozwiązywanie nazw bazujące na wątkach */
+ GG_RESOLVER_WIN32,
GG_RESOLVER_CUSTOM, /**< Funkcje rozwiązywania nazw dostarczone przed aplikację */
GG_RESOLVER_INVALID = -1 /**< Nieprawidłowy sposób rozwiązywania nazw (wynik \c gg_session_get_resolver) */
} gg_resolver_t;
diff --git a/libpurple/protocols/gg/lib/resolver.c b/libpurple/protocols/gg/lib/resolver.c
index ec2d3c0c3c..bf8370c330 100644
--- a/libpurple/protocols/gg/lib/resolver.c
+++ b/libpurple/protocols/gg/lib/resolver.c
@@ -215,6 +215,280 @@ struct gg_resolver_fork_data {
int pid; /*< Identyfikator procesu */
};
+
+
+#ifdef _WIN32
+/**
+ * Deal with the fact that you can't select() on a win32 file fd.
+ * This makes it practically impossible to tie into purple's event loop.
+ *
+ * -This is thanks to Tor Lillqvist.
+ * XXX - Move this to where the rest of the the win32 compatiblity stuff goes when we push the changes back to libgadu.
+ */
+static int
+socket_pipe (int *fds)
+{
+ SOCKET temp, socket1 = -1, socket2 = -1;
+ struct sockaddr_in saddr;
+ int len;
+ u_long arg;
+ fd_set read_set, write_set;
+ struct timeval tv;
+
+ temp = socket(AF_INET, SOCK_STREAM, 0);
+
+ if (temp == INVALID_SOCKET) {
+ goto out0;
+ }
+
+ arg = 1;
+ if (ioctlsocket(temp, FIONBIO, &arg) == SOCKET_ERROR) {
+ goto out0;
+ }
+
+ memset(&saddr, 0, sizeof(saddr));
+ saddr.sin_family = AF_INET;
+ saddr.sin_port = 0;
+ saddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+
+ if (bind(temp, (struct sockaddr *)&saddr, sizeof (saddr))) {
+ goto out0;
+ }
+
+ if (listen(temp, 1) == SOCKET_ERROR) {
+ goto out0;
+ }
+
+ len = sizeof(saddr);
+ if (getsockname(temp, (struct sockaddr *)&saddr, &len)) {
+ goto out0;
+ }
+
+ socket1 = socket(AF_INET, SOCK_STREAM, 0);
+
+ if (socket1 == INVALID_SOCKET) {
+ goto out0;
+ }
+
+ arg = 1;
+ if (ioctlsocket(socket1, FIONBIO, &arg) == SOCKET_ERROR) {
+ goto out1;
+ }
+
+ if (connect(socket1, (struct sockaddr *)&saddr, len) != SOCKET_ERROR ||
+ WSAGetLastError() != WSAEWOULDBLOCK) {
+ goto out1;
+ }
+
+ FD_ZERO(&read_set);
+ FD_SET(temp, &read_set);
+
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+
+ if (select(0, &read_set, NULL, NULL, NULL) == SOCKET_ERROR) {
+ goto out1;
+ }
+
+ if (!FD_ISSET(temp, &read_set)) {
+ goto out1;
+ }
+
+ socket2 = accept(temp, (struct sockaddr *) &saddr, &len);
+ if (socket2 == INVALID_SOCKET) {
+ goto out1;
+ }
+
+ FD_ZERO(&write_set);
+ FD_SET(socket1, &write_set);
+
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+
+ if (select(0, NULL, &write_set, NULL, NULL) == SOCKET_ERROR) {
+ goto out2;
+ }
+
+ if (!FD_ISSET(socket1, &write_set)) {
+ goto out2;
+ }
+
+ arg = 0;
+ if (ioctlsocket(socket1, FIONBIO, &arg) == SOCKET_ERROR) {
+ goto out2;
+ }
+
+ arg = 0;
+ if (ioctlsocket(socket2, FIONBIO, &arg) == SOCKET_ERROR) {
+ goto out2;
+ }
+
+ fds[0] = socket1;
+ fds[1] = socket2;
+
+ closesocket (temp);
+
+ return 0;
+
+out2:
+ closesocket (socket2);
+out1:
+ closesocket (socket1);
+out0:
+ closesocket (temp);
+ errno = EIO; /* XXX */
+
+ return -1;
+}
+#endif
+
+
+
+#ifdef _WIN32
+struct gg_resolve_win32thread_data {
+ char *hostname;
+ int fd;
+};
+
+static DWORD WINAPI gg_resolve_win32thread_thread(LPVOID arg)
+{
+ struct gg_resolve_win32thread_data *d = arg;
+ struct in_addr a;
+
+ gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread_thread() host: %s, fd: %i called\n", d->hostname, d->fd);
+
+ if ((a.s_addr = inet_addr(d->hostname)) == INADDR_NONE) {
+ /* W przypadku błędu gg_gethostbyname_real() zwróci -1
+ * i nie zmieni &addr. Tam jest już INADDR_NONE,
+ * więc nie musimy robić nic więcej. */
+ gg_gethostbyname_real(d->hostname, &a, 0);
+ }
+
+ // if ((a.s_addr = inet_addr(d->hostname)) == INADDR_NONE) {
+ // struct in_addr *hn;
+
+ // if (!(hn = gg_gethostbyname(d->hostname)))
+ // a.s_addr = INADDR_NONE;
+ // else {
+ // a.s_addr = hn->s_addr;
+ // free(hn);
+ // }
+ // }
+
+ write(d->fd, &a, sizeof(a));
+ close(d->fd);
+
+ free(d->hostname);
+ d->hostname = NULL;
+
+ free(d);
+
+ gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread_thread() done\n");
+
+ return 0;
+}
+
+
+static int gg_resolve_win32thread(int *fd, void **resolver, const char *hostname)
+{
+ struct gg_resolve_win32thread_data *d = NULL;
+ HANDLE h;
+ DWORD dwTId;
+ int pipes[2], new_errno;
+
+ gg_debug(GG_DEBUG_FUNCTION, "** gg_resolve_win32thread(%p, %p, \"%s\");\n", fd, resolver, hostname);
+
+ if (!resolver || !fd || !hostname) {
+ gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread() invalid arguments\n");
+ errno = EFAULT;
+ return -1;
+ }
+
+ if (socket_pipe(pipes) == -1) {
+ gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread() unable to create pipes (errno=%d, %s)\n", errno, strerror(errno));
+ return -1;
+ }
+
+ if (!(d = malloc(sizeof(*d)))) {
+ gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread() out of memory\n");
+ new_errno = errno;
+ goto cleanup;
+ }
+
+ d->hostname = NULL;
+
+ if (!(d->hostname = strdup(hostname))) {
+ gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread() out of memory\n");
+ new_errno = errno;
+ goto cleanup;
+ }
+
+ d->fd = pipes[1];
+
+ h = CreateThread(NULL, 0, gg_resolve_win32thread_thread,
+ d, 0, &dwTId);
+
+ if (h == NULL) {
+ gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread() unable to create thread\n");
+ new_errno = errno;
+ goto cleanup;
+ }
+
+ *resolver = h;
+ *fd = pipes[0];
+
+ gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread() done\n");
+
+ return 0;
+
+cleanup:
+ if (d) {
+ free(d->hostname);
+ free(d);
+ }
+
+ close(pipes[0]);
+ close(pipes[1]);
+
+ errno = new_errno;
+
+ return -1;
+
+}
+
+static void gg_resolve_win32thread_cleanup(void **priv_data, int force)
+{
+ struct gg_resolve_win32thread_data *data;
+
+ gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread_cleanup() force: %i called\n", force);
+
+ if (priv_data == NULL || *priv_data == NULL)
+ gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread_cleanup() priv_data: NULL\n");
+ return;
+
+ data = (struct gg_resolve_win32thread_data*) *priv_data;
+ gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread_cleanup() data: %s called\n", data->hostname);
+ *priv_data = NULL;
+
+ if (force) {
+ gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread_cleanup() force called\n", force);
+ //pthread_cancel(data->thread);
+ //pthread_join(data->thread, NULL);
+ }
+
+ free(data->hostname);
+ data->hostname = NULL;
+
+ if (data->fd != -1) {
+ close(data->fd);
+ data->fd = -1;
+ }
+ gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread_cleanup() done\n");
+ free(data);
+}
+#endif
+
+#ifndef _WIN32
/**
* \internal Rozwiązuje nazwę serwera w osobnym procesie.
*
@@ -328,6 +602,7 @@ void gg_resolver_fork_cleanup(void **priv_data, int force)
free(data);
}
+#endif
#ifdef GG_CONFIG_HAVE_PTHREAD
@@ -508,19 +783,31 @@ int gg_session_set_resolver(struct gg_session *gs, gg_resolver_t type)
return 0;
}
-#if !defined(GG_CONFIG_HAVE_PTHREAD) || !defined(GG_CONFIG_PTHREAD_DEFAULT)
- type = GG_RESOLVER_FORK;
+#ifdef _WIN32
+ type = GG_RESOLVER_WIN32;
#else
+ type = GG_RESOLVER_FORK;
+#endif
+
+#if defined(GG_CONFIG_HAVE_PTHREAD) || defined(GG_CONFIG_PTHREAD_DEFAULT)
type = GG_RESOLVER_PTHREAD;
#endif
}
switch (type) {
- case GG_RESOLVER_FORK:
+#ifdef _WIN32
+ case GG_RESOLVER_WIN32:
+ gs->resolver_type = type;
+ gs->resolver_start = gg_resolve_win32thread;
+ gs->resolver_cleanup = gg_resolve_win32thread_cleanup;
+ return 0;
+#else
+ case GG_RESOLVER_FORK:
gs->resolver_type = type;
gs->resolver_start = gg_resolver_fork_start;
gs->resolver_cleanup = gg_resolver_fork_cleanup;
return 0;
+#endif
#ifdef GG_CONFIG_HAVE_PTHREAD
case GG_RESOLVER_PTHREAD:
@@ -599,19 +886,31 @@ int gg_http_set_resolver(struct gg_http *gh, gg_resolver_t type)
return 0;
}
-#if !defined(GG_CONFIG_HAVE_PTHREAD) || !defined(GG_CONFIG_PTHREAD_DEFAULT)
- type = GG_RESOLVER_FORK;
+#ifdef _WIN32
+ type = GG_RESOLVER_WIN32;
#else
+ type = GG_RESOLVER_FORK;
+#endif
+
+#if defined(GG_CONFIG_HAVE_PTHREAD) || defined(GG_CONFIG_PTHREAD_DEFAULT)
type = GG_RESOLVER_PTHREAD;
#endif
}
switch (type) {
- case GG_RESOLVER_FORK:
+#ifdef _WIN32
+ case GG_RESOLVER_WIN32:
+ gh->resolver_type = type;
+ gh->resolver_start = gg_resolve_win32thread;
+ gh->resolver_cleanup = gg_resolve_win32thread_cleanup;
+ return 0;
+#else
+ case GG_RESOLVER_FORK:
gh->resolver_type = type;
gh->resolver_start = gg_resolver_fork_start;
gh->resolver_cleanup = gg_resolver_fork_cleanup;
return 0;
+#endif
#ifdef GG_CONFIG_HAVE_PTHREAD
case GG_RESOLVER_PTHREAD:
@@ -683,12 +982,22 @@ int gg_global_set_resolver(gg_resolver_t type)
gg_global_resolver_cleanup = NULL;
return 0;
+#ifndef _WIN32
case GG_RESOLVER_FORK:
gg_global_resolver_type = type;
gg_global_resolver_start = gg_resolver_fork_start;
gg_global_resolver_cleanup = gg_resolver_fork_cleanup;
return 0;
-
+#endif
+
+#ifdef _WIN32
+ case GG_RESOLVER_WIN32:
+ gg_global_resolver_type = type;
+ gg_global_resolver_start = gg_resolve_win32thread;
+ gg_global_resolver_cleanup = gg_resolve_win32thread_cleanup;
+ return 0;
+#endif
+
#ifdef GG_CONFIG_HAVE_PTHREAD
case GG_RESOLVER_PTHREAD:
gg_global_resolver_type = type;