diff options
Diffstat (limited to 'src/mod_mysql_vhost.c')
-rw-r--r-- | src/mod_mysql_vhost.c | 309 |
1 files changed, 0 insertions, 309 deletions
diff --git a/src/mod_mysql_vhost.c b/src/mod_mysql_vhost.c deleted file mode 100644 index 68b65d52..00000000 --- a/src/mod_mysql_vhost.c +++ /dev/null @@ -1,309 +0,0 @@ -#include <stdio.h> -#include <errno.h> -#include <fcntl.h> -#include <string.h> - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifdef HAVE_MYSQL_H -# ifdef HAVE_LIBMYSQL -# define HAVE_MYSQL -# endif -#endif - -#ifdef HAVE_MYSQL -#include <mysql.h> -#endif - -#include "plugin.h" -#include "log.h" - -#include "stat_cache.h" -#include "sys-files.h" - -#include "mod_sql_vhost_core.h" - -#ifdef HAVE_MYSQL - -#define CORE_PLUGIN "mod_sql_vhost_core" - -typedef struct { - MYSQL *mysql; - - buffer *mysql_pre; - buffer *mysql_post; - - mod_sql_vhost_core_plugin_config *core; -} plugin_config; - -/* global plugin data */ -typedef struct { - PLUGIN_DATA; - - buffer *tmp_buf; - - plugin_config **config_storage; - - plugin_config conf; -} plugin_data; - -SQLVHOST_BACKEND_GETVHOST(mod_mysql_vhost_get_vhost); - -/* init the plugin data */ -INIT_FUNC(mod_mysql_vhost_init) { - plugin_data *p; - - UNUSED(srv); - - p = calloc(1, sizeof(*p)); - - p->tmp_buf = buffer_init(); - - return p; -} - -/* cleanup the plugin data */ -SERVER_FUNC(mod_mysql_vhost_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; - - mysql_close(s->mysql); - - buffer_free(s->mysql_pre); - buffer_free(s->mysql_post); - - free(s); - } - free(p->config_storage); - } - buffer_free(p->tmp_buf); - - free(p); - - return HANDLER_GO_ON; -} - -/* set configuration values */ -SERVER_FUNC(mod_mysql_vhost_set_defaults) { - plugin_data *p = p_d; - mod_sql_vhost_core_plugin_data *core_config; - - size_t i = 0; - - /* our very own plugin storage, one entry for each conditional - * - * srv->config_context->used is the number of conditionals - * */ - p->config_storage = calloc(1, srv->config_context->used * sizeof(specific_config *)); - - /* get the config of the core-plugin */ - core_config = plugin_get_config(srv, CORE_PLUGIN); - - /* walk through all conditionals and check for assignments */ - for (i = 0; i < srv->config_context->used; i++) { - plugin_config *s; - buffer *sel; - char *qmark; - - /* get the config from the core plugin for this conditional-context */ - s = calloc(1, sizeof(plugin_config)); - - s->core = core_config->config_storage[i]; - - s->mysql = NULL; - - s->mysql_pre = buffer_init(); - s->mysql_post = buffer_init(); - - p->config_storage[i] = s; - - /* check if we are the plugin for this backend */ - if (!buffer_is_equal_string(s->core->backend, CONST_STR_LEN("mysql"))) continue; - - /* attach us to the core-plugin */ - s->core->backend_data = p; - s->core->get_vhost = mod_mysql_vhost_get_vhost; - - sel = buffer_init(); - buffer_copy_string_buffer(sel, s->core->select_vhost); - - if (sel->used && (qmark = strchr(sel->ptr, '?'))) { - *qmark = '\0'; - buffer_copy_string(s->mysql_pre, sel->ptr); - buffer_copy_string(s->mysql_post, qmark+1); - } else { - buffer_copy_string_buffer(s->mysql_pre, sel); - } - buffer_free(sel); - - /* required: - * - username - * - database - * - * optional: - * - password, default: empty - * - socket, default: mysql default - * - hostname, if set overrides socket - * - port, default: 3306 - */ - - /* all have to be set */ - if (!(buffer_is_empty(s->core->user) || - buffer_is_empty(s->core->db))) { - - int fd; - - if (NULL == (s->mysql = mysql_init(NULL))) { - log_error_write(srv, __FILE__, __LINE__, "s", "mysql_init() failed, exiting..."); - - return HANDLER_ERROR; - } - -#if MYSQL_VERSION_ID >= 50003 - /* in mysql versions above 5.0.3 the reconnect flag is off by default */ - { - my_bool reconnect = 1; - mysql_options(s->mysql, MYSQL_OPT_RECONNECT, &reconnect); - } -#endif - -#define FOO(x) (s->core->x->used ? s->core->x->ptr : NULL) - - s->mysql->free_me = 1; - - if (!mysql_real_connect(s->mysql, FOO(hostname), FOO(user), FOO(pass), - FOO(db), s->core->port, FOO(sock), 0)) { - log_error_write(srv, __FILE__, __LINE__, "s", mysql_error(s->mysql)); - - return HANDLER_ERROR; - } -#undef FOO - /* set close_on_exec for mysql the hard way */ - /* Note: this only works as it is done during startup, */ - /* otherwise we cannot be sure that mysql is fd i-1 */ - if (-1 == (fd = open("/dev/null", 0))) { - close(fd); - fcntl(fd-1, F_SETFD, FD_CLOEXEC); - } - } - } - - - - return HANDLER_GO_ON; -} - -static int mod_mysql_vhost_patch_connection(server *srv, connection *con, plugin_data *p) { - size_t i; - plugin_config *s = p->config_storage[0]; - - PATCH_OPTION(mysql_pre); - PATCH_OPTION(mysql_post); - PATCH_OPTION(mysql); - - /* 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->mysql) { - PATCH_OPTION(mysql); - PATCH_OPTION(mysql_pre); - PATCH_OPTION(mysql_post); - } - } - - return 0; -} - -/** - * get the vhost info from the database - */ -SQLVHOST_BACKEND_GETVHOST(mod_mysql_vhost_get_vhost) { - plugin_data *p = p_d; - unsigned cols; - MYSQL_ROW row; - MYSQL_RES *result = NULL; - - UNUSED(host); - - /* no host specified? */ - if (!con->uri.authority->used) return HANDLER_ERROR; - - mod_mysql_vhost_patch_connection(srv, con, p); - - if (!p->conf.mysql) return HANDLER_ERROR; - - /* build and run SQL query */ - buffer_copy_string_buffer(p->tmp_buf, p->conf.mysql_pre); - if (p->conf.mysql_post->used) { - buffer_append_string_buffer(p->tmp_buf, con->uri.authority); - buffer_append_string_buffer(p->tmp_buf, p->conf.mysql_post); - } - if (mysql_query(p->conf.mysql, BUF_STR(p->tmp_buf))) { - ERROR("mysql_query(%s) failed: %s", SAFE_BUF_STR(p->tmp_buf), mysql_error(p->conf.mysql)); - - mysql_free_result(result); - return HANDLER_ERROR; - } - result = mysql_store_result(p->conf.mysql); - cols = mysql_num_fields(result); - row = mysql_fetch_row(result); - - if (!row || cols < 1) { - /* no such virtual host */ - mysql_free_result(result); - return HANDLER_ERROR; - } - - buffer_copy_string(docroot, row[0]); - - mysql_free_result(result); - - return HANDLER_GO_ON; -} - -/* this function is called at dlopen() time and inits the callbacks */ -LI_EXPORT int mod_mysql_vhost_plugin_init(plugin *p); -LI_EXPORT int mod_mysql_vhost_plugin_init(plugin *p) { - data_string *ds; - - p->version = LIGHTTPD_VERSION_ID; - p->name = buffer_init_string("mysql_vhost"); - - p->init = mod_mysql_vhost_init; - p->cleanup = mod_mysql_vhost_cleanup; - - p->set_defaults = mod_mysql_vhost_set_defaults; - - ds = data_string_init(); - buffer_copy_string_len(ds->value, CONST_STR_LEN(CORE_PLUGIN)); - array_insert_unique(p->required_plugins, (data_unset *)ds); - - return 0; -} -#else -/* we don't have mysql support, this plugin does nothing */ -LI_EXPORT int mod_mysql_vhost_plugin_init(plugin *p); -LI_EXPORT int mod_mysql_vhost_plugin_init(plugin *p) { - p->version = LIGHTTPD_VERSION_ID; - p->name = buffer_init_string("mysql_vhost"); - - return 0; -} -#endif |