|
|
|
@ -28,15 +28,18 @@
|
|
|
|
|
* /ada@riksnet.se 2004-12-06 |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
typedef struct { |
|
|
|
|
#ifdef HAVE_MYSQL |
|
|
|
|
typedef struct { |
|
|
|
|
MYSQL *mysql; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
buffer *mydb; |
|
|
|
|
buffer *myuser; |
|
|
|
|
buffer *mypass; |
|
|
|
|
buffer *mysock; |
|
|
|
|
|
|
|
|
|
buffer *hostname; |
|
|
|
|
unsigned short port; |
|
|
|
|
|
|
|
|
|
buffer *mysql_pre; |
|
|
|
|
buffer *mysql_post; |
|
|
|
|
} plugin_config; |
|
|
|
@ -87,9 +90,9 @@ SERVER_FUNC(mod_mysql_vhost_cleanup) {
|
|
|
|
|
size_t i; |
|
|
|
|
for (i = 0; i < srv->config_context->used; i++) { |
|
|
|
|
plugin_config *s = p->config_storage[i]; |
|
|
|
|
#ifdef HAVE_MYSQL |
|
|
|
|
|
|
|
|
|
mysql_close(s->mysql); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
buffer_free(s->mydb); |
|
|
|
|
buffer_free(s->myuser); |
|
|
|
|
buffer_free(s->mypass); |
|
|
|
@ -165,11 +168,13 @@ SERVER_FUNC(mod_mysql_vhost_set_defaults) {
|
|
|
|
|
size_t i = 0; |
|
|
|
|
|
|
|
|
|
config_values_t cv[] = { |
|
|
|
|
{ "mysql-vhost.db", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER },
|
|
|
|
|
{ "mysql-vhost.db", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, |
|
|
|
|
{ "mysql-vhost.user", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, |
|
|
|
|
{ "mysql-vhost.pass", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER },
|
|
|
|
|
{ "mysql-vhost.sock", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER },
|
|
|
|
|
{ "mysql-vhost.sql", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER },
|
|
|
|
|
{ "mysql-vhost.pass", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, |
|
|
|
|
{ "mysql-vhost.sock", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, |
|
|
|
|
{ "mysql-vhost.sql", NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_SERVER }, |
|
|
|
|
{ "mysql-vhost.hostname", NULL, T_CONFIG_STRING,T_CONFIG_SCOPE_SERVER }, |
|
|
|
|
{ "mysql-vhost.port", NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_SERVER }, |
|
|
|
|
{ NULL, NULL, T_CONFIG_UNSET, T_CONFIG_SCOPE_UNSET } |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
@ -185,10 +190,10 @@ SERVER_FUNC(mod_mysql_vhost_set_defaults) {
|
|
|
|
|
s->myuser = buffer_init(); |
|
|
|
|
s->mypass = buffer_init(); |
|
|
|
|
s->mysock = buffer_init(); |
|
|
|
|
s->hostname = buffer_init(); |
|
|
|
|
s->port = 0; /* default port for mysql */ |
|
|
|
|
sel = buffer_init(); |
|
|
|
|
#ifdef HAVE_MYSQL |
|
|
|
|
s->mysql = NULL; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
s->mysql_pre = buffer_init(); |
|
|
|
|
s->mysql_post = buffer_init(); |
|
|
|
@ -198,6 +203,8 @@ SERVER_FUNC(mod_mysql_vhost_set_defaults) {
|
|
|
|
|
cv[2].destination = s->mypass; |
|
|
|
|
cv[3].destination = s->mysock; |
|
|
|
|
cv[4].destination = sel; |
|
|
|
|
cv[5].destination = s->hostname; |
|
|
|
|
cv[6].destination = &(s->port); |
|
|
|
|
|
|
|
|
|
p->config_storage[i] = s; |
|
|
|
|
|
|
|
|
@ -216,12 +223,21 @@ SERVER_FUNC(mod_mysql_vhost_set_defaults) {
|
|
|
|
|
buffer_copy_string_buffer(s->mysql_pre, 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->myuser) || |
|
|
|
|
buffer_is_empty(s->mypass) || |
|
|
|
|
buffer_is_empty(s->mydb) || |
|
|
|
|
buffer_is_empty(s->mysock))) { |
|
|
|
|
#ifdef HAVE_MYSQL |
|
|
|
|
buffer_is_empty(s->mydb))) { |
|
|
|
|
|
|
|
|
|
int fd; |
|
|
|
|
|
|
|
|
|
if (NULL == (s->mysql = mysql_init(NULL))) { |
|
|
|
@ -229,14 +245,15 @@ SERVER_FUNC(mod_mysql_vhost_set_defaults) {
|
|
|
|
|
|
|
|
|
|
return HANDLER_ERROR; |
|
|
|
|
} |
|
|
|
|
#define FOO(x) (s->x->used ? s->x->ptr : NULL) |
|
|
|
|
|
|
|
|
|
if (!mysql_real_connect(s->mysql, NULL, s->myuser->ptr, s->mypass->ptr,
|
|
|
|
|
s->mydb->ptr, 0, s->mysock->ptr, 0)) { |
|
|
|
|
if (!mysql_real_connect(s->mysql, FOO(hostname), FOO(myuser), FOO(mypass),
|
|
|
|
|
FOO(mydb), s->port, FOO(mysock), 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 */ |
|
|
|
@ -244,7 +261,6 @@ SERVER_FUNC(mod_mysql_vhost_set_defaults) {
|
|
|
|
|
close(fd); |
|
|
|
|
fcntl(fd-1, F_SETFD, FD_CLOEXEC);
|
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -279,11 +295,9 @@ static int mod_mysql_vhost_patch_connection(server *srv, connection *con, plugin
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef HAVE_MYSQL |
|
|
|
|
if (s->mysql) { |
|
|
|
|
PATCH(mysql); |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
@ -297,9 +311,7 @@ static int mod_mysql_vhost_setup_connection(server *srv, connection *con, plugin
|
|
|
|
|
|
|
|
|
|
PATCH(mysql_pre); |
|
|
|
|
PATCH(mysql_post); |
|
|
|
|
#ifdef HAVE_MYSQL |
|
|
|
|
PATCH(mysql); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
@ -308,7 +320,6 @@ static int mod_mysql_vhost_setup_connection(server *srv, connection *con, plugin
|
|
|
|
|
|
|
|
|
|
/* handle document root request */ |
|
|
|
|
CONNECTION_FUNC(mod_mysql_vhost_handle_docroot) { |
|
|
|
|
#ifdef HAVE_MYSQL |
|
|
|
|
plugin_data *p = p_d; |
|
|
|
|
plugin_connection_data *c; |
|
|
|
|
|
|
|
|
@ -399,13 +410,6 @@ GO_ON: buffer_copy_string_buffer(con->server_name, c->server_name);
|
|
|
|
|
ERR500: if (result) mysql_free_result(result); |
|
|
|
|
con->http_status = 500; /* Internal Error */ |
|
|
|
|
return HANDLER_FINISHED; |
|
|
|
|
#else |
|
|
|
|
UNUSED(srv); |
|
|
|
|
UNUSED(con); |
|
|
|
|
UNUSED(p_d); |
|
|
|
|
|
|
|
|
|
return HANDLER_ERROR; |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* this function is called at dlopen() time and inits the callbacks */ |
|
|
|
@ -422,4 +426,12 @@ int mod_mysql_vhost_plugin_init(plugin *p) {
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
#else |
|
|
|
|
/* we don't have mysql support, this plugin does nothing */ |
|
|
|
|
int mod_mysql_vhost_plugin_init(plugin *p) { |
|
|
|
|
p->version = LIGHTTPD_VERSION_ID; |
|
|
|
|
p->name = buffer_init_string("mysql_vhost"); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|