aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Woodhouse <dwmw2@infradead.org>2010-12-18 01:27:25 +0000
committerSamuel Ortiz <sameo@linux.intel.com>2010-12-21 23:55:08 +0100
commit23da985012cacd288ce0e0b2ceb514367153aa0a (patch)
treeadc624f8cf10493286d2dcdae1f439da0dc58f77
parent56dccba64e86322761ecabd16ed889a58f3728cf (diff)
downloadpacrunner-23da985012cacd288ce0e0b2ceb514367153aa0a.tar.gz
proxy: Block client requests while a PAC script is downloading
Better to wait, than to give wrong answers.
-rw-r--r--src/proxy.c30
1 files changed, 24 insertions, 6 deletions
diff --git a/src/proxy.c b/src/proxy.c
index 98e73d4..e89d623 100644
--- a/src/proxy.c
+++ b/src/proxy.c
@@ -38,6 +38,11 @@ struct pacrunner_proxy {
char **excludes;
};
+static GList *proxy_list = NULL;
+static GMutex *proxy_mutex = NULL;
+static GCond *proxy_cond = NULL;
+static gint proxy_updating = 0;
+
struct pacrunner_proxy *pacrunner_proxy_create(const char *interface)
{
struct pacrunner_proxy *proxy;
@@ -196,6 +201,10 @@ static void download_callback(char *content, void *user_data)
pacrunner_proxy_enable(proxy);
done:
+ g_mutex_lock(proxy_mutex);
+ proxy_updating--;
+ g_cond_broadcast(proxy_cond);
+ g_mutex_unlock(proxy_mutex);
pacrunner_proxy_unref(proxy);
}
@@ -231,19 +240,20 @@ int pacrunner_proxy_set_auto(struct pacrunner_proxy *proxy,
pacrunner_proxy_ref(proxy);
+ g_mutex_lock(proxy_mutex);
err = __pacrunner_download_update(proxy->interface, proxy->url,
download_callback, proxy);
if (err < 0) {
pacrunner_proxy_unref(proxy);
+ g_mutex_unlock(proxy_mutex);
return err;
}
+ proxy_updating++;
+ g_mutex_unlock(proxy_mutex);
return 0;
}
-static GList *proxy_list = NULL;
-static GMutex *proxy_mutex = NULL;
-
int pacrunner_proxy_enable(struct pacrunner_proxy *proxy)
{
GList *list;
@@ -301,10 +311,14 @@ char *pacrunner_proxy_lookup(const char *url, const char *host)
DBG("url %s host %s", url, host);
- if (proxy_list == NULL)
- return NULL;
-
g_mutex_lock(proxy_mutex);
+ while (proxy_updating)
+ g_cond_wait(proxy_cond, proxy_mutex);
+
+ if (proxy_list == NULL) {
+ g_mutex_unlock(proxy_mutex);
+ return NULL;
+ }
for (list = g_list_first(proxy_list); list; list = g_list_next(list)) {
struct pacrunner_proxy *proxy = list->data;
@@ -342,6 +356,7 @@ int __pacrunner_proxy_init(void)
DBG("");
proxy_mutex = g_mutex_new();
+ proxy_cond = g_cond_new();
return 0;
}
@@ -364,6 +379,9 @@ void __pacrunner_proxy_cleanup(void)
g_mutex_free(proxy_mutex);
proxy_mutex = NULL;
+ g_cond_free(proxy_cond);
+ proxy_cond = NULL;
+
g_list_free(proxy_list);
proxy_list = NULL;
}