From a159f203b559a406a5489f3ef2a60a61574bbb86 Mon Sep 17 00:00:00 2001 From: Jeremy Harris Date: Sat, 14 Nov 2015 17:32:29 +0000 Subject: [PATCH 1/1] MySQL: support MySQL config file option group names. Bug 1701 --- doc/doc-docbook/spec.xfpt | 14 +++++++++----- doc/doc-txt/ChangeLog | 2 ++ src/src/lookups/mysql.c | 27 ++++++++++++++++++--------- 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/doc/doc-docbook/spec.xfpt b/doc/doc-docbook/spec.xfpt index f505250c8..d7d981ea7 100644 --- a/doc/doc-docbook/spec.xfpt +++ b/doc/doc-docbook/spec.xfpt @@ -7592,13 +7592,17 @@ ${lookup pgsql{servers=master/db/name/pw; UPDATE ...} } .section "Special MySQL features" "SECID73" For MySQL, an empty host name or the use of &"localhost"& in &%mysql_servers%& causes a connection to the server on the local host by means of a Unix domain -socket. An alternate socket can be specified in parentheses. The full syntax of -each item in &%mysql_servers%& is: +socket. An alternate socket can be specified in parentheses. +.new +An option group name for MySQL option files can be specified in square brackets; +the default value is &"exim"&. +.wen +The full syntax of each item in &%mysql_servers%& is: .display -<&'hostname'&>::<&'port'&>(<&'socket name'&>)/<&'database'&>/&&& - <&'user'&>/<&'password'&> +<&'hostname'&>::<&'port'&>(<&'socket name'&>)[<&'option group'&>]/&&& + <&'database'&>/<&'user'&>/<&'password'&> .endd -Any of the three sub-parts of the first field can be omitted. For normal use on +Any of the four sub-parts of the first field can be omitted. For normal use on the local host it can be left blank or set to just &"localhost"&. No database need be supplied &-- but if it is absent here, it must be given in diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog index 22ddaa2af..d650fc1c0 100644 --- a/doc/doc-txt/ChangeLog +++ b/doc/doc-txt/ChangeLog @@ -102,6 +102,8 @@ GF/01 Bug 1715: Fix for race condition in exicyclog, where exim could attempt installations where exicyclog is run as root, rather than exim user; result is that the running daemon panics and dies. +JH/20 Bug 1701: For MySQL lookups, support MySQL config file option group names. + Exim version 4.86 ----------------- diff --git a/src/src/lookups/mysql.c b/src/src/lookups/mysql.c index 1ce8831e8..68b04dcc8 100644 --- a/src/src/lookups/mysql.c +++ b/src/src/lookups/mysql.c @@ -125,42 +125,50 @@ sdata[0] = server; /* What's left at the start */ /* See if we have a cached connection to the server */ -for (cn = mysql_connections; cn != NULL; cn = cn->next) - { +for (cn = mysql_connections; cn; cn = cn->next) if (Ustrcmp(cn->server, server_copy) == 0) { mysql_handle = cn->handle; break; } - } /* If no cached connection, we must set one up. Mysql allows for a host name and port to be specified. It also allows the name of a Unix socket to be used. Unfortunately, this contains slashes, but its use is expected to be rare, so the rather cumbersome syntax shouldn't inconvenience too many people. We use -this: host:port(socket) where all the parts are optional. */ +this: host:port(socket)[group] where all the parts are optional. +The "group" parameter specifies an option group from a MySQL option file. */ -if (cn == NULL) +if (!cn) { uschar *p; uschar *socket = NULL; int port = 0; + uschar *group = US"exim"; + + if ((p = Ustrchr(sdata[0], '['))) + { + *p++ = 0; + group = p; + while (*p && *p != ']') p++; + *p = 0; + } - if ((p = Ustrchr(sdata[0], '(')) != NULL) + if ((p = Ustrchr(sdata[0], '('))) { *p++ = 0; socket = p; - while (*p != 0 && *p != ')') p++; + while (*p && *p != ')') p++; *p = 0; } - if ((p = Ustrchr(sdata[0], ':')) != NULL) + if ((p = Ustrchr(sdata[0], ':'))) { *p++ = 0; port = Uatoi(p); } - if (Ustrchr(sdata[0], '/') != NULL) + if (Ustrchr(sdata[0], '/')) { *errmsg = string_sprintf("unexpected slash in MySQL server hostname: %s", sdata[0]); @@ -181,6 +189,7 @@ if (cn == NULL) mysql_handle = store_get(sizeof(MYSQL)); mysql_init(mysql_handle); + mysql_options(mysql_handle, MYSQL_READ_DEFAULT_GROUP, CS group); if (mysql_real_connect(mysql_handle, /* host user passwd database */ CS sdata[0], CS sdata[2], CS sdata[3], CS sdata[1], -- 2.25.1