diff options
author | David Woodhouse <dwmw2@infradead.org> | 2010-12-18 01:27:25 +0000 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2010-12-21 23:55:08 +0100 |
commit | 23da985012cacd288ce0e0b2ceb514367153aa0a (patch) | |
tree | adc624f8cf10493286d2dcdae1f439da0dc58f77 | |
parent | 56dccba64e86322761ecabd16ed889a58f3728cf (diff) | |
download | pacrunner-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.c | 30 |
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; } |