diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2010-10-09 11:16:39 +0200 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2010-10-09 11:16:39 +0200 |
commit | e63901aa3be63f086945d895dc8b1fcfcf03a189 (patch) | |
tree | 8654226b406ea6eae53cfeb69ff23f7cf3407c99 /libproxy | |
parent | 729feb23cae5872a9c5aa15e12f908b807e7dd8c (diff) | |
download | pacrunner-e63901aa3be63f086945d895dc8b1fcfcf03a189.tar.gz |
Add simple libproxy implementation
Diffstat (limited to 'libproxy')
-rw-r--r-- | libproxy/libproxy-1.0.pc.in | 11 | ||||
-rw-r--r-- | libproxy/proxy.c | 179 | ||||
-rw-r--r-- | libproxy/proxy.h | 40 |
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 */ |