summaryrefslogtreecommitdiff
path: root/ftp/proftpd/files/patch-ba
diff options
context:
space:
mode:
Diffstat (limited to 'ftp/proftpd/files/patch-ba')
-rw-r--r--ftp/proftpd/files/patch-ba253
1 files changed, 253 insertions, 0 deletions
diff --git a/ftp/proftpd/files/patch-ba b/ftp/proftpd/files/patch-ba
new file mode 100644
index 000000000000..b1d054b52edc
--- /dev/null
+++ b/ftp/proftpd/files/patch-ba
@@ -0,0 +1,253 @@
+--- contrib/mod_mysql.c.old Sun Feb 11 19:47:54 2001
++++ contrib/mod_mysql.c Sun Feb 11 19:45:37 2001
+@@ -0,0 +1,250 @@
++/*
++ * ProFTPD: mod_mysql -- Support for connecting to MySQL databases.
++ * Time-stamp: <1999-10-04 03:21:21 root>
++ * Copyright (c) 1998-1999 Johnie Ingram.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
++ */
++
++#define MOD_MYSQL_VERSION "mod_mysql/2.0"
++
++/* -- DO NOT MODIFY THE LINE BELOW UNLESS YOU FEEL LIKE IT --
++ * $Libraries: -lm -lmysqlclient $
++ */
++
++/* This is mod_mysql, contrib software for proftpd 1.2.0pre3 and above.
++ For more information contact Johnie Ingram <johnie@netgod.net>.
++
++ History Log:
++
++ * 1999-09-19: v2.0: Most directives split into mod_sql; invented API.
++
++*/
++
++#include "conf.h"
++#include <mysql.h>
++
++/* *INDENT-OFF* */
++
++static MYSQL mod_mysql_server;
++static MYSQL *mysqldb = 0;
++
++/* Maximum username field to expect, etc. */
++#define ARBITRARY_MAX 128
++
++static struct
++{
++ char *sql_host; /* Data for connecting, set by MySQLInfo. */
++ char *sql_user;
++ char *sql_pass;
++ char *sql_dbname;
++
++ int ok;
++ int opens;
++} g;
++
++/* *INDENT-ON* */
++
++/* **************************************************************** */
++
++MODRET
++sql_cmd_close (cmd_rec * cmd)
++{
++ log_debug (DEBUG5, "mysql: close [%i] for %s", g.opens, cmd->argv[0]);
++
++ if (!g.ok || g.opens--)
++ return DECLINED (cmd);
++
++ if (mysqldb)
++ {
++ log_debug (DEBUG4, "mysql: disconnecting: %s", mysql_stat (mysqldb));
++ mysql_close (mysqldb);
++ }
++ mysqldb = NULL;
++ return DECLINED (cmd);
++}
++
++MODRET
++sql_cmd_open (cmd_rec * cmd)
++{
++ if (!g.ok)
++ return DECLINED (cmd);
++
++ g.opens++;
++ log_debug (DEBUG5, "mysql: open [%i] for %s", g.opens, cmd->argv[0]);
++ if (g.opens > 1)
++ return HANDLED (cmd);
++
++ if (!(mysqldb = mysql_connect (&mod_mysql_server, g.sql_host,
++ g.sql_user, g.sql_pass)))
++ {
++ log_pri (LOG_ERR, "mysql: client %s connect FAILED to %s@%s",
++ mysql_get_client_info (), g.sql_user, g.sql_host);
++ g.ok = FALSE;
++ g.opens = 0;
++ return DECLINED (cmd);
++ }
++ log_debug (DEBUG5, "mysql: connect OK %s -> %s (%s@%s)",
++ mysql_get_client_info (), mysql_get_server_info (mysqldb),
++ g.sql_user, g.sql_host);
++
++ return HANDLED (cmd);
++}
++
++MODRET
++_do_query (cmd_rec * cmd, const char *query, int update)
++{
++ int error = 1;
++
++ if (!g.ok)
++ return DECLINED (cmd);
++
++ block_signals ();
++
++ /* This forces a quick ping of the remote server, so we know if its there. */
++ if (mysqldb)
++ mysql_select_db (mysqldb, g.sql_dbname);
++
++ if (!mysqldb
++ || ((error = mysql_query (mysqldb, query))
++ && !strcasecmp (mysql_error (mysqldb), "mysql server has gone")))
++ {
++ /* We need to restart the server link. */
++ if (mysqldb)
++ log_pri (LOG_ERR, "mysql: server has wandered off (%s/%s)",
++ g.sql_host, g.sql_dbname);
++ sql_cmd_open (cmd);
++ if (!mysqldb)
++ return DECLINED (cmd);
++ error = mysql_select_db (mysqldb, g.sql_dbname)
++ || mysql_query (mysqldb, query);
++ }
++
++ unblock_signals ();
++
++ if (error)
++ {
++ log_debug (DEBUG4, "mysql: %s failed: \"%s\": %s",
++ (update) ? "update" : "select",
++ query, mysql_error (mysqldb));
++ return DECLINED (cmd);
++ }
++
++ log_debug (DEBUG5, "mysql: %s OK: [%s] \"%s\"",
++ (update) ? "update" : "select", g.sql_dbname, query);
++ return HANDLED (cmd);
++}
++
++MODRET
++sql_cmd_update (cmd_rec * cmd)
++{
++ return _do_query (cmd, cmd->argv[1], TRUE);
++}
++
++MODRET
++sql_cmd_select (cmd_rec * cmd)
++{
++ MODRET mr;
++ MYSQL_RES *result;
++ MYSQL_ROW sql_row;
++ int i, j;
++
++ mr = _do_query (cmd, cmd->argv[1], FALSE);
++ if (!MODRET_ISHANDLED (mr))
++ return DECLINED (mr);
++
++ if ((result = mysql_store_result (mysqldb)))
++ {
++ int rcount = mysql_num_rows (result);
++ int fcount = mysql_num_fields (result);
++ int count = rcount * fcount;
++
++ char **data = pcalloc (cmd->tmp_pool, sizeof (char *) * (count + 1));
++ for (i = 0, count = 0; i < rcount; i++)
++ {
++ sql_row = mysql_fetch_row (result);
++ for (j = 0; j < fcount; j++)
++ data[count++] = pstrdup (cmd->tmp_pool, sql_row[j]);
++ }
++ mysql_free_result (result);
++ data[count] = NULL;
++ mr->data = data;
++ }
++ return mr;
++}
++
++static authtable mysql_authtab[] = {
++ {0, "dbd_open", sql_cmd_open},
++ {0, "dbd_close", sql_cmd_close},
++ {0, "dbd_update", sql_cmd_update},
++ {0, "dbd_select", sql_cmd_select},
++
++ {0, NULL, NULL}
++};
++
++/* **************************************************************** */
++
++MODRET set_sqlinfo (cmd_rec * cmd)
++{
++ CHECK_ARGS (cmd, 4);
++ CHECK_CONF (cmd, CONF_ROOT | CONF_GLOBAL | CONF_VIRTUAL);
++ add_config_param_str ("MySQLInfo", 4,
++ (void *) cmd->argv[1], (void *) cmd->argv[2],
++ (void *) cmd->argv[3], (void *) cmd->argv[4]);
++ return HANDLED (cmd);
++}
++
++static conftable mysql_conftab[] = {
++/* *INDENT-OFF* */
++
++ { "MySQLInfo", set_sqlinfo, NULL },
++
++ { 0, NULL }
++
++/* *INDENT-ON* */
++};
++
++/* **************************************************************** */
++
++static int
++mysql_modinit ()
++{
++ config_rec *c;
++
++ memset (&g, 0, sizeof (g));
++ if (!(c = find_config (CURRENT_CONF, CONF_PARAM, "MySQLInfo", FALSE)))
++ return 0;
++
++ g.sql_host = pstrdup (session.pool, c->argv[0]);
++ g.sql_user = pstrdup (session.pool, c->argv[1]);
++ g.sql_pass = pstrdup (session.pool, c->argv[2]);
++ g.sql_dbname = pstrdup (session.pool, c->argv[3]);
++ g.ok = TRUE;
++
++ log_debug (DEBUG5, "%s: configured: db %s at %s@%s",
++ MOD_MYSQL_VERSION, g.sql_dbname, g.sql_user, g.sql_host);
++ return 0;
++}
++
++module mysql_module = {
++ NULL, NULL, /* Always NULL */
++ 0x20, /* API Version 2.0 */
++ "mysql",
++ mysql_conftab, /* SQL configuration handler table */
++ NULL, /* SQL command handler table */
++ mysql_authtab, /* SQL authentication handler table */
++ mysql_modinit, /* Pre-fork "parent-mode" init */
++ mysql_modinit /* Post-fork "child mode" init */
++};