mirror of
				https://github.com/swaywm/sway.git
				synced 2025-10-29 05:40:18 -04:00 
			
		
		
		
	Add quotes to multiword arguments.
This adds quotes around multiword arguments before they are passed to
`/bin/sh -c` in an exec command.
Example:
I connect to irc like this:
    exec termite -e "mosh server tmux a"
Without this patch the arguments are passed to sh as:
    termite -e mosh server tmux a
When it should be:
    termite -e "mosh server tmux a"
For the command to work.
			
			
This commit is contained in:
		
							parent
							
								
									ed227f5664
								
							
						
					
					
						commit
						32ae26e519
					
				
					 3 changed files with 33 additions and 0 deletions
				
			
		|  | @ -273,6 +273,32 @@ char *join_args(char **argv, int argc) { | ||||||
| 	return res; | 	return res; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static bool has_whitespace(const char *str) { | ||||||
|  | 	while (*str) { | ||||||
|  | 		if (isspace(*str)) { | ||||||
|  | 			return true; | ||||||
|  | 		} | ||||||
|  | 		++str; | ||||||
|  | 	} | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * Add quotes around any argv with whitespaces. | ||||||
|  |  */ | ||||||
|  | void add_quotes(char **argv, int argc) { | ||||||
|  | 	int i; | ||||||
|  | 	for (i = 0; i < argc; ++i) { | ||||||
|  | 		if (has_whitespace(argv[i])) { | ||||||
|  | 			int len = strlen(argv[i]) + 3; | ||||||
|  | 			char *tmp = argv[i]; | ||||||
|  | 			argv[i] = malloc(len * sizeof(char)); | ||||||
|  | 			snprintf(argv[i], len, "\"%s\"", tmp); | ||||||
|  | 			free(tmp); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Join a list of strings, adding separator in between. Separator can be NULL. |  * Join a list of strings, adding separator in between. Separator can be NULL. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|  | @ -31,6 +31,11 @@ int unescape_string(char *string); | ||||||
| char *join_args(char **argv, int argc); | char *join_args(char **argv, int argc); | ||||||
| char *join_list(list_t *list, char *separator); | char *join_list(list_t *list, char *separator); | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * Add quotes around any argv with whitespaces. | ||||||
|  |  */ | ||||||
|  | void add_quotes(char **argv, int argc); | ||||||
|  | 
 | ||||||
| // split string into 2 by delim.
 | // split string into 2 by delim.
 | ||||||
| char *cmdsep(char **stringp, const char *delim); | char *cmdsep(char **stringp, const char *delim); | ||||||
| // Split string into 2 by delim, handle quotes
 | // Split string into 2 by delim, handle quotes
 | ||||||
|  |  | ||||||
|  | @ -361,8 +361,10 @@ static struct cmd_results *cmd_exec_always(int argc, char **argv) { | ||||||
| 			return error; | 			return error; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		add_quotes(argv + 1, argc - 1); | ||||||
| 		tmp = join_args(argv + 1, argc - 1); | 		tmp = join_args(argv + 1, argc - 1); | ||||||
| 	} else { | 	} else { | ||||||
|  | 		add_quotes(argv, argc); | ||||||
| 		tmp = join_args(argv, argc); | 		tmp = join_args(argv, argc); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Mikkel Oscar Lyderik
						Mikkel Oscar Lyderik