summaryrefslogtreecommitdiff
path: root/sql/mysqld.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/mysqld.cc')
-rw-r--r--sql/mysqld.cc64
1 files changed, 42 insertions, 22 deletions
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 41807285acc..d9ba97ad11a 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -2506,6 +2506,19 @@ int mysql_service(void *p)
return 0;
}
+
+/* Quote string if it contains space, else copy */
+
+static char *add_quoted_string(char *to, const char *from, char *to_end)
+{
+ uint length= (uint) (to_end-to);
+
+ if (!strchr(from, ' '))
+ return strnmov(to, from, length);
+ return strxnmov(to, length, "\"", from, "\"", NullS);
+}
+
+
/*
Handle basic handling of services, like installation and removal
@@ -2515,25 +2528,41 @@ int mysql_service(void *p)
servicename Internal name of service
displayname Display name of service (in taskbar ?)
file_path Path to this program
+ startup_option Startup option to mysqld
RETURN VALUES
0 option handled
1 Could not handle option
*/
-bool default_service_handling(char **argv,
- const char *servicename,
- const char *displayname,
- const char *file_path)
+static bool
+default_service_handling(char **argv,
+ const char *servicename,
+ const char *displayname,
+ const char *file_path,
+ const char *extra_opt)
{
+ char path_and_service[FN_REFLEN+FN_REFLEN+32], *pos, *end;
+ end= path_and_service + sizeof(path_and_service)-1;
+
+ /* We have to quote filename if it contains spaces */
+ pos= add_quoted_string(path_and_service, file_path, end);
+ if (*extra_opt)
+ {
+ /* Add (possible quoted) option after file_path */
+ *pos++= ' ';
+ pos= add_quoted_string(pos, extra_opt, end);
+ }
+ *pos= 0; // Ensure end null
+
if (Service.got_service_option(argv, "install"))
{
- Service.Install(1, servicename, displayname, file_path);
+ Service.Install(1, servicename, displayname, path_and_service);
return 0;
}
if (Service.got_service_option(argv, "install-manual"))
{
- Service.Install(0, servicename, displayname, file_path);
+ Service.Install(0, servicename, displayname, path_and_service);
return 0;
}
if (Service.got_service_option(argv, "remove"))
@@ -2560,12 +2589,11 @@ int main(int argc, char **argv)
char file_path[FN_REFLEN];
my_path(file_path, argv[0], ""); /* Find name in path */
fn_format(file_path,argv[0],file_path,"",MY_REPLACE_DIR+
- MY_UNPACK_FILENAME+MY_RESOLVE_SYMLINKS+MY_QUOTE_SPACES);
-
+ MY_UNPACK_FILENAME | MY_RESOLVE_SYMLINKS);
if (argc == 2)
{
- if (!default_service_handling(argv,MYSQL_SERVICENAME, MYSQL_SERVICENAME,
- file_path))
+ if (!default_service_handling(argv, MYSQL_SERVICENAME, MYSQL_SERVICENAME,
+ file_path, ""))
return 0;
if (Service.IsService(argv[1]))
{
@@ -2578,12 +2606,8 @@ int main(int argc, char **argv)
}
else if (argc == 3) /* install or remove any optional service */
{
- /* Add service name after filename */
- uint length=strlen(file_path);
- *strxnmov(file_path + length, sizeof(file_path)-length-2, " ",
- argv[2], NullS)= '\0';
-
- if (!default_service_handling(argv, argv[2], argv[2], file_path))
+ if (!default_service_handling(argv, argv[2], argv[2], file_path,
+ argv[2]))
return 0;
if (Service.IsService(argv[2]))
{
@@ -2605,12 +2629,8 @@ int main(int argc, char **argv)
Install an optional service with optional config file
mysqld --install-manual mysqldopt --defaults-file=c:\miguel\my.ini
*/
- uint length=strlen(file_path);
- char tmp_path[FN_REFLEN];
- fn_format(tmp_path,argv[3],tmp_path,"",MY_QUOTE_SPACES);
- *strxnmov(file_path + length, sizeof(file_path)-length-2, " ",
- tmp_path, " ", argv[2], NullS)= '\0';
- if (!default_service_handling(argv, argv[2], argv[2], file_path))
+ if (!default_service_handling(argv, argv[2], argv[2], file_path,
+ argv[3]))
return 0;
}
else if (argc == 1 && Service.IsService(MYSQL_SERVICENAME))