From 2a23064da537eec5520495fa7033ab66cd8e5bfe Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Wed, 10 Oct 2007 13:22:21 +0000 Subject: [PATCH] Fixes from Eli Zaretskii: Fix to allow quoted directories in PATH. Fix for Savannah bug #20549. --- ChangeLog | 16 ++++++++++++++++ function.c | 7 ++++--- job.c | 23 ++++++++++++++++------- job.h | 3 ++- w32/pathstuff.c | 8 +++++++- 5 files changed, 45 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index c9d3eb1..4fdf374 100644 --- a/ChangeLog +++ b/ChangeLog @@ -10,6 +10,11 @@ * make.h: Add a prototype for w32_kill() (change suggested by Yongwei Wu ). +2007-09-21 Eli Zaretskii + + * w32/pathstuff.c (convert_Path_to_windows32): Handle quoted + directories in Path. + 2007-08-15 Paul Smith * doc/make.texi (GNU Free Documentation License): The fdl.texi @@ -23,6 +28,17 @@ then (order-only for example) but they will be this time. Fixes Savannah bug #'s 3330 and 15919. +2007-07-21 Eli Zaretskii + + Fix Savannah bug #20549: + * function.c (func_shell): Call construct_command_argv with zero + value of FLAGS. + * job.c (construct_command_argv_internal): New argument FLAGS; all + callers changed. + [WINDOWS32]: If FLAGS has the COMMANDS_RECURSE bit set, ignore + just_print_flag. + * job.h (construct_command_argv_internal): Update prototype. + 2007-07-13 Paul Smith * file.c (expand_deps): Use variable_buffer as the start of the diff --git a/function.c b/function.c index 4be2340..09edbad 100644 --- a/function.c +++ b/function.c @@ -1601,7 +1601,8 @@ func_shell (char *o, char **argv, const char *funcname UNUSED) #ifndef __MSDOS__ /* Construct the argument list. */ - command_argv = construct_command_argv (argv[0], NULL, NULL, &batch_filename); + command_argv = construct_command_argv (argv[0], NULL, NULL, 0, + &batch_filename); if (command_argv == 0) return o; #endif @@ -1785,8 +1786,8 @@ func_shell (char *o, char **argv, const char *funcname) char* batch_filename = NULL; /* Construct the argument list. */ - command_argv = construct_command_argv (argv[0], (char **) NULL, - (struct file *) 0, &batch_filename); + command_argv = construct_command_argv (argv[0], NULL, NULL, 0, + &batch_filename); if (command_argv == 0) return o; diff --git a/job.c b/job.c index afae60e..c877dca 100644 --- a/job.c +++ b/job.c @@ -1016,7 +1016,9 @@ start_job_command (struct child *child) #ifdef VMS argv = p; #else - argv = construct_command_argv (p, &end, child->file, &child->sh_batch_file); + argv = construct_command_argv (p, &end, child->file, + child->file->cmds->lines_flags[child->command_line - 1], + &child->sh_batch_file); #endif if (end == NULL) child->command_ptr = NULL; @@ -2200,11 +2202,17 @@ void clean_tmp (void) If *RESTP is NULL, newlines will be ignored. SHELL is the shell to use, or nil to use the default shell. - IFS is the value of $IFS, or nil (meaning the default). */ + IFS is the value of $IFS, or nil (meaning the default). + + FLAGS is the value of lines_flags for this command line. It is + used in the WINDOWS32 port to check whether + or $(MAKE) were found + in this command line, in which case the effect of just_print_flag + is overridden. */ static char ** construct_command_argv_internal (char *line, char **restp, char *shell, - char *ifs, char **batch_filename_ptr) + char *ifs, int flags, + char **batch_filename_ptr) { #ifdef __MSDOS__ /* MSDOS supports both the stock DOS shell and ports of Unixy shells. @@ -2784,7 +2792,7 @@ construct_command_argv_internal (char *line, char **restp, char *shell, /* Some shells do not work well when invoked as 'sh -c xxx' to run a command line (e.g. Cygnus GNUWIN32 sh.exe on WIN32 systems). In these cases, run commands via a script file. */ - if (just_print_flag) { + if (just_print_flag && !(flags & COMMANDS_RECURSE)) { /* Need to allocate new_argv, although it's unused, because start_job_command will want to free it and its 0'th element. */ new_argv = xmalloc(2 * sizeof (char *)); @@ -2826,7 +2834,7 @@ construct_command_argv_internal (char *line, char **restp, char *shell, } else #endif /* WINDOWS32 */ if (unixy_shell) - new_argv = construct_command_argv_internal (new_line, 0, 0, 0, 0); + new_argv = construct_command_argv_internal (new_line, 0, 0, 0, flags, 0); #ifdef __EMX__ else if (!unixy_shell) { @@ -2937,7 +2945,7 @@ construct_command_argv_internal (char *line, char **restp, char *shell, char ** construct_command_argv (char *line, char **restp, struct file *file, - char **batch_filename_ptr) + int cmd_flags, char **batch_filename_ptr) { char *shell, *ifs; char **argv; @@ -3049,7 +3057,8 @@ construct_command_argv (char *line, char **restp, struct file *file, warn_undefined_variables_flag = save; } - argv = construct_command_argv_internal (line, restp, shell, ifs, batch_filename_ptr); + argv = construct_command_argv_internal (line, restp, shell, ifs, + cmd_flags, batch_filename_ptr); free (shell); free (ifs); diff --git a/job.h b/job.h index 8ed0969..ea6d7e8 100644 --- a/job.h +++ b/job.h @@ -70,7 +70,8 @@ void new_job (struct file *file); void reap_children (int block, int err); void start_waiting_jobs (void); -char **construct_command_argv (char *line, char **restp, struct file *file, char** batch_file); +char **construct_command_argv (char *line, char **restp, struct file *file, + int cmd_flags, char** batch_file); #ifdef VMS int child_execute_job (char *argv, struct child *child); #elif defined(__EMX__) diff --git a/w32/pathstuff.c b/w32/pathstuff.c index 0622349..6f712d1 100644 --- a/w32/pathstuff.c +++ b/w32/pathstuff.c @@ -70,11 +70,17 @@ convert_Path_to_windows32(char *Path, char to_delim) } else /* all finished, force abort */ p += strlen(p); + } else if (*p == '"') { /* a quoted directory */ + for (p++; *p && *p != '"'; p++) /* skip quoted part */ + ; + etok = strpbrk(p, ":;"); /* find next delimiter */ + *etok = to_delim; + p = ++etok; } else { /* found another one, no drive letter */ *etok = to_delim; p = ++etok; - } + } return Path; } -- 2.7.4