Index: libproxy/cmake/modules.cmk =================================================================== --- libproxy/cmake/modules.cmk (revision 775) +++ libproxy/cmake/modules.cmk (working copy) @@ -9,6 +9,7 @@ include(cmake/pxmodule.cmk) include(cmake/pkgconfig.cmk) include(cmake/modules/config_envvar.cmk) +include(cmake/modules/config_sysconfig.cmk) include(cmake/modules/config_gnome.cmk) include(cmake/modules/config_kde4.cmk) include(cmake/modules/config_macosx.cmk) @@ -27,6 +28,7 @@ # message("MODULES TO BUILD:") px_module(config_envvar "${ENVVAR_FOUND}" 1) +px_module(config_sysconfig "${SYSCONFIG_FOUND}" 1) px_module(config_gnome "${GNOME_FOUND}" 0) px_module(config_kde4 "${KDE4_FOUND}" 0 ${KDE4_LIBRARIES}) px_module(config_macosx "${SC_FOUND}" 1 ${SC_LIBRARIES} ${CF_LIBRARIES}) Index: libproxy/cmake/modules/config_sysconfig.cmk =================================================================== --- libproxy/cmake/modules/config_sysconfig.cmk (revision 0) +++ libproxy/cmake/modules/config_sysconfig.cmk (revision 0) @@ -0,0 +1,5 @@ +if (NOT WIN32 AND NOT APPLE) + if (EXISTS "/etc/sysconfig" AND IS_DIRECTORY "/etc/sysconfig") + set(SYSCONFIG_FOUND 1) + endif() +endif() \ No newline at end of file Index: libproxy/modules/config_sysconfig.cpp =================================================================== --- libproxy/modules/config_sysconfig.cpp (revision 0) +++ libproxy/modules/config_sysconfig.cpp (revision 0) @@ -0,0 +1,165 @@ +/******************************************************************************* + * libproxy sysconfig module + * Copyright (C) 2010 Novell Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + ******************************************************************************/ + +#include +#include +#include +#include + +#include "../extension_config.hpp" +using namespace libproxy; +using std::map; + +enum Trim { + NO_TRIM = 0x00, + L_TRIM = 0x01, + R_TRIM = 0x02, + TRIM = (L_TRIM|R_TRIM) +}; + +static std::string trim( const std::string & s, const Trim trim_r = TRIM ) { + + if (s.empty() || trim_r == NO_TRIM) + return s; + + std::string ret(s); + + if (trim_r & L_TRIM) { + std::string::size_type p = ret.find_first_not_of(" \t\n"); + if (p == std::string::npos) + return std::string(); + + ret = ret.substr(p); + } + + if (trim_r & R_TRIM) { + std::string::size_type p = ret.find_last_not_of(" \t\n"); + if (p == std::string::npos) + return std::string(); + + ret = ret.substr(0, p+1); + } + + return ret; +} + +static map sysconfig_read(const string &_path) { + + map ret; + string line; + + ifstream in(_path.c_str()); + if (in.fail()) { + return ret; + } + + while(getline( in, line)) { + + if (*line.begin() != '#') { + + string::size_type pos = line.find('=', 0); + + if (pos != string::npos) { + + string key = trim(line.substr(0, pos)); + string value = trim(line.substr(pos + 1, line.length() - pos - 1)); + + if (value.length() >= 2 + && *(value.begin()) == '"' + && *(value.rbegin()) == '"') { + value = value.substr( 1, value.length() - 2 ); + } + + if (value.length() >= 2 + && *(value.begin()) == '\'' + && *(value.rbegin()) == '\'' ) { + value = value.substr( 1, value.length() - 2 ); + } + ret[key] = value; + } // '=' found + + } // not comment + + } // while getline + return ret; +} + +static bool should_use_sysconfig() +{ + struct stat st; + if (stat("/etc/sysconfig", &st) == 0) + return (getuid() == 0); + return false; +} + +class sysconfig_config_extension : public config_extension { + + map _data; + +public: + sysconfig_config_extension() + : _data(sysconfig_read("/etc/sysconfig/proxy")) { + + } + + ~sysconfig_config_extension() { + } + + url get_config(url url) throw (runtime_error) { + map::const_iterator it = _data.find("PROXY_ENABLED"); + if (it != _data.end() && it->second == "no") + return libproxy::url("direct://"); + + string key; + string proxy; + + // If the URL is an ftp url, try to read the ftp proxy + if (url.get_scheme() == "ftp") + key = "FTP_PROXY"; + else if (url.get_scheme() == "http") + key = "HTTP_PROXY"; + else if (url.get_scheme() == "https") + key = "HTTPS_PROXY"; + + it = _data.find(key); + if (it != _data.end()) + proxy = it->second; + + if (proxy.empty()) + throw runtime_error("Unable to read configuration"); + + return libproxy::url(proxy); + } + + string get_ignore(url) { + map::const_iterator it = _data.find("NO_PROXY"); + if (it != _data.end()) + return it->second; + return ""; + } + + // if we are running as root, and the module is used, then + // make sure this is the first method tried + virtual bool operator<(const base_extension&) const { + return true; + } +}; + +MM_MODULE_INIT_EZ(sysconfig_config_extension, should_use_sysconfig(), NULL, NULL); +