Mercurial > pidgin
comparison src/proxy.c @ 664:5cb19972df52
[gaim-migrate @ 674]
socks4 works now :-P
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Fri, 11 Aug 2000 00:21:36 +0000 |
parents | b402a23f35df |
children | 9e51c1a4abba |
comparison
equal
deleted
inserted
replaced
663:18e147714c4b | 664:5cb19972df52 |
---|---|
175 free(inputline); | 175 free(inputline); |
176 } | 176 } |
177 | 177 |
178 return ret; | 178 return ret; |
179 break; | 179 break; |
180 case PROXY_SOCKS4: /* Socks v4 proxy (? I'm not a proxy hacker) */ | 180 case PROXY_SOCKS4: |
181 /* this is going to be a cross between the HTTP proxy code | 181 /* code shamelessly stolen from everybuddy */ |
182 * above and the TiK proxy code, translated from tcl->C */ | 182 { |
183 { | 183 struct sockaddr_in sa; |
184 struct hostent *hostinfo; | 184 unsigned char packet[12]; |
185 unsigned short shortport = proxy_port; | 185 struct hostent *hp; |
186 | 186 |
187 memset(&name, 0, sizeof (name)); | 187 debug_print("connecting with socks4.\n"); |
188 name.sin_family = AF_INET; | 188 |
189 name.sin_port = htons (shortport); | 189 if (!(hp = gethostbyname(proxy_host))) |
190 hostinfo = gethostbyname (proxy_host); | 190 return -1; |
191 if (hostinfo == NULL) { | 191 |
192 fprintf (stderr, "Unknown host %s.\n", proxy_host); | 192 bzero(&sa, sizeof(sa)); |
193 return (-1); | 193 sa.sin_family = AF_INET; |
194 sa.sin_port = htons(proxy_port); | |
195 bcopy(hp->h_addr, (char *) &sa.sin_addr, hp->h_length); | |
196 | |
197 if (connect(sockfd, (struct sockaddr *) &sa, sizeof (sa)) != -1) { | |
198 unsigned short realport = htons(((struct sockaddr_in *)serv_addr)->sin_port); | |
199 | |
200 if (!(hp = gethostbyname(proxy_realhost))) | |
201 return -1; | |
202 packet[0] = 4; | |
203 packet[1] = 1; | |
204 packet[2] = (((unsigned short) realport) >> 8); | |
205 packet[3] = (((unsigned short) realport) & 0xff); | |
206 packet[4] = (unsigned char) (hp->h_addr_list[0])[0]; | |
207 packet[5] = (unsigned char) (hp->h_addr_list[0])[1]; | |
208 packet[6] = (unsigned char) (hp->h_addr_list[0])[2]; | |
209 packet[7] = (unsigned char) (hp->h_addr_list[0])[3]; | |
210 packet[8] = 0; | |
211 if (write(sockfd, packet, 9) == 9) { | |
212 bzero(packet, sizeof(packet)); | |
213 if (read(sockfd, packet, 9) >= 4 && packet[1] == 90) | |
214 return 0; | |
194 } | 215 } |
195 name.sin_addr = *(struct in_addr *) hostinfo->h_addr; | 216 close(sockfd); |
196 } | 217 } |
197 sprintf(debug_buff,"Trying to connect ...\n"); | 218 return -1; |
198 debug_print(debug_buff); | 219 } |
199 if ((ret = connect(sockfd,(struct sockaddr *)&name,sizeof(name)))<0) | 220 break; |
200 return(ret); | |
201 | |
202 /* here's where it's no longer http proxy and is now tik */ | |
203 { | |
204 char cmd[80]; | |
205 char *inputline; | |
206 unsigned short realport=((struct sockaddr_in *)serv_addr)->sin_port; | |
207 unsigned long realhost=((struct sockaddr_in *)serv_addr)->sin_addr.s_addr; | |
208 | |
209 cmd[0] = 4; cmd[0] = 1; | |
210 memcpy(cmd + 2, &realport, 2); | |
211 memcpy(cmd + 4, &realhost, 4); | |
212 cmd[8] = 0; | |
213 if (send(sockfd,cmd,8,0)<0) | |
214 return(-1); | |
215 if (proxy_recv_line(sockfd,&inputline) < 0) { | |
216 return(-1); | |
217 } | |
218 if (inputline[1] != 90) { | |
219 sprintf(debug_buff, "request failed: %d\n", | |
220 inputline[1]); | |
221 debug_print(debug_buff); | |
222 if (inputline[1] == 91) | |
223 do_error_dialog("The SOCKS proxy denied" | |
224 "your request.", | |
225 "Gaim - Proxy Error"); | |
226 else | |
227 do_error_dialog("Unknown SOCKS error.", | |
228 "Gaim - Proxy Error"); | |
229 return -1; | |
230 } | |
231 } | |
232 return ret; | |
233 break; | |
234 case PROXY_SOCKS5: | 221 case PROXY_SOCKS5: |
235 return -1; | 222 return -1; |
236 break; | 223 break; |
237 default: | 224 default: |
238 fprintf(stderr,"Unknown proxy type : %d.\n",proxy_type); | 225 fprintf(stderr,"Unknown proxy type : %d.\n",proxy_type); |