diff options
author | james <james@e7ae566f-a301-0410-adde-c780ea21d3b5> | 2005-12-08 23:10:22 +0000 |
---|---|---|
committer | james <james@e7ae566f-a301-0410-adde-c780ea21d3b5> | 2005-12-08 23:10:22 +0000 |
commit | df5722cc68307206c5edcc94fd7ae333d3212b59 (patch) | |
tree | 6cf9b42be4660ac58cb61c76276f28f140b44b25 /ieproxy.c | |
parent | Inline file capability now works for (diff) | |
download | openvpn-df5722cc68307206c5edcc94fd7ae333d3212b59.tar.xz |
First attempt at automatic proxy detection,
Windows-only at this point. Proxy settings
are taken from IE.
git-svn-id: http://svn.openvpn.net/projects/openvpn/branches/BETA21/openvpn@846 e7ae566f-a301-0410-adde-c780ea21d3b5
Diffstat (limited to 'ieproxy.c')
-rwxr-xr-x | ieproxy.c | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/ieproxy.c b/ieproxy.c new file mode 100755 index 0000000..42b067b --- /dev/null +++ b/ieproxy.c @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2004 Ewan Bhamrah Harley <code@ewan.info> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program (see the file COPYING included with this + * distribution); if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <WinInet.h> +#include <malloc.h> + +LPCTSTR getIeHttpProxyError=NULL; + +/* getIeHttpProxy fetches the current IE proxy settings for http */ + +LPCTSTR getIeHttpProxy() +{ + DWORD psize=0; + INTERNET_PROXY_INFO *pinfo; + LPTSTR proxyString; + LPTSTR p; + LPTSTR q; + unsigned int len; + + /* first see how big a buffer we need for the IPO structure */ + InternetQueryOption(NULL, INTERNET_OPTION_PROXY, NULL, &psize); + if(!psize) + { + getIeHttpProxyError="InternetQueryOption failed to return buffer size"; + return(NULL); + } + + /* allocate memory for IPO */ + pinfo = malloc (psize*sizeof(TCHAR)); + if (pinfo == NULL) + { + getIeHttpProxyError="malloc failed (1)"; + return(NULL); + } + + /* now run the real query */ + if(!InternetQueryOption(NULL, INTERNET_OPTION_PROXY, (LPVOID) pinfo, &psize)) + { + getIeHttpProxyError="InternetQueryOption() failed to find proxy info"; + free(pinfo); + return(NULL); + } + + + /* see what sort of result we got */ + + if(pinfo->dwAccessType == INTERNET_OPEN_TYPE_DIRECT) + { + /* No proxy configured */ + free(pinfo); + return(""); + } + else if(pinfo->dwAccessType == INTERNET_OPEN_TYPE_PROXY) + { + /* we have a proxy - now parse result string */ + /* if result string does NOT contain an '=' sign then */ + /* there is a single proxy for all protocols */ + for (p=(LPTSTR)pinfo->lpszProxy; *p && *p != '='; p++); + if(!*p) + { + /* single proxy */ + /* allocate a new string to return */ + len = 1+strlen(pinfo->lpszProxy); + proxyString = malloc (len*sizeof(TCHAR)); + if (proxyString == NULL) + { + getIeHttpProxyError="malloc failed (2)"; + free(pinfo); + return(NULL); + } + strncpy(proxyString, pinfo->lpszProxy,len); + proxyString[len]=0; + free(pinfo); + return(proxyString); + } + else + { + /* multiple space seperated proxies defined in the form */ + /* protocol=proxyhost[:port] */ + /* we want the one marked "http=", if any. */ + p=(LPTSTR)pinfo->lpszProxy; + while(*p && strncmp(p, "http=", 5)) + { + for(; *p && *p != ' '; p++); + if(*p) p++; + } + if(*p) + { + /* found the proxy */ + p+=5; + for(q=p; *q && *q != ' '; q++); + /* allocate a buffer for the proxy information */ + len=1+(q-p); + proxyString=malloc(len*sizeof(TCHAR)); + if(proxyString==NULL) + { + getIeHttpProxyError="malloc failed (3)"; + free(pinfo); + return(NULL); + } + strncpy(proxyString, p, len); + proxyString[len]=0; + free(pinfo); + return(proxyString); + } + else + { + /* No http proxy in list */ + free(pinfo); + return(""); + } + } + } + else + { + /* InternetQueryOption returned a proxy type we don't know about*/ + getIeHttpProxyError="Unknown Proxy Type"; + free(pinfo); + return(NULL); + } +} |