aboutsummaryrefslogtreecommitdiffstats
path: root/libproxy
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2010-10-09 11:16:39 +0200
committerMarcel Holtmann <marcel@holtmann.org>2010-10-09 11:16:39 +0200
commite63901aa3be63f086945d895dc8b1fcfcf03a189 (patch)
tree8654226b406ea6eae53cfeb69ff23f7cf3407c99 /libproxy
parent729feb23cae5872a9c5aa15e12f908b807e7dd8c (diff)
downloadpacrunner-e63901aa3be63f086945d895dc8b1fcfcf03a189.tar.gz
Add simple libproxy implementation
Diffstat (limited to 'libproxy')
-rw-r--r--libproxy/libproxy-1.0.pc.in11
-rw-r--r--libproxy/proxy.c179
-rw-r--r--libproxy/proxy.h40
3 files changed, 230 insertions, 0 deletions
diff --git a/libproxy/libproxy-1.0.pc.in b/libproxy/libproxy-1.0.pc.in
new file mode 100644
index 0000000..917b029
--- /dev/null
+++ b/libproxy/libproxy-1.0.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libproxy-1.0
+Description: Proxy Configuration Library
+Requires: dbus-1
+Version: @VERSION@
+Libs: -L${libdir} -lproxy
+Cflags: -I${includedir}
diff --git a/libproxy/proxy.c b/libproxy/proxy.c
new file mode 100644
index 0000000..16953bb
--- /dev/null
+++ b/libproxy/proxy.c
@@ -0,0 +1,179 @@
+/*
+ *
+ * libproxy - A library for proxy configuration
+ *
+ * Copyright (C) 2010 Intel Corporation. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or modify
+ * it under the terms and conditions of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * 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 program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <dbus/dbus.h>
+
+#include "proxy.h"
+
+struct _pxProxyFactory {
+ DBusConnection *conn;
+};
+
+pxProxyFactory *px_proxy_factory_new(void)
+{
+ pxProxyFactory *factory;
+
+ factory = malloc(sizeof(*factory));
+ if (factory == NULL)
+ return NULL;
+
+ memset(factory, 0, sizeof(*factory));
+
+ factory->conn = dbus_bus_get_private(DBUS_BUS_SYSTEM, NULL);
+ if (factory->conn == NULL) {
+ free(factory);
+ return NULL;
+ }
+
+ dbus_connection_set_exit_on_disconnect(factory->conn, FALSE);
+
+ return factory;
+}
+
+void px_proxy_factory_free(pxProxyFactory *factory)
+{
+ if (factory == NULL)
+ return;
+
+ dbus_connection_close(factory->conn);
+
+ free(factory);
+}
+
+static char **extract_result(const char *str, const char *scheme)
+{
+ char **result;
+
+ result = malloc(sizeof(char *) * 2);
+ if (result == NULL)
+ return NULL;
+
+ result[0] = NULL;
+ result[1] = NULL;
+
+ if (strcmp(str, "DIRECT") == 0) {
+ result[0] = strdup("direct://");
+ return result;
+ }
+
+ if (strncmp(str, "PROXY ", 6) == 0) {
+ int len = strlen(scheme) + strlen(str + 6) + 4;
+ result[0] = malloc(len);
+ if (result[0] != NULL)
+ sprintf(result[0], "%s://%s", scheme, str + 6);
+ return result;
+ }
+
+ return result;
+}
+
+char **px_proxy_factory_get_proxies(pxProxyFactory *factory, const char *url)
+{
+ DBusMessage *msg, *reply;
+ const char *str = NULL;
+ char *scheme, *host, *port, *path, **result;
+
+ if (factory == NULL)
+ return NULL;
+
+ if (url == NULL)
+ return NULL;
+
+ msg = dbus_message_new_method_call("org.pacrunner",
+ "/org/pacrunner/client", "org.pacrunner.Client",
+ "FindProxyForURL");
+ if (msg == NULL)
+ goto direct;
+
+ scheme = strdup(url);
+ if (scheme == NULL) {
+ dbus_message_unref(msg);
+ goto direct;
+ }
+
+ host = strstr(scheme, "://");
+ if (host != NULL) {
+ *host = '\0';
+ host += 3;
+ } else {
+ dbus_message_unref(msg);
+ goto direct;
+ }
+
+ path = strchr(host, '/');
+ if (path != NULL)
+ *(path++) = '\0';
+
+ port = strrchr(host, ':');
+ if (port != NULL) {
+ char *end;
+ int tmp;
+
+ tmp = strtol(port + 1, &end, 10);
+ if (*end == '\0')
+ *port = '\0';
+ }
+
+ dbus_message_append_args(msg, DBUS_TYPE_STRING, &url,
+ DBUS_TYPE_STRING, &host, DBUS_TYPE_INVALID);
+
+ reply = dbus_connection_send_with_reply_and_block(factory->conn,
+ msg, -1, NULL);
+
+ dbus_message_unref(msg);
+
+ if (reply == NULL) {
+ free(scheme);
+ goto direct;
+ }
+
+ dbus_message_get_args(reply, NULL, DBUS_TYPE_STRING, &str,
+ DBUS_TYPE_INVALID);
+
+ if (str == NULL || strlen(str) == 0)
+ str = "DIRECT";
+
+ result = extract_result(str, scheme);
+
+ free(scheme);
+
+ dbus_message_unref(reply);
+
+ return result;
+
+direct:
+ result = malloc(sizeof(char *) * 2);
+ if (result == NULL)
+ return NULL;
+
+ result[0] = strdup("direct://");
+ result[1] = NULL;
+
+ return result;
+}
diff --git a/libproxy/proxy.h b/libproxy/proxy.h
new file mode 100644
index 0000000..ee21461
--- /dev/null
+++ b/libproxy/proxy.h
@@ -0,0 +1,40 @@
+/*
+ *
+ * libproxy - A library for proxy configuration
+ *
+ * Copyright (C) 2010 Intel Corporation. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or modify
+ * it under the terms and conditions of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * 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 program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifndef __PROXY_H
+#define __PROXY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _pxProxyFactory pxProxyFactory;
+
+pxProxyFactory *px_proxy_factory_new(void);
+void px_proxy_factory_free(pxProxyFactory *factory);
+
+char **px_proxy_factory_get_proxies(pxProxyFactory *factory, const char *url);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __PROXY_H */