summaryrefslogtreecommitdiff
path: root/sql/winservice.c
diff options
context:
space:
mode:
Diffstat (limited to 'sql/winservice.c')
-rw-r--r--sql/winservice.c87
1 files changed, 75 insertions, 12 deletions
diff --git a/sql/winservice.c b/sql/winservice.c
index 0c238d4d33d..ee29d3556d8 100644
--- a/sql/winservice.c
+++ b/sql/winservice.c
@@ -76,6 +76,7 @@ int get_mysql_service_properties(const wchar_t *bin_path,
wchar_t *file_part;
wchar_t **args= NULL;
int retval= 1;
+ BOOL have_inifile;
props->datadir[0]= 0;
props->inifile[0]= 0;
@@ -85,11 +86,28 @@ int get_mysql_service_properties(const wchar_t *bin_path,
props->version_patch= 0;
args= CommandLineToArgvW(bin_path, &numargs);
-
- if(numargs != 3)
+ if(numargs == 2)
+ {
+ /*
+ There are rare cases where service config does not have
+ --defaults-filein the binary parth . There services were registered with
+ plain mysqld --install, the data directory is next to "bin" in this case.
+ Service name (second parameter) must be MySQL.
+ */
+ if(wcscmp(args[1], L"MySQL") != 0)
+ goto end;
+ have_inifile= FALSE;
+ }
+ else if(numargs == 3)
+ {
+ have_inifile= TRUE;
+ }
+ else
+ {
goto end;
+ }
- if(wcsncmp(args[1], L"--defaults-file=", 16) != 0)
+ if(have_inifile && wcsncmp(args[1], L"--defaults-file=", 16) != 0)
goto end;
GetFullPathNameW(args[0], MAX_PATH, mysqld_path, &file_part);
@@ -106,21 +124,66 @@ int get_mysql_service_properties(const wchar_t *bin_path,
}
wcstombs(props->mysqld_exe, mysqld_path, MAX_PATH);
- wcstombs(props->inifile, args[1]+16, MAX_PATH);
- normalize_path(props->inifile, MAX_PATH);
-
- if (GetFileAttributes(props->inifile) == INVALID_FILE_ATTRIBUTES)
- goto end;
-
/* If mysqld.exe exists, try to get its version from executable */
if (GetFileAttributes(props->mysqld_exe) != INVALID_FILE_ATTRIBUTES)
{
- get_file_version(props->mysqld_exe, &props->version_major,
+ get_file_version(props->mysqld_exe, &props->version_major,
&props->version_minor, &props->version_patch);
}
+ if (have_inifile)
+ {
+ /* Easy case, we have --defaults-file in service definition. */
+ wcstombs(props->inifile, args[1]+16, MAX_PATH);
+ normalize_path(props->inifile, MAX_PATH);
+ if (GetFileAttributes(props->inifile) == INVALID_FILE_ATTRIBUTES)
+ goto end;
+ GetPrivateProfileString("mysqld", "datadir", NULL, props->datadir, MAX_PATH,
+ props->inifile);
+ }
+ else
+ {
+ /*
+ Hard, although a rare case, we're guessing datadir and defaults-file.
+ On Windows, defaults-file is traditionally install-root\my.ini
+ and datadir is install-root\data
+ */
+ char install_root[MAX_PATH];
+ int i;
+ char *p;
+
+ /*
+ Get the install root(parent of bin directory where mysqld.exe)
+ is located.
+ */
+ strcpy_s(install_root, MAX_PATH, props->mysqld_exe);
+ for (i=0; i< 2; i++)
+ {
+ p= strrchr(install_root, '\\');
+ if(!p)
+ goto end;
+ *p= 0;
+ }
+
+ /* Look for my.ini in the install root */
+ sprintf_s(props->inifile, MAX_PATH, "%s\\my.ini", install_root);
+ if (GetFileAttributes(props->inifile) != INVALID_FILE_ATTRIBUTES)
+ {
+ /* Ini file found, get datadir from there */
+ GetPrivateProfileString("mysqld", "datadir", NULL, props->datadir,
+ MAX_PATH, props->inifile);
+ }
+ else
+ {
+ /* Ini file was not found */
+ props->inifile[0]= 0;
+ }
- GetPrivateProfileString("mysqld", "datadir", NULL, props->datadir, MAX_PATH,
- props->inifile);
+ /* Try datadir in install directory.*/
+ if (props->datadir[0] == 0)
+ {
+ sprintf_s(props->datadir, MAX_PATH, "%s\\data", install_root);
+ }
+ }
if (props->datadir[0])
{