File libproxy-sysconfig-support.patch of Package libproxy

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 <sys/stat.h>
+#include <cstdlib>
+#include <map>
+#include <fstream>
+
+#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<string,string> sysconfig_read(const string &_path)	{
+    
+	map<string,string> 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<string,string> _data;
+    
+public:
+	sysconfig_config_extension()
+		: _data(sysconfig_read("/etc/sysconfig/proxy")) {
+            
+	}
+
+	~sysconfig_config_extension() {
+	}
+   
+	url get_config(url url) throw (runtime_error) {
+		map<string,string>::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<string,string>::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);
+
openSUSE Build Service is sponsored by