Index: proftpd/contrib/mod_sql.c
===================================================================
RCS file: /cvsroot/proftp/proftpd/contrib/mod_sql.c,v
retrieving revision 1.212
diff -u -r1.212 mod_sql.c
--- proftpd/contrib/mod_sql.c 12 Apr 2011 22:47:46 -0000 1.212
+++ proftpd/contrib/mod_sql.c 15 Apr 2011 17:29:27 -0000
@@ -256,6 +256,7 @@
struct sql_named_conn *next, *prev;
const char *conn_name;
const char *backend;
+ unsigned int conn_policy;
};
static struct sql_named_conn *sql_named_conns = NULL;
@@ -5588,6 +5589,32 @@
/* Event handlers
*/
+static void sql_chroot_ev(const void *event_data, void *user_data) {
+ /* Loop through our list of named connections, making sure that any
+ * with a connection policy of PERSESSION are opened.
+ */
+ if (sql_named_conns != NULL) {
+ pool *tmp_pool;
+ struct sql_named_conn *snc;
+
+ tmp_pool = make_sub_pool(session.pool);
+
+ for (snc = sql_named_conns; snc; snc = snc->next) {
+ if (snc->conn_policy == SQL_CONN_POLICY_PERSESSION) {
+ cmd_rec *cmd;
+ modret_t *mr;
+
+ cmd = _sql_make_cmd(tmp_pool, 1, snc->conn_name);
+ mr = _sql_dispatch(cmd, "sql_open");
+ (void) check_response(mr);
+ SQL_FREE_CMD(cmd);
+ }
+ }
+
+ destroy_pool(tmp_pool);
+ }
+}
+
static void sql_exit_ev(const void *event_data, void *user_data) {
config_rec *c;
cmd_rec *cmd;
@@ -6113,11 +6140,11 @@
if (get_named_conn_backend(conn_name) == NULL) {
pr_sql_conn_policy = SQL_CONN_POLICY_PERSESSION;
- if (strcasecmp(c->argv[5], "perconn") == 0 ||
- strcasecmp(c->argv[5], "perconnection") == 0) {
+ if (strncasecmp(c->argv[5], "perconn", 8) == 0 ||
+ strncasecmp(c->argv[5], "perconnection", 14) == 0) {
pr_sql_conn_policy = SQL_CONN_POLICY_PERCONN;
- } else if (strcasecmp(c->argv[5], "percall") == 0) {
+ } else if (strncasecmp(c->argv[5], "percall", 8) == 0) {
pr_sql_conn_policy = SQL_CONN_POLICY_PERCALL;
}
@@ -6129,17 +6156,12 @@
return -1;
}
- /* Restore the default connection policy. */
- pr_sql_conn_policy = default_conn_policy;
-
- sql_log(DEBUG_INFO, "connection '%s' successfully established",
- conn_name );
-
/* Add the mapping of the connection name to the backend to the
* lookup list.
*/
snc = pcalloc(sql_pool, sizeof(struct sql_named_conn));
snc->conn_name = conn_name;
+ snc->conn_policy = pr_sql_conn_policy;
snc->backend = c->argv[1];
if (sql_named_conns != NULL) {
@@ -6149,6 +6171,12 @@
sql_named_conns = snc;
+ /* Restore the default connection policy. */
+ pr_sql_conn_policy = default_conn_policy;
+
+ sql_log(DEBUG_INFO, "connection '%s' successfully established",
+ conn_name );
+
} else {
sql_log(DEBUG_INFO, MOD_SQL_VERSION
": unable to open SQLNamedConnectInfo '%s': another connection "
@@ -6255,7 +6283,7 @@
destroy_pool(tmp_pool);
- /* Add our exit handler */
+ pr_event_register(&sql_module, "core.chroot", sql_chroot_ev, NULL);
pr_event_register(&sql_module, "core.exit", sql_exit_ev, NULL);
return 0;