summaryrefslogtreecommitdiff
path: root/src/mod_sql_vhost_core.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_sql_vhost_core.c')
-rw-r--r--src/mod_sql_vhost_core.c384
1 files changed, 0 insertions, 384 deletions
diff --git a/src/mod_sql_vhost_core.c b/src/mod_sql_vhost_core.c
deleted file mode 100644
index 8cef1c8b..00000000
--- a/src/mod_sql_vhost_core.c
+++ /dev/null
@@ -1,384 +0,0 @@
-#include <stdio.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <string.h>
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "plugin.h"
-#include "log.h"
-#include "sys-files.h"
-
-#include "stat_cache.h"
-
-#include "mod_sql_vhost_core.h"
-
-#define plugin_data mod_sql_vhost_core_plugin_data
-#define plugin_config mod_sql_vhost_core_plugin_config
-
-typedef struct {
- buffer *docroot;
- time_t added_ts;
-
- time_t ttl;
-} cached_vhost;
-
-/* init the plugin data */
-INIT_FUNC(mod_sql_vhost_core_init) {
- plugin_data *p;
-
- UNUSED(srv);
-
- p = calloc(1, sizeof(*p));
-
- p->docroot = buffer_init();
- p->host = buffer_init();
-
- return p;
-}
-
-/* cleanup the plugin data */
-SERVER_FUNC(mod_sql_vhost_core_cleanup) {
- plugin_data *p = p_d;
-
- UNUSED(srv);
-
- if (!p) return HANDLER_GO_ON;
-
- if (p->config_storage) {
- size_t i;
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
- if (!s) continue;
-
- buffer_free(s->db);
- buffer_free(s->user);
- buffer_free(s->pass);
- buffer_free(s->sock);
- buffer_free(s->backend);
- buffer_free(s->hostname);
- buffer_free(s->select_vhost);
-#ifdef HAVE_GLIB_H
- g_hash_table_destroy(s->vhost_table);
-#endif
-
- free(s);
- }
- free(p->config_storage);
- }
- buffer_free(p->docroot);
- buffer_free(p->host);
-
- free(p);
-
- return HANDLER_GO_ON;
-}
-
-#ifdef HAVE_GLIB_H
-#if 0
-static cached_vhost *cached_vhost_init(void) {
- cached_vhost *vhost;
-
- vhost = g_new0(cached_vhost, 1);
-
- return vhost;
-}
-#endif
-
-static void cached_vhost_free(cached_vhost *vhost) {
- if (!vhost) return;
-
- if (vhost->docroot) buffer_free(vhost->docroot);
-
- g_free(vhost);
-}
-
-static void cached_vhost_free_hash(gpointer vhost) {
- cached_vhost_free(vhost);
-}
-
-static uint buffer_hash(gconstpointer key) {
- buffer *b = (buffer *)key;
-
- return g_str_hash(b->ptr);
-}
-
-static gboolean buffer_hash_equal(gconstpointer _a, gconstpointer _b) {
- buffer *a = (buffer *)_a;
- buffer *b = (buffer *)_b;
-
- return buffer_is_equal(a, b);
-}
-
-static void buffer_hash_free(gpointer d) {
- buffer *b = d;
-
- buffer_free(b);
-}
-#endif
-
-#define CONFIG_CACHE_TTL "sql-vhost.cache-ttl"
-#define CONFIG_DEBUG "sql-vhost.debug"
-
-/* set configuration values */
-SERVER_FUNC(mod_sql_vhost_core_set_defaults) {
- plugin_data *p = p_d;
-
- size_t i = 0;
-
- config_values_t cv[] = {
- { "sql-vhost.db", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 0 * e.g. vhost */
- { "sql-vhost.user", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 1 * lighty */
- { "sql-vhost.pass", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 2 * secrect */
- { "sql-vhost.sock", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 3 * /tmp/mysql.sock */
- { "sql-vhost.select-vhost", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 4 * SELECT ... FROM hosts WHERE hostname = ? */
- { "sql-vhost.hostname", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 5 * 127.0.0.1 */
- { "sql-vhost.port", NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_SERVER }, /* 6 * 3306 */
- { "sql-vhost.backend", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 7 * mysql */
-
- /* backward compat */
- { "mysql-vhost.db", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 8 == 0 */
- { "mysql-vhost.user", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 9 == 1 */
- { "mysql-vhost.pass", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 10 == 2 */
- { "mysql-vhost.sock", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 11 == 3 */
- { "mysql-vhost.sql", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, /* 12 == 4 */
- { "mysql-vhost.hostname", NULL, T_CONFIG_STRING,T_CONFIG_SCOPE_SERVER }, /* 13 == 5 */
- { "mysql-vhost.port", NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_SERVER }, /* 14 == 6 */
-
- { CONFIG_CACHE_TTL, NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_SERVER }, /* 15 * 60 */
- { CONFIG_DEBUG, NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_SERVER }, /* 15 * 60 */
-
- { NULL, NULL, T_CONFIG_UNSET, T_CONFIG_SCOPE_UNSET }
- };
-
- p->config_storage = calloc(1, srv->config_context->used * sizeof(specific_config *));
-
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s;
-
- s = calloc(1, sizeof(plugin_config));
- s->db = buffer_init();
- s->user = buffer_init();
- s->pass = buffer_init();
- s->sock = buffer_init();
- s->hostname = buffer_init();
- s->backend = buffer_init();
- s->port = 0; /* default port for mysql */
- s->select_vhost = buffer_init();
- s->backend_data = NULL;
-#ifdef HAVE_GLIB_H
- s->vhost_table = g_hash_table_new_full(buffer_hash, buffer_hash_equal, buffer_hash_free, cached_vhost_free_hash);
-#endif
- s->cache_ttl = 60;
- s->debug = 0;
-
- cv[0].destination = s->db;
- cv[1].destination = s->user;
- cv[2].destination = s->pass;
- cv[3].destination = s->sock;
- cv[4].destination = s->select_vhost;
- cv[5].destination = s->hostname;
- cv[6].destination = &(s->port);
- cv[7].destination = s->backend;
-
- /* backend compat */
- cv[8].destination = cv[0].destination;
- cv[9].destination = cv[1].destination;
- cv[10].destination = cv[2].destination;
- cv[11].destination = cv[3].destination;
- cv[12].destination = cv[4].destination;
- cv[13].destination = cv[5].destination;
- cv[14].destination = cv[6].destination;
-
- cv[15].destination = &(s->cache_ttl);
- cv[16].destination = &(s->debug);
-
- p->config_storage[i] = s;
-
- if (config_insert_values_global(srv,
- ((data_config *)srv->config_context->data[i])->value,
- cv)) return HANDLER_ERROR;
-
- /* we only parse the config, the backend plugin will patch itself into the plugin-struct */
- }
-
- return HANDLER_GO_ON;
-}
-
-static int mod_sql_vhost_core_patch_connection(server *srv, connection *con, plugin_data *p) {
- size_t i, j;
- plugin_config *s = p->config_storage[0];
-
- PATCH_OPTION(backend_data);
- PATCH_OPTION(get_vhost);
-#ifdef HAVE_GLIB_H
- PATCH_OPTION(vhost_table);
-#endif
- PATCH_OPTION(cache_ttl);
- PATCH_OPTION(debug);
-
- /* skip the first, the global context */
- for (i = 1; i < srv->config_context->used; i++) {
- data_config *dc = (data_config *)srv->config_context->data[i];
- s = p->config_storage[i];
-
- /* condition didn't match */
- if (!config_check_cond(srv, con, dc)) continue;
-
- if (s->backend_data) {
- PATCH_OPTION(backend_data);
- PATCH_OPTION(get_vhost);
-#ifdef HAVE_GLIB_H
- PATCH_OPTION(vhost_table);
-#endif
- }
-
- for (j = 0; j < dc->value->used; j++) {
- data_unset *du = dc->value->data[j];
-
- if (buffer_is_equal_string(du->key, CONST_STR_LEN(CONFIG_CACHE_TTL))) {
- PATCH_OPTION(cache_ttl);
- } else if (buffer_is_equal_string(du->key, CONST_STR_LEN(CONFIG_DEBUG))) {
- PATCH_OPTION(debug);
- }
- }
- }
-
- return 0;
-}
-
-/* handle document root request
- *
- * glib: if available we cache the entries
- *
- * */
-CONNECTION_FUNC(mod_sql_vhost_core_handle_docroot) {
- plugin_data *p = p_d;
- stat_cache_entry *sce;
-#ifdef HAVE_GLIB_H
- cached_vhost *vhost = NULL;
-#endif
-
- /* no host specified? */
- if (!con->uri.authority->used) return HANDLER_GO_ON;
-
- mod_sql_vhost_core_patch_connection(srv, con, p);
-
- /* do we have backend ? */
- if (!p->conf.get_vhost) return HANDLER_GO_ON;
-
-#ifdef HAVE_GLIB_H
- if (p->conf.cache_ttl == 0 || /* 1. we don't cache */
- NULL == (vhost = g_hash_table_lookup(p->conf.vhost_table, con->uri.authority)) || /* 2. check if the host is already known */
- srv->cur_ts - vhost->added_ts >= p->conf.cache_ttl
- ) { /* 3. the cache value is old */
- /* ask the backend for the data */
- if (p->conf.debug) TRACE("cache-miss for %s", SAFE_BUF_STR(con->uri.authority));
-
- if (HANDLER_GO_ON != p->conf.get_vhost(srv, con, p->conf.backend_data, p->docroot, p->host)) {
- return HANDLER_GO_ON;
- }
-
- if (p->conf.cache_ttl > 0) {
- /* check if the cache-ttl is > 0, otherwise we would always trash the cache-entry */
- if (vhost) {
- if (p->conf.debug) TRACE("refreshing %s: %s", SAFE_BUF_STR(con->uri.authority), SAFE_BUF_STR(p->docroot));
- buffer_copy_string_buffer(vhost->docroot, p->docroot);
- vhost->added_ts = srv->cur_ts;
- } else {
- buffer *key;
-
- vhost = g_new0(cached_vhost, 1);
- vhost->docroot = buffer_init_buffer(p->docroot);
- vhost->added_ts = srv->cur_ts;
- vhost->ttl = p->conf.cache_ttl;
-
- key = buffer_init_buffer(con->uri.authority);
-
- if (p->conf.debug) TRACE("adding %s: %s", SAFE_BUF_STR(key), SAFE_BUF_STR(vhost->docroot));
-
- g_hash_table_insert(p->conf.vhost_table, key, vhost);
-
- g_assert(g_hash_table_lookup(p->conf.vhost_table, key));
- }
- }
- } else {
- if (p->conf.debug) TRACE("cache-hit for %s: %s", SAFE_BUF_STR(vhost->docroot), SAFE_BUF_STR(con->uri.authority));
-
- buffer_copy_string_buffer(p->docroot, vhost->docroot);
- }
-#else
- if (HANDLER_GO_ON != p->conf.get_vhost(srv, con, p->conf.backend_data, p->docroot, p->host)) {
- return HANDLER_GO_ON;
- }
-#endif
-
- if (HANDLER_ERROR == stat_cache_get_entry(srv, con, p->docroot, &sce)) {
- ERROR("stat_cache_get_entry(%s) failed: %s", SAFE_BUF_STR(p->docroot), strerror(errno));
-
- return HANDLER_GO_ON;
- }
- if (!S_ISDIR(sce->st.st_mode)) {
- ERROR("%s is not a dir", SAFE_BUF_STR(p->docroot));
-
- return HANDLER_GO_ON;
- }
-
- buffer_copy_string_buffer(con->server_name, p->host);
- buffer_copy_string_buffer(con->physical.doc_root, p->docroot);
-
- return HANDLER_GO_ON;
-}
-
-#if 0
-#ifdef HAVE_GLIB_H
-static gboolean cached_vhost_remove_expired(gpointer _key, gpointer _val, gpointer data) {
-// buffer *key = _key;
- cached_vhost *val = _val;
- server *srv = data;
- UNUSED(_key);
-
- return (srv->cur_ts - val->added_ts > val->ttl);
-}
-#endif
-
-TRIGGER_FUNC(mod_sql_vhost_core_trigger) {
- plugin_data *p = p_d;
- size_t i;
-
- /* test once every 10 seconds */
- if (srv->cur_ts % 10 != 0) return HANDLER_GO_ON;
-
-#ifdef HAVE_GLIB_H
- /* cleanup all caches */
- for (i = 0; i < srv->config_context->used; i++) {
- plugin_config *s = p->config_storage[i];
-
- if (s->vhost_table) {
- g_hash_table_foreach_remove(s->vhost_table, cached_vhost_remove_expired, srv);
- }
- }
-#endif
-
- return HANDLER_GO_ON;
-}
-#endif
-
-/* this function is called at dlopen() time and inits the callbacks */
-LI_EXPORT int mod_sql_vhost_core_plugin_init(plugin *p);
-LI_EXPORT int mod_sql_vhost_core_plugin_init(plugin *p) {
- p->version = LIGHTTPD_VERSION_ID;
- p->name = buffer_init_string("mod_sql_vhost_core");
-
- p->init = mod_sql_vhost_core_init;
- p->cleanup = mod_sql_vhost_core_cleanup;
-
- p->set_defaults = mod_sql_vhost_core_set_defaults;
- p->handle_docroot = mod_sql_vhost_core_handle_docroot;
-
- return 0;
-}
-