Index: cdr_addon_mysql.c =================================================================== --- cdr_addon_mysql.c (revision 260) +++ cdr_addon_mysql.c (working copy) @@ -14,6 +14,10 @@ * Added an automatic reconnect as to not lose a cdr record * Cleaned up the original code to match the coding guidelines * + * Modified Juli 2006 + * Martin Portmann + * Added mysql ssl support + * * This program is free software, distributed under the terms of * the GNU General Public License. * @@ -48,7 +52,9 @@ static char *name = "mysql"; static char *config = "cdr_mysql.conf"; static char *hostname = NULL, *dbname = NULL, *dbuser = NULL, *password = NULL, *dbsock = NULL, *dbtable = NULL; +static char *ssl_ca = NULL, *ssl_cert = NULL, *ssl_key = NULL; static int hostname_alloc = 0, dbname_alloc = 0, dbuser_alloc = 0, password_alloc = 0, dbsock_alloc = 0, dbtable_alloc = 0; +static int ssl_ca_alloc = 0, ssl_cert_alloc = 0, ssl_key_alloc = 0; static int dbport = 0; static int connected = 0; static time_t connect_time = 0; @@ -136,7 +142,10 @@ if (timeout && mysql_options(&mysql, MYSQL_OPT_CONNECT_TIMEOUT, (char *)&timeout)!=0) { ast_log(LOG_ERROR, "cdr_mysql: mysql_options returned (%d) %s\n", mysql_errno(&mysql), mysql_error(&mysql)); } - if (mysql_real_connect(&mysql, hostname, dbuser, password, dbname, dbport, dbsock, 0)) { + if (ssl_ca || ssl_cert || ssl_key) { + mysql_ssl_set (&mysql, ssl_key, ssl_cert, ssl_ca, NULL, NULL); + } + if (mysql_real_connect(&mysql, hostname, dbuser, password, dbname, dbport, dbsock, ssl_ca ? CLIENT_SSL : 0)) { connected = 1; connect_time = time(NULL); records = 0; @@ -278,6 +287,21 @@ password = NULL; password_alloc = 0; } + if (ssl_ca && ssl_ca_alloc) { + free (ssl_ca); + ssl_ca = NULL; + ssl_ca_alloc = 0; + } + if (ssl_cert && ssl_cert_alloc) { + free (ssl_cert); + ssl_cert = NULL; + ssl_cert_alloc = 0; + } + if (ssl_key && ssl_key_alloc) { + free (ssl_key); + ssl_key = NULL; + ssl_key_alloc = 0; + } dbport = 0; ast_cdr_unregister(name); return 0; @@ -415,6 +439,42 @@ userfield = 0; } } + + tmp = ast_variable_retrieve(cfg, "global", "ssl_ca"); + if (tmp) { + ssl_ca = malloc (strlen(tmp) + 1); + if (ssl_ca) { + ssl_ca_alloc = 1; + strcpy(ssl_ca, tmp); + } else { + ast_log(LOG_ERROR, "Out of memory error.\n"); + return -1; + } + } + + tmp = ast_variable_retrieve(cfg, "global", "ssl_cert"); + if (tmp) { + ssl_cert = malloc (strlen(tmp) + 1); + if (ssl_cert) { + ssl_cert_alloc = 1; + strcpy(ssl_cert, tmp); + } else { + ast_log(LOG_ERROR, "Out of memory error.\n"); + return -1; + } + } + + tmp = ast_variable_retrieve(cfg, "global", "ssl_key"); + if (tmp) { + ssl_key = malloc (strlen(tmp) + 1); + if (ssl_key) { + ssl_key_alloc = 1; + strcpy(ssl_key, tmp); + } else { + ast_log(LOG_ERROR, "Out of memory error.\n"); + return -1; + } + } ast_config_destroy(cfg); @@ -433,7 +493,11 @@ ast_log(LOG_ERROR, "cdr_mysql: mysql_options returned (%d) %s\n", mysql_errno(&mysql), mysql_error(&mysql)); } - if (!mysql_real_connect(&mysql, hostname, dbuser, password, dbname, dbport, dbsock, 0)) { + if (ssl_ca || ssl_cert || ssl_key) { + mysql_ssl_set (&mysql, ssl_key, ssl_cert, ssl_ca, NULL, NULL); + } + + if (!mysql_real_connect(&mysql, hostname, dbuser, password, dbname, dbport, dbsock, ssl_ca ? CLIENT_SSL : 0)) { ast_log(LOG_ERROR, "Failed to connect to mysql database %s on %s.\n", dbname, hostname); connected = 0; records = 0;