commit:     d4dad7eeba18466da05ed9f25c17a909e64c4596
Author:     Thomas Deutschmann <whissi <AT> gentoo <DOT> org>
AuthorDate: Thu Mar 11 23:37:19 2021 +0000
Commit:     Thomas Deutschmann <whissi <AT> gentoo <DOT> org>
CommitDate: Thu Mar 11 23:37:36 2021 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=d4dad7ee

dev-db/mariadb: sync pkg_config() with dev-db/mysql

Package-Manager: Portage-3.0.17, Repoman-3.0.2
Signed-off-by: Thomas Deutschmann <whissi <AT> gentoo.org>

 dev-db/mariadb/mariadb-10.2.37-r2.ebuild | 586 ++++++++++++++++++++++--------
 dev-db/mariadb/mariadb-10.3.28-r2.ebuild | 587 ++++++++++++++++++++++--------
 dev-db/mariadb/mariadb-10.4.18-r2.ebuild | 594 ++++++++++++++++++++++---------
 dev-db/mariadb/mariadb-10.5.9-r2.ebuild  | 594 ++++++++++++++++++++++---------
 4 files changed, 1713 insertions(+), 648 deletions(-)

diff --git a/dev-db/mariadb/mariadb-10.2.37-r2.ebuild 
b/dev-db/mariadb/mariadb-10.2.37-r2.ebuild
index 54d6e4b3454..50a556a2213 100644
--- a/dev-db/mariadb/mariadb-10.2.37-r2.ebuild
+++ b/dev-db/mariadb/mariadb-10.2.37-r2.ebuild
@@ -781,65 +781,316 @@ pkg_postinst() {
        einfo
 }
 
+
 pkg_config() {
        _getoptval() {
-               local mypd="${EROOT}"/usr/libexec/mariadb/my_print_defaults
-               local section="$1"
+               local section="${1}"
                local flag="--${2}="
                local extra_options="${3}"
-               "${mypd}" $extra_options $section | sed -n 
"/^${flag}/s,${flag},,gp"
+               local cmd=(
+                       "${my_print_defaults_binary}"
+                       "${extra_options}"
+                       "${section}"
+               )
+               local results=( $(eval "${cmd[@]}" 2>/dev/null | sed -n 
"/^${flag}/s,${flag},,gp") )
+
+               if [[ ${#results[@]} -gt 0 ]] ; then
+                       # When option is set multiple times only return last 
value
+                       echo "${results[-1]}"
+               fi
+       }
+
+       _mktemp_dry() {
+               # emktemp has no --dry-run option
+               local template="${1}"
+
+               if [[ -z "${template}" ]] ; then
+                       if [[ -z "${T}" ]] ; then
+                               template="/tmp/XXXXXXX"
+                       else
+                               template="${T}/XXXXXXX"
+                       fi
+               fi
+
+               local template_wo_X=${template//X/}
+               local n_X
+               let n_X=${#template}-${#template_wo_X}
+               if [[ ${n_X} -lt 3 ]] ; then
+                       echo "${FUNCNAME[0]}: too few X's in template 
‘${template}’" >&2
+                       return
+               fi
+
+               local attempts=0
+               local character tmpfile
+               while [[ true ]] ; do
+                       let attempts=attempts+1
+
+                       new_file=
+                       while read -n1 character ; do
+                               if [[ "${character}" == "X" ]] ; then
+                                       tmpfile+="${RANDOM:0:1}"
+                               else
+                                       tmpfile+="${character}"
+                               fi
+                       done < <(echo -n "${template}")
+
+                       if [[ ! -f "${tmpfile}" ]]
+                       then
+                               echo "${tmpfile}"
+                               return
+                       fi
+
+                       if [[ ${attempts} -ge 100 ]] ; then
+                               echo "${FUNCNAME[0]}: Cannot create temporary 
file after 100 attempts." >&2
+                               return
+                       fi
+               done
        }
-       local old_MY_DATADIR="${MY_DATADIR}"
-       local old_HOME="${HOME}"
+
+       local mysql_binary="${EROOT}/usr/bin/mysql"
+       if [[ ! -x "${mysql_binary}" ]] ; then
+               die "'${mysql_binary}' not found! Please re-install 
${CATEGORY}/${PN}!"
+       fi
+
+       local mysqld_binary="${EROOT}/usr/sbin/mysqld"
+       if [[ ! -x "${mysqld_binary}" ]] ; then
+               die "'${mysqld_binary}' not found! Please re-install 
${CATEGORY}/${PN}!"
+       fi
+
+       local mysql_install_db_binary="${EROOT}/usr/bin/mysql_install_db"
+       if [[ ! -x "${mysql_install_db_binary}" ]] ; then
+               die "'${mysql_install_db_binary}' not found! Please re-install 
${CATEGORY}/${PN}!"
+       fi
+
+       local my_print_defaults_binary="${EROOT}/usr/bin/my_print_defaults"
+       if [[ ! -x "${my_print_defaults_binary}" ]] ; then
+               die "'${my_print_defaults_binary}' not found! Please re-install 
dev-db/mysql-connector-c!"
+       fi
+
+       if [[ -z "${MYSQL_USER}" ]] ; then
+               MYSQL_USER=mysql
+               if use prefix ; then
+                       MYSQL_USER=$(id -u -n 2>/dev/null)
+                       if [[ -z "${MYSQL_USER}" ]] ; then
+                               die "Failed to determine current username!"
+                       fi
+               fi
+       fi
+
+       if [[ -z "${MYSQL_GROUP}" ]] ; then
+               MYSQL_GROUP=mysql
+               if use prefix ; then
+                       MYSQL_GROUP=$(id -g -n 2>/dev/null)
+                       if [[ -z "${MYSQL_GROUP}" ]] ; then
+                               die "Failed to determine current user 
groupname!"
+                       fi
+               fi
+       fi
+
        # my_print_defaults needs to read stuff in $HOME/.my.cnf
-       export HOME=${EPREFIX}/root
+       local -x HOME="${EROOT}/root"
 
        # Make sure the vars are correctly initialized
        mysql_init_vars
 
-       [[ -z "${MY_DATADIR}" ]] && die "Sorry, unable to find MY_DATADIR"
-       if [[ ! -x "${EROOT}/usr/sbin/mysqld" ]] ; then
-               die "Minimal builds do NOT include the MySQL server"
+       # Read currently set data directory
+       MY_DATADIR="$(_getoptval mysqld datadir 
"--defaults-file='${MY_SYSCONFDIR}/my.cnf'")"
+
+       # Bug #213475 - MySQL _will_ object strenously if your machine is named
+       # localhost. Also causes weird failures.
+       [[ "${HOSTNAME}" == "localhost" ]] && die "Your machine must NOT be 
named localhost"
+
+       if [[ -z "${MY_DATADIR}" ]] ; then
+               die "Sorry, unable to find MY_DATADIR!"
+       elif [[ -d "${MY_DATADIR}/mysql" ]] ; then
+               ewarn "Looks like your data directory '${MY_DATADIR}' is 
already initialized!"
+               ewarn "Please rename or delete its content if you wish to 
initialize a new data directory."
+               die "${PN} data directory at '${MY_DATADIR}' looks already 
initialized!"
        fi
 
-       if [[ ( -n "${MY_DATADIR}" ) && ( "${MY_DATADIR}" != 
"${old_MY_DATADIR}" ) ]]; then
-               local MY_DATADIR_s="${ROOT}/${MY_DATADIR}"
-               MY_DATADIR_s="${MY_DATADIR_s%%/}"
-               local old_MY_DATADIR_s="${ROOT}/${old_MY_DATADIR}"
-               old_MY_DATADIR_s="${old_MY_DATADIR_s%%/}"
+       MYSQL_TMPDIR="$(_getoptval mysqld tmpdir 
"--defaults-file='${MY_SYSCONFDIR}/my.cnf'")"
+       MYSQL_TMPDIR=${MYSQL_TMPDIR%/}
+       # These are dir+prefix
+       MYSQL_LOG_BIN="$(_getoptval mysqld log-bin 
"--defaults-file='${MY_SYSCONFDIR}/my.cnf'")"
+       MYSQL_LOG_BIN=${MYSQL_LOG_BIN%/*}
+       MYSQL_RELAY_LOG="$(_getoptval mysqld relay-log 
"--defaults-file='${MY_SYSCONFDIR}/my.cnf'")"
+       MYSQL_RELAY_LOG=${MYSQL_RELAY_LOG%/*}
 
-               if [[ ( -d "${old_MY_DATADIR_s}" ) && ( "${old_MY_DATADIR_s}" 
!= / ) ]]; then
-                       if [[ -d "${MY_DATADIR_s}" ]]; then
-                               ewarn "Both ${old_MY_DATADIR_s} and 
${MY_DATADIR_s} exist"
-                               ewarn "Attempting to use ${MY_DATADIR_s} and 
preserving ${old_MY_DATADIR_s}"
-                       else
-                               elog "Moving MY_DATADIR from 
${old_MY_DATADIR_s} to ${MY_DATADIR_s}"
-                               mv --strip-trailing-slashes -T 
"${old_MY_DATADIR_s}" "${MY_DATADIR_s}" \
-                               || die "Moving MY_DATADIR failed"
-                       fi
+       # Create missing directories.
+       # Always check if mysql user can write to directory even if we just
+       # created directory because a parent directory might be not
+       # accessible for that user.
+       PID_DIR="${EROOT}/run/mysqld"
+       if [[ ! -d "${PID_DIR}" ]] ; then
+               einfo "Creating ${PN} PID directory '${PID_DIR}' ..."
+               install -d -m 755 -o ${MYSQL_USER} -g ${MYSQL_GROUP} 
"${PID_DIR}" \
+                       || die "Failed to create PID directory '${PID_DIR}'!"
+       fi
+
+       local _pid_dir_testfile="$(_mktemp_dry 
"${PID_DIR}/.pkg_config-access-test.XXXXXXXXX")"
+       [[ -z "${_pid_dir_testfile}" ]] \
+               && die "_mktemp_dry() for 
'${PID_DIR}/.pkg_config-access-test.XXXXXXXXX' failed!"
+
+       if use prefix ; then
+               touch "${_pid_dir_testfile}" &>/dev/null
+       else
+               su -s /bin/sh -c "touch ${_pid_dir_testfile}" ${MYSQL_USER} 
&>/dev/null
+       fi
+
+       if [[ $? -ne 0 ]] ; then
+               die "${MYSQL_USER} user cannot write into PID dir '${PID_DIR}'!"
+       else
+               rm "${_pid_dir_testfile}" || die
+               unset _pid_dir_testfile
+       fi
+
+       if [[ ! -d "${MY_DATADIR}" ]] ; then
+               einfo "Creating ${PN} data directory '${MY_DATADIR}' ..."
+               install -d -m 770 -o ${MYSQL_USER} -g ${MYSQL_GROUP} 
"${MY_DATADIR}" \
+                       || die "Failed to create ${PN} data directory 
'${MY_DATADIR}'!"
+       fi
+
+       local _my_datadir_testfile="$(_mktemp_dry 
"${MY_DATADIR}/.pkg_config-access-test.XXXXXXXXX")"
+       [[ -z "${_my_datadir_testfile}" ]] \
+               && die "_mktemp_dry() for 
'${MY_DATADIR}/.pkg_config-access-test.XXXXXXXXX' failed!"
+
+       if use prefix ; then
+               touch "${_my_datadir_testfile}" &>/dev/null
+       else
+               su -s /bin/sh -c "touch ${_my_datadir_testfile}" ${MYSQL_USER} 
&>/dev/null
+       fi
+
+       if [[ $? -ne 0 ]] ; then
+               die "${MYSQL_USER} user cannot write into data directory 
'${MY_DATADIR}'!"
+       else
+               rm "${_my_datadir_testfile}" || die
+               unset _my_datadir_testfile
+       fi
+
+       if [[ -n "${MYSQL_TMPDIR}" && ! -d "${MYSQL_TMPDIR}" ]] ; then
+               einfo "Creating ${PN} tmpdir '${MYSQL_TMPDIR}' ..."
+               install -d -m 770 -o ${MYSQL_USER} -g ${MYSQL_GROUP} 
"${MYSQL_TMPDIR}" \
+                       || die "Failed to create ${PN} tmpdir 
'${MYSQL_TMPDIR}'!"
+       fi
+
+       if [[ -z "${MYSQL_TMPDIR}" ]] ; then
+               MYSQL_TMPDIR="$(_mktemp_dry 
"${EROOT}/tmp/mysqld-tmp.XXXXXXXXX")"
+               [[ -z "${MYSQL_TMPDIR}" ]] \
+                       && die "_mktemp_dry() for '${MYSQL_TMPDIR}' failed!"
+
+               mkdir "${MYSQL_TMPDIR}" || die
+               chown ${MYSQL_USER} "${MYSQL_TMPDIR}" || die
+       fi
+
+       # Now we need to test MYSQL_TMPDIR...
+       local _my_tmpdir_testfile="$(_mktemp_dry 
"${MYSQL_TMPDIR}/.pkg_config-access-test.XXXXXXXXX")"
+       [[ -z "${_my_tmpdir_testfile}" ]] \
+               && die "_mktemp_dry() for 
'${MYSQL_TMPDIR}/.pkg_config-access-test.XXXXXXXXX' failed!"
+
+       if use prefix ; then
+               touch "${_my_tmpdir_testfile}" &>/dev/null
+       else
+               su -s /bin/sh -c "touch ${_my_tmpdir_testfile}" ${MYSQL_USER} 
&>/dev/null
+       fi
+
+       if [[ $? -ne 0 ]] ; then
+               die "${MYSQL_USER} user cannot write into tmpdir 
'${MYSQL_TMPDIR}'!"
+       else
+               rm "${_my_tmpdir_testfile}" || die
+               unset _my_tmpdir_testfile
+       fi
+
+       if [[ -n "${MYSQL_LOG_BIN}" && ! -d "${MYSQL_LOG_BIN}" ]] ; then
+               einfo "Creating ${PN} log-bin directory '${MYSQL_LOG_BIN}' ..."
+               install -d -m 770 -o ${MYSQL_USER} -g ${MYSQL_GROUP} 
"${MYSQL_LOG_BIN}" \
+                       || die "Failed to create ${PN} log-bin directory 
'${MYSQL_LOG_BIN}'"
+       fi
+
+       if [[ -n "${MYSQL_LOG_BIN}" ]] ; then
+               local _my_logbin_testfile="$(_mktemp_dry 
"${MYSQL_LOG_BIN}/.pkg_config-access-test.XXXXXXXXX")"
+               [[ -z "${_my_logbin_testfile}" ]] \
+                       && die "_mktemp_dry() for 
'${MYSQL_LOG_BIN}/.pkg_config-access-test.XXXXXXXXX' failed!"
+
+               if use prefix ; then
+                       touch "${_my_logbin_testfile}" &>/dev/null
                else
-                       ewarn "Previous MY_DATADIR (${old_MY_DATADIR_s}) does 
not exist"
-                       if [[ -d "${MY_DATADIR_s}" ]]; then
-                               ewarn "Attempting to use ${MY_DATADIR_s}"
-                       else
-                               eerror "New MY_DATADIR (${MY_DATADIR_s}) does 
not exist"
-                               die "Configuration Failed! Please reinstall 
${CATEGORY}/${PN}"
-                       fi
+                       su -s /bin/sh -c "touch ${_my_logbin_testfile}" 
${MYSQL_USER} &>/dev/null
+               fi
+
+               if [[ $? -ne 0 ]] ; then
+                       die "${MYSQL_USER} user cannot write into log-bin 
directory '${MYSQL_LOG_BIN}'!"
+               else
+                       rm "${_my_logbin_testfile}" || die
+                       unset _my_logbin_testfile
                fi
        fi
 
-       local pwd1="a"
-       local pwd2="b"
-       local maxtry=15
+       if [[ -n "${MYSQL_RELAY_LOG}" && ! -d "${MYSQL_RELAY_LOG}" ]] ; then
+               einfo "Creating ${PN} relay-log directory '${MYSQL_RELAY_LOG}' 
..."
+               install -d -m 770 -o ${MYSQL_USER} -g ${MYSQL_GROUP} 
"${MYSQL_RELAY_LOG}" \
+                       || die "Failed to create ${PN} relay-log directory 
'${MYSQL_RELAY_LOG}'!"
+       fi
+
+       if [[ -n "${MYSQL_RELAY_LOG}" ]] ; then
+               local _my_relaylog_testfile="$(_mktemp_dry 
"${MYSQL_RELAY_LOG}/.pkg_config-access-test.XXXXXXXXX")"
+               [[ -z "${_my_relaylog_testfile}" ]] \
+                       && die "_mktemp_dry() for 
'${MYSQL_RELAY_LOG}/.pkg_config-access-test.XXXXXXXXX' failed!"
+
+               if use prefix ; then
+                       touch "${_my_relaylog_testfile}" &>/dev/null
+               else
+                       su -s /bin/sh -c "touch ${_my_relaylog_testfile}" 
${MYSQL_USER} &>/dev/null
+               fi
+
+               if [[ $? -ne 0 ]] ; then
+                       die "${MYSQL_USER} user cannot write into relay-log 
directory '${MYSQL_RELAY_LOG}'!"
+               else
+                       rm "${_my_relaylog_testfile}" || die
+                       unset _my_relaylog_testfile
+               fi
+       fi
+
+       local SETUP_TMPDIR=$(mktemp -d "/tmp/${PN}-config.XXXXXXXXX" 
2>/dev/null)
+       [[ -z "${SETUP_TMPDIR}" ]] && die "Failed to create setup tmpdir"
+
+       # Limit access
+       chmod 0770 "${SETUP_TMPDIR}" || die
+       chown ${MYSQL_USER} "${SETUP_TMPDIR}" || die
+
+
+       local mysql_install_log="${SETUP_TMPDIR}/install_db.log"
+       local mysqld_logfile="${SETUP_TMPDIR}/mysqld.log"
+
+       echo ""
+       einfo "Detected settings:"
+       einfo "=================="
+       einfo "MySQL User:\t\t\t\t${MYSQL_USER}"
+       einfo "MySQL Group:\t\t\t\t${MYSQL_GROUP}"
+       einfo "MySQL DATA directory:\t\t${MY_DATADIR}"
+       einfo "MySQL TMP directory:\t\t\t${MYSQL_TMPDIR}"
+
+       if [[ -n "${MYSQL_LOG_BIN}" ]] ; then
+               einfo "MySQL Binary Log File location:\t${MYSQL_LOG_BIN}"
+       fi
 
-       if [ -z "${MYSQL_ROOT_PASSWORD}" ]; then
+       if [[ -n "${MYSQL_RELAY_LOG}" ]] ; then
+               einfo "MySQL Relay Log File location:\t${MYSQL_RELAY_LOG}"
+       fi
+
+       einfo "PID DIR:\t\t\t\t${PID_DIR}"
+       einfo "Install db log:\t\t\t${mysql_install_log}"
+       einfo "Install server log:\t\t\t${mysqld_logfile}"
+
+       echo
+
+       if [[ -z "${MYSQL_ROOT_PASSWORD}" ]] ; then
                local tmp_mysqld_password_source=
 
-               for tmp_mysqld_password_source in mysql client; do
+               for tmp_mysqld_password_source in mysql client ; do
                        einfo "Trying to get password for mysql 'root' user 
from '${tmp_mysqld_password_source}' section ..."
                        MYSQL_ROOT_PASSWORD="$(_getoptval 
"${tmp_mysqld_password_source}" password)"
-                       if [[ -n "${MYSQL_ROOT_PASSWORD}" ]]; then
-                               if [[ ${MYSQL_ROOT_PASSWORD} == *$'\n'* ]]; then
+                       if [[ -n "${MYSQL_ROOT_PASSWORD}" ]] ; then
+                               if [[ ${MYSQL_ROOT_PASSWORD} == *$'\n'* ]] ; 
then
                                        ewarn "Ignoring password from 
'${tmp_mysqld_password_source}' section due to newline character (do you have 
multiple password options set?)!"
                                        MYSQL_ROOT_PASSWORD=
                                        continue
@@ -851,167 +1102,188 @@ pkg_config() {
                done
 
                # Sometimes --show is required to display passwords in some 
implementations of my_print_defaults
-               if [[ "${MYSQL_ROOT_PASSWORD}" == '*****' ]]; then
+               if [[ "${MYSQL_ROOT_PASSWORD}" == '*****' ]] ; then
                        MYSQL_ROOT_PASSWORD="$(_getoptval 
"${tmp_mysqld_password_source}" password --show)"
                fi
 
                unset tmp_mysqld_password_source
        fi
-       MYSQL_TMPDIR="$(_getoptval mysqld tmpdir | tail -n1)"
-       # These are dir+prefix
-       MYSQL_RELAY_LOG="$(_getoptval mysqld relay-log | tail -n1)"
-       MYSQL_RELAY_LOG=${MYSQL_RELAY_LOG%/*}
-       MYSQL_LOG_BIN="$(_getoptval mysqld log-bin | tail -n1)"
-       MYSQL_LOG_BIN=${MYSQL_LOG_BIN%/*}
-
-       if [[ ! -d "${ROOT}/$MYSQL_TMPDIR" ]]; then
-               einfo "Creating MySQL tmpdir $MYSQL_TMPDIR"
-               install -d -m 770 -o mysql -g mysql "${EROOT}/$MYSQL_TMPDIR"
-       fi
-       if [[ ! -d "${ROOT}/$MYSQL_LOG_BIN" ]]; then
-               einfo "Creating MySQL log-bin directory $MYSQL_LOG_BIN"
-               install -d -m 770 -o mysql -g mysql "${EROOT}/$MYSQL_LOG_BIN"
-       fi
-       if [[ ! -d "${EROOT}/$MYSQL_RELAY_LOG" ]]; then
-               einfo "Creating MySQL relay-log directory $MYSQL_RELAY_LOG"
-               install -d -m 770 -o mysql -g mysql "${EROOT}/$MYSQL_RELAY_LOG"
-       fi
-
-       if [[ -d "${ROOT}/${MY_DATADIR}/mysql" ]] ; then
-               ewarn "You have already a MySQL database in place."
-               ewarn "(${ROOT}/${MY_DATADIR}/*)"
-               ewarn "Please rename or delete it if you wish to replace it."
-               die "MySQL database already exists!"
-       fi
-
-       # Bug #213475 - MySQL _will_ object strenously if your machine is named
-       # localhost. Also causes weird failures.
-       [[ "${HOSTNAME}" == "localhost" ]] && die "Your machine must NOT be 
named localhost"
 
-       if [[ -z "${MYSQL_ROOT_PASSWORD}" ]]; then
-
-               einfo "Please provide a password for the mysql 
'root'@'localhost' user now"
-               einfo "or through the ${HOME}/.my.cnf file."
-               ewarn "Avoid [\"'\\_%] characters in the password"
+       if [[ -z "${MYSQL_ROOT_PASSWORD}" ]] ; then
+               local pwd1="a"
+               local pwd2="b"
+
+               echo
+               einfo "No password for mysql 'root' user was specified via 
environment"
+               einfo "variable MYSQL_ROOT_PASSWORD and no password was found 
in config"
+               einfo "file like '${HOME}/.my.cnf'."
+               einfo "To continue please provide a password for the mysql 
'root' user"
+               einfo "now on console:"
+               ewarn "NOTE: Please avoid [\"'\\_%] characters in the password!"
                read -rsp "    >" pwd1 ; echo
 
                einfo "Retype the password"
                read -rsp "    >" pwd2 ; echo
 
-               if [[ "x$pwd1" != "x$pwd2" ]] ; then
-                       die "Passwords are not the same"
+               if [[ "x${pwd1}" != "x${pwd2}" ]] ; then
+                       die "Passwords are not the same!"
                fi
 
                MYSQL_ROOT_PASSWORD="${pwd1}"
                unset pwd1 pwd2
+
+               echo
        fi
 
-       local options
-       local sqltmp="$(emktemp)"
+       local -a mysqld_options
 
        # Fix bug 446200. Don't reference host my.cnf, needs to come first,
-       # see https://bugs.mysql.com/bug.php?id=31312
-       use prefix && options="${options} 
'--defaults-file=${MY_SYSCONFDIR}/my.cnf'"
+       # see http://bugs.mysql.com/bug.php?id=31312
+       use prefix && mysqld_options+=( 
"--defaults-file='${MY_SYSCONFDIR}/my.cnf'" )
 
        # Figure out which options we need to disable to do the setup
        local helpfile="${TMPDIR}/mysqld-help"
        "${EROOT}/usr/sbin/mysqld" --verbose --help >"${helpfile}" 2>/dev/null
-       for opt in grant-tables host-cache name-resolve networking slave-start \
+
+       local opt optexp optfull
+       for opt in host-cache name-resolve networking slave-start \
                federated ssl log-bin relay-log slow-query-log external-locking 
\
                log-slave-updates \
-               ; do
+       ; do
                optexp="--(skip-)?${opt}" optfull="--loose-skip-${opt}"
-               egrep -sq -- "${optexp}" "${helpfile}" && options="${options} 
${optfull}"
+               egrep -sq -- "${optexp}" "${helpfile}" && mysqld_options+=( 
"${optfull}" )
        done
 
-       einfo "Creating the mysql database and setting proper permissions on it 
..."
+       # Prepare timezones, see
+       # https://dev.mysql.com/doc/mysql/en/time-zone-support.html
+       local tz_sql="${SETUP_TMPDIR}/tz.sql"
 
-       # Now that /var/run is a tmpfs mount point, we need to ensure it exists 
before using it
-       PID_DIR="${EROOT}/var/run/mysqld"
-       if [[ ! -d "${PID_DIR}" ]]; then
-               install -d -m 755 -o mysql -g mysql "${PID_DIR}" || die "Could 
not create pid directory"
+       echo "USE mysql;" >"${tz_sql}"
+       "${EROOT}/usr/bin/mysql_tzinfo_to_sql" "${EROOT}/usr/share/zoneinfo" >> 
"${tz_sql}" 2>/dev/null
+       if [[ $? -ne 0 ]] ; then
+               die "mysql_tzinfo_to_sql failed!"
        fi
 
-       if [[ ! -d "${MY_DATADIR}" ]]; then
-               install -d -m 750 -o mysql -g mysql "${MY_DATADIR}" || die 
"Could not create data directory"
-       fi
+       local cmd=(
+               "${mysql_install_db_binary}"
+               "${mysqld_options[@]}"
+               "--init-file='${tz_sql}'"
+               "--basedir='${EROOT}/usr'"
+               "--datadir='${MY_DATADIR}'"
+               "--tmpdir='${MYSQL_TMPDIR}'"
+               "--log-error='${mysql_install_log}'"
+               "--rpm"
+               "--cross-bootstrap"
+               "--user=${MYSQL_USER}"
+       )
 
-       pushd "${TMPDIR}" &>/dev/null || die
+       einfo "Initializing ${PN} data directory: ${cmd[@]}"
+       eval "${cmd[@]}" >>"${mysql_install_log}" 2>&1
 
-       # Filling timezones, see
-       # https://dev.mysql.com/doc/mysql/en/time-zone-support.html
-       "${EROOT}/usr/bin/mysql_tzinfo_to_sql" "${EROOT}/usr/share/zoneinfo" > 
"${sqltmp}" 2>/dev/null
-
-       local cmd=( "${EROOT}/usr/share/mariadb/scripts/mysql_install_db" )
-       [[ -f "${cmd}" ]] || cmd=( "${EROOT}/usr/bin/mysql_install_db" )
-       cmd+=( "--basedir=${EPREFIX}/usr" ${options} 
"--datadir=${ROOT}/${MY_DATADIR}" "--tmpdir=${ROOT}/${MYSQL_TMPDIR}" )
-       einfo "Command: ${cmd[*]}"
-       su -s /bin/sh -c "${cmd[*]}" mysql \
-               >"${TMPDIR}"/mysql_install_db.log 2>&1
-       if [[ $? -ne 0 ]]; then
-               grep -B5 -A999 -i "ERROR" "${TMPDIR}"/mysql_install_db.log 1>&2
-               die "Failed to initialize mysqld. Please review 
${EPREFIX}/var/log/mysql/mysqld.err AND ${TMPDIR}/mysql_install_db.log"
+       if [[ $? -ne 0 || ! -f "${MY_DATADIR}/mysql/user.frm" ]] ; then
+               grep -B5 -A999 -iE "(Aborting|ERROR|errno)" 
"${mysql_install_log}" 1>&2
+               die "Failed to initialize ${PN} data directory. Please review 
'${mysql_install_log}'!"
        fi
-       popd &>/dev/null || die
-       [[ -f "${ROOT}/${MY_DATADIR}/mysql/user.frm" ]] \
-               || die "MySQL databases not installed"
-
-       use prefix || options="${options} --user=mysql"
-
-       local socket="${EROOT}/var/run/mysqld/mysqld${RANDOM}.sock"
-       local pidfile="${EROOT}/var/run/mysqld/mysqld${RANDOM}.pid"
-       local mysqld="${EROOT}/usr/sbin/mysqld \
-               ${options} \
-               --log-warnings=0 \
-               --basedir=${EROOT}/usr \
-               --datadir=${ROOT}/${MY_DATADIR} \
-               --max_allowed_packet=8M \
-               --net_buffer_length=16K \
-               --socket=${socket} \
-               --pid-file=${pidfile} \
-               --tmpdir=${ROOT}/${MYSQL_TMPDIR}"
-       #einfo "About to start mysqld: ${mysqld}"
-       ebegin "Starting mysqld"
-       einfo "Command ${mysqld}"
-       ${mysqld} &
-       rc=$?
-       while ! [[ -S "${socket}" || "${maxtry}" -lt 1 ]] ; do
+
+       local x=${RANDOM}
+       local socket="${PID_DIR}/mysqld.${x}.sock"
+       [[ -f "${socket}" ]] && die "Randomness failed; Socket ${socket} 
already exists!"
+       local pidfile="${PID_DIR}/mysqld.${x}.pid"
+       [[ -f "${pidfile}" ]] && die "Randomness failed; Pidfile ${pidfile} 
already exists!"
+       unset x
+
+       cmd=(
+               "${mysqld_binary}"
+               "${mysqld_options[@]}"
+               "--basedir='${EROOT}/usr'"
+               "--datadir='${MY_DATADIR}'"
+               "--tmpdir='${MYSQL_TMPDIR}'"
+               --max_allowed_packet=8M
+               --net_buffer_length=16K
+               "--socket='${socket}'"
+               "--pid-file='${pidfile}'"
+               "--log-error='${mysqld_logfile}'"
+               "--user=${MYSQL_USER}"
+       )
+
+       einfo "Starting mysqld to finalize initialization: ${cmd[@]}"
+       eval "${cmd[@]}" >>"${mysqld_logfile}" 2>&1 &
+
+       echo -n "Waiting for mysqld to accept connections "
+       local maxtry=15
+       while [[ ! -S "${socket}" && "${maxtry}" -gt 1 ]] ; do
                maxtry=$((${maxtry}-1))
                echo -n "."
                sleep 1
        done
-       eend $rc
 
-       if ! [[ -S "${socket}" ]]; then
-               die "Completely failed to start up mysqld with: ${mysqld}"
+       if [[ -S "${socket}" ]] ; then
+               # Even with a socket we don't know if mysqld will abort
+               # start due to an error so just wait a little bit more...
+               maxtry=5
+               while [[ -S "${socket}" && "${maxtry}" -gt 1 ]] ; do
+                       maxtry=$((${maxtry}-1))
+                       echo -n "."
+                       sleep 1
+               done
+       fi
+
+       echo
+
+       if [[ ! -S "${socket}" ]] ; then
+               grep -B5 -A999 -iE "(Aborting|ERROR|errno)" "${mysqld_logfile}" 
1>&2
+               die "mysqld was unable to start from initialized data 
directory. Please review '${mysqld_logfile}'!"
        fi
 
+       local mysql_logfile="${SETUP_TMPDIR}/set_root_pw.log"
+       touch "${mysql_logfile}" || die
+
        ebegin "Setting root password"
        # Do this from memory, as we don't want clear text passwords in temp 
files
-       local sql="UPDATE mysql.user SET Password = 
PASSWORD('${MYSQL_ROOT_PASSWORD}') WHERE USER='root'; FLUSH PRIVILEGES"
-       "${EROOT}/usr/bin/mysql" \
-               "--socket=${socket}" \
-               -hlocalhost \
-               -e "${sql}"
-       eend $?
-
-       if [[ -n "${sqltmp}" ]] ; then
-               ebegin "Loading \"zoneinfo\", this step may require a few 
seconds"
-               "${EROOT}/usr/bin/mysql" \
-                       "--socket=${socket}" \
-                       -hlocalhost \
-                       -uroot \
-                       --password="${MYSQL_ROOT_PASSWORD}" \
-                       mysql < "${sqltmp}"
-               rc=$?
-               eend $?
-               [[ $rc -ne 0 ]] && ewarn "Failed to load zoneinfo!"
-       fi
-
-       # Stop the server and cleanup
-       einfo "Stopping the server ..."
-       kill $(< "${pidfile}" )
-       rm -f "${sqltmp}"
-       wait %1
-       einfo "Done"
+       local sql="ALTER USER 'root'@'localhost' IDENTIFIED BY 
'${MYSQL_ROOT_PASSWORD}'"
+       cmd=(
+               "${mysql_binary}"
+               --no-defaults
+               "--socket='${socket}'"
+               -hlocalhost
+               "-e \"${sql}\""
+       )
+       eval "${cmd[@]}" >"${mysql_logfile}" 2>&1
+       local rc=$?
+       eend ${rc}
+
+       if [[ ${rc} -ne 0 ]] ; then
+               # Poor man's solution which tries to avoid having password
+               # in log.  NOTE: sed can fail if user didn't follow advice
+               # and included character which will require escaping...
+               sed -i -e "s/${MYSQL_ROOT_PASSWORD}/*****/" "${mysql_logfile}" 
2>/dev/null
+
+               grep -B5 -A999 -iE "(Aborting|ERROR|errno)" "${mysql_logfile}"
+               die "Failed to set ${PN} root password. Please review 
'${mysql_logfile}'!"
+       fi
+
+       # Stop the server
+       if [[ -f "${pidfile}" ]] && pgrep -F "${pidfile}" &>/dev/null ; then
+               echo -n "Stopping the server "
+               pkill -F "${pidfile}" &>/dev/null
+
+               maxtry=10
+               while [[ -f "${pidfile}" ]] && pgrep -F "${pidfile}" 
&>/dev/null ; do
+                       maxtry=$((${maxtry}-1))
+                       echo -n "."
+                       sleep 1
+               done
+
+               echo
+
+               if [[ -f "${pidfile}" ]] && pgrep -F "${pidfile}" &>/dev/null ; 
then
+                       # We somehow failed to stop server.
+                       # However, not a fatal error. Just warn the user.
+                       ewarn "WARNING: mysqld[$(cat "${pidfile}")] is still 
running!"
+               fi
+       fi
+
+       rm -r "${SETUP_TMPDIR}" || die
+
+       einfo "${PN} data directory at '${MY_DATADIR}' successfully 
initialized!"
 }

diff --git a/dev-db/mariadb/mariadb-10.3.28-r2.ebuild 
b/dev-db/mariadb/mariadb-10.3.28-r2.ebuild
index 9b89b41f74d..633a152ef1b 100644
--- a/dev-db/mariadb/mariadb-10.3.28-r2.ebuild
+++ b/dev-db/mariadb/mariadb-10.3.28-r2.ebuild
@@ -772,65 +772,316 @@ pkg_postinst() {
        einfo
 }
 
+
 pkg_config() {
        _getoptval() {
-               local mypd="${EROOT}"/usr/libexec/mariadb/my_print_defaults
-               local section="$1"
+               local section="${1}"
                local flag="--${2}="
                local extra_options="${3}"
-               "${mypd}" $extra_options $section | sed -n 
"/^${flag}/s,${flag},,gp"
+               local cmd=(
+                       "${my_print_defaults_binary}"
+                       "${extra_options}"
+                       "${section}"
+               )
+               local results=( $(eval "${cmd[@]}" 2>/dev/null | sed -n 
"/^${flag}/s,${flag},,gp") )
+
+               if [[ ${#results[@]} -gt 0 ]] ; then
+                       # When option is set multiple times only return last 
value
+                       echo "${results[-1]}"
+               fi
+       }
+
+       _mktemp_dry() {
+               # emktemp has no --dry-run option
+               local template="${1}"
+
+               if [[ -z "${template}" ]] ; then
+                       if [[ -z "${T}" ]] ; then
+                               template="/tmp/XXXXXXX"
+                       else
+                               template="${T}/XXXXXXX"
+                       fi
+               fi
+
+               local template_wo_X=${template//X/}
+               local n_X
+               let n_X=${#template}-${#template_wo_X}
+               if [[ ${n_X} -lt 3 ]] ; then
+                       echo "${FUNCNAME[0]}: too few X's in template 
‘${template}’" >&2
+                       return
+               fi
+
+               local attempts=0
+               local character tmpfile
+               while [[ true ]] ; do
+                       let attempts=attempts+1
+
+                       new_file=
+                       while read -n1 character ; do
+                               if [[ "${character}" == "X" ]] ; then
+                                       tmpfile+="${RANDOM:0:1}"
+                               else
+                                       tmpfile+="${character}"
+                               fi
+                       done < <(echo -n "${template}")
+
+                       if [[ ! -f "${tmpfile}" ]]
+                       then
+                               echo "${tmpfile}"
+                               return
+                       fi
+
+                       if [[ ${attempts} -ge 100 ]] ; then
+                               echo "${FUNCNAME[0]}: Cannot create temporary 
file after 100 attempts." >&2
+                               return
+                       fi
+               done
        }
-       local old_MY_DATADIR="${MY_DATADIR}"
-       local old_HOME="${HOME}"
+
+       local mysql_binary="${EROOT}/usr/bin/mysql"
+       if [[ ! -x "${mysql_binary}" ]] ; then
+               die "'${mysql_binary}' not found! Please re-install 
${CATEGORY}/${PN}!"
+       fi
+
+       local mysqld_binary="${EROOT}/usr/sbin/mysqld"
+       if [[ ! -x "${mysqld_binary}" ]] ; then
+               die "'${mysqld_binary}' not found! Please re-install 
${CATEGORY}/${PN}!"
+       fi
+
+       local mysql_install_db_binary="${EROOT}/usr/bin/mysql_install_db"
+       if [[ ! -x "${mysql_install_db_binary}" ]] ; then
+               die "'${mysql_install_db_binary}' not found! Please re-install 
${CATEGORY}/${PN}!"
+       fi
+
+       local my_print_defaults_binary="${EROOT}/usr/bin/my_print_defaults"
+       if [[ ! -x "${my_print_defaults_binary}" ]] ; then
+               die "'${my_print_defaults_binary}' not found! Please re-install 
dev-db/mysql-connector-c!"
+       fi
+
+       if [[ -z "${MYSQL_USER}" ]] ; then
+               MYSQL_USER=mysql
+               if use prefix ; then
+                       MYSQL_USER=$(id -u -n 2>/dev/null)
+                       if [[ -z "${MYSQL_USER}" ]] ; then
+                               die "Failed to determine current username!"
+                       fi
+               fi
+       fi
+
+       if [[ -z "${MYSQL_GROUP}" ]] ; then
+               MYSQL_GROUP=mysql
+               if use prefix ; then
+                       MYSQL_GROUP=$(id -g -n 2>/dev/null)
+                       if [[ -z "${MYSQL_GROUP}" ]] ; then
+                               die "Failed to determine current user 
groupname!"
+                       fi
+               fi
+       fi
+
        # my_print_defaults needs to read stuff in $HOME/.my.cnf
-       export HOME=${EPREFIX}/root
+       local -x HOME="${EROOT}/root"
 
        # Make sure the vars are correctly initialized
        mysql_init_vars
 
-       [[ -z "${MY_DATADIR}" ]] && die "Sorry, unable to find MY_DATADIR"
-       if [[ ! -x "${EROOT}/usr/sbin/mysqld" ]] ; then
-               die "Minimal builds do NOT include the MySQL server"
+       # Read currently set data directory
+       MY_DATADIR="$(_getoptval mysqld datadir 
"--defaults-file='${MY_SYSCONFDIR}/my.cnf'")"
+
+       # Bug #213475 - MySQL _will_ object strenously if your machine is named
+       # localhost. Also causes weird failures.
+       [[ "${HOSTNAME}" == "localhost" ]] && die "Your machine must NOT be 
named localhost"
+
+       if [[ -z "${MY_DATADIR}" ]] ; then
+               die "Sorry, unable to find MY_DATADIR!"
+       elif [[ -d "${MY_DATADIR}/mysql" ]] ; then
+               ewarn "Looks like your data directory '${MY_DATADIR}' is 
already initialized!"
+               ewarn "Please rename or delete its content if you wish to 
initialize a new data directory."
+               die "${PN} data directory at '${MY_DATADIR}' looks already 
initialized!"
        fi
 
-       if [[ ( -n "${MY_DATADIR}" ) && ( "${MY_DATADIR}" != 
"${old_MY_DATADIR}" ) ]]; then
-               local MY_DATADIR_s="${ROOT}/${MY_DATADIR}"
-               MY_DATADIR_s="${MY_DATADIR_s%%/}"
-               local old_MY_DATADIR_s="${ROOT}/${old_MY_DATADIR}"
-               old_MY_DATADIR_s="${old_MY_DATADIR_s%%/}"
+       MYSQL_TMPDIR="$(_getoptval mysqld tmpdir 
"--defaults-file='${MY_SYSCONFDIR}/my.cnf'")"
+       MYSQL_TMPDIR=${MYSQL_TMPDIR%/}
+       # These are dir+prefix
+       MYSQL_LOG_BIN="$(_getoptval mysqld log-bin 
"--defaults-file='${MY_SYSCONFDIR}/my.cnf'")"
+       MYSQL_LOG_BIN=${MYSQL_LOG_BIN%/*}
+       MYSQL_RELAY_LOG="$(_getoptval mysqld relay-log 
"--defaults-file='${MY_SYSCONFDIR}/my.cnf'")"
+       MYSQL_RELAY_LOG=${MYSQL_RELAY_LOG%/*}
 
-               if [[ ( -d "${old_MY_DATADIR_s}" ) && ( "${old_MY_DATADIR_s}" 
!= / ) ]]; then
-                       if [[ -d "${MY_DATADIR_s}" ]]; then
-                               ewarn "Both ${old_MY_DATADIR_s} and 
${MY_DATADIR_s} exist"
-                               ewarn "Attempting to use ${MY_DATADIR_s} and 
preserving ${old_MY_DATADIR_s}"
-                       else
-                               elog "Moving MY_DATADIR from 
${old_MY_DATADIR_s} to ${MY_DATADIR_s}"
-                               mv --strip-trailing-slashes -T 
"${old_MY_DATADIR_s}" "${MY_DATADIR_s}" \
-                               || die "Moving MY_DATADIR failed"
-                       fi
+       # Create missing directories.
+       # Always check if mysql user can write to directory even if we just
+       # created directory because a parent directory might be not
+       # accessible for that user.
+       PID_DIR="${EROOT}/run/mysqld"
+       if [[ ! -d "${PID_DIR}" ]] ; then
+               einfo "Creating ${PN} PID directory '${PID_DIR}' ..."
+               install -d -m 755 -o ${MYSQL_USER} -g ${MYSQL_GROUP} 
"${PID_DIR}" \
+                       || die "Failed to create PID directory '${PID_DIR}'!"
+       fi
+
+       local _pid_dir_testfile="$(_mktemp_dry 
"${PID_DIR}/.pkg_config-access-test.XXXXXXXXX")"
+       [[ -z "${_pid_dir_testfile}" ]] \
+               && die "_mktemp_dry() for 
'${PID_DIR}/.pkg_config-access-test.XXXXXXXXX' failed!"
+
+       if use prefix ; then
+               touch "${_pid_dir_testfile}" &>/dev/null
+       else
+               su -s /bin/sh -c "touch ${_pid_dir_testfile}" ${MYSQL_USER} 
&>/dev/null
+       fi
+
+       if [[ $? -ne 0 ]] ; then
+               die "${MYSQL_USER} user cannot write into PID dir '${PID_DIR}'!"
+       else
+               rm "${_pid_dir_testfile}" || die
+               unset _pid_dir_testfile
+       fi
+
+       if [[ ! -d "${MY_DATADIR}" ]] ; then
+               einfo "Creating ${PN} data directory '${MY_DATADIR}' ..."
+               install -d -m 770 -o ${MYSQL_USER} -g ${MYSQL_GROUP} 
"${MY_DATADIR}" \
+                       || die "Failed to create ${PN} data directory 
'${MY_DATADIR}'!"
+       fi
+
+       local _my_datadir_testfile="$(_mktemp_dry 
"${MY_DATADIR}/.pkg_config-access-test.XXXXXXXXX")"
+       [[ -z "${_my_datadir_testfile}" ]] \
+               && die "_mktemp_dry() for 
'${MY_DATADIR}/.pkg_config-access-test.XXXXXXXXX' failed!"
+
+       if use prefix ; then
+               touch "${_my_datadir_testfile}" &>/dev/null
+       else
+               su -s /bin/sh -c "touch ${_my_datadir_testfile}" ${MYSQL_USER} 
&>/dev/null
+       fi
+
+       if [[ $? -ne 0 ]] ; then
+               die "${MYSQL_USER} user cannot write into data directory 
'${MY_DATADIR}'!"
+       else
+               rm "${_my_datadir_testfile}" || die
+               unset _my_datadir_testfile
+       fi
+
+       if [[ -n "${MYSQL_TMPDIR}" && ! -d "${MYSQL_TMPDIR}" ]] ; then
+               einfo "Creating ${PN} tmpdir '${MYSQL_TMPDIR}' ..."
+               install -d -m 770 -o ${MYSQL_USER} -g ${MYSQL_GROUP} 
"${MYSQL_TMPDIR}" \
+                       || die "Failed to create ${PN} tmpdir 
'${MYSQL_TMPDIR}'!"
+       fi
+
+       if [[ -z "${MYSQL_TMPDIR}" ]] ; then
+               MYSQL_TMPDIR="$(_mktemp_dry 
"${EROOT}/tmp/mysqld-tmp.XXXXXXXXX")"
+               [[ -z "${MYSQL_TMPDIR}" ]] \
+                       && die "_mktemp_dry() for '${MYSQL_TMPDIR}' failed!"
+
+               mkdir "${MYSQL_TMPDIR}" || die
+               chown ${MYSQL_USER} "${MYSQL_TMPDIR}" || die
+       fi
+
+       # Now we need to test MYSQL_TMPDIR...
+       local _my_tmpdir_testfile="$(_mktemp_dry 
"${MYSQL_TMPDIR}/.pkg_config-access-test.XXXXXXXXX")"
+       [[ -z "${_my_tmpdir_testfile}" ]] \
+               && die "_mktemp_dry() for 
'${MYSQL_TMPDIR}/.pkg_config-access-test.XXXXXXXXX' failed!"
+
+       if use prefix ; then
+               touch "${_my_tmpdir_testfile}" &>/dev/null
+       else
+               su -s /bin/sh -c "touch ${_my_tmpdir_testfile}" ${MYSQL_USER} 
&>/dev/null
+       fi
+
+       if [[ $? -ne 0 ]] ; then
+               die "${MYSQL_USER} user cannot write into tmpdir 
'${MYSQL_TMPDIR}'!"
+       else
+               rm "${_my_tmpdir_testfile}" || die
+               unset _my_tmpdir_testfile
+       fi
+
+       if [[ -n "${MYSQL_LOG_BIN}" && ! -d "${MYSQL_LOG_BIN}" ]] ; then
+               einfo "Creating ${PN} log-bin directory '${MYSQL_LOG_BIN}' ..."
+               install -d -m 770 -o ${MYSQL_USER} -g ${MYSQL_GROUP} 
"${MYSQL_LOG_BIN}" \
+                       || die "Failed to create ${PN} log-bin directory 
'${MYSQL_LOG_BIN}'"
+       fi
+
+       if [[ -n "${MYSQL_LOG_BIN}" ]] ; then
+               local _my_logbin_testfile="$(_mktemp_dry 
"${MYSQL_LOG_BIN}/.pkg_config-access-test.XXXXXXXXX")"
+               [[ -z "${_my_logbin_testfile}" ]] \
+                       && die "_mktemp_dry() for 
'${MYSQL_LOG_BIN}/.pkg_config-access-test.XXXXXXXXX' failed!"
+
+               if use prefix ; then
+                       touch "${_my_logbin_testfile}" &>/dev/null
                else
-                       ewarn "Previous MY_DATADIR (${old_MY_DATADIR_s}) does 
not exist"
-                       if [[ -d "${MY_DATADIR_s}" ]]; then
-                               ewarn "Attempting to use ${MY_DATADIR_s}"
-                       else
-                               eerror "New MY_DATADIR (${MY_DATADIR_s}) does 
not exist"
-                               die "Configuration Failed! Please reinstall 
${CATEGORY}/${PN}"
-                       fi
+                       su -s /bin/sh -c "touch ${_my_logbin_testfile}" 
${MYSQL_USER} &>/dev/null
+               fi
+
+               if [[ $? -ne 0 ]] ; then
+                       die "${MYSQL_USER} user cannot write into log-bin 
directory '${MYSQL_LOG_BIN}'!"
+               else
+                       rm "${_my_logbin_testfile}" || die
+                       unset _my_logbin_testfile
                fi
        fi
 
-       local pwd1="a"
-       local pwd2="b"
-       local maxtry=15
+       if [[ -n "${MYSQL_RELAY_LOG}" && ! -d "${MYSQL_RELAY_LOG}" ]] ; then
+               einfo "Creating ${PN} relay-log directory '${MYSQL_RELAY_LOG}' 
..."
+               install -d -m 770 -o ${MYSQL_USER} -g ${MYSQL_GROUP} 
"${MYSQL_RELAY_LOG}" \
+                       || die "Failed to create ${PN} relay-log directory 
'${MYSQL_RELAY_LOG}'!"
+       fi
+
+       if [[ -n "${MYSQL_RELAY_LOG}" ]] ; then
+               local _my_relaylog_testfile="$(_mktemp_dry 
"${MYSQL_RELAY_LOG}/.pkg_config-access-test.XXXXXXXXX")"
+               [[ -z "${_my_relaylog_testfile}" ]] \
+                       && die "_mktemp_dry() for 
'${MYSQL_RELAY_LOG}/.pkg_config-access-test.XXXXXXXXX' failed!"
+
+               if use prefix ; then
+                       touch "${_my_relaylog_testfile}" &>/dev/null
+               else
+                       su -s /bin/sh -c "touch ${_my_relaylog_testfile}" 
${MYSQL_USER} &>/dev/null
+               fi
+
+               if [[ $? -ne 0 ]] ; then
+                       die "${MYSQL_USER} user cannot write into relay-log 
directory '${MYSQL_RELAY_LOG}'!"
+               else
+                       rm "${_my_relaylog_testfile}" || die
+                       unset _my_relaylog_testfile
+               fi
+       fi
+
+       local SETUP_TMPDIR=$(mktemp -d "/tmp/${PN}-config.XXXXXXXXX" 
2>/dev/null)
+       [[ -z "${SETUP_TMPDIR}" ]] && die "Failed to create setup tmpdir"
+
+       # Limit access
+       chmod 0770 "${SETUP_TMPDIR}" || die
+       chown ${MYSQL_USER} "${SETUP_TMPDIR}" || die
+
+
+       local mysql_install_log="${SETUP_TMPDIR}/install_db.log"
+       local mysqld_logfile="${SETUP_TMPDIR}/mysqld.log"
+
+       echo ""
+       einfo "Detected settings:"
+       einfo "=================="
+       einfo "MySQL User:\t\t\t\t${MYSQL_USER}"
+       einfo "MySQL Group:\t\t\t\t${MYSQL_GROUP}"
+       einfo "MySQL DATA directory:\t\t${MY_DATADIR}"
+       einfo "MySQL TMP directory:\t\t\t${MYSQL_TMPDIR}"
+
+       if [[ -n "${MYSQL_LOG_BIN}" ]] ; then
+               einfo "MySQL Binary Log File location:\t${MYSQL_LOG_BIN}"
+       fi
 
-       if [ -z "${MYSQL_ROOT_PASSWORD}" ]; then
+       if [[ -n "${MYSQL_RELAY_LOG}" ]] ; then
+               einfo "MySQL Relay Log File location:\t${MYSQL_RELAY_LOG}"
+       fi
+
+       einfo "PID DIR:\t\t\t\t${PID_DIR}"
+       einfo "Install db log:\t\t\t${mysql_install_log}"
+       einfo "Install server log:\t\t\t${mysqld_logfile}"
+
+       echo
+
+       if [[ -z "${MYSQL_ROOT_PASSWORD}" ]] ; then
                local tmp_mysqld_password_source=
 
-               for tmp_mysqld_password_source in mysql client; do
+               for tmp_mysqld_password_source in mysql client ; do
                        einfo "Trying to get password for mysql 'root' user 
from '${tmp_mysqld_password_source}' section ..."
                        MYSQL_ROOT_PASSWORD="$(_getoptval 
"${tmp_mysqld_password_source}" password)"
-                       if [[ -n "${MYSQL_ROOT_PASSWORD}" ]]; then
-                               if [[ ${MYSQL_ROOT_PASSWORD} == *$'\n'* ]]; then
+                       if [[ -n "${MYSQL_ROOT_PASSWORD}" ]] ; then
+                               if [[ ${MYSQL_ROOT_PASSWORD} == *$'\n'* ]] ; 
then
                                        ewarn "Ignoring password from 
'${tmp_mysqld_password_source}' section due to newline character (do you have 
multiple password options set?)!"
                                        MYSQL_ROOT_PASSWORD=
                                        continue
@@ -842,167 +1093,189 @@ pkg_config() {
                done
 
                # Sometimes --show is required to display passwords in some 
implementations of my_print_defaults
-               if [[ "${MYSQL_ROOT_PASSWORD}" == '*****' ]]; then
+               if [[ "${MYSQL_ROOT_PASSWORD}" == '*****' ]] ; then
                        MYSQL_ROOT_PASSWORD="$(_getoptval 
"${tmp_mysqld_password_source}" password --show)"
                fi
 
                unset tmp_mysqld_password_source
        fi
-       MYSQL_TMPDIR="$(_getoptval mysqld tmpdir | tail -n1)"
-       # These are dir+prefix
-       MYSQL_RELAY_LOG="$(_getoptval mysqld relay-log | tail -n1)"
-       MYSQL_RELAY_LOG=${MYSQL_RELAY_LOG%/*}
-       MYSQL_LOG_BIN="$(_getoptval mysqld log-bin | tail -n1)"
-       MYSQL_LOG_BIN=${MYSQL_LOG_BIN%/*}
-
-       if [[ ! -d "${ROOT}/$MYSQL_TMPDIR" ]]; then
-               einfo "Creating MySQL tmpdir $MYSQL_TMPDIR"
-               install -d -m 770 -o mysql -g mysql "${EROOT}/$MYSQL_TMPDIR"
-       fi
-       if [[ ! -d "${ROOT}/$MYSQL_LOG_BIN" ]]; then
-               einfo "Creating MySQL log-bin directory $MYSQL_LOG_BIN"
-               install -d -m 770 -o mysql -g mysql "${EROOT}/$MYSQL_LOG_BIN"
-       fi
-       if [[ ! -d "${EROOT}/$MYSQL_RELAY_LOG" ]]; then
-               einfo "Creating MySQL relay-log directory $MYSQL_RELAY_LOG"
-               install -d -m 770 -o mysql -g mysql "${EROOT}/$MYSQL_RELAY_LOG"
-       fi
-
-       if [[ -d "${ROOT}/${MY_DATADIR}/mysql" ]] ; then
-               ewarn "You have already a MySQL database in place."
-               ewarn "(${ROOT}/${MY_DATADIR}/*)"
-               ewarn "Please rename or delete it if you wish to replace it."
-               die "MySQL database already exists!"
-       fi
-
-       # Bug #213475 - MySQL _will_ object strenously if your machine is named
-       # localhost. Also causes weird failures.
-       [[ "${HOSTNAME}" == "localhost" ]] && die "Your machine must NOT be 
named localhost"
 
-       if [[ -z "${MYSQL_ROOT_PASSWORD}" ]]; then
-
-               einfo "Please provide a password for the mysql 
'root'@'localhost' user now"
-               einfo "or through the ${HOME}/.my.cnf file."
-               ewarn "Avoid [\"'\\_%] characters in the password"
+       if [[ -z "${MYSQL_ROOT_PASSWORD}" ]] ; then
+               local pwd1="a"
+               local pwd2="b"
+
+               echo
+               einfo "No password for mysql 'root' user was specified via 
environment"
+               einfo "variable MYSQL_ROOT_PASSWORD and no password was found 
in config"
+               einfo "file like '${HOME}/.my.cnf'."
+               einfo "To continue please provide a password for the mysql 
'root' user"
+               einfo "now on console:"
+               ewarn "NOTE: Please avoid [\"'\\_%] characters in the password!"
                read -rsp "    >" pwd1 ; echo
 
                einfo "Retype the password"
                read -rsp "    >" pwd2 ; echo
 
-               if [[ "x$pwd1" != "x$pwd2" ]] ; then
-                       die "Passwords are not the same"
+               if [[ "x${pwd1}" != "x${pwd2}" ]] ; then
+                       die "Passwords are not the same!"
                fi
 
                MYSQL_ROOT_PASSWORD="${pwd1}"
                unset pwd1 pwd2
+
+               echo
        fi
 
-       local options
-       local sqltmp="$(emktemp)"
+       local -a mysqld_options
 
        # Fix bug 446200. Don't reference host my.cnf, needs to come first,
-       # see https://bugs.mysql.com/bug.php?id=31312
-       use prefix && options="${options} 
'--defaults-file=${MY_SYSCONFDIR}/my.cnf'"
+       # see http://bugs.mysql.com/bug.php?id=31312
+       use prefix && mysqld_options+=( 
"--defaults-file='${MY_SYSCONFDIR}/my.cnf'" )
 
        # Figure out which options we need to disable to do the setup
        local helpfile="${TMPDIR}/mysqld-help"
        "${EROOT}/usr/sbin/mysqld" --verbose --help >"${helpfile}" 2>/dev/null
-       for opt in grant-tables host-cache name-resolve networking slave-start \
+
+       local opt optexp optfull
+       for opt in host-cache name-resolve networking slave-start \
                federated ssl log-bin relay-log slow-query-log external-locking 
\
                log-slave-updates \
-               ; do
+       ; do
                optexp="--(skip-)?${opt}" optfull="--loose-skip-${opt}"
-               egrep -sq -- "${optexp}" "${helpfile}" && options="${options} 
${optfull}"
+               egrep -sq -- "${optexp}" "${helpfile}" && mysqld_options+=( 
"${optfull}" )
        done
 
-       einfo "Creating the mysql database and setting proper permissions on it 
..."
+       # Prepare timezones, see
+       # https://dev.mysql.com/doc/mysql/en/time-zone-support.html
+       local tz_sql="${SETUP_TMPDIR}/tz.sql"
 
-       # Now that /var/run is a tmpfs mount point, we need to ensure it exists 
before using it
-       PID_DIR="${EROOT}/var/run/mysqld"
-       if [[ ! -d "${PID_DIR}" ]]; then
-               install -d -m 755 -o mysql -g mysql "${PID_DIR}" || die "Could 
not create pid directory"
+       echo "USE mysql;" >"${tz_sql}"
+       "${EROOT}/usr/bin/mysql_tzinfo_to_sql" "${EROOT}/usr/share/zoneinfo" >> 
"${tz_sql}" 2>/dev/null
+       if [[ $? -ne 0 ]] ; then
+               die "mysql_tzinfo_to_sql failed!"
        fi
 
-       if [[ ! -d "${MY_DATADIR}" ]]; then
-               install -d -m 750 -o mysql -g mysql "${MY_DATADIR}" || die 
"Could not create data directory"
-       fi
+       local cmd=(
+               "${mysql_install_db_binary}"
+               "${mysqld_options[@]}"
+               "--init-file='${tz_sql}'"
+               "--basedir='${EROOT}/usr'"
+               "--datadir='${MY_DATADIR}'"
+               "--tmpdir='${MYSQL_TMPDIR}'"
+               "--log-error='${mysql_install_log}'"
+               "--rpm"
+               "--cross-bootstrap"
+               "--skip-test-db"
+               "--user=${MYSQL_USER}"
+       )
 
-       pushd "${TMPDIR}" &>/dev/null || die
+       einfo "Initializing ${PN} data directory: ${cmd[@]}"
+       eval "${cmd[@]}" >>"${mysql_install_log}" 2>&1
 
-       # Filling timezones, see
-       # https://dev.mysql.com/doc/mysql/en/time-zone-support.html
-       "${EROOT}/usr/bin/mysql_tzinfo_to_sql" "${EROOT}/usr/share/zoneinfo" > 
"${sqltmp}" 2>/dev/null
-
-       local cmd=( "${EROOT}/usr/share/mariadb/scripts/mysql_install_db" )
-       [[ -f "${cmd}" ]] || cmd=( "${EROOT}/usr/bin/mysql_install_db" )
-       cmd+=( "--basedir=${EPREFIX}/usr" ${options} 
"--datadir=${ROOT}/${MY_DATADIR}" "--tmpdir=${ROOT}/${MYSQL_TMPDIR}" )
-       einfo "Command: ${cmd[*]}"
-       su -s /bin/sh -c "${cmd[*]}" mysql \
-               >"${TMPDIR}"/mysql_install_db.log 2>&1
-       if [[ $? -ne 0 ]]; then
-               grep -B5 -A999 -i "ERROR" "${TMPDIR}"/mysql_install_db.log 1>&2
-               die "Failed to initialize mysqld. Please review 
${EPREFIX}/var/log/mysql/mysqld.err AND ${TMPDIR}/mysql_install_db.log"
+       if [[ $? -ne 0 || ! -f "${MY_DATADIR}/mysql/user.frm" ]] ; then
+               grep -B5 -A999 -iE "(Aborting|ERROR|errno)" 
"${mysql_install_log}" 1>&2
+               die "Failed to initialize ${PN} data directory. Please review 
'${mysql_install_log}'!"
        fi
-       popd &>/dev/null || die
-       [[ -f "${ROOT}/${MY_DATADIR}/mysql/user.frm" ]] \
-               || die "MySQL databases not installed"
-
-       use prefix || options="${options} --user=mysql"
-
-       local socket="${EROOT}/var/run/mysqld/mysqld${RANDOM}.sock"
-       local pidfile="${EROOT}/var/run/mysqld/mysqld${RANDOM}.pid"
-       local mysqld="${EROOT}/usr/sbin/mysqld \
-               ${options} \
-               --log-warnings=0 \
-               --basedir=${EROOT}/usr \
-               --datadir=${ROOT}/${MY_DATADIR} \
-               --max_allowed_packet=8M \
-               --net_buffer_length=16K \
-               --socket=${socket} \
-               --pid-file=${pidfile} \
-               --tmpdir=${ROOT}/${MYSQL_TMPDIR}"
-       #einfo "About to start mysqld: ${mysqld}"
-       ebegin "Starting mysqld"
-       einfo "Command ${mysqld}"
-       ${mysqld} &
-       rc=$?
-       while ! [[ -S "${socket}" || "${maxtry}" -lt 1 ]] ; do
+
+       local x=${RANDOM}
+       local socket="${PID_DIR}/mysqld.${x}.sock"
+       [[ -f "${socket}" ]] && die "Randomness failed; Socket ${socket} 
already exists!"
+       local pidfile="${PID_DIR}/mysqld.${x}.pid"
+       [[ -f "${pidfile}" ]] && die "Randomness failed; Pidfile ${pidfile} 
already exists!"
+       unset x
+
+       cmd=(
+               "${mysqld_binary}"
+               "${mysqld_options[@]}"
+               "--basedir='${EROOT}/usr'"
+               "--datadir='${MY_DATADIR}'"
+               "--tmpdir='${MYSQL_TMPDIR}'"
+               --max_allowed_packet=8M
+               --net_buffer_length=16K
+               "--socket='${socket}'"
+               "--pid-file='${pidfile}'"
+               "--log-error='${mysqld_logfile}'"
+               "--user=${MYSQL_USER}"
+       )
+
+       einfo "Starting mysqld to finalize initialization: ${cmd[@]}"
+       eval "${cmd[@]}" >>"${mysqld_logfile}" 2>&1 &
+
+       echo -n "Waiting for mysqld to accept connections "
+       local maxtry=15
+       while [[ ! -S "${socket}" && "${maxtry}" -gt 1 ]] ; do
                maxtry=$((${maxtry}-1))
                echo -n "."
                sleep 1
        done
-       eend $rc
 
-       if ! [[ -S "${socket}" ]]; then
-               die "Completely failed to start up mysqld with: ${mysqld}"
+       if [[ -S "${socket}" ]] ; then
+               # Even with a socket we don't know if mysqld will abort
+               # start due to an error so just wait a little bit more...
+               maxtry=5
+               while [[ -S "${socket}" && "${maxtry}" -gt 1 ]] ; do
+                       maxtry=$((${maxtry}-1))
+                       echo -n "."
+                       sleep 1
+               done
+       fi
+
+       echo
+
+       if [[ ! -S "${socket}" ]] ; then
+               grep -B5 -A999 -iE "(Aborting|ERROR|errno)" "${mysqld_logfile}" 
1>&2
+               die "mysqld was unable to start from initialized data 
directory. Please review '${mysqld_logfile}'!"
        fi
 
+       local mysql_logfile="${SETUP_TMPDIR}/set_root_pw.log"
+       touch "${mysql_logfile}" || die
+
        ebegin "Setting root password"
        # Do this from memory, as we don't want clear text passwords in temp 
files
-       local sql="UPDATE mysql.user SET Password = 
PASSWORD('${MYSQL_ROOT_PASSWORD}') WHERE USER='root'; FLUSH PRIVILEGES"
-       "${EROOT}/usr/bin/mysql" \
-               "--socket=${socket}" \
-               -hlocalhost \
-               -e "${sql}"
-       eend $?
-
-       if [[ -n "${sqltmp}" ]] ; then
-               ebegin "Loading \"zoneinfo\", this step may require a few 
seconds"
-               "${EROOT}/usr/bin/mysql" \
-                       "--socket=${socket}" \
-                       -hlocalhost \
-                       -uroot \
-                       --password="${MYSQL_ROOT_PASSWORD}" \
-                       mysql < "${sqltmp}"
-               rc=$?
-               eend $?
-               [[ $rc -ne 0 ]] && ewarn "Failed to load zoneinfo!"
-       fi
-
-       # Stop the server and cleanup
-       einfo "Stopping the server ..."
-       kill $(< "${pidfile}" )
-       rm -f "${sqltmp}"
-       wait %1
-       einfo "Done"
+       local sql="ALTER USER 'root'@'localhost' IDENTIFIED BY 
'${MYSQL_ROOT_PASSWORD}'"
+       cmd=(
+               "${mysql_binary}"
+               --no-defaults
+               "--socket='${socket}'"
+               -hlocalhost
+               "-e \"${sql}\""
+       )
+       eval "${cmd[@]}" >"${mysql_logfile}" 2>&1
+       local rc=$?
+       eend ${rc}
+
+       if [[ ${rc} -ne 0 ]] ; then
+               # Poor man's solution which tries to avoid having password
+               # in log.  NOTE: sed can fail if user didn't follow advice
+               # and included character which will require escaping...
+               sed -i -e "s/${MYSQL_ROOT_PASSWORD}/*****/" "${mysql_logfile}" 
2>/dev/null
+
+               grep -B5 -A999 -iE "(Aborting|ERROR|errno)" "${mysql_logfile}"
+               die "Failed to set ${PN} root password. Please review 
'${mysql_logfile}'!"
+       fi
+
+       # Stop the server
+       if [[ -f "${pidfile}" ]] && pgrep -F "${pidfile}" &>/dev/null ; then
+               echo -n "Stopping the server "
+               pkill -F "${pidfile}" &>/dev/null
+
+               maxtry=10
+               while [[ -f "${pidfile}" ]] && pgrep -F "${pidfile}" 
&>/dev/null ; do
+                       maxtry=$((${maxtry}-1))
+                       echo -n "."
+                       sleep 1
+               done
+
+               echo
+
+               if [[ -f "${pidfile}" ]] && pgrep -F "${pidfile}" &>/dev/null ; 
then
+                       # We somehow failed to stop server.
+                       # However, not a fatal error. Just warn the user.
+                       ewarn "WARNING: mysqld[$(cat "${pidfile}")] is still 
running!"
+               fi
+       fi
+
+       rm -r "${SETUP_TMPDIR}" || die
+
+       einfo "${PN} data directory at '${MY_DATADIR}' successfully 
initialized!"
 }

diff --git a/dev-db/mariadb/mariadb-10.4.18-r2.ebuild 
b/dev-db/mariadb/mariadb-10.4.18-r2.ebuild
index c858a3d8b66..e1889aedf00 100644
--- a/dev-db/mariadb/mariadb-10.4.18-r2.ebuild
+++ b/dev-db/mariadb/mariadb-10.4.18-r2.ebuild
@@ -793,63 +793,313 @@ pkg_postinst() {
 
 pkg_config() {
        _getoptval() {
-               local mypd="${EROOT}"/usr/libexec/mariadb/my_print_defaults
-               local section="$1"
+               local section="${1}"
                local flag="--${2}="
                local extra_options="${3}"
-               "${mypd}" $extra_options $section | sed -n 
"/^${flag}/s,${flag},,gp"
+               local cmd=(
+                       "${my_print_defaults_binary}"
+                       "${extra_options}"
+                       "${section}"
+               )
+               local results=( $(eval "${cmd[@]}" 2>/dev/null | sed -n 
"/^${flag}/s,${flag},,gp") )
+
+               if [[ ${#results[@]} -gt 0 ]] ; then
+                       # When option is set multiple times only return last 
value
+                       echo "${results[-1]}"
+               fi
        }
-       local old_MY_DATADIR="${MY_DATADIR}"
-       local old_HOME="${HOME}"
+
+       _mktemp_dry() {
+               # emktemp has no --dry-run option
+               local template="${1}"
+
+               if [[ -z "${template}" ]] ; then
+                       if [[ -z "${T}" ]] ; then
+                               template="/tmp/XXXXXXX"
+                       else
+                               template="${T}/XXXXXXX"
+                       fi
+               fi
+
+               local template_wo_X=${template//X/}
+               local n_X
+               let n_X=${#template}-${#template_wo_X}
+               if [[ ${n_X} -lt 3 ]] ; then
+                       echo "${FUNCNAME[0]}: too few X's in template 
‘${template}’" >&2
+                       return
+               fi
+
+               local attempts=0
+               local character tmpfile
+               while [[ true ]] ; do
+                       let attempts=attempts+1
+
+                       new_file=
+                       while read -n1 character ; do
+                               if [[ "${character}" == "X" ]] ; then
+                                       tmpfile+="${RANDOM:0:1}"
+                               else
+                                       tmpfile+="${character}"
+                               fi
+                       done < <(echo -n "${template}")
+
+                       if [[ ! -f "${tmpfile}" ]]
+                       then
+                               echo "${tmpfile}"
+                               return
+                       fi
+
+                       if [[ ${attempts} -ge 100 ]] ; then
+                               echo "${FUNCNAME[0]}: Cannot create temporary 
file after 100 attempts." >&2
+                               return
+                       fi
+               done
+       }
+
+       local mysql_binary="${EROOT}/usr/bin/mysql"
+       if [[ ! -x "${mysql_binary}" ]] ; then
+               die "'${mysql_binary}' not found! Please re-install 
${CATEGORY}/${PN}!"
+       fi
+
+       local mysqld_binary="${EROOT}/usr/sbin/mysqld"
+       if [[ ! -x "${mysqld_binary}" ]] ; then
+               die "'${mysqld_binary}' not found! Please re-install 
${CATEGORY}/${PN}!"
+       fi
+
+       local mysql_install_db_binary="${EROOT}/usr/bin/mysql_install_db"
+       if [[ ! -x "${mysql_install_db_binary}" ]] ; then
+               die "'${mysql_install_db_binary}' not found! Please re-install 
${CATEGORY}/${PN}!"
+       fi
+
+       local my_print_defaults_binary="${EROOT}/usr/bin/my_print_defaults"
+       if [[ ! -x "${my_print_defaults_binary}" ]] ; then
+               die "'${my_print_defaults_binary}' not found! Please re-install 
dev-db/mysql-connector-c!"
+       fi
+
+       if [[ -z "${MYSQL_USER}" ]] ; then
+               MYSQL_USER=mysql
+               if use prefix ; then
+                       MYSQL_USER=$(id -u -n 2>/dev/null)
+                       if [[ -z "${MYSQL_USER}" ]] ; then
+                               die "Failed to determine current username!"
+                       fi
+               fi
+       fi
+
+       if [[ -z "${MYSQL_GROUP}" ]] ; then
+               MYSQL_GROUP=mysql
+               if use prefix ; then
+                       MYSQL_GROUP=$(id -g -n 2>/dev/null)
+                       if [[ -z "${MYSQL_GROUP}" ]] ; then
+                               die "Failed to determine current user 
groupname!"
+                       fi
+               fi
+       fi
+
        # my_print_defaults needs to read stuff in $HOME/.my.cnf
-       export HOME=${EPREFIX}/root
+       local -x HOME="${EROOT}/root"
 
        # Make sure the vars are correctly initialized
        mysql_init_vars
 
-       [[ -z "${MY_DATADIR}" ]] && die "Sorry, unable to find MY_DATADIR"
-       if [[ ! -x "${EROOT}/usr/sbin/mysqld" ]] ; then
-               die "Minimal builds do NOT include the MySQL server"
+       # Read currently set data directory
+       MY_DATADIR="$(_getoptval mysqld datadir 
"--defaults-file='${MY_SYSCONFDIR}/my.cnf'")"
+
+       # Bug #213475 - MySQL _will_ object strenously if your machine is named
+       # localhost. Also causes weird failures.
+       [[ "${HOSTNAME}" == "localhost" ]] && die "Your machine must NOT be 
named localhost"
+
+       if [[ -z "${MY_DATADIR}" ]] ; then
+               die "Sorry, unable to find MY_DATADIR!"
+       elif [[ -d "${MY_DATADIR}/mysql" ]] ; then
+               ewarn "Looks like your data directory '${MY_DATADIR}' is 
already initialized!"
+               ewarn "Please rename or delete its content if you wish to 
initialize a new data directory."
+               die "${PN} data directory at '${MY_DATADIR}' looks already 
initialized!"
        fi
 
-       if [[ ( -n "${MY_DATADIR}" ) && ( "${MY_DATADIR}" != 
"${old_MY_DATADIR}" ) ]]; then
-               local MY_DATADIR_s="${ROOT}/${MY_DATADIR}"
-               MY_DATADIR_s="${MY_DATADIR_s%%/}"
-               local old_MY_DATADIR_s="${ROOT}/${old_MY_DATADIR}"
-               old_MY_DATADIR_s="${old_MY_DATADIR_s%%/}"
+       MYSQL_TMPDIR="$(_getoptval mysqld tmpdir 
"--defaults-file='${MY_SYSCONFDIR}/my.cnf'")"
+       MYSQL_TMPDIR=${MYSQL_TMPDIR%/}
+       # These are dir+prefix
+       MYSQL_LOG_BIN="$(_getoptval mysqld log-bin 
"--defaults-file='${MY_SYSCONFDIR}/my.cnf'")"
+       MYSQL_LOG_BIN=${MYSQL_LOG_BIN%/*}
+       MYSQL_RELAY_LOG="$(_getoptval mysqld relay-log 
"--defaults-file='${MY_SYSCONFDIR}/my.cnf'")"
+       MYSQL_RELAY_LOG=${MYSQL_RELAY_LOG%/*}
 
-               if [[ ( -d "${old_MY_DATADIR_s}" ) && ( "${old_MY_DATADIR_s}" 
!= / ) ]]; then
-                       if [[ -d "${MY_DATADIR_s}" ]]; then
-                               ewarn "Both ${old_MY_DATADIR_s} and 
${MY_DATADIR_s} exist"
-                               ewarn "Attempting to use ${MY_DATADIR_s} and 
preserving ${old_MY_DATADIR_s}"
-                       else
-                               elog "Moving MY_DATADIR from 
${old_MY_DATADIR_s} to ${MY_DATADIR_s}"
-                               mv --strip-trailing-slashes -T 
"${old_MY_DATADIR_s}" "${MY_DATADIR_s}" \
-                               || die "Moving MY_DATADIR failed"
-                       fi
+       # Create missing directories.
+       # Always check if mysql user can write to directory even if we just
+       # created directory because a parent directory might be not
+       # accessible for that user.
+       PID_DIR="${EROOT}/run/mysqld"
+       if [[ ! -d "${PID_DIR}" ]] ; then
+               einfo "Creating ${PN} PID directory '${PID_DIR}' ..."
+               install -d -m 755 -o ${MYSQL_USER} -g ${MYSQL_GROUP} 
"${PID_DIR}" \
+                       || die "Failed to create PID directory '${PID_DIR}'!"
+       fi
+
+       local _pid_dir_testfile="$(_mktemp_dry 
"${PID_DIR}/.pkg_config-access-test.XXXXXXXXX")"
+       [[ -z "${_pid_dir_testfile}" ]] \
+               && die "_mktemp_dry() for 
'${PID_DIR}/.pkg_config-access-test.XXXXXXXXX' failed!"
+
+       if use prefix ; then
+               touch "${_pid_dir_testfile}" &>/dev/null
+       else
+               su -s /bin/sh -c "touch ${_pid_dir_testfile}" ${MYSQL_USER} 
&>/dev/null
+       fi
+
+       if [[ $? -ne 0 ]] ; then
+               die "${MYSQL_USER} user cannot write into PID dir '${PID_DIR}'!"
+       else
+               rm "${_pid_dir_testfile}" || die
+               unset _pid_dir_testfile
+       fi
+
+       if [[ ! -d "${MY_DATADIR}" ]] ; then
+               einfo "Creating ${PN} data directory '${MY_DATADIR}' ..."
+               install -d -m 770 -o ${MYSQL_USER} -g ${MYSQL_GROUP} 
"${MY_DATADIR}" \
+                       || die "Failed to create ${PN} data directory 
'${MY_DATADIR}'!"
+       fi
+
+       local _my_datadir_testfile="$(_mktemp_dry 
"${MY_DATADIR}/.pkg_config-access-test.XXXXXXXXX")"
+       [[ -z "${_my_datadir_testfile}" ]] \
+               && die "_mktemp_dry() for 
'${MY_DATADIR}/.pkg_config-access-test.XXXXXXXXX' failed!"
+
+       if use prefix ; then
+               touch "${_my_datadir_testfile}" &>/dev/null
+       else
+               su -s /bin/sh -c "touch ${_my_datadir_testfile}" ${MYSQL_USER} 
&>/dev/null
+       fi
+
+       if [[ $? -ne 0 ]] ; then
+               die "${MYSQL_USER} user cannot write into data directory 
'${MY_DATADIR}'!"
+       else
+               rm "${_my_datadir_testfile}" || die
+               unset _my_datadir_testfile
+       fi
+
+       if [[ -n "${MYSQL_TMPDIR}" && ! -d "${MYSQL_TMPDIR}" ]] ; then
+               einfo "Creating ${PN} tmpdir '${MYSQL_TMPDIR}' ..."
+               install -d -m 770 -o ${MYSQL_USER} -g ${MYSQL_GROUP} 
"${MYSQL_TMPDIR}" \
+                       || die "Failed to create ${PN} tmpdir 
'${MYSQL_TMPDIR}'!"
+       fi
+
+       if [[ -z "${MYSQL_TMPDIR}" ]] ; then
+               MYSQL_TMPDIR="$(_mktemp_dry 
"${EROOT}/tmp/mysqld-tmp.XXXXXXXXX")"
+               [[ -z "${MYSQL_TMPDIR}" ]] \
+                       && die "_mktemp_dry() for '${MYSQL_TMPDIR}' failed!"
+
+               mkdir "${MYSQL_TMPDIR}" || die
+               chown ${MYSQL_USER} "${MYSQL_TMPDIR}" || die
+       fi
+
+       # Now we need to test MYSQL_TMPDIR...
+       local _my_tmpdir_testfile="$(_mktemp_dry 
"${MYSQL_TMPDIR}/.pkg_config-access-test.XXXXXXXXX")"
+       [[ -z "${_my_tmpdir_testfile}" ]] \
+               && die "_mktemp_dry() for 
'${MYSQL_TMPDIR}/.pkg_config-access-test.XXXXXXXXX' failed!"
+
+       if use prefix ; then
+               touch "${_my_tmpdir_testfile}" &>/dev/null
+       else
+               su -s /bin/sh -c "touch ${_my_tmpdir_testfile}" ${MYSQL_USER} 
&>/dev/null
+       fi
+
+       if [[ $? -ne 0 ]] ; then
+               die "${MYSQL_USER} user cannot write into tmpdir 
'${MYSQL_TMPDIR}'!"
+       else
+               rm "${_my_tmpdir_testfile}" || die
+               unset _my_tmpdir_testfile
+       fi
+
+       if [[ -n "${MYSQL_LOG_BIN}" && ! -d "${MYSQL_LOG_BIN}" ]] ; then
+               einfo "Creating ${PN} log-bin directory '${MYSQL_LOG_BIN}' ..."
+               install -d -m 770 -o ${MYSQL_USER} -g ${MYSQL_GROUP} 
"${MYSQL_LOG_BIN}" \
+                       || die "Failed to create ${PN} log-bin directory 
'${MYSQL_LOG_BIN}'"
+       fi
+
+       if [[ -n "${MYSQL_LOG_BIN}" ]] ; then
+               local _my_logbin_testfile="$(_mktemp_dry 
"${MYSQL_LOG_BIN}/.pkg_config-access-test.XXXXXXXXX")"
+               [[ -z "${_my_logbin_testfile}" ]] \
+                       && die "_mktemp_dry() for 
'${MYSQL_LOG_BIN}/.pkg_config-access-test.XXXXXXXXX' failed!"
+
+               if use prefix ; then
+                       touch "${_my_logbin_testfile}" &>/dev/null
                else
-                       ewarn "Previous MY_DATADIR (${old_MY_DATADIR_s}) does 
not exist"
-                       if [[ -d "${MY_DATADIR_s}" ]]; then
-                               ewarn "Attempting to use ${MY_DATADIR_s}"
-                       else
-                               eerror "New MY_DATADIR (${MY_DATADIR_s}) does 
not exist"
-                               die "Configuration Failed! Please reinstall 
${CATEGORY}/${PN}"
-                       fi
+                       su -s /bin/sh -c "touch ${_my_logbin_testfile}" 
${MYSQL_USER} &>/dev/null
+               fi
+
+               if [[ $? -ne 0 ]] ; then
+                       die "${MYSQL_USER} user cannot write into log-bin 
directory '${MYSQL_LOG_BIN}'!"
+               else
+                       rm "${_my_logbin_testfile}" || die
+                       unset _my_logbin_testfile
                fi
        fi
 
-       local pwd1="a"
-       local pwd2="b"
-       local maxtry=15
+       if [[ -n "${MYSQL_RELAY_LOG}" && ! -d "${MYSQL_RELAY_LOG}" ]] ; then
+               einfo "Creating ${PN} relay-log directory '${MYSQL_RELAY_LOG}' 
..."
+               install -d -m 770 -o ${MYSQL_USER} -g ${MYSQL_GROUP} 
"${MYSQL_RELAY_LOG}" \
+                       || die "Failed to create ${PN} relay-log directory 
'${MYSQL_RELAY_LOG}'!"
+       fi
 
-       if [ -z "${MYSQL_ROOT_PASSWORD}" ]; then
+       if [[ -n "${MYSQL_RELAY_LOG}" ]] ; then
+               local _my_relaylog_testfile="$(_mktemp_dry 
"${MYSQL_RELAY_LOG}/.pkg_config-access-test.XXXXXXXXX")"
+               [[ -z "${_my_relaylog_testfile}" ]] \
+                       && die "_mktemp_dry() for 
'${MYSQL_RELAY_LOG}/.pkg_config-access-test.XXXXXXXXX' failed!"
+
+               if use prefix ; then
+                       touch "${_my_relaylog_testfile}" &>/dev/null
+               else
+                       su -s /bin/sh -c "touch ${_my_relaylog_testfile}" 
${MYSQL_USER} &>/dev/null
+               fi
+
+               if [[ $? -ne 0 ]] ; then
+                       die "${MYSQL_USER} user cannot write into relay-log 
directory '${MYSQL_RELAY_LOG}'!"
+               else
+                       rm "${_my_relaylog_testfile}" || die
+                       unset _my_relaylog_testfile
+               fi
+       fi
+
+       local SETUP_TMPDIR=$(mktemp -d "/tmp/${PN}-config.XXXXXXXXX" 
2>/dev/null)
+       [[ -z "${SETUP_TMPDIR}" ]] && die "Failed to create setup tmpdir"
+
+       # Limit access
+       chmod 0770 "${SETUP_TMPDIR}" || die
+       chown ${MYSQL_USER} "${SETUP_TMPDIR}" || die
+
+
+       local mysql_install_log="${SETUP_TMPDIR}/install_db.log"
+       local mysqld_logfile="${SETUP_TMPDIR}/mysqld.log"
+
+       echo ""
+       einfo "Detected settings:"
+       einfo "=================="
+       einfo "MySQL User:\t\t\t\t${MYSQL_USER}"
+       einfo "MySQL Group:\t\t\t\t${MYSQL_GROUP}"
+       einfo "MySQL DATA directory:\t\t${MY_DATADIR}"
+       einfo "MySQL TMP directory:\t\t\t${MYSQL_TMPDIR}"
+
+       if [[ -n "${MYSQL_LOG_BIN}" ]] ; then
+               einfo "MySQL Binary Log File location:\t${MYSQL_LOG_BIN}"
+       fi
+
+       if [[ -n "${MYSQL_RELAY_LOG}" ]] ; then
+               einfo "MySQL Relay Log File location:\t${MYSQL_RELAY_LOG}"
+       fi
+
+       einfo "PID DIR:\t\t\t\t${PID_DIR}"
+       einfo "Install db log:\t\t\t${mysql_install_log}"
+       einfo "Install server log:\t\t\t${mysqld_logfile}"
+
+       echo
+
+       if [[ -z "${MYSQL_ROOT_PASSWORD}" ]] ; then
                local tmp_mysqld_password_source=
 
-               for tmp_mysqld_password_source in mysql client; do
+               for tmp_mysqld_password_source in mysql client ; do
                        einfo "Trying to get password for mysql 'root' user 
from '${tmp_mysqld_password_source}' section ..."
                        MYSQL_ROOT_PASSWORD="$(_getoptval 
"${tmp_mysqld_password_source}" password)"
-                       if [[ -n "${MYSQL_ROOT_PASSWORD}" ]]; then
-                               if [[ ${MYSQL_ROOT_PASSWORD} == *$'\n'* ]]; then
+                       if [[ -n "${MYSQL_ROOT_PASSWORD}" ]] ; then
+                               if [[ ${MYSQL_ROOT_PASSWORD} == *$'\n'* ]] ; 
then
                                        ewarn "Ignoring password from 
'${tmp_mysqld_password_source}' section due to newline character (do you have 
multiple password options set?)!"
                                        MYSQL_ROOT_PASSWORD=
                                        continue
@@ -861,179 +1111,189 @@ pkg_config() {
                done
 
                # Sometimes --show is required to display passwords in some 
implementations of my_print_defaults
-               if [[ "${MYSQL_ROOT_PASSWORD}" == '*****' ]]; then
+               if [[ "${MYSQL_ROOT_PASSWORD}" == '*****' ]] ; then
                        MYSQL_ROOT_PASSWORD="$(_getoptval 
"${tmp_mysqld_password_source}" password --show)"
                fi
 
                unset tmp_mysqld_password_source
        fi
-       MYSQL_TMPDIR="$(_getoptval mysqld tmpdir | tail -n1)"
-       # These are dir+prefix
-       MYSQL_RELAY_LOG="$(_getoptval mysqld relay-log | tail -n1)"
-       MYSQL_RELAY_LOG=${MYSQL_RELAY_LOG%/*}
-       MYSQL_LOG_BIN="$(_getoptval mysqld log-bin | tail -n1)"
-       MYSQL_LOG_BIN=${MYSQL_LOG_BIN%/*}
-
-       if [[ ! -d "${ROOT}/$MYSQL_TMPDIR" ]]; then
-               einfo "Creating MySQL tmpdir $MYSQL_TMPDIR"
-               install -d -m 770 -o mysql -g mysql "${EROOT}/$MYSQL_TMPDIR"
-       fi
-       if [[ ! -d "${ROOT}/$MYSQL_LOG_BIN" ]]; then
-               einfo "Creating MySQL log-bin directory $MYSQL_LOG_BIN"
-               install -d -m 770 -o mysql -g mysql "${EROOT}/$MYSQL_LOG_BIN"
-       fi
-       if [[ ! -d "${EROOT}/$MYSQL_RELAY_LOG" ]]; then
-               einfo "Creating MySQL relay-log directory $MYSQL_RELAY_LOG"
-               install -d -m 770 -o mysql -g mysql "${EROOT}/$MYSQL_RELAY_LOG"
-       fi
 
-       if [[ -d "${ROOT}/${MY_DATADIR}/mysql" ]] ; then
-               ewarn "You have already a MySQL database in place."
-               ewarn "(${ROOT}/${MY_DATADIR}/*)"
-               ewarn "Please rename or delete it if you wish to replace it."
-               die "MySQL database already exists!"
-       fi
-
-       # Bug #213475 - MySQL _will_ object strenously if your machine is named
-       # localhost. Also causes weird failures.
-       [[ "${HOSTNAME}" == "localhost" ]] && die "Your machine must NOT be 
named localhost"
-
-       if [[ -z "${MYSQL_ROOT_PASSWORD}" ]]; then
-
-               einfo "Please provide a password for the mysql 
'root'@'localhost' user now"
-               einfo "or through the ${HOME}/.my.cnf file."
-               ewarn "Avoid [\"'\\_%] characters in the password"
-               einfo "Not entering a password defaults to UNIX authentication"
+       if [[ -z "${MYSQL_ROOT_PASSWORD}" ]] ; then
+               local pwd1="a"
+               local pwd2="b"
+
+               echo
+               einfo "No password for mysql 'root' user was specified via 
environment"
+               einfo "variable MYSQL_ROOT_PASSWORD and no password was found 
in config"
+               einfo "file like '${HOME}/.my.cnf'."
+               einfo "To continue please provide a password for the mysql 
'root' user"
+               einfo "now on console:"
+               ewarn "NOTE: Please avoid [\"'\\_%] characters in the password!"
                read -rsp "    >" pwd1 ; echo
 
-               if [[ -n "${pwd1}" ]] ; then
-                       einfo "Retype the password"
-                       read -rsp "    >" pwd2 ; echo
+               einfo "Retype the password"
+               read -rsp "    >" pwd2 ; echo
 
-                       if [[ "x$pwd1" != "x$pwd2" ]] ; then
-                               die "Passwords are not the same"
-                       fi
-
-                       MYSQL_ROOT_PASSWORD="${pwd1}"
+               if [[ "x${pwd1}" != "x${pwd2}" ]] ; then
+                       die "Passwords are not the same!"
                fi
 
+               MYSQL_ROOT_PASSWORD="${pwd1}"
                unset pwd1 pwd2
+
+               echo
        fi
 
-       local options
-       local sqltmp="$(emktemp)"
+       local -a mysqld_options
 
        # Fix bug 446200. Don't reference host my.cnf, needs to come first,
-       # see https://bugs.mysql.com/bug.php?id=31312
-       use prefix && options="${options} 
'--defaults-file=${MY_SYSCONFDIR}/my.cnf'"
+       # see http://bugs.mysql.com/bug.php?id=31312
+       use prefix && mysqld_options+=( 
"--defaults-file='${MY_SYSCONFDIR}/my.cnf'" )
 
        # Figure out which options we need to disable to do the setup
        local helpfile="${TMPDIR}/mysqld-help"
        "${EROOT}/usr/sbin/mysqld" --verbose --help >"${helpfile}" 2>/dev/null
+
+       local opt optexp optfull
        for opt in host-cache name-resolve networking slave-start \
                federated ssl log-bin relay-log slow-query-log external-locking 
\
                log-slave-updates \
-               ; do
+       ; do
                optexp="--(skip-)?${opt}" optfull="--loose-skip-${opt}"
-               egrep -sq -- "${optexp}" "${helpfile}" && options="${options} 
${optfull}"
+               egrep -sq -- "${optexp}" "${helpfile}" && mysqld_options+=( 
"${optfull}" )
        done
 
-       einfo "Creating the mysql database and setting proper permissions on it 
..."
+       # Prepare timezones, see
+       # https://dev.mysql.com/doc/mysql/en/time-zone-support.html
+       local tz_sql="${SETUP_TMPDIR}/tz.sql"
 
-       # Now that /var/run is a tmpfs mount point, we need to ensure it exists 
before using it
-       PID_DIR="${EROOT}/var/run/mysqld"
-       if [[ ! -d "${PID_DIR}" ]]; then
-               install -d -m 755 -o mysql -g mysql "${PID_DIR}" || die "Could 
not create pid directory"
+       echo "USE mysql;" >"${tz_sql}"
+       "${EROOT}/usr/bin/mysql_tzinfo_to_sql" "${EROOT}/usr/share/zoneinfo" >> 
"${tz_sql}" 2>/dev/null
+       if [[ $? -ne 0 ]] ; then
+               die "mysql_tzinfo_to_sql failed!"
        fi
 
-       if [[ ! -d "${MY_DATADIR}" ]]; then
-               install -d -m 750 -o mysql -g mysql "${MY_DATADIR}" || die 
"Could not create data directory"
-       fi
+       local cmd=(
+               "${mysql_install_db_binary}"
+               "${mysqld_options[@]}"
+               "--init-file='${tz_sql}'"
+               "--basedir='${EROOT}/usr'"
+               "--datadir='${MY_DATADIR}'"
+               "--tmpdir='${MYSQL_TMPDIR}'"
+               "--log-error='${mysql_install_log}'"
+               "--rpm"
+               "--cross-bootstrap"
+               "--skip-test-db"
+               "--user=${MYSQL_USER}"
+       )
 
-       pushd "${TMPDIR}" &>/dev/null || die
+       einfo "Initializing ${PN} data directory: ${cmd[@]}"
+       eval "${cmd[@]}" >>"${mysql_install_log}" 2>&1
 
-       # Filling timezones, see
-       # https://dev.mysql.com/doc/mysql/en/time-zone-support.html
-       "${EROOT}/usr/bin/mysql_tzinfo_to_sql" "${EROOT}/usr/share/zoneinfo" > 
"${sqltmp}" 2>/dev/null
-
-       local cmd=( "${EROOT}/usr/share/mariadb/scripts/mysql_install_db" )
-       [[ -f "${cmd}" ]] || cmd=( "${EROOT}/usr/bin/mysql_install_db" )
-       cmd+=( "--basedir=${EPREFIX}/usr" ${options} 
"--datadir=${ROOT}/${MY_DATADIR}" "--tmpdir=${ROOT}/${MYSQL_TMPDIR}" )
-       einfo "Command: ${cmd[*]}"
-       su -s /bin/sh -c "${cmd[*]}" mysql \
-               >"${TMPDIR}"/mysql_install_db.log 2>&1
-       if [[ $? -ne 0 ]]; then
-               grep -B5 -A999 -i "ERROR" "${TMPDIR}"/mysql_install_db.log 1>&2
-               die "Failed to initialize mysqld. Please review 
${EPREFIX}/var/log/mysql/mysqld.err AND ${TMPDIR}/mysql_install_db.log"
+       if [[ $? -ne 0 || ! -f "${MY_DATADIR}/mysql/user.frm" ]] ; then
+               grep -B5 -A999 -iE "(Aborting|ERROR|errno)" 
"${mysql_install_log}" 1>&2
+               die "Failed to initialize ${PN} data directory. Please review 
'${mysql_install_log}'!"
        fi
-       popd &>/dev/null || die
-       [[ -f "${ROOT}/${MY_DATADIR}/mysql/user.frm" ]] \
-               || die "MySQL databases not installed"
 
-       if [[ -z ${sqltmp} && -z ${MYSQL_ROOT_PASSWORD} ]] ; then
-               einfo "Done"
-               exit 0
-       fi
+       local x=${RANDOM}
+       local socket="${PID_DIR}/mysqld.${x}.sock"
+       [[ -f "${socket}" ]] && die "Randomness failed; Socket ${socket} 
already exists!"
+       local pidfile="${PID_DIR}/mysqld.${x}.pid"
+       [[ -f "${pidfile}" ]] && die "Randomness failed; Pidfile ${pidfile} 
already exists!"
+       unset x
+
+       cmd=(
+               "${mysqld_binary}"
+               "${mysqld_options[@]}"
+               "--basedir='${EROOT}/usr'"
+               "--datadir='${MY_DATADIR}'"
+               "--tmpdir='${MYSQL_TMPDIR}'"
+               --max_allowed_packet=8M
+               --net_buffer_length=16K
+               "--socket='${socket}'"
+               "--pid-file='${pidfile}'"
+               "--log-error='${mysqld_logfile}'"
+               "--user=${MYSQL_USER}"
+       )
 
-       use prefix || options="${options} --user=mysql"
-
-       local socket="${EROOT}/var/run/mysqld/mysqld${RANDOM}.sock"
-       local pidfile="${EROOT}/var/run/mysqld/mysqld${RANDOM}.pid"
-       local mysqld="${EROOT}/usr/sbin/mysqld \
-               ${options} \
-               --log-warnings=0 \
-               --basedir=${EROOT}/usr \
-               --datadir=${ROOT}/${MY_DATADIR} \
-               --max_allowed_packet=8M \
-               --net_buffer_length=16K \
-               --socket=${socket} \
-               --pid-file=${pidfile} \
-               --tmpdir=${ROOT}/${MYSQL_TMPDIR}"
-       #einfo "About to start mysqld: ${mysqld}"
-       ebegin "Starting mysqld"
-       einfo "Command ${mysqld}"
-       ${mysqld} &
-       rc=$?
-       while ! [[ -S "${socket}" || "${maxtry}" -lt 1 ]] ; do
+       einfo "Starting mysqld to finalize initialization: ${cmd[@]}"
+       eval "${cmd[@]}" >>"${mysqld_logfile}" 2>&1 &
+
+       echo -n "Waiting for mysqld to accept connections "
+       local maxtry=15
+       while [[ ! -S "${socket}" && "${maxtry}" -gt 1 ]] ; do
                maxtry=$((${maxtry}-1))
                echo -n "."
                sleep 1
        done
-       eend $rc
 
-       if ! [[ -S "${socket}" ]]; then
-               die "Completely failed to start up mysqld with: ${mysqld}"
+       if [[ -S "${socket}" ]] ; then
+               # Even with a socket we don't know if mysqld will abort
+               # start due to an error so just wait a little bit more...
+               maxtry=5
+               while [[ -S "${socket}" && "${maxtry}" -gt 1 ]] ; do
+                       maxtry=$((${maxtry}-1))
+                       echo -n "."
+                       sleep 1
+               done
+       fi
+
+       echo
+
+       if [[ ! -S "${socket}" ]] ; then
+               grep -B5 -A999 -iE "(Aborting|ERROR|errno)" "${mysqld_logfile}" 
1>&2
+               die "mysqld was unable to start from initialized data 
directory. Please review '${mysqld_logfile}'!"
        fi
 
-       if [[ -n "${MYSQL_ROOT_PASSWORD}" ]] ; then
-               ebegin "Setting root password"
-               # Do this from memory, as we don't want clear text passwords in 
temp files
-               local sql="SET PASSWORD FOR 'root'@'localhost' = 
PASSWORD('${MYSQL_ROOT_PASSWORD}')"
-               "${EROOT}/usr/bin/mysql" \
-                       "--socket=${socket}" \
-                       -hlocalhost \
-                       -e "${sql}"
-               unset sql
-               eend $?
+       local mysql_logfile="${SETUP_TMPDIR}/set_root_pw.log"
+       touch "${mysql_logfile}" || die
+
+       ebegin "Setting root password"
+       # Do this from memory, as we don't want clear text passwords in temp 
files
+       local sql="ALTER USER 'root'@'localhost' IDENTIFIED BY 
'${MYSQL_ROOT_PASSWORD}'"
+       cmd=(
+               "${mysql_binary}"
+               --no-defaults
+               "--socket='${socket}'"
+               -hlocalhost
+               "-e \"${sql}\""
+       )
+       eval "${cmd[@]}" >"${mysql_logfile}" 2>&1
+       local rc=$?
+       eend ${rc}
+
+       if [[ ${rc} -ne 0 ]] ; then
+               # Poor man's solution which tries to avoid having password
+               # in log.  NOTE: sed can fail if user didn't follow advice
+               # and included character which will require escaping...
+               sed -i -e "s/${MYSQL_ROOT_PASSWORD}/*****/" "${mysql_logfile}" 
2>/dev/null
+
+               grep -B5 -A999 -iE "(Aborting|ERROR|errno)" "${mysql_logfile}"
+               die "Failed to set ${PN} root password. Please review 
'${mysql_logfile}'!"
        fi
 
-       if [[ -n "${sqltmp}" ]] ; then
-               ebegin "Loading \"zoneinfo\", this step may require a few 
seconds"
-               "${EROOT}/usr/bin/mysql" \
-                       "--socket=${socket}" \
-                       -hlocalhost \
-                       -uroot \
-                       --password="${MYSQL_ROOT_PASSWORD}" \
-                       mysql < "${sqltmp}"
-               rc=$?
-               eend $?
-               [[ $rc -ne 0 ]] && ewarn "Failed to load zoneinfo!"
+       # Stop the server
+       if [[ -f "${pidfile}" ]] && pgrep -F "${pidfile}" &>/dev/null ; then
+               echo -n "Stopping the server "
+               pkill -F "${pidfile}" &>/dev/null
+
+               maxtry=10
+               while [[ -f "${pidfile}" ]] && pgrep -F "${pidfile}" 
&>/dev/null ; do
+                       maxtry=$((${maxtry}-1))
+                       echo -n "."
+                       sleep 1
+               done
+
+               echo
+
+               if [[ -f "${pidfile}" ]] && pgrep -F "${pidfile}" &>/dev/null ; 
then
+                       # We somehow failed to stop server.
+                       # However, not a fatal error. Just warn the user.
+                       ewarn "WARNING: mysqld[$(cat "${pidfile}")] is still 
running!"
+               fi
        fi
 
-       # Stop the server and cleanup
-       einfo "Stopping the server ..."
-       kill $(< "${pidfile}" )
-       rm -f "${sqltmp}"
-       wait %1
-       einfo "Done"
+       rm -r "${SETUP_TMPDIR}" || die
+
+       einfo "${PN} data directory at '${MY_DATADIR}' successfully 
initialized!"
 }

diff --git a/dev-db/mariadb/mariadb-10.5.9-r2.ebuild 
b/dev-db/mariadb/mariadb-10.5.9-r2.ebuild
index b685780a5d2..3c1ddb824bf 100644
--- a/dev-db/mariadb/mariadb-10.5.9-r2.ebuild
+++ b/dev-db/mariadb/mariadb-10.5.9-r2.ebuild
@@ -789,63 +789,313 @@ pkg_postinst() {
 
 pkg_config() {
        _getoptval() {
-               local mypd="${EROOT}"/usr/libexec/mariadb/my_print_defaults
-               local section="$1"
+               local section="${1}"
                local flag="--${2}="
                local extra_options="${3}"
-               "${mypd}" $extra_options $section | sed -n 
"/^${flag}/s,${flag},,gp"
+               local cmd=(
+                       "${my_print_defaults_binary}"
+                       "${extra_options}"
+                       "${section}"
+               )
+               local results=( $(eval "${cmd[@]}" 2>/dev/null | sed -n 
"/^${flag}/s,${flag},,gp") )
+
+               if [[ ${#results[@]} -gt 0 ]] ; then
+                       # When option is set multiple times only return last 
value
+                       echo "${results[-1]}"
+               fi
        }
-       local old_MY_DATADIR="${MY_DATADIR}"
-       local old_HOME="${HOME}"
+
+       _mktemp_dry() {
+               # emktemp has no --dry-run option
+               local template="${1}"
+
+               if [[ -z "${template}" ]] ; then
+                       if [[ -z "${T}" ]] ; then
+                               template="/tmp/XXXXXXX"
+                       else
+                               template="${T}/XXXXXXX"
+                       fi
+               fi
+
+               local template_wo_X=${template//X/}
+               local n_X
+               let n_X=${#template}-${#template_wo_X}
+               if [[ ${n_X} -lt 3 ]] ; then
+                       echo "${FUNCNAME[0]}: too few X's in template 
‘${template}’" >&2
+                       return
+               fi
+
+               local attempts=0
+               local character tmpfile
+               while [[ true ]] ; do
+                       let attempts=attempts+1
+
+                       new_file=
+                       while read -n1 character ; do
+                               if [[ "${character}" == "X" ]] ; then
+                                       tmpfile+="${RANDOM:0:1}"
+                               else
+                                       tmpfile+="${character}"
+                               fi
+                       done < <(echo -n "${template}")
+
+                       if [[ ! -f "${tmpfile}" ]]
+                       then
+                               echo "${tmpfile}"
+                               return
+                       fi
+
+                       if [[ ${attempts} -ge 100 ]] ; then
+                               echo "${FUNCNAME[0]}: Cannot create temporary 
file after 100 attempts." >&2
+                               return
+                       fi
+               done
+       }
+
+       local mysql_binary="${EROOT}/usr/bin/mysql"
+       if [[ ! -x "${mysql_binary}" ]] ; then
+               die "'${mysql_binary}' not found! Please re-install 
${CATEGORY}/${PN}!"
+       fi
+
+       local mysqld_binary="${EROOT}/usr/sbin/mysqld"
+       if [[ ! -x "${mysqld_binary}" ]] ; then
+               die "'${mysqld_binary}' not found! Please re-install 
${CATEGORY}/${PN}!"
+       fi
+
+       local mysql_install_db_binary="${EROOT}/usr/bin/mysql_install_db"
+       if [[ ! -x "${mysql_install_db_binary}" ]] ; then
+               die "'${mysql_install_db_binary}' not found! Please re-install 
${CATEGORY}/${PN}!"
+       fi
+
+       local my_print_defaults_binary="${EROOT}/usr/bin/my_print_defaults"
+       if [[ ! -x "${my_print_defaults_binary}" ]] ; then
+               die "'${my_print_defaults_binary}' not found! Please re-install 
dev-db/mysql-connector-c!"
+       fi
+
+       if [[ -z "${MYSQL_USER}" ]] ; then
+               MYSQL_USER=mysql
+               if use prefix ; then
+                       MYSQL_USER=$(id -u -n 2>/dev/null)
+                       if [[ -z "${MYSQL_USER}" ]] ; then
+                               die "Failed to determine current username!"
+                       fi
+               fi
+       fi
+
+       if [[ -z "${MYSQL_GROUP}" ]] ; then
+               MYSQL_GROUP=mysql
+               if use prefix ; then
+                       MYSQL_GROUP=$(id -g -n 2>/dev/null)
+                       if [[ -z "${MYSQL_GROUP}" ]] ; then
+                               die "Failed to determine current user 
groupname!"
+                       fi
+               fi
+       fi
+
        # my_print_defaults needs to read stuff in $HOME/.my.cnf
-       export HOME=${EPREFIX}/root
+       local -x HOME="${EROOT}/root"
 
        # Make sure the vars are correctly initialized
        mysql_init_vars
 
-       [[ -z "${MY_DATADIR}" ]] && die "Sorry, unable to find MY_DATADIR"
-       if [[ ! -x "${EROOT}/usr/sbin/mysqld" ]] ; then
-               die "Minimal builds do NOT include the MySQL server"
+       # Read currently set data directory
+       MY_DATADIR="$(_getoptval mysqld datadir 
"--defaults-file='${MY_SYSCONFDIR}/my.cnf'")"
+
+       # Bug #213475 - MySQL _will_ object strenously if your machine is named
+       # localhost. Also causes weird failures.
+       [[ "${HOSTNAME}" == "localhost" ]] && die "Your machine must NOT be 
named localhost"
+
+       if [[ -z "${MY_DATADIR}" ]] ; then
+               die "Sorry, unable to find MY_DATADIR!"
+       elif [[ -d "${MY_DATADIR}/mysql" ]] ; then
+               ewarn "Looks like your data directory '${MY_DATADIR}' is 
already initialized!"
+               ewarn "Please rename or delete its content if you wish to 
initialize a new data directory."
+               die "${PN} data directory at '${MY_DATADIR}' looks already 
initialized!"
        fi
 
-       if [[ ( -n "${MY_DATADIR}" ) && ( "${MY_DATADIR}" != 
"${old_MY_DATADIR}" ) ]]; then
-               local MY_DATADIR_s="${ROOT}/${MY_DATADIR}"
-               MY_DATADIR_s="${MY_DATADIR_s%%/}"
-               local old_MY_DATADIR_s="${ROOT}/${old_MY_DATADIR}"
-               old_MY_DATADIR_s="${old_MY_DATADIR_s%%/}"
+       MYSQL_TMPDIR="$(_getoptval mysqld tmpdir 
"--defaults-file='${MY_SYSCONFDIR}/my.cnf'")"
+       MYSQL_TMPDIR=${MYSQL_TMPDIR%/}
+       # These are dir+prefix
+       MYSQL_LOG_BIN="$(_getoptval mysqld log-bin 
"--defaults-file='${MY_SYSCONFDIR}/my.cnf'")"
+       MYSQL_LOG_BIN=${MYSQL_LOG_BIN%/*}
+       MYSQL_RELAY_LOG="$(_getoptval mysqld relay-log 
"--defaults-file='${MY_SYSCONFDIR}/my.cnf'")"
+       MYSQL_RELAY_LOG=${MYSQL_RELAY_LOG%/*}
 
-               if [[ ( -d "${old_MY_DATADIR_s}" ) && ( "${old_MY_DATADIR_s}" 
!= / ) ]]; then
-                       if [[ -d "${MY_DATADIR_s}" ]]; then
-                               ewarn "Both ${old_MY_DATADIR_s} and 
${MY_DATADIR_s} exist"
-                               ewarn "Attempting to use ${MY_DATADIR_s} and 
preserving ${old_MY_DATADIR_s}"
-                       else
-                               elog "Moving MY_DATADIR from 
${old_MY_DATADIR_s} to ${MY_DATADIR_s}"
-                               mv --strip-trailing-slashes -T 
"${old_MY_DATADIR_s}" "${MY_DATADIR_s}" \
-                               || die "Moving MY_DATADIR failed"
-                       fi
+       # Create missing directories.
+       # Always check if mysql user can write to directory even if we just
+       # created directory because a parent directory might be not
+       # accessible for that user.
+       PID_DIR="${EROOT}/run/mysqld"
+       if [[ ! -d "${PID_DIR}" ]] ; then
+               einfo "Creating ${PN} PID directory '${PID_DIR}' ..."
+               install -d -m 755 -o ${MYSQL_USER} -g ${MYSQL_GROUP} 
"${PID_DIR}" \
+                       || die "Failed to create PID directory '${PID_DIR}'!"
+       fi
+
+       local _pid_dir_testfile="$(_mktemp_dry 
"${PID_DIR}/.pkg_config-access-test.XXXXXXXXX")"
+       [[ -z "${_pid_dir_testfile}" ]] \
+               && die "_mktemp_dry() for 
'${PID_DIR}/.pkg_config-access-test.XXXXXXXXX' failed!"
+
+       if use prefix ; then
+               touch "${_pid_dir_testfile}" &>/dev/null
+       else
+               su -s /bin/sh -c "touch ${_pid_dir_testfile}" ${MYSQL_USER} 
&>/dev/null
+       fi
+
+       if [[ $? -ne 0 ]] ; then
+               die "${MYSQL_USER} user cannot write into PID dir '${PID_DIR}'!"
+       else
+               rm "${_pid_dir_testfile}" || die
+               unset _pid_dir_testfile
+       fi
+
+       if [[ ! -d "${MY_DATADIR}" ]] ; then
+               einfo "Creating ${PN} data directory '${MY_DATADIR}' ..."
+               install -d -m 770 -o ${MYSQL_USER} -g ${MYSQL_GROUP} 
"${MY_DATADIR}" \
+                       || die "Failed to create ${PN} data directory 
'${MY_DATADIR}'!"
+       fi
+
+       local _my_datadir_testfile="$(_mktemp_dry 
"${MY_DATADIR}/.pkg_config-access-test.XXXXXXXXX")"
+       [[ -z "${_my_datadir_testfile}" ]] \
+               && die "_mktemp_dry() for 
'${MY_DATADIR}/.pkg_config-access-test.XXXXXXXXX' failed!"
+
+       if use prefix ; then
+               touch "${_my_datadir_testfile}" &>/dev/null
+       else
+               su -s /bin/sh -c "touch ${_my_datadir_testfile}" ${MYSQL_USER} 
&>/dev/null
+       fi
+
+       if [[ $? -ne 0 ]] ; then
+               die "${MYSQL_USER} user cannot write into data directory 
'${MY_DATADIR}'!"
+       else
+               rm "${_my_datadir_testfile}" || die
+               unset _my_datadir_testfile
+       fi
+
+       if [[ -n "${MYSQL_TMPDIR}" && ! -d "${MYSQL_TMPDIR}" ]] ; then
+               einfo "Creating ${PN} tmpdir '${MYSQL_TMPDIR}' ..."
+               install -d -m 770 -o ${MYSQL_USER} -g ${MYSQL_GROUP} 
"${MYSQL_TMPDIR}" \
+                       || die "Failed to create ${PN} tmpdir 
'${MYSQL_TMPDIR}'!"
+       fi
+
+       if [[ -z "${MYSQL_TMPDIR}" ]] ; then
+               MYSQL_TMPDIR="$(_mktemp_dry 
"${EROOT}/tmp/mysqld-tmp.XXXXXXXXX")"
+               [[ -z "${MYSQL_TMPDIR}" ]] \
+                       && die "_mktemp_dry() for '${MYSQL_TMPDIR}' failed!"
+
+               mkdir "${MYSQL_TMPDIR}" || die
+               chown ${MYSQL_USER} "${MYSQL_TMPDIR}" || die
+       fi
+
+       # Now we need to test MYSQL_TMPDIR...
+       local _my_tmpdir_testfile="$(_mktemp_dry 
"${MYSQL_TMPDIR}/.pkg_config-access-test.XXXXXXXXX")"
+       [[ -z "${_my_tmpdir_testfile}" ]] \
+               && die "_mktemp_dry() for 
'${MYSQL_TMPDIR}/.pkg_config-access-test.XXXXXXXXX' failed!"
+
+       if use prefix ; then
+               touch "${_my_tmpdir_testfile}" &>/dev/null
+       else
+               su -s /bin/sh -c "touch ${_my_tmpdir_testfile}" ${MYSQL_USER} 
&>/dev/null
+       fi
+
+       if [[ $? -ne 0 ]] ; then
+               die "${MYSQL_USER} user cannot write into tmpdir 
'${MYSQL_TMPDIR}'!"
+       else
+               rm "${_my_tmpdir_testfile}" || die
+               unset _my_tmpdir_testfile
+       fi
+
+       if [[ -n "${MYSQL_LOG_BIN}" && ! -d "${MYSQL_LOG_BIN}" ]] ; then
+               einfo "Creating ${PN} log-bin directory '${MYSQL_LOG_BIN}' ..."
+               install -d -m 770 -o ${MYSQL_USER} -g ${MYSQL_GROUP} 
"${MYSQL_LOG_BIN}" \
+                       || die "Failed to create ${PN} log-bin directory 
'${MYSQL_LOG_BIN}'"
+       fi
+
+       if [[ -n "${MYSQL_LOG_BIN}" ]] ; then
+               local _my_logbin_testfile="$(_mktemp_dry 
"${MYSQL_LOG_BIN}/.pkg_config-access-test.XXXXXXXXX")"
+               [[ -z "${_my_logbin_testfile}" ]] \
+                       && die "_mktemp_dry() for 
'${MYSQL_LOG_BIN}/.pkg_config-access-test.XXXXXXXXX' failed!"
+
+               if use prefix ; then
+                       touch "${_my_logbin_testfile}" &>/dev/null
                else
-                       ewarn "Previous MY_DATADIR (${old_MY_DATADIR_s}) does 
not exist"
-                       if [[ -d "${MY_DATADIR_s}" ]]; then
-                               ewarn "Attempting to use ${MY_DATADIR_s}"
-                       else
-                               eerror "New MY_DATADIR (${MY_DATADIR_s}) does 
not exist"
-                               die "Configuration Failed! Please reinstall 
${CATEGORY}/${PN}"
-                       fi
+                       su -s /bin/sh -c "touch ${_my_logbin_testfile}" 
${MYSQL_USER} &>/dev/null
+               fi
+
+               if [[ $? -ne 0 ]] ; then
+                       die "${MYSQL_USER} user cannot write into log-bin 
directory '${MYSQL_LOG_BIN}'!"
+               else
+                       rm "${_my_logbin_testfile}" || die
+                       unset _my_logbin_testfile
                fi
        fi
 
-       local pwd1="a"
-       local pwd2="b"
-       local maxtry=15
+       if [[ -n "${MYSQL_RELAY_LOG}" && ! -d "${MYSQL_RELAY_LOG}" ]] ; then
+               einfo "Creating ${PN} relay-log directory '${MYSQL_RELAY_LOG}' 
..."
+               install -d -m 770 -o ${MYSQL_USER} -g ${MYSQL_GROUP} 
"${MYSQL_RELAY_LOG}" \
+                       || die "Failed to create ${PN} relay-log directory 
'${MYSQL_RELAY_LOG}'!"
+       fi
 
-       if [ -z "${MYSQL_ROOT_PASSWORD}" ]; then
+       if [[ -n "${MYSQL_RELAY_LOG}" ]] ; then
+               local _my_relaylog_testfile="$(_mktemp_dry 
"${MYSQL_RELAY_LOG}/.pkg_config-access-test.XXXXXXXXX")"
+               [[ -z "${_my_relaylog_testfile}" ]] \
+                       && die "_mktemp_dry() for 
'${MYSQL_RELAY_LOG}/.pkg_config-access-test.XXXXXXXXX' failed!"
+
+               if use prefix ; then
+                       touch "${_my_relaylog_testfile}" &>/dev/null
+               else
+                       su -s /bin/sh -c "touch ${_my_relaylog_testfile}" 
${MYSQL_USER} &>/dev/null
+               fi
+
+               if [[ $? -ne 0 ]] ; then
+                       die "${MYSQL_USER} user cannot write into relay-log 
directory '${MYSQL_RELAY_LOG}'!"
+               else
+                       rm "${_my_relaylog_testfile}" || die
+                       unset _my_relaylog_testfile
+               fi
+       fi
+
+       local SETUP_TMPDIR=$(mktemp -d "/tmp/${PN}-config.XXXXXXXXX" 
2>/dev/null)
+       [[ -z "${SETUP_TMPDIR}" ]] && die "Failed to create setup tmpdir"
+
+       # Limit access
+       chmod 0770 "${SETUP_TMPDIR}" || die
+       chown ${MYSQL_USER} "${SETUP_TMPDIR}" || die
+
+
+       local mysql_install_log="${SETUP_TMPDIR}/install_db.log"
+       local mysqld_logfile="${SETUP_TMPDIR}/mysqld.log"
+
+       echo ""
+       einfo "Detected settings:"
+       einfo "=================="
+       einfo "MySQL User:\t\t\t\t${MYSQL_USER}"
+       einfo "MySQL Group:\t\t\t\t${MYSQL_GROUP}"
+       einfo "MySQL DATA directory:\t\t${MY_DATADIR}"
+       einfo "MySQL TMP directory:\t\t\t${MYSQL_TMPDIR}"
+
+       if [[ -n "${MYSQL_LOG_BIN}" ]] ; then
+               einfo "MySQL Binary Log File location:\t${MYSQL_LOG_BIN}"
+       fi
+
+       if [[ -n "${MYSQL_RELAY_LOG}" ]] ; then
+               einfo "MySQL Relay Log File location:\t${MYSQL_RELAY_LOG}"
+       fi
+
+       einfo "PID DIR:\t\t\t\t${PID_DIR}"
+       einfo "Install db log:\t\t\t${mysql_install_log}"
+       einfo "Install server log:\t\t\t${mysqld_logfile}"
+
+       echo
+
+       if [[ -z "${MYSQL_ROOT_PASSWORD}" ]] ; then
                local tmp_mysqld_password_source=
 
-               for tmp_mysqld_password_source in mysql client; do
+               for tmp_mysqld_password_source in mysql client ; do
                        einfo "Trying to get password for mysql 'root' user 
from '${tmp_mysqld_password_source}' section ..."
                        MYSQL_ROOT_PASSWORD="$(_getoptval 
"${tmp_mysqld_password_source}" password)"
-                       if [[ -n "${MYSQL_ROOT_PASSWORD}" ]]; then
-                               if [[ ${MYSQL_ROOT_PASSWORD} == *$'\n'* ]]; then
+                       if [[ -n "${MYSQL_ROOT_PASSWORD}" ]] ; then
+                               if [[ ${MYSQL_ROOT_PASSWORD} == *$'\n'* ]] ; 
then
                                        ewarn "Ignoring password from 
'${tmp_mysqld_password_source}' section due to newline character (do you have 
multiple password options set?)!"
                                        MYSQL_ROOT_PASSWORD=
                                        continue
@@ -857,179 +1107,189 @@ pkg_config() {
                done
 
                # Sometimes --show is required to display passwords in some 
implementations of my_print_defaults
-               if [[ "${MYSQL_ROOT_PASSWORD}" == '*****' ]]; then
+               if [[ "${MYSQL_ROOT_PASSWORD}" == '*****' ]] ; then
                        MYSQL_ROOT_PASSWORD="$(_getoptval 
"${tmp_mysqld_password_source}" password --show)"
                fi
 
                unset tmp_mysqld_password_source
        fi
-       MYSQL_TMPDIR="$(_getoptval mysqld tmpdir | tail -n1)"
-       # These are dir+prefix
-       MYSQL_RELAY_LOG="$(_getoptval mysqld relay-log | tail -n1)"
-       MYSQL_RELAY_LOG=${MYSQL_RELAY_LOG%/*}
-       MYSQL_LOG_BIN="$(_getoptval mysqld log-bin | tail -n1)"
-       MYSQL_LOG_BIN=${MYSQL_LOG_BIN%/*}
-
-       if [[ ! -d "${ROOT}/$MYSQL_TMPDIR" ]]; then
-               einfo "Creating MySQL tmpdir $MYSQL_TMPDIR"
-               install -d -m 770 -o mysql -g mysql "${EROOT}/$MYSQL_TMPDIR"
-       fi
-       if [[ ! -d "${ROOT}/$MYSQL_LOG_BIN" ]]; then
-               einfo "Creating MySQL log-bin directory $MYSQL_LOG_BIN"
-               install -d -m 770 -o mysql -g mysql "${EROOT}/$MYSQL_LOG_BIN"
-       fi
-       if [[ ! -d "${EROOT}/$MYSQL_RELAY_LOG" ]]; then
-               einfo "Creating MySQL relay-log directory $MYSQL_RELAY_LOG"
-               install -d -m 770 -o mysql -g mysql "${EROOT}/$MYSQL_RELAY_LOG"
-       fi
 
-       if [[ -d "${ROOT}/${MY_DATADIR}/mysql" ]] ; then
-               ewarn "You have already a MySQL database in place."
-               ewarn "(${ROOT}/${MY_DATADIR}/*)"
-               ewarn "Please rename or delete it if you wish to replace it."
-               die "MySQL database already exists!"
-       fi
-
-       # Bug #213475 - MySQL _will_ object strenously if your machine is named
-       # localhost. Also causes weird failures.
-       [[ "${HOSTNAME}" == "localhost" ]] && die "Your machine must NOT be 
named localhost"
-
-       if [[ -z "${MYSQL_ROOT_PASSWORD}" ]]; then
-
-               einfo "Please provide a password for the mysql 
'root'@'localhost' user now"
-               einfo "or through the ${HOME}/.my.cnf file."
-               ewarn "Avoid [\"'\\_%] characters in the password"
-               einfo "Not entering a password defaults to UNIX authentication"
+       if [[ -z "${MYSQL_ROOT_PASSWORD}" ]] ; then
+               local pwd1="a"
+               local pwd2="b"
+
+               echo
+               einfo "No password for mysql 'root' user was specified via 
environment"
+               einfo "variable MYSQL_ROOT_PASSWORD and no password was found 
in config"
+               einfo "file like '${HOME}/.my.cnf'."
+               einfo "To continue please provide a password for the mysql 
'root' user"
+               einfo "now on console:"
+               ewarn "NOTE: Please avoid [\"'\\_%] characters in the password!"
                read -rsp "    >" pwd1 ; echo
 
-               if [[ -n "${pwd1}" ]] ; then
-                       einfo "Retype the password"
-                       read -rsp "    >" pwd2 ; echo
+               einfo "Retype the password"
+               read -rsp "    >" pwd2 ; echo
 
-                       if [[ "x$pwd1" != "x$pwd2" ]] ; then
-                               die "Passwords are not the same"
-                       fi
-
-                       MYSQL_ROOT_PASSWORD="${pwd1}"
+               if [[ "x${pwd1}" != "x${pwd2}" ]] ; then
+                       die "Passwords are not the same!"
                fi
 
+               MYSQL_ROOT_PASSWORD="${pwd1}"
                unset pwd1 pwd2
+
+               echo
        fi
 
-       local options
-       local sqltmp="$(emktemp)"
+       local -a mysqld_options
 
        # Fix bug 446200. Don't reference host my.cnf, needs to come first,
-       # see https://bugs.mysql.com/bug.php?id=31312
-       use prefix && options="${options} 
'--defaults-file=${MY_SYSCONFDIR}/my.cnf'"
+       # see http://bugs.mysql.com/bug.php?id=31312
+       use prefix && mysqld_options+=( 
"--defaults-file='${MY_SYSCONFDIR}/my.cnf'" )
 
        # Figure out which options we need to disable to do the setup
        local helpfile="${TMPDIR}/mysqld-help"
        "${EROOT}/usr/sbin/mysqld" --verbose --help >"${helpfile}" 2>/dev/null
+
+       local opt optexp optfull
        for opt in host-cache name-resolve networking slave-start \
                federated ssl log-bin relay-log slow-query-log external-locking 
\
                log-slave-updates \
-               ; do
+       ; do
                optexp="--(skip-)?${opt}" optfull="--loose-skip-${opt}"
-               egrep -sq -- "${optexp}" "${helpfile}" && options="${options} 
${optfull}"
+               egrep -sq -- "${optexp}" "${helpfile}" && mysqld_options+=( 
"${optfull}" )
        done
 
-       einfo "Creating the mysql database and setting proper permissions on it 
..."
+       # Prepare timezones, see
+       # https://dev.mysql.com/doc/mysql/en/time-zone-support.html
+       local tz_sql="${SETUP_TMPDIR}/tz.sql"
 
-       # Now that /var/run is a tmpfs mount point, we need to ensure it exists 
before using it
-       PID_DIR="${EROOT}/var/run/mysqld"
-       if [[ ! -d "${PID_DIR}" ]]; then
-               install -d -m 755 -o mysql -g mysql "${PID_DIR}" || die "Could 
not create pid directory"
+       echo "USE mysql;" >"${tz_sql}"
+       "${EROOT}/usr/bin/mysql_tzinfo_to_sql" "${EROOT}/usr/share/zoneinfo" >> 
"${tz_sql}" 2>/dev/null
+       if [[ $? -ne 0 ]] ; then
+               die "mysql_tzinfo_to_sql failed!"
        fi
 
-       if [[ ! -d "${MY_DATADIR}" ]]; then
-               install -d -m 750 -o mysql -g mysql "${MY_DATADIR}" || die 
"Could not create data directory"
-       fi
+       local cmd=(
+               "${mysql_install_db_binary}"
+               "${mysqld_options[@]}"
+               "--init-file='${tz_sql}'"
+               "--basedir='${EROOT}/usr'"
+               "--datadir='${MY_DATADIR}'"
+               "--tmpdir='${MYSQL_TMPDIR}'"
+               "--log-error='${mysql_install_log}'"
+               "--rpm"
+               "--cross-bootstrap"
+               "--skip-test-db"
+               "--user=${MYSQL_USER}"
+       )
 
-       pushd "${TMPDIR}" &>/dev/null || die
+       einfo "Initializing ${PN} data directory: ${cmd[@]}"
+       eval "${cmd[@]}" >>"${mysql_install_log}" 2>&1
 
-       # Filling timezones, see
-       # https://dev.mysql.com/doc/mysql/en/time-zone-support.html
-       "${EROOT}/usr/bin/mysql_tzinfo_to_sql" "${EROOT}/usr/share/zoneinfo" > 
"${sqltmp}" 2>/dev/null
-
-       local cmd=( "${EROOT}/usr/share/mariadb/scripts/mysql_install_db" )
-       [[ -f "${cmd}" ]] || cmd=( "${EROOT}/usr/bin/mysql_install_db" )
-       cmd+=( "--basedir=${EPREFIX}/usr" ${options} 
"--datadir=${ROOT}/${MY_DATADIR}" "--tmpdir=${ROOT}/${MYSQL_TMPDIR}" )
-       einfo "Command: ${cmd[*]}"
-       su -s /bin/sh -c "${cmd[*]}" mysql \
-               >"${TMPDIR}"/mysql_install_db.log 2>&1
-       if [[ $? -ne 0 ]]; then
-               grep -B5 -A999 -i "ERROR" "${TMPDIR}"/mysql_install_db.log 1>&2
-               die "Failed to initialize mysqld. Please review 
${EPREFIX}/var/log/mysql/mysqld.err AND ${TMPDIR}/mysql_install_db.log"
+       if [[ $? -ne 0 || ! -f "${MY_DATADIR}/mysql/user.frm" ]] ; then
+               grep -B5 -A999 -iE "(Aborting|ERROR|errno)" 
"${mysql_install_log}" 1>&2
+               die "Failed to initialize ${PN} data directory. Please review 
'${mysql_install_log}'!"
        fi
-       popd &>/dev/null || die
-       [[ -f "${ROOT}/${MY_DATADIR}/mysql/user.frm" ]] \
-               || die "MySQL databases not installed"
 
-       if [[ -z ${sqltmp} && -z ${MYSQL_ROOT_PASSWORD} ]] ; then
-               einfo "Done"
-               exit 0
-       fi
+       local x=${RANDOM}
+       local socket="${PID_DIR}/mysqld.${x}.sock"
+       [[ -f "${socket}" ]] && die "Randomness failed; Socket ${socket} 
already exists!"
+       local pidfile="${PID_DIR}/mysqld.${x}.pid"
+       [[ -f "${pidfile}" ]] && die "Randomness failed; Pidfile ${pidfile} 
already exists!"
+       unset x
+
+       cmd=(
+               "${mysqld_binary}"
+               "${mysqld_options[@]}"
+               "--basedir='${EROOT}/usr'"
+               "--datadir='${MY_DATADIR}'"
+               "--tmpdir='${MYSQL_TMPDIR}'"
+               --max_allowed_packet=8M
+               --net_buffer_length=16K
+               "--socket='${socket}'"
+               "--pid-file='${pidfile}'"
+               "--log-error='${mysqld_logfile}'"
+               "--user=${MYSQL_USER}"
+       )
 
-       use prefix || options="${options} --user=mysql"
-
-       local socket="${EROOT}/var/run/mysqld/mysqld${RANDOM}.sock"
-       local pidfile="${EROOT}/var/run/mysqld/mysqld${RANDOM}.pid"
-       local mysqld="${EROOT}/usr/sbin/mysqld \
-               ${options} \
-               --log-warnings=0 \
-               --basedir=${EROOT}/usr \
-               --datadir=${ROOT}/${MY_DATADIR} \
-               --max_allowed_packet=8M \
-               --net_buffer_length=16K \
-               --socket=${socket} \
-               --pid-file=${pidfile} \
-               --tmpdir=${ROOT}/${MYSQL_TMPDIR}"
-       #einfo "About to start mysqld: ${mysqld}"
-       ebegin "Starting mysqld"
-       einfo "Command ${mysqld}"
-       ${mysqld} &
-       rc=$?
-       while ! [[ -S "${socket}" || "${maxtry}" -lt 1 ]] ; do
+       einfo "Starting mysqld to finalize initialization: ${cmd[@]}"
+       eval "${cmd[@]}" >>"${mysqld_logfile}" 2>&1 &
+
+       echo -n "Waiting for mysqld to accept connections "
+       local maxtry=15
+       while [[ ! -S "${socket}" && "${maxtry}" -gt 1 ]] ; do
                maxtry=$((${maxtry}-1))
                echo -n "."
                sleep 1
        done
-       eend $rc
 
-       if ! [[ -S "${socket}" ]]; then
-               die "Completely failed to start up mysqld with: ${mysqld}"
+       if [[ -S "${socket}" ]] ; then
+               # Even with a socket we don't know if mysqld will abort
+               # start due to an error so just wait a little bit more...
+               maxtry=5
+               while [[ -S "${socket}" && "${maxtry}" -gt 1 ]] ; do
+                       maxtry=$((${maxtry}-1))
+                       echo -n "."
+                       sleep 1
+               done
+       fi
+
+       echo
+
+       if [[ ! -S "${socket}" ]] ; then
+               grep -B5 -A999 -iE "(Aborting|ERROR|errno)" "${mysqld_logfile}" 
1>&2
+               die "mysqld was unable to start from initialized data 
directory. Please review '${mysqld_logfile}'!"
        fi
 
-       if [[ -n "${MYSQL_ROOT_PASSWORD}" ]] ; then
-               ebegin "Setting root password"
-               # Do this from memory, as we don't want clear text passwords in 
temp files
-               local sql="SET PASSWORD FOR 'root'@'localhost' = 
PASSWORD('${MYSQL_ROOT_PASSWORD}')"
-               "${EROOT}/usr/bin/mysql" \
-                       "--socket=${socket}" \
-                       -hlocalhost \
-                       -e "${sql}"
-               unset sql
-               eend $?
+       local mysql_logfile="${SETUP_TMPDIR}/set_root_pw.log"
+       touch "${mysql_logfile}" || die
+
+       ebegin "Setting root password"
+       # Do this from memory, as we don't want clear text passwords in temp 
files
+       local sql="ALTER USER 'root'@'localhost' IDENTIFIED BY 
'${MYSQL_ROOT_PASSWORD}'"
+       cmd=(
+               "${mysql_binary}"
+               --no-defaults
+               "--socket='${socket}'"
+               -hlocalhost
+               "-e \"${sql}\""
+       )
+       eval "${cmd[@]}" >"${mysql_logfile}" 2>&1
+       local rc=$?
+       eend ${rc}
+
+       if [[ ${rc} -ne 0 ]] ; then
+               # Poor man's solution which tries to avoid having password
+               # in log.  NOTE: sed can fail if user didn't follow advice
+               # and included character which will require escaping...
+               sed -i -e "s/${MYSQL_ROOT_PASSWORD}/*****/" "${mysql_logfile}" 
2>/dev/null
+
+               grep -B5 -A999 -iE "(Aborting|ERROR|errno)" "${mysql_logfile}"
+               die "Failed to set ${PN} root password. Please review 
'${mysql_logfile}'!"
        fi
 
-       if [[ -n "${sqltmp}" ]] ; then
-               ebegin "Loading \"zoneinfo\", this step may require a few 
seconds"
-               "${EROOT}/usr/bin/mysql" \
-                       "--socket=${socket}" \
-                       -hlocalhost \
-                       -uroot \
-                       --password="${MYSQL_ROOT_PASSWORD}" \
-                       mysql < "${sqltmp}"
-               rc=$?
-               eend $?
-               [[ $rc -ne 0 ]] && ewarn "Failed to load zoneinfo!"
+       # Stop the server
+       if [[ -f "${pidfile}" ]] && pgrep -F "${pidfile}" &>/dev/null ; then
+               echo -n "Stopping the server "
+               pkill -F "${pidfile}" &>/dev/null
+
+               maxtry=10
+               while [[ -f "${pidfile}" ]] && pgrep -F "${pidfile}" 
&>/dev/null ; do
+                       maxtry=$((${maxtry}-1))
+                       echo -n "."
+                       sleep 1
+               done
+
+               echo
+
+               if [[ -f "${pidfile}" ]] && pgrep -F "${pidfile}" &>/dev/null ; 
then
+                       # We somehow failed to stop server.
+                       # However, not a fatal error. Just warn the user.
+                       ewarn "WARNING: mysqld[$(cat "${pidfile}")] is still 
running!"
+               fi
        fi
 
-       # Stop the server and cleanup
-       einfo "Stopping the server ..."
-       kill $(< "${pidfile}" )
-       rm -f "${sqltmp}"
-       wait %1
-       einfo "Done"
+       rm -r "${SETUP_TMPDIR}" || die
+
+       einfo "${PN} data directory at '${MY_DATADIR}' successfully 
initialized!"
 }

Reply via email to