mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +00:00 
			
		
		
		
	Do not set a limit on the length of commands when printing them.
This commit is contained in:
		
							
								
								
									
										86
									
								
								arguments.c
									
									
									
									
									
								
							
							
						
						
									
										86
									
								
								arguments.c
									
									
									
									
									
								
							| @@ -128,77 +128,73 @@ args_free(struct args *args) | |||||||
| 	free(args); | 	free(args); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Print a set of arguments. */ | /* Add to string. */ | ||||||
| size_t | static void printflike(3, 4) | ||||||
| args_print(struct args *args, char *buf, size_t len) | args_print_add(char **buf, size_t *len, const char *fmt, ...) | ||||||
| { | { | ||||||
| 	size_t		 	 off, used; | 	va_list  ap; | ||||||
|  | 	char	*s; | ||||||
|  | 	size_t	 slen; | ||||||
|  |  | ||||||
|  | 	va_start(ap, fmt); | ||||||
|  | 	slen = xvasprintf(&s, fmt, ap); | ||||||
|  | 	va_end(ap); | ||||||
|  |  | ||||||
|  | 	*len += slen; | ||||||
|  | 	*buf = xrealloc(*buf, *len); | ||||||
|  |  | ||||||
|  | 	strlcat(*buf, s, *len); | ||||||
|  | 	free(s); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* Print a set of arguments. */ | ||||||
|  | char * | ||||||
|  | args_print(struct args *args) | ||||||
|  | { | ||||||
|  | 	size_t		 	 len; | ||||||
|  | 	char			*buf; | ||||||
| 	int			 i; | 	int			 i; | ||||||
| 	const char		*quotes; |  | ||||||
| 	struct args_entry	*entry; | 	struct args_entry	*entry; | ||||||
|  |  | ||||||
| 	/* There must be at least one byte at the start. */ | 	len = 1; | ||||||
| 	if (len == 0) | 	buf = xcalloc(1, len); | ||||||
| 		return (0); |  | ||||||
| 	off = 0; |  | ||||||
|  |  | ||||||
| 	/* Process the flags first. */ | 	/* Process the flags first. */ | ||||||
| 	buf[off++] = '-'; |  | ||||||
| 	RB_FOREACH(entry, args_tree, &args->tree) { | 	RB_FOREACH(entry, args_tree, &args->tree) { | ||||||
| 		if (entry->value != NULL) | 		if (entry->value != NULL) | ||||||
| 			continue; | 			continue; | ||||||
|  |  | ||||||
| 		if (off == len - 1) { | 		if (*buf == '\0') | ||||||
| 			buf[off] = '\0'; | 			args_print_add(&buf, &len, "-"); | ||||||
| 			return (len); | 		args_print_add(&buf, &len, "%c", entry->flag); | ||||||
| 	} | 	} | ||||||
| 		buf[off++] = entry->flag; |  | ||||||
| 		buf[off] = '\0'; |  | ||||||
| 	} |  | ||||||
| 	if (off == 1) |  | ||||||
| 		buf[--off] = '\0'; |  | ||||||
|  |  | ||||||
| 	/* Then the flags with arguments. */ | 	/* Then the flags with arguments. */ | ||||||
| 	RB_FOREACH(entry, args_tree, &args->tree) { | 	RB_FOREACH(entry, args_tree, &args->tree) { | ||||||
| 		if (entry->value == NULL) | 		if (entry->value == NULL) | ||||||
| 			continue; | 			continue; | ||||||
|  |  | ||||||
| 		if (off >= len) { | 		if (*buf != '\0') | ||||||
| 			/* snprintf will have zero terminated. */ | 			args_print_add(&buf, &len, " -%c ", entry->flag); | ||||||
| 			return (len); |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if (strchr(entry->value, ' ') != NULL) |  | ||||||
| 			quotes = "\""; |  | ||||||
| 		else | 		else | ||||||
| 			quotes = ""; | 			args_print_add(&buf, &len, "-%c ", entry->flag); | ||||||
| 		used = xsnprintf(buf + off, len - off, "%s-%c %s%s%s", | 		if (strchr(entry->value, ' ') != NULL) | ||||||
| 		    off != 0 ? " " : "", entry->flag, quotes, entry->value, | 			args_print_add(&buf, &len, "\"%s\"", entry->value); | ||||||
| 		    quotes); | 		else | ||||||
| 		if (used > len - off) | 			args_print_add(&buf, &len, "%s", entry->value); | ||||||
| 			used = len - off; |  | ||||||
| 		off += used; |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* And finally the argument vector. */ | 	/* And finally the argument vector. */ | ||||||
| 	for (i = 0; i < args->argc; i++) { | 	for (i = 0; i < args->argc; i++) { | ||||||
| 		if (off >= len) { | 		if (*buf != '\0') | ||||||
| 			/* snprintf will have zero terminated. */ | 			args_print_add(&buf, &len, " "); | ||||||
| 			return (len); |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if (strchr(args->argv[i], ' ') != NULL) | 		if (strchr(args->argv[i], ' ') != NULL) | ||||||
| 			quotes = "\""; | 			args_print_add(&buf, &len, "\"%s\"", args->argv[i]); | ||||||
| 		else | 		else | ||||||
| 			quotes = ""; | 			args_print_add(&buf, &len, "%s", args->argv[i]); | ||||||
| 		used = xsnprintf(buf + off, len - off, "%s%s%s%s", |  | ||||||
| 		    off != 0 ? " " : "", quotes, args->argv[i], quotes); |  | ||||||
| 		if (used > len - off) |  | ||||||
| 			used = len - off; |  | ||||||
| 		off += used; |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return (off); | 	return (buf); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Return if an argument is present. */ | /* Return if an argument is present. */ | ||||||
|   | |||||||
| @@ -56,7 +56,6 @@ cmd_list_keys_exec(struct cmd *self, struct cmd_q *cmdq) | |||||||
| 	struct key_binding	*bd; | 	struct key_binding	*bd; | ||||||
| 	const char		*key, *tablename, *r; | 	const char		*key, *tablename, *r; | ||||||
| 	char			*cp, tmp[BUFSIZ]; | 	char			*cp, tmp[BUFSIZ]; | ||||||
| 	size_t			 used; |  | ||||||
| 	int			 repeat, width, tablewidth, keywidth; | 	int			 repeat, width, tablewidth, keywidth; | ||||||
|  |  | ||||||
| 	if (self->entry == &cmd_list_commands_entry) | 	if (self->entry == &cmd_list_commands_entry) | ||||||
| @@ -115,11 +114,9 @@ cmd_list_keys_exec(struct cmd *self, struct cmd_q *cmdq) | |||||||
| 			strlcat(tmp, " ", sizeof tmp); | 			strlcat(tmp, " ", sizeof tmp); | ||||||
| 			free(cp); | 			free(cp); | ||||||
|  |  | ||||||
| 			used = strlen(tmp); | 			cp = cmd_list_print(bd->cmdlist); | ||||||
| 			if (used < (sizeof tmp) - 1) { | 			strlcat(tmp, cp, sizeof tmp); | ||||||
| 				cmd_list_print(bd->cmdlist, tmp + used, | 			free(cp); | ||||||
| 				    (sizeof tmp) - used); |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			cmdq_print(cmdq, "bind-key %s", tmp); | 			cmdq_print(cmdq, "bind-key %s", tmp); | ||||||
| 		} | 		} | ||||||
|   | |||||||
							
								
								
									
										35
									
								
								cmd-list.c
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								cmd-list.c
									
									
									
									
									
								
							| @@ -99,25 +99,28 @@ cmd_list_free(struct cmd_list *cmdlist) | |||||||
| 	free(cmdlist); | 	free(cmdlist); | ||||||
| } | } | ||||||
|  |  | ||||||
| size_t | char * | ||||||
| cmd_list_print(struct cmd_list *cmdlist, char *buf, size_t len) | cmd_list_print(struct cmd_list *cmdlist) | ||||||
| { | { | ||||||
| 	struct cmd	*cmd; | 	struct cmd	*cmd; | ||||||
| 	size_t		 off, used; | 	char		*buf, *this; | ||||||
|  | 	size_t		 len; | ||||||
|  |  | ||||||
|  | 	len = 1; | ||||||
|  | 	buf = xcalloc(1, len); | ||||||
|  |  | ||||||
| 	off = 0; |  | ||||||
| 	TAILQ_FOREACH(cmd, &cmdlist->list, qentry) { | 	TAILQ_FOREACH(cmd, &cmdlist->list, qentry) { | ||||||
| 		if (off >= len) | 		this = cmd_print(cmd); | ||||||
| 			break; |  | ||||||
| 		off += cmd_print(cmd, buf + off, len - off); | 		len += strlen(this) + 3; | ||||||
| 		if (off >= len) | 		buf = xrealloc(buf, len); | ||||||
| 			break; |  | ||||||
| 		if (TAILQ_NEXT(cmd, qentry) != NULL) { | 		strlcat(buf, this, len); | ||||||
| 			used = xsnprintf(buf + off, len - off, " ; "); | 		if (TAILQ_NEXT(cmd, qentry) != NULL) | ||||||
| 			if (used > len - off) | 			strlcat(buf, " ; ", len); | ||||||
| 				used = len - off; |  | ||||||
| 			off += used; | 		free(this); | ||||||
| 	} | 	} | ||||||
| 	} |  | ||||||
| 	return (off); | 	return (buf); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -184,11 +184,12 @@ cmdq_continue_one(struct cmd_q *cmdq) | |||||||
| { | { | ||||||
| 	struct cmd	*cmd = cmdq->cmd; | 	struct cmd	*cmd = cmdq->cmd; | ||||||
| 	enum cmd_retval	 retval; | 	enum cmd_retval	 retval; | ||||||
| 	char		 tmp[1024]; | 	char		*s; | ||||||
| 	int		 flags = !!(cmd->flags & CMD_CONTROL); | 	int		 flags = !!(cmd->flags & CMD_CONTROL); | ||||||
|  |  | ||||||
| 	cmd_print(cmd, tmp, sizeof tmp); | 	s = cmd_print(cmd); | ||||||
| 	log_debug("cmdq %p: %s", cmdq, tmp); | 	log_debug("cmdq %p: %s", cmdq, s); | ||||||
|  | 	free(s); | ||||||
|  |  | ||||||
| 	cmdq->time = time(NULL); | 	cmdq->time = time(NULL); | ||||||
| 	cmdq->number++; | 	cmdq->number++; | ||||||
|   | |||||||
							
								
								
									
										22
									
								
								cmd.c
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								cmd.c
									
									
									
									
									
								
							| @@ -384,21 +384,19 @@ usage: | |||||||
| 	return (NULL); | 	return (NULL); | ||||||
| } | } | ||||||
|  |  | ||||||
| size_t | char * | ||||||
| cmd_print(struct cmd *cmd, char *buf, size_t len) | cmd_print(struct cmd *cmd) | ||||||
| { | { | ||||||
| 	size_t	off, used; | 	char	*out, *s; | ||||||
|  |  | ||||||
| 	off = xsnprintf(buf, len, "%s ", cmd->entry->name); | 	s = args_print(cmd->args); | ||||||
| 	if (off + 1 < len) { | 	if (*s != '\0') | ||||||
| 		used = args_print(cmd->args, buf + off, len - off - 1); | 		xasprintf(&out, "%s %s", cmd->entry->name, s); | ||||||
| 		if (used == 0) |  | ||||||
| 			off--; |  | ||||||
| 	else | 	else | ||||||
| 			off += used; | 		out = xstrdup(cmd->entry->name); | ||||||
| 		buf[off] = '\0'; | 	free(s); | ||||||
| 	} |  | ||||||
| 	return (off); | 	return (out); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Adjust current mouse position for a pane. */ | /* Adjust current mouse position for a pane. */ | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								tmux.h
									
									
									
									
									
								
							| @@ -1665,7 +1665,7 @@ RB_PROTOTYPE(args_tree, args_entry, entry, args_cmp); | |||||||
| struct args	*args_create(int, ...); | struct args	*args_create(int, ...); | ||||||
| struct args	*args_parse(const char *, int, char **); | struct args	*args_parse(const char *, int, char **); | ||||||
| void		 args_free(struct args *); | void		 args_free(struct args *); | ||||||
| size_t		 args_print(struct args *, char *, size_t); | char		*args_print(struct args *); | ||||||
| int		 args_has(struct args *, u_char); | int		 args_has(struct args *, u_char); | ||||||
| void		 args_set(struct args *, u_char, const char *); | void		 args_set(struct args *, u_char, const char *); | ||||||
| const char	*args_get(struct args *, u_char); | const char	*args_get(struct args *, u_char); | ||||||
| @@ -1694,7 +1694,7 @@ char	       **cmd_copy_argv(int, char **); | |||||||
| void		 cmd_free_argv(int, char **); | void		 cmd_free_argv(int, char **); | ||||||
| char		*cmd_stringify_argv(int, char **); | char		*cmd_stringify_argv(int, char **); | ||||||
| struct cmd	*cmd_parse(int, char **, const char *, u_int, char **); | struct cmd	*cmd_parse(int, char **, const char *, u_int, char **); | ||||||
| size_t		 cmd_print(struct cmd *, char *, size_t); | char		*cmd_print(struct cmd *); | ||||||
| int		 cmd_mouse_at(struct window_pane *, struct mouse_event *, | int		 cmd_mouse_at(struct window_pane *, struct mouse_event *, | ||||||
| 		     u_int *, u_int *, int); | 		     u_int *, u_int *, int); | ||||||
| struct winlink	*cmd_mouse_window(struct mouse_event *, struct session **); | struct winlink	*cmd_mouse_window(struct mouse_event *, struct session **); | ||||||
| @@ -1710,7 +1710,7 @@ enum cmd_retval	 cmd_attach_session(struct cmd_q *, const char *, int, int, | |||||||
| /* cmd-list.c */ | /* cmd-list.c */ | ||||||
| struct cmd_list	*cmd_list_parse(int, char **, const char *, u_int, char **); | struct cmd_list	*cmd_list_parse(int, char **, const char *, u_int, char **); | ||||||
| void		 cmd_list_free(struct cmd_list *); | void		 cmd_list_free(struct cmd_list *); | ||||||
| size_t		 cmd_list_print(struct cmd_list *, char *, size_t); | char		*cmd_list_print(struct cmd_list *); | ||||||
|  |  | ||||||
| /* cmd-queue.c */ | /* cmd-queue.c */ | ||||||
| struct cmd_q	*cmdq_new(struct client *); | struct cmd_q	*cmdq_new(struct client *); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 nicm
					nicm