1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
/* ######################################################################
Proxy - Proxy releated functions
##################################################################### */
/*}}}*/
// Include Files /*{{{*/
#include<apt-pkg/configuration.h>
#include<apt-pkg/error.h>
#include<apt-pkg/fileutl.h>
#include<apt-pkg/strutl.h>
#include<iostream>
#include <unistd.h>
#include "proxy.h"
// AutoDetectProxy - auto detect proxy /*{{{*/
// ---------------------------------------------------------------------
/* */
bool AutoDetectProxy(URI &URL)
{
// we support both http/https debug options
bool Debug = _config->FindB("Debug::Acquire::"+URL.Access,false);
// the user already explicitly set a proxy for this host
if(_config->Find("Acquire::"+URL.Access+"::proxy::"+URL.Host, "") != "")
return true;
// option is "Acquire::http::Proxy-Auto-Detect" but we allow the old
// name without the dash ("-")
std::string AutoDetectProxyCmd = _config->Find("Acquire::"+URL.Access+"::Proxy-Auto-Detect",
_config->Find("Acquire::"+URL.Access+"::ProxyAutoDetect"));
if (AutoDetectProxyCmd.empty())
return true;
if (Debug)
std::clog << "Using auto proxy detect command: " << AutoDetectProxyCmd << std::endl;
int Pipes[2] = {-1,-1};
if (pipe(Pipes) != 0)
return _error->Errno("pipe", "Failed to create Pipe");
pid_t Process = ExecFork();
if (Process == 0)
{
close(Pipes[0]);
dup2(Pipes[1],STDOUT_FILENO);
SetCloseExec(STDOUT_FILENO,false);
std::string foo = URL;
const char *Args[4];
Args[0] = AutoDetectProxyCmd.c_str();
Args[1] = foo.c_str();
Args[2] = 0;
execv(Args[0],(char **)Args);
std::cerr << "Failed to exec method " << Args[0] << std::endl;
_exit(100);
}
char buf[512];
int InFd = Pipes[0];
close(Pipes[1]);
int res = read(InFd, buf, sizeof(buf)-1);
ExecWait(Process, "ProxyAutoDetect", true);
if (res < 0)
return _error->Errno("read", "Failed to read");
if (res == 0)
return _error->Warning("ProxyAutoDetect returned no data");
// add trailing \0
buf[res] = 0;
if (Debug)
std::clog << "auto detect command returned: '" << buf << "'" << std::endl;
if (strstr(buf, URL.Access.c_str()) == buf)
_config->Set("Acquire::"+URL.Access+"::proxy::"+URL.Host, _strstrip(buf));
return true;
}
/*}}}*/
|