Mercurial > pidgin
comparison src/proxy.c @ 1695:c0ab844d4790
[gaim-migrate @ 1705]
ugh
committer: Tailor Script <tailor@pidgin.im>
| author | Eric Warmenhoven <eric@warmenhoven.org> |
|---|---|
| date | Mon, 09 Apr 2001 20:53:47 +0000 |
| parents | f6cc5cb7faf6 |
| children | b4d454e5ee31 |
comparison
equal
deleted
inserted
replaced
| 1694:bea407767ac1 | 1695:c0ab844d4790 |
|---|---|
| 36 #include <unistd.h> | 36 #include <unistd.h> |
| 37 #include <gtk/gtk.h> | 37 #include <gtk/gtk.h> |
| 38 #include "gaim.h" | 38 #include "gaim.h" |
| 39 #include "proxy.h" | 39 #include "proxy.h" |
| 40 | 40 |
| 41 /* this code is borrowed from cvs 1.10 */ | |
| 42 static int proxy_recv_line(int sock, char **resultp) | |
| 43 { | |
| 44 int c; | |
| 45 char *result; | |
| 46 size_t input_index = 0; | |
| 47 size_t result_size = 80; | |
| 48 | |
| 49 result = g_malloc(result_size); | |
| 50 | |
| 51 while (1) { | |
| 52 char ch; | |
| 53 if (recv(sock, &ch, 1, 0) < 0) | |
| 54 debug_printf("recv() error from proxy server\n"); | |
| 55 c = ch; | |
| 56 | |
| 57 if (c == EOF) { | |
| 58 g_free(result); | |
| 59 | |
| 60 /* It's end of file. */ | |
| 61 debug_printf("end of file from server\n"); | |
| 62 } | |
| 63 | |
| 64 if (c == '\012') | |
| 65 break; | |
| 66 | |
| 67 result[input_index++] = c; | |
| 68 while (input_index + 1 >= result_size) { | |
| 69 result_size *= 2; | |
| 70 result = (char *)g_realloc(result, result_size); | |
| 71 } | |
| 72 } | |
| 73 | |
| 74 if (resultp) | |
| 75 *resultp = result; | |
| 76 | |
| 77 /* Terminate it just for kicks, but we *can* deal with embedded NULs. */ | |
| 78 result[input_index] = '\0'; | |
| 79 | |
| 80 if (resultp == NULL) | |
| 81 g_free(result); | |
| 82 return input_index; | |
| 83 } | |
| 84 | |
| 85 static int proxy_connect_none(char *host, unsigned short port) | 41 static int proxy_connect_none(char *host, unsigned short port) |
| 86 { | 42 { |
| 87 struct sockaddr_in sin; | 43 struct sockaddr_in sin; |
| 88 struct hostent *hp; | 44 struct hostent *hp; |
| 89 int fd = -1; | 45 int fd = -1; |
| 116 { | 72 { |
| 117 struct hostent *hp; | 73 struct hostent *hp; |
| 118 struct sockaddr_in sin; | 74 struct sockaddr_in sin; |
| 119 int fd = -1; | 75 int fd = -1; |
| 120 char cmd[384]; | 76 char cmd[384]; |
| 121 char *inputline; | 77 char inputline[8192]; |
| 78 int nlc = 0; | |
| 79 int pos = 0; | |
| 122 | 80 |
| 123 debug_printf("connecting to %s:%d via %s:%d using HTTP\n", host, port, proxyhost, proxyport); | 81 debug_printf("connecting to %s:%d via %s:%d using HTTP\n", host, port, proxyhost, proxyport); |
| 124 | 82 |
| 125 if (!(hp = gethostbyname(proxyhost))) | 83 if (!(hp = gethostbyname(proxyhost))) |
| 126 return -1; | 84 return -1; |
| 138 return -1; | 96 return -1; |
| 139 } | 97 } |
| 140 | 98 |
| 141 snprintf(cmd, sizeof(cmd), "CONNECT %s:%d HTTP/1.1\n\r\n\r", host, port); | 99 snprintf(cmd, sizeof(cmd), "CONNECT %s:%d HTTP/1.1\n\r\n\r", host, port); |
| 142 | 100 |
| 143 if (send(fd, cmd, strlen(cmd), 0) < 0) | 101 if (send(fd, cmd, strlen(cmd), 0) < 0) { |
| 144 return -1; | 102 close(fd); |
| 145 if (proxy_recv_line(fd, &inputline) < 0) | 103 return -1; |
| 146 return -1; | 104 } |
| 105 while ((nlc != 2) && (read(fd, &inputline[pos++], 1) == 1)) { | |
| 106 if (inputline[pos-1] == '\n') | |
| 107 nlc++; | |
| 108 else if (inputline[pos-1] != '\r') | |
| 109 nlc = 0; | |
| 110 } | |
| 147 | 111 |
| 148 if ((memcmp(HTTP_GOODSTRING, inputline, strlen(HTTP_GOODSTRING)) == 0) || | 112 if ((memcmp(HTTP_GOODSTRING, inputline, strlen(HTTP_GOODSTRING)) == 0) || |
| 149 (memcmp(HTTP_GOODSTRING2, inputline, strlen(HTTP_GOODSTRING2)) == 0)) { | 113 (memcmp(HTTP_GOODSTRING2, inputline, strlen(HTTP_GOODSTRING2)) == 0)) { |
| 150 while (strlen(inputline) > 1) { | |
| 151 free(inputline); | |
| 152 if (proxy_recv_line(fd, &inputline) < 0) | |
| 153 return -1; | |
| 154 } | |
| 155 free(inputline); | |
| 156 return fd; | 114 return fd; |
| 157 } | 115 } |
| 158 | 116 |
| 159 free(inputline); | |
| 160 | |
| 161 close(fd); | 117 close(fd); |
| 162 | |
| 163 return -1; | 118 return -1; |
| 164 } | 119 } |
| 165 | 120 |
| 166 static int proxy_connect_socks4(char *host, unsigned short port, | 121 static int proxy_connect_socks4(char *host, unsigned short port, |
| 167 char *proxyhost, unsigned short proxyport) | 122 char *proxyhost, unsigned short proxyport) |
