Mercurial > pidgin
comparison src/proxy.c @ 10619:4ab7dec04c38
[gaim-migrate @ 12086]
Use g_thread based asynchronous DNS lookup on all platforms. It seems to me that configure.ac should need to be modified to specify gthread as a module on AM_PATH_GTK_2_0(), but it seems to be ok as it is.
committer: Tailor Script <tailor@pidgin.im>
author | Daniel Atallah <daniel.atallah@gmail.com> |
---|---|
date | Tue, 22 Feb 2005 05:45:45 +0000 |
parents | 351449bb5a74 |
children | 06f5cc17cddc |
comparison
equal
deleted
inserted
replaced
10618:9eb3b224face | 10619:4ab7dec04c38 |
---|---|
187 * Proxy API | 187 * Proxy API |
188 **************************************************************************/ | 188 **************************************************************************/ |
189 typedef void (*dns_callback_t)(GSList *hosts, gpointer data, | 189 typedef void (*dns_callback_t)(GSList *hosts, gpointer data, |
190 const char *error_message); | 190 const char *error_message); |
191 | 191 |
192 #ifdef __unix__ | 192 #if 0 |
193 | 193 |
194 /* This structure represents both a pending DNS request and | 194 /* This structure represents both a pending DNS request and |
195 * a free child process. | 195 * a free child process. |
196 */ | 196 */ |
197 typedef struct { | 197 typedef struct { |
632 req->inpa = gaim_input_add(req->fd_out, GAIM_INPUT_READ, host_resolved, req); | 632 req->inpa = gaim_input_add(req->fd_out, GAIM_INPUT_READ, host_resolved, req); |
633 | 633 |
634 return 0; | 634 return 0; |
635 } | 635 } |
636 | 636 |
637 #elif defined _WIN32 /* end __unix__ */ | 637 #elif defined G_THREADS_ENABLED |
638 | |
639 /* Note: The below win32 implementation is actually platform independent. | |
640 Perhaps this can be used in place of the above platform dependent code. | |
641 */ | |
642 | 638 |
643 typedef struct _dns_tdata { | 639 typedef struct _dns_tdata { |
644 char *hostname; | 640 char *hostname; |
645 int port; | 641 int port; |
646 dns_callback_t callback; | 642 dns_callback_t callback; |
660 g_free(td); | 656 g_free(td); |
661 return FALSE; | 657 return FALSE; |
662 } | 658 } |
663 | 659 |
664 static gpointer dns_thread(gpointer data) { | 660 static gpointer dns_thread(gpointer data) { |
661 | |
662 #if HAVE_GETADDRINFO | |
663 int rc; | |
664 struct addrinfo hints, *res, *tmp; | |
665 char servname[20]; | |
666 #else | |
665 struct sockaddr_in sin; | 667 struct sockaddr_in sin; |
668 struct hostent *hp; | |
669 #endif | |
666 dns_tdata *td = (dns_tdata*)data; | 670 dns_tdata *td = (dns_tdata*)data; |
667 struct hostent *hp; | 671 |
668 | 672 #if HAVE_GETADDRINFO |
673 g_snprintf(servname, sizeof(servname), "%d", td->port); | |
674 memset(&hints,0,sizeof(hints)); | |
675 | |
676 /* This is only used to convert a service | |
677 * name to a port number. As we know we are | |
678 * passing a number already, we know this | |
679 * value will not be really used by the C | |
680 * library. | |
681 */ | |
682 hints.ai_socktype = SOCK_STREAM; | |
683 if ((rc = getaddrinfo(td->hostname, servname, &hints, &res)) == 0) { | |
684 tmp = res; | |
685 while(res) { | |
686 td->hosts = g_slist_append(td->hosts, | |
687 GSIZE_TO_POINTER(res->ai_addrlen)); | |
688 td->hosts = g_slist_append(td->hosts, | |
689 g_memdup(res->ai_addr, res->ai_addrlen)); | |
690 res = res->ai_next; | |
691 } | |
692 freeaddrinfo(tmp); | |
693 } else { | |
694 td->errmsg = g_strdup_printf("DNS getaddrinfo(\"%s\", \"%s\") error: %d", td->hostname, servname, rc); | |
695 } | |
696 #else | |
669 if ((hp = gethostbyname(td->hostname))) { | 697 if ((hp = gethostbyname(td->hostname))) { |
670 memset(&sin, 0, sizeof(struct sockaddr_in)); | 698 memset(&sin, 0, sizeof(struct sockaddr_in)); |
671 memcpy(&sin.sin_addr.s_addr, hp->h_addr, hp->h_length); | 699 memcpy(&sin.sin_addr.s_addr, hp->h_addr, hp->h_length); |
672 sin.sin_family = hp->h_addrtype; | 700 sin.sin_family = hp->h_addrtype; |
673 sin.sin_port = htons(td->port); | 701 sin.sin_port = htons(td->port); |
674 | 702 |
675 td->hosts = g_slist_append(td->hosts, | 703 td->hosts = g_slist_append(td->hosts, |
676 GINT_TO_POINTER(sizeof(sin))); | 704 GSIZE_TO_POINTER(sizeof(sin))); |
677 td->hosts = g_slist_append(td->hosts, | 705 td->hosts = g_slist_append(td->hosts, |
678 g_memdup(&sin, sizeof(sin))); | 706 g_memdup(&sin, sizeof(sin))); |
679 } else { | 707 } else { |
680 td->errmsg = g_strdup_printf("DNS error: %d", errno); | 708 td->errmsg = g_strdup_printf("DNS gethostbyname(\"%s\") error: %d", td->hostname, h_errno); |
681 } | 709 } |
710 #endif | |
682 /* back to main thread */ | 711 /* back to main thread */ |
683 g_idle_add(dns_main_thread_cb, td); | 712 g_idle_add(dns_main_thread_cb, td); |
684 return 0; | 713 return 0; |
685 } | 714 } |
686 | 715 |
715 return -1; | 744 return -1; |
716 } | 745 } |
717 return 0; | 746 return 0; |
718 } | 747 } |
719 | 748 |
720 #else /* not __unix__ or _WIN32 */ | 749 #else /* not G_THREADS_ENABLED */ |
721 | 750 |
722 typedef struct { | 751 typedef struct { |
723 gpointer data; | 752 gpointer data; |
724 size_t addrlen; | 753 size_t addrlen; |
725 struct sockaddr *addr; | 754 struct sockaddr *addr; |
1889 proxy_pref_cb, NULL); | 1918 proxy_pref_cb, NULL); |
1890 gaim_prefs_connect_callback(handle, "/core/proxy/username", | 1919 gaim_prefs_connect_callback(handle, "/core/proxy/username", |
1891 proxy_pref_cb, NULL); | 1920 proxy_pref_cb, NULL); |
1892 gaim_prefs_connect_callback(handle, "/core/proxy/password", | 1921 gaim_prefs_connect_callback(handle, "/core/proxy/password", |
1893 proxy_pref_cb, NULL); | 1922 proxy_pref_cb, NULL); |
1894 #ifdef _WIN32 | |
1895 if(!g_thread_supported()) | 1923 if(!g_thread_supported()) |
1896 g_thread_init(NULL); | 1924 g_thread_init(NULL); |
1897 #endif | |
1898 } | 1925 } |
1899 | 1926 |
1900 void * | 1927 void * |
1901 gaim_proxy_get_handle() | 1928 gaim_proxy_get_handle() |
1902 { | 1929 { |