Mercurial > pidgin
comparison src/proxy.c @ 10309:19974fd2d61d
[gaim-migrate @ 11501]
I prefer these functions like nobody's business.
committer: Tailor Script <tailor@pidgin.im>
| author | Mark Doliner <mark@kingant.net> |
|---|---|
| date | Fri, 03 Dec 2004 03:07:47 +0000 |
| parents | 2ac21bf20e04 |
| children | 61852117568f |
comparison
equal
deleted
inserted
replaced
| 10308:52c2303f60dc | 10309:19974fd2d61d |
|---|---|
| 239 char ch; | 239 char ch; |
| 240 int rc; | 240 int rc; |
| 241 | 241 |
| 242 /* Are you alive? */ | 242 /* Are you alive? */ |
| 243 if(kill(req->dns_pid, 0) != 0) { | 243 if(kill(req->dns_pid, 0) != 0) { |
| 244 gaim_debug(GAIM_DEBUG_WARNING, "dns", | 244 gaim_debug_warning("dns", |
| 245 "DNS child %d no longer exists\n", req->dns_pid); | 245 "DNS child %d no longer exists\n", req->dns_pid); |
| 246 return -1; | 246 return -1; |
| 247 } | 247 } |
| 248 | 248 |
| 249 /* Let's contact this lost child! */ | 249 /* Let's contact this lost child! */ |
| 250 rc = write(req->fd_in, dns_params, sizeof(*dns_params)); | 250 rc = write(req->fd_in, dns_params, sizeof(*dns_params)); |
| 251 if(rc<0) { | 251 if(rc<0) { |
| 252 gaim_debug(GAIM_DEBUG_ERROR, "dns", | 252 gaim_debug_error("dns", |
| 253 "Unable to write to DNS child %d: %d\n", | 253 "Unable to write to DNS child %d: %d\n", |
| 254 req->dns_pid, strerror(errno)); | 254 req->dns_pid, strerror(errno)); |
| 255 close(req->fd_in); | 255 close(req->fd_in); |
| 256 return -1; | 256 return -1; |
| 257 } | 257 } |
| 259 g_return_val_if_fail(rc == sizeof(*dns_params), -1); | 259 g_return_val_if_fail(rc == sizeof(*dns_params), -1); |
| 260 | 260 |
| 261 /* Did you hear me? (This avoids some race conditions) */ | 261 /* Did you hear me? (This avoids some race conditions) */ |
| 262 rc = read(req->fd_out, &ch, 1); | 262 rc = read(req->fd_out, &ch, 1); |
| 263 if(rc != 1 || ch!='Y') { | 263 if(rc != 1 || ch!='Y') { |
| 264 gaim_debug(GAIM_DEBUG_WARNING, "dns", | 264 gaim_debug_warning("dns", |
| 265 "DNS child %d not responding. Killing it!\n", | 265 "DNS child %d not responding. Killing it!\n", |
| 266 req->dns_pid); | 266 req->dns_pid); |
| 267 kill(req->dns_pid, SIGKILL); | 267 kill(req->dns_pid, SIGKILL); |
| 268 return -1; | 268 return -1; |
| 269 } | 269 } |
| 270 | 270 |
| 271 gaim_debug(GAIM_DEBUG_INFO, "dns", | 271 gaim_debug_info("dns", |
| 272 "Successfully sent DNS request to child %d\n", req->dns_pid); | 272 "Successfully sent DNS request to child %d\n", req->dns_pid); |
| 273 return 0; | 273 return 0; |
| 274 } | 274 } |
| 275 | 275 |
| 276 static void host_resolved(gpointer data, gint source, GaimInputCondition cond); | 276 static void host_resolved(gpointer data, gint source, GaimInputCondition cond); |
| 285 req->host = g_strdup(r->params.hostname); | 285 req->host = g_strdup(r->params.hostname); |
| 286 req->port = r->params.port; | 286 req->port = r->params.port; |
| 287 req->callback = r->callback; | 287 req->callback = r->callback; |
| 288 req->data = r->data; | 288 req->data = r->data; |
| 289 | 289 |
| 290 gaim_debug(GAIM_DEBUG_INFO, "dns", | 290 gaim_debug_info("dns", |
| 291 "Processing queued DNS query for '%s' with child %d\n", | 291 "Processing queued DNS query for '%s' with child %d\n", |
| 292 req->host, req->dns_pid); | 292 req->host, req->dns_pid); |
| 293 | 293 |
| 294 if(send_dns_request_to_child(req, &(r->params)) != 0) { | 294 if(send_dns_request_to_child(req, &(r->params)) != 0) { |
| 295 req_free(req); | 295 req_free(req); |
| 296 req = NULL; | 296 req = NULL; |
| 297 | 297 |
| 298 gaim_debug(GAIM_DEBUG_WARNING, "dns", | 298 gaim_debug_warning("dns", |
| 299 "Intent of process queued query of '%s' failed, " | 299 "Intent of process queued query of '%s' failed, " |
| 300 "requeueing...\n", r->params.hostname); | 300 "requeueing...\n", r->params.hostname); |
| 301 g_queue_push_head(queued_requests, r); | 301 g_queue_push_head(queued_requests, r); |
| 302 } else { | 302 } else { |
| 303 req->inpa = gaim_input_add(req->fd_out, GAIM_INPUT_READ, host_resolved, req); | 303 req->inpa = gaim_input_add(req->fd_out, GAIM_INPUT_READ, host_resolved, req); |
| 318 int rc, err; | 318 int rc, err; |
| 319 GSList *hosts = NULL; | 319 GSList *hosts = NULL; |
| 320 struct sockaddr *addr = NULL; | 320 struct sockaddr *addr = NULL; |
| 321 size_t addrlen; | 321 size_t addrlen; |
| 322 | 322 |
| 323 gaim_debug(GAIM_DEBUG_INFO, "dns", "Host '%s' resolved\n", req->host); | 323 gaim_debug_info("dns", "Host '%s' resolved\n", req->host); |
| 324 gaim_input_remove(req->inpa); | 324 gaim_input_remove(req->inpa); |
| 325 | 325 |
| 326 rc=read(req->fd_out, &err, sizeof(err)); | 326 rc=read(req->fd_out, &err, sizeof(err)); |
| 327 if((rc==4) && (err!=0)) { | 327 if((rc==4) && (err!=0)) { |
| 328 char message[1024]; | 328 char message[1024]; |
| 331 gai_strerror(err), req->dns_pid); | 331 gai_strerror(err), req->dns_pid); |
| 332 #else | 332 #else |
| 333 g_snprintf(message, sizeof(message), "DNS error: %d (pid=%d)", | 333 g_snprintf(message, sizeof(message), "DNS error: %d (pid=%d)", |
| 334 err, req->dns_pid); | 334 err, req->dns_pid); |
| 335 #endif | 335 #endif |
| 336 gaim_debug(GAIM_DEBUG_ERROR, "dns", "%s\n", message); | 336 gaim_debug_error("dns", "%s\n", message); |
| 337 req->callback(NULL, req->data, message); | 337 req->callback(NULL, req->data, message); |
| 338 release_dns_child(req); | 338 release_dns_child(req); |
| 339 return; | 339 return; |
| 340 } | 340 } |
| 341 if(rc>0) { | 341 if(rc>0) { |
| 351 } | 351 } |
| 352 } | 352 } |
| 353 } else if(rc==-1) { | 353 } else if(rc==-1) { |
| 354 char message[1024]; | 354 char message[1024]; |
| 355 g_snprintf(message, sizeof(message), "Error reading from DNS child: %s",strerror(errno)); | 355 g_snprintf(message, sizeof(message), "Error reading from DNS child: %s",strerror(errno)); |
| 356 gaim_debug(GAIM_DEBUG_ERROR, "dns", "%s\n", message); | 356 gaim_debug_error("dns", "%s\n", message); |
| 357 req->callback(NULL, req->data, message); | 357 req->callback(NULL, req->data, message); |
| 358 req_free(req); | 358 req_free(req); |
| 359 return; | 359 return; |
| 360 } else if(rc==0) { | 360 } else if(rc==0) { |
| 361 char message[1024]; | 361 char message[1024]; |
| 362 g_snprintf(message, sizeof(message), "EOF reading from DNS child"); | 362 g_snprintf(message, sizeof(message), "EOF reading from DNS child"); |
| 363 close(req->fd_out); | 363 close(req->fd_out); |
| 364 gaim_debug(GAIM_DEBUG_ERROR, "dns", "%s\n", message); | 364 gaim_debug_error("dns", "%s\n", message); |
| 365 req->callback(NULL, req->data, message); | 365 req->callback(NULL, req->data, message); |
| 366 req_free(req); | 366 req_free(req); |
| 367 return; | 367 return; |
| 368 } | 368 } |
| 369 | 369 |
| 408 return; | 408 return; |
| 409 | 409 |
| 410 e[MIN(n,sizeof(e)-1)] = '\0'; | 410 e[MIN(n,sizeof(e)-1)] = '\0'; |
| 411 | 411 |
| 412 if(strstr(e,"gdb")) { | 412 if(strstr(e,"gdb")) { |
| 413 gaim_debug(GAIM_DEBUG_INFO, "dns", | 413 gaim_debug_info("dns", |
| 414 "Debugger detected, performing useless query...\n"); | 414 "Debugger detected, performing useless query...\n"); |
| 415 gethostbyname("x.x.x.x.x"); | 415 gethostbyname("x.x.x.x.x"); |
| 416 } | 416 } |
| 417 #endif | 417 #endif |
| 418 } | 418 } |
| 575 r->data = data; | 575 r->data = data; |
| 576 if (!queued_requests) | 576 if (!queued_requests) |
| 577 queued_requests = g_queue_new(); | 577 queued_requests = g_queue_new(); |
| 578 g_queue_push_tail(queued_requests, r); | 578 g_queue_push_tail(queued_requests, r); |
| 579 | 579 |
| 580 gaim_debug(GAIM_DEBUG_INFO, "dns", | 580 gaim_debug_info("dns", |
| 581 "DNS query for '%s' queued\n", dns_params.hostname); | 581 "DNS query for '%s' queued\n", dns_params.hostname); |
| 582 | 582 |
| 583 return 0; | 583 return 0; |
| 584 } | 584 } |
| 585 | 585 |
| 586 /* Create pipes for communicating with the child process */ | 586 /* Create pipes for communicating with the child process */ |
| 587 if (pipe(child_out) || pipe(child_in)) { | 587 if (pipe(child_out) || pipe(child_in)) { |
| 588 gaim_debug(GAIM_DEBUG_ERROR, "dns", | 588 gaim_debug_error("dns", |
| 589 "Could not create pipes: %s\n", strerror(errno)); | 589 "Could not create pipes: %s\n", strerror(errno)); |
| 590 return -1; | 590 return -1; |
| 591 } | 591 } |
| 592 | 592 |
| 593 req = g_new(pending_dns_request_t, 1); | 593 req = g_new(pending_dns_request_t, 1); |
| 609 | 609 |
| 610 /* We should not access the child's side of the pipe, so close them... */ | 610 /* We should not access the child's side of the pipe, so close them... */ |
| 611 close(child_out[1]); | 611 close(child_out[1]); |
| 612 close(child_in[0]); | 612 close(child_in[0]); |
| 613 if (req->dns_pid == -1) { | 613 if (req->dns_pid == -1) { |
| 614 gaim_debug(GAIM_DEBUG_ERROR, "dns", | 614 gaim_debug_error("dns", |
| 615 "Could not create child process for DNS: %s\n", | 615 "Could not create child process for DNS: %s\n", |
| 616 strerror(errno)); | 616 strerror(errno)); |
| 617 g_free(req); | 617 g_free(req); |
| 618 return -1; | 618 return -1; |
| 619 } | 619 } |
| 620 | 620 |
| 621 req->fd_out = child_out[0]; | 621 req->fd_out = child_out[0]; |
| 622 req->fd_in = child_in[1]; | 622 req->fd_in = child_in[1]; |
| 623 number_of_dns_children++; | 623 number_of_dns_children++; |
| 624 gaim_debug(GAIM_DEBUG_INFO, "dns", | 624 gaim_debug_info("dns", |
| 625 "Created new DNS child %d, there are now %d children.\n", | 625 "Created new DNS child %d, there are now %d children.\n", |
| 626 req->dns_pid, number_of_dns_children); | 626 req->dns_pid, number_of_dns_children); |
| 627 } | 627 } |
| 628 | 628 |
| 629 req->host = g_strdup(hostname); | 629 req->host = g_strdup(hostname); |
| 742 pending_dns_request_t *req; | 742 pending_dns_request_t *req; |
| 743 | 743 |
| 744 if (!inet_aton(hostname, &sin.sin_addr)) { | 744 if (!inet_aton(hostname, &sin.sin_addr)) { |
| 745 struct hostent *hp; | 745 struct hostent *hp; |
| 746 if(!(hp = gethostbyname(hostname))) { | 746 if(!(hp = gethostbyname(hostname))) { |
| 747 gaim_debug(GAIM_DEBUG_ERROR, "dns", | 747 gaim_debug_error("dns", |
| 748 "gaim_gethostbyname(\"%s\", %d) failed: %d\n", | 748 "gaim_gethostbyname(\"%s\", %d) failed: %d\n", |
| 749 hostname, port, h_errno); | 749 hostname, port, h_errno); |
| 750 return -1; | 750 return -1; |
| 751 } | 751 } |
| 752 memset(&sin, 0, sizeof(struct sockaddr_in)); | 752 memset(&sin, 0, sizeof(struct sockaddr_in)); |
| 772 { | 772 { |
| 773 struct PHB *phb = data; | 773 struct PHB *phb = data; |
| 774 unsigned int len; | 774 unsigned int len; |
| 775 int error=0, ret; | 775 int error=0, ret; |
| 776 | 776 |
| 777 gaim_debug(GAIM_DEBUG_INFO, "proxy", "Connected.\n"); | 777 gaim_debug_info("proxy", "Connected.\n"); |
| 778 | 778 |
| 779 len = sizeof(error); | 779 len = sizeof(error); |
| 780 | 780 |
| 781 /* | 781 /* |
| 782 * getsockopt after a non-blocking connect returns -1 if something is | 782 * getsockopt after a non-blocking connect returns -1 if something is |
| 795 if (ret < 0 || error != 0) { | 795 if (ret < 0 || error != 0) { |
| 796 if(ret!=0) error = errno; | 796 if(ret!=0) error = errno; |
| 797 close(source); | 797 close(source); |
| 798 gaim_input_remove(phb->inpa); | 798 gaim_input_remove(phb->inpa); |
| 799 | 799 |
| 800 gaim_debug(GAIM_DEBUG_ERROR, "proxy", | 800 gaim_debug_error("proxy", |
| 801 "getsockopt SO_ERROR check: %s\n", strerror(error)); | 801 "getsockopt SO_ERROR check: %s\n", strerror(error)); |
| 802 | 802 |
| 803 try_connect(phb); | 803 try_connect(phb); |
| 804 return; | 804 return; |
| 805 } | 805 } |
| 837 static int | 837 static int |
| 838 proxy_connect_none(struct PHB *phb, struct sockaddr *addr, socklen_t addrlen) | 838 proxy_connect_none(struct PHB *phb, struct sockaddr *addr, socklen_t addrlen) |
| 839 { | 839 { |
| 840 int fd = -1; | 840 int fd = -1; |
| 841 | 841 |
| 842 gaim_debug(GAIM_DEBUG_INFO, "proxy", | 842 gaim_debug_info("proxy", |
| 843 "Connecting to %s:%d with no proxy\n", phb->host, phb->port); | 843 "Connecting to %s:%d with no proxy\n", phb->host, phb->port); |
| 844 | 844 |
| 845 if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) { | 845 if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) { |
| 846 gaim_debug(GAIM_DEBUG_ERROR, "proxy", | 846 gaim_debug_error("proxy", |
| 847 "Unable to create socket: %s\n", strerror(errno)); | 847 "Unable to create socket: %s\n", strerror(errno)); |
| 848 return -1; | 848 return -1; |
| 849 } | 849 } |
| 850 fcntl(fd, F_SETFL, O_NONBLOCK); | 850 fcntl(fd, F_SETFL, O_NONBLOCK); |
| 851 #ifndef _WIN32 | 851 #ifndef _WIN32 |
| 852 fcntl(fd, F_SETFD, FD_CLOEXEC); | 852 fcntl(fd, F_SETFD, FD_CLOEXEC); |
| 853 #endif | 853 #endif |
| 854 | 854 |
| 855 if (connect(fd, (struct sockaddr *)addr, addrlen) < 0) { | 855 if (connect(fd, (struct sockaddr *)addr, addrlen) < 0) { |
| 856 if ((errno == EINPROGRESS) || (errno == EINTR)) { | 856 if ((errno == EINPROGRESS) || (errno == EINTR)) { |
| 857 gaim_debug(GAIM_DEBUG_WARNING, "proxy", | 857 gaim_debug_warning("proxy", |
| 858 "Connect would have blocked.\n"); | 858 "Connect would have blocked.\n"); |
| 859 phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, no_one_calls, phb); | 859 phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, no_one_calls, phb); |
| 860 } | 860 } |
| 861 else { | 861 else { |
| 862 gaim_debug(GAIM_DEBUG_ERROR, "proxy", | 862 gaim_debug_error("proxy", |
| 863 "Connect failed: %s\n", strerror(errno)); | 863 "Connect failed: %s\n", strerror(errno)); |
| 864 close(fd); | 864 close(fd); |
| 865 return -1; | 865 return -1; |
| 866 } | 866 } |
| 867 } | 867 } |
| 868 else { | 868 else { |
| 869 unsigned int len; | 869 unsigned int len; |
| 870 int error = ETIMEDOUT; | 870 int error = ETIMEDOUT; |
| 871 gaim_debug(GAIM_DEBUG_MISC, "proxy", "Connect didn't block.\n"); | 871 gaim_debug_misc("proxy", "Connect didn't block.\n"); |
| 872 len = sizeof(error); | 872 len = sizeof(error); |
| 873 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { | 873 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { |
| 874 gaim_debug(GAIM_DEBUG_ERROR, "proxy", "getsockopt failed.\n"); | 874 gaim_debug_error("proxy", "getsockopt failed.\n"); |
| 875 close(fd); | 875 close(fd); |
| 876 return -1; | 876 return -1; |
| 877 } | 877 } |
| 878 fcntl(fd, F_SETFL, 0); | 878 fcntl(fd, F_SETFL, 0); |
| 879 phb->port = fd; /* bleh */ | 879 phb->port = fd; /* bleh */ |
| 889 #define HTTP_GOODSTRING2 "HTTP/1.1 200" | 889 #define HTTP_GOODSTRING2 "HTTP/1.1 200" |
| 890 | 890 |
| 891 static void | 891 static void |
| 892 http_complete(struct PHB *phb, gint source) | 892 http_complete(struct PHB *phb, gint source) |
| 893 { | 893 { |
| 894 gaim_debug(GAIM_DEBUG_INFO, "http proxy", "proxy connection established\n"); | 894 gaim_debug_info("http proxy", "proxy connection established\n"); |
| 895 if(source < 0) { | 895 if(source < 0) { |
| 896 try_connect(phb); | 896 try_connect(phb); |
| 897 } else if(!phb->account || phb->account->gc) { | 897 } else if(!phb->account || phb->account->gc) { |
| 898 phb->func(phb->data, source, GAIM_INPUT_READ); | 898 phb->func(phb->data, source, GAIM_INPUT_READ); |
| 899 g_free(phb->host); | 899 g_free(phb->host); |
| 938 } | 938 } |
| 939 } | 939 } |
| 940 } | 940 } |
| 941 | 941 |
| 942 if(error) { | 942 if(error) { |
| 943 gaim_debug(GAIM_DEBUG_ERROR, "proxy", | 943 gaim_debug_error("proxy", |
| 944 "Unable to parse proxy's response: %s\n", inputline); | 944 "Unable to parse proxy's response: %s\n", inputline); |
| 945 close(source); | 945 close(source); |
| 946 source=-1; | 946 source=-1; |
| 947 } | 947 } |
| 948 else if(status!=200) { | 948 else if(status!=200) { |
| 949 gaim_debug(GAIM_DEBUG_ERROR, "proxy", | 949 gaim_debug_error("proxy", |
| 950 "Proxy server replied with:\n%s\n", p); | 950 "Proxy server replied with:\n%s\n", p); |
| 951 close(source); | 951 close(source); |
| 952 source = -1; | 952 source = -1; |
| 953 | 953 |
| 954 /* XXX: why in the hell are we calling gaim_connection_error() here? */ | 954 /* XXX: why in the hell are we calling gaim_connection_error() here? */ |
| 976 int request_len = 0; | 976 int request_len = 0; |
| 977 struct PHB *phb = data; | 977 struct PHB *phb = data; |
| 978 unsigned int len; | 978 unsigned int len; |
| 979 int error = ETIMEDOUT; | 979 int error = ETIMEDOUT; |
| 980 | 980 |
| 981 gaim_debug(GAIM_DEBUG_INFO, "http proxy", "Connected.\n"); | 981 gaim_debug_info("http proxy", "Connected.\n"); |
| 982 | 982 |
| 983 if (phb->inpa > 0) | 983 if (phb->inpa > 0) |
| 984 gaim_input_remove(phb->inpa); | 984 gaim_input_remove(phb->inpa); |
| 985 | 985 |
| 986 len = sizeof(error); | 986 len = sizeof(error); |
| 990 | 990 |
| 991 try_connect(phb); | 991 try_connect(phb); |
| 992 return; | 992 return; |
| 993 } | 993 } |
| 994 | 994 |
| 995 gaim_debug(GAIM_DEBUG_INFO, "proxy", "using CONNECT tunnelling for %s:%d\n", phb->host, phb->port); | 995 gaim_debug_info("proxy", "using CONNECT tunnelling for %s:%d\n", phb->host, phb->port); |
| 996 request_len = g_snprintf(request, sizeof(request), | 996 request_len = g_snprintf(request, sizeof(request), |
| 997 "CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n", | 997 "CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n", |
| 998 phb->host, phb->port, phb->host, phb->port); | 998 phb->host, phb->port, phb->host, phb->port); |
| 999 | 999 |
| 1000 if (gaim_proxy_info_get_username(phb->gpi) != NULL) { | 1000 if (gaim_proxy_info_get_username(phb->gpi) != NULL) { |
| 1030 static int | 1030 static int |
| 1031 proxy_connect_http(struct PHB *phb, struct sockaddr *addr, socklen_t addrlen) | 1031 proxy_connect_http(struct PHB *phb, struct sockaddr *addr, socklen_t addrlen) |
| 1032 { | 1032 { |
| 1033 int fd = -1; | 1033 int fd = -1; |
| 1034 | 1034 |
| 1035 gaim_debug(GAIM_DEBUG_INFO, "http proxy", | 1035 gaim_debug_info("http proxy", |
| 1036 "Connecting to %s:%d via %s:%d using HTTP\n", | 1036 "Connecting to %s:%d via %s:%d using HTTP\n", |
| 1037 phb->host, phb->port, | 1037 phb->host, phb->port, |
| 1038 gaim_proxy_info_get_host(phb->gpi), | 1038 gaim_proxy_info_get_host(phb->gpi), |
| 1039 gaim_proxy_info_get_port(phb->gpi)); | 1039 gaim_proxy_info_get_port(phb->gpi)); |
| 1040 | 1040 |
| 1047 fcntl(fd, F_SETFD, FD_CLOEXEC); | 1047 fcntl(fd, F_SETFD, FD_CLOEXEC); |
| 1048 #endif | 1048 #endif |
| 1049 | 1049 |
| 1050 if (connect(fd, addr, addrlen) < 0) { | 1050 if (connect(fd, addr, addrlen) < 0) { |
| 1051 if ((errno == EINPROGRESS) || (errno == EINTR)) { | 1051 if ((errno == EINPROGRESS) || (errno == EINTR)) { |
| 1052 gaim_debug(GAIM_DEBUG_WARNING, "http proxy", | 1052 gaim_debug_warning("http proxy", |
| 1053 "Connect would have blocked.\n"); | 1053 "Connect would have blocked.\n"); |
| 1054 | 1054 |
| 1055 if (phb->port != 80) { | 1055 if (phb->port != 80) { |
| 1056 /* we need to do CONNECT first */ | 1056 /* we need to do CONNECT first */ |
| 1057 phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, | 1057 phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, |
| 1066 } | 1066 } |
| 1067 else { | 1067 else { |
| 1068 unsigned int len; | 1068 unsigned int len; |
| 1069 int error = ETIMEDOUT; | 1069 int error = ETIMEDOUT; |
| 1070 | 1070 |
| 1071 gaim_debug(GAIM_DEBUG_MISC, "http proxy", | 1071 gaim_debug_misc("http proxy", |
| 1072 "Connect didn't block.\n"); | 1072 "Connect didn't block.\n"); |
| 1073 | 1073 |
| 1074 len = sizeof(error); | 1074 len = sizeof(error); |
| 1075 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { | 1075 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { |
| 1076 close(fd); | 1076 close(fd); |
| 1117 struct hostent *hp; | 1117 struct hostent *hp; |
| 1118 struct PHB *phb = data; | 1118 struct PHB *phb = data; |
| 1119 unsigned int len; | 1119 unsigned int len; |
| 1120 int error = ETIMEDOUT; | 1120 int error = ETIMEDOUT; |
| 1121 | 1121 |
| 1122 gaim_debug(GAIM_DEBUG_INFO, "s4 proxy", "Connected.\n"); | 1122 gaim_debug_info("s4 proxy", "Connected.\n"); |
| 1123 | 1123 |
| 1124 if (phb->inpa > 0) | 1124 if (phb->inpa > 0) |
| 1125 gaim_input_remove(phb->inpa); | 1125 gaim_input_remove(phb->inpa); |
| 1126 | 1126 |
| 1127 len = sizeof(error); | 1127 len = sizeof(error); |
| 1165 static int | 1165 static int |
| 1166 proxy_connect_socks4(struct PHB *phb, struct sockaddr *addr, socklen_t addrlen) | 1166 proxy_connect_socks4(struct PHB *phb, struct sockaddr *addr, socklen_t addrlen) |
| 1167 { | 1167 { |
| 1168 int fd = -1; | 1168 int fd = -1; |
| 1169 | 1169 |
| 1170 gaim_debug(GAIM_DEBUG_INFO, "socks4 proxy", | 1170 gaim_debug_info("socks4 proxy", |
| 1171 "Connecting to %s:%d via %s:%d using SOCKS4\n", | 1171 "Connecting to %s:%d via %s:%d using SOCKS4\n", |
| 1172 phb->host, phb->port, | 1172 phb->host, phb->port, |
| 1173 gaim_proxy_info_get_host(phb->gpi), | 1173 gaim_proxy_info_get_host(phb->gpi), |
| 1174 gaim_proxy_info_get_port(phb->gpi)); | 1174 gaim_proxy_info_get_port(phb->gpi)); |
| 1175 | 1175 |
| 1181 fcntl(fd, F_SETFD, FD_CLOEXEC); | 1181 fcntl(fd, F_SETFD, FD_CLOEXEC); |
| 1182 #endif | 1182 #endif |
| 1183 | 1183 |
| 1184 if (connect(fd, addr, addrlen) < 0) { | 1184 if (connect(fd, addr, addrlen) < 0) { |
| 1185 if ((errno == EINPROGRESS) || (errno == EINTR)) { | 1185 if ((errno == EINPROGRESS) || (errno == EINTR)) { |
| 1186 gaim_debug(GAIM_DEBUG_WARNING, "socks4 proxy", | 1186 gaim_debug_warning("socks4 proxy", |
| 1187 "Connect would have blocked.\n"); | 1187 "Connect would have blocked.\n"); |
| 1188 phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, s4_canwrite, phb); | 1188 phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, s4_canwrite, phb); |
| 1189 } | 1189 } |
| 1190 else { | 1190 else { |
| 1191 close(fd); | 1191 close(fd); |
| 1193 } | 1193 } |
| 1194 } else { | 1194 } else { |
| 1195 unsigned int len; | 1195 unsigned int len; |
| 1196 int error = ETIMEDOUT; | 1196 int error = ETIMEDOUT; |
| 1197 | 1197 |
| 1198 gaim_debug(GAIM_DEBUG_MISC, "socks4 proxy", | 1198 gaim_debug_misc("socks4 proxy", |
| 1199 "Connect didn't block.\n"); | 1199 "Connect didn't block.\n"); |
| 1200 | 1200 |
| 1201 len = sizeof(error); | 1201 len = sizeof(error); |
| 1202 | 1202 |
| 1203 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { | 1203 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { |
| 1217 { | 1217 { |
| 1218 unsigned char buf[512]; | 1218 unsigned char buf[512]; |
| 1219 struct PHB *phb = data; | 1219 struct PHB *phb = data; |
| 1220 | 1220 |
| 1221 gaim_input_remove(phb->inpa); | 1221 gaim_input_remove(phb->inpa); |
| 1222 gaim_debug(GAIM_DEBUG_INFO, "socks5 proxy", "Able to read again.\n"); | 1222 gaim_debug_info("socks5 proxy", "Able to read again.\n"); |
| 1223 | 1223 |
| 1224 if (read(source, buf, 4) < 4) { | 1224 if (read(source, buf, 4) < 4) { |
| 1225 gaim_debug(GAIM_DEBUG_WARNING, "socks5 proxy", "or not...\n"); | 1225 gaim_debug_warning("socks5 proxy", "or not...\n"); |
| 1226 close(source); | 1226 close(source); |
| 1227 | 1227 |
| 1228 try_connect(phb); | 1228 try_connect(phb); |
| 1229 return; | 1229 return; |
| 1230 } | 1230 } |
| 1231 if ((buf[0] != 0x05) || (buf[1] != 0x00)) { | 1231 if ((buf[0] != 0x05) || (buf[1] != 0x00)) { |
| 1232 if ((buf[0] == 0x05) && (buf[1] < 0x09)) | 1232 if ((buf[0] == 0x05) && (buf[1] < 0x09)) |
| 1233 gaim_debug(GAIM_DEBUG_ERROR, "socks5 proxy", socks5errors[buf[1]]); | 1233 gaim_debug_error("socks5 proxy", socks5errors[buf[1]]); |
| 1234 else | 1234 else |
| 1235 gaim_debug(GAIM_DEBUG_ERROR, "socks5 proxy", "Bad data.\n"); | 1235 gaim_debug_error("socks5 proxy", "Bad data.\n"); |
| 1236 close(source); | 1236 close(source); |
| 1237 | 1237 |
| 1238 try_connect(phb); | 1238 try_connect(phb); |
| 1239 return; | 1239 return; |
| 1240 } | 1240 } |
| 1299 { | 1299 { |
| 1300 unsigned char buf[512]; | 1300 unsigned char buf[512]; |
| 1301 struct PHB *phb = data; | 1301 struct PHB *phb = data; |
| 1302 | 1302 |
| 1303 gaim_input_remove(phb->inpa); | 1303 gaim_input_remove(phb->inpa); |
| 1304 gaim_debug(GAIM_DEBUG_INFO, "socks5 proxy", "Got auth response.\n"); | 1304 gaim_debug_info("socks5 proxy", "Got auth response.\n"); |
| 1305 | 1305 |
| 1306 if (read(source, buf, 2) < 2) { | 1306 if (read(source, buf, 2) < 2) { |
| 1307 close(source); | 1307 close(source); |
| 1308 | 1308 |
| 1309 try_connect(phb); | 1309 try_connect(phb); |
| 1325 { | 1325 { |
| 1326 unsigned char buf[512]; | 1326 unsigned char buf[512]; |
| 1327 struct PHB *phb = data; | 1327 struct PHB *phb = data; |
| 1328 | 1328 |
| 1329 gaim_input_remove(phb->inpa); | 1329 gaim_input_remove(phb->inpa); |
| 1330 gaim_debug(GAIM_DEBUG_INFO, "socks5 proxy", "Able to read.\n"); | 1330 gaim_debug_info("socks5 proxy", "Able to read.\n"); |
| 1331 | 1331 |
| 1332 if (read(source, buf, 2) < 2) { | 1332 if (read(source, buf, 2) < 2) { |
| 1333 close(source); | 1333 close(source); |
| 1334 | 1334 |
| 1335 try_connect(phb); | 1335 try_connect(phb); |
| 1376 int i; | 1376 int i; |
| 1377 struct PHB *phb = data; | 1377 struct PHB *phb = data; |
| 1378 unsigned int len; | 1378 unsigned int len; |
| 1379 int error = ETIMEDOUT; | 1379 int error = ETIMEDOUT; |
| 1380 | 1380 |
| 1381 gaim_debug(GAIM_DEBUG_INFO, "socks5 proxy", "Connected.\n"); | 1381 gaim_debug_info("socks5 proxy", "Connected.\n"); |
| 1382 | 1382 |
| 1383 if (phb->inpa > 0) | 1383 if (phb->inpa > 0) |
| 1384 gaim_input_remove(phb->inpa); | 1384 gaim_input_remove(phb->inpa); |
| 1385 | 1385 |
| 1386 len = sizeof(error); | 1386 len = sizeof(error); |
| 1406 buf[2] = 0x00; | 1406 buf[2] = 0x00; |
| 1407 i = 3; | 1407 i = 3; |
| 1408 } | 1408 } |
| 1409 | 1409 |
| 1410 if (write(source, buf, i) < i) { | 1410 if (write(source, buf, i) < i) { |
| 1411 gaim_debug(GAIM_DEBUG_ERROR, "socks5 proxy", "Unable to write\n"); | 1411 gaim_debug_error("socks5 proxy", "Unable to write\n"); |
| 1412 close(source); | 1412 close(source); |
| 1413 | 1413 |
| 1414 try_connect(phb); | 1414 try_connect(phb); |
| 1415 return; | 1415 return; |
| 1416 } | 1416 } |
| 1421 static int | 1421 static int |
| 1422 proxy_connect_socks5(struct PHB *phb, struct sockaddr *addr, socklen_t addrlen) | 1422 proxy_connect_socks5(struct PHB *phb, struct sockaddr *addr, socklen_t addrlen) |
| 1423 { | 1423 { |
| 1424 int fd = -1; | 1424 int fd = -1; |
| 1425 | 1425 |
| 1426 gaim_debug(GAIM_DEBUG_INFO, "socks5 proxy", | 1426 gaim_debug_info("socks5 proxy", |
| 1427 "Connecting to %s:%d via %s:%d using SOCKS5\n", | 1427 "Connecting to %s:%d via %s:%d using SOCKS5\n", |
| 1428 phb->host, phb->port, | 1428 phb->host, phb->port, |
| 1429 gaim_proxy_info_get_host(phb->gpi), | 1429 gaim_proxy_info_get_host(phb->gpi), |
| 1430 gaim_proxy_info_get_port(phb->gpi)); | 1430 gaim_proxy_info_get_port(phb->gpi)); |
| 1431 | 1431 |
| 1437 fcntl(fd, F_SETFD, FD_CLOEXEC); | 1437 fcntl(fd, F_SETFD, FD_CLOEXEC); |
| 1438 #endif | 1438 #endif |
| 1439 | 1439 |
| 1440 if (connect(fd, addr, addrlen) < 0) { | 1440 if (connect(fd, addr, addrlen) < 0) { |
| 1441 if ((errno == EINPROGRESS) || (errno == EINTR)) { | 1441 if ((errno == EINPROGRESS) || (errno == EINTR)) { |
| 1442 gaim_debug(GAIM_DEBUG_WARNING, "socks5 proxy", | 1442 gaim_debug_warning("socks5 proxy", |
| 1443 "Connect would have blocked.\n"); | 1443 "Connect would have blocked.\n"); |
| 1444 | 1444 |
| 1445 phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, s5_canwrite, phb); | 1445 phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, s5_canwrite, phb); |
| 1446 } | 1446 } |
| 1447 else { | 1447 else { |
| 1451 } | 1451 } |
| 1452 else { | 1452 else { |
| 1453 unsigned int len; | 1453 unsigned int len; |
| 1454 int error = ETIMEDOUT; | 1454 int error = ETIMEDOUT; |
| 1455 | 1455 |
| 1456 gaim_debug(GAIM_DEBUG_MISC, "socks5 proxy", | 1456 gaim_debug_misc("socks5 proxy", |
| 1457 "Connect didn't block.\n"); | 1457 "Connect didn't block.\n"); |
| 1458 | 1458 |
| 1459 len = sizeof(error); | 1459 len = sizeof(error); |
| 1460 | 1460 |
| 1461 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { | 1461 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { |
