diff options
Diffstat (limited to 'apt-pkg/contrib/proxy.cc')
-rw-r--r-- | apt-pkg/contrib/proxy.cc | 55 |
1 files changed, 20 insertions, 35 deletions
diff --git a/apt-pkg/contrib/proxy.cc b/apt-pkg/contrib/proxy.cc index 0c753131d..cbe640634 100644 --- a/apt-pkg/contrib/proxy.cc +++ b/apt-pkg/contrib/proxy.cc @@ -16,9 +16,9 @@ #include <unistd.h> #include "proxy.h" + /*}}}*/ - -// AutoDetectProxy - auto detect proxy /*{{{*/ +// AutoDetectProxy - auto detect proxy /*{{{*/ // --------------------------------------------------------------------- /* */ bool AutoDetectProxy(URI &URL) @@ -41,45 +41,30 @@ bool AutoDetectProxy(URI &URL) 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); - } + std::string const urlstring = URL; + std::vector<const char *> Args; + Args.push_back(AutoDetectProxyCmd.c_str()); + Args.push_back(urlstring.c_str()); + Args.push_back(nullptr); + FileFd PipeFd; + pid_t Child; + if(Popen(&Args[0], PipeFd, Child, FileFd::ReadOnly) == false) + return _error->Error("ProxyAutoDetect command '%s' failed!", AutoDetectProxyCmd.c_str()); char buf[512]; - int InFd = Pipes[0]; - close(Pipes[1]); - int res = read(InFd, buf, sizeof(buf)-1); - ExecWait(Process, "ProxyAutoDetect", true); + if (PipeFd.ReadLine(buf, sizeof(buf)) == nullptr) + return _error->Error("Failed to read in AutoDetectProxy"); + PipeFd.Close(); + ExecWait(Child, "ProxyAutoDetect", true); + auto const cleanedbuf = _strstrip(buf); - if (res < 0) - return _error->Errno("read", "Failed to read"); - if (res == 0) + if (cleanedbuf[0] == '\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; + std::clog << "auto detect command returned: '" << cleanedbuf << "'" << std::endl; - if (strstr(buf, URL.Access.c_str()) == buf) - _config->Set("Acquire::"+URL.Access+"::proxy::"+URL.Host, _strstrip(buf)); + if (strstr(cleanedbuf, URL.Access.c_str()) == cleanedbuf) + _config->Set("Acquire::"+URL.Access+"::proxy::"+URL.Host, cleanedbuf); return true; } |