mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +00:00 
			
		
		
		
	Try to resolve relative paths for loadb and saveb (first using client
working directory if any then default-path or session wd).
This commit is contained in:
		| @@ -48,8 +48,9 @@ cmd_load_buffer_exec(struct cmd *self, struct cmd_ctx *ctx) | |||||||
| { | { | ||||||
| 	struct args	*args = self->args; | 	struct args	*args = self->args; | ||||||
| 	struct client	*c = ctx->cmdclient; | 	struct client	*c = ctx->cmdclient; | ||||||
|  | 	struct session  *s; | ||||||
| 	FILE		*f; | 	FILE		*f; | ||||||
| 	const char	*path; | 	const char	*path, *newpath, *wd; | ||||||
| 	char		*pdata, *new_pdata, *cause; | 	char		*pdata, *new_pdata, *cause; | ||||||
| 	size_t		 psize; | 	size_t		 psize; | ||||||
| 	u_int		 limit; | 	u_int		 limit; | ||||||
| @@ -93,6 +94,19 @@ cmd_load_buffer_exec(struct cmd *self, struct cmd_ctx *ctx) | |||||||
| 		return (1); | 		return (1); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if (c != NULL) | ||||||
|  | 		wd = c->cwd; | ||||||
|  | 	else if ((s = cmd_current_session(ctx, 0)) != NULL) { | ||||||
|  | 		wd = options_get_string(&s->options, "default-path"); | ||||||
|  | 		if (*wd == '\0') | ||||||
|  | 			wd = s->cwd; | ||||||
|  | 	} else | ||||||
|  | 		wd = NULL; | ||||||
|  | 	if (wd != NULL && *wd != '\0') { | ||||||
|  | 		newpath = get_full_path(wd, path); | ||||||
|  | 		if (newpath != NULL) | ||||||
|  | 			path = newpath; | ||||||
|  | 	} | ||||||
| 	if ((f = fopen(path, "rb")) == NULL) { | 	if ((f = fopen(path, "rb")) == NULL) { | ||||||
| 		ctx->error(ctx, "%s: %s", path, strerror(errno)); | 		ctx->error(ctx, "%s: %s", path, strerror(errno)); | ||||||
| 		return (-1); | 		return (-1); | ||||||
|   | |||||||
| @@ -45,8 +45,9 @@ cmd_save_buffer_exec(struct cmd *self, struct cmd_ctx *ctx) | |||||||
| { | { | ||||||
| 	struct args		*args = self->args; | 	struct args		*args = self->args; | ||||||
| 	struct client		*c = ctx->cmdclient; | 	struct client		*c = ctx->cmdclient; | ||||||
|  | 	struct session          *s; | ||||||
| 	struct paste_buffer	*pb; | 	struct paste_buffer	*pb; | ||||||
| 	const char		*path; | 	const char		*path, *newpath, *wd; | ||||||
| 	char			*cause; | 	char			*cause; | ||||||
| 	int			 buffer; | 	int			 buffer; | ||||||
| 	mode_t			 mask; | 	mode_t			 mask; | ||||||
| @@ -80,6 +81,20 @@ cmd_save_buffer_exec(struct cmd *self, struct cmd_ctx *ctx) | |||||||
| 		} | 		} | ||||||
| 		bufferevent_write(c->stdout_event, pb->data, pb->size); | 		bufferevent_write(c->stdout_event, pb->data, pb->size); | ||||||
| 	} else { | 	} else { | ||||||
|  | 		if (c != NULL) | ||||||
|  | 			wd = c->cwd; | ||||||
|  | 		else if ((s = cmd_current_session(ctx, 0)) != NULL) { | ||||||
|  | 			wd = options_get_string(&s->options, "default-path"); | ||||||
|  | 			if (*wd == '\0') | ||||||
|  | 				wd = s->cwd; | ||||||
|  | 		} else | ||||||
|  | 			wd = NULL; | ||||||
|  | 		if (wd != NULL && *wd != '\0') { | ||||||
|  | 			newpath = get_full_path(wd, path); | ||||||
|  | 			if (newpath != NULL) | ||||||
|  | 				path = newpath; | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		mask = umask(S_IRWXG | S_IRWXO); | 		mask = umask(S_IRWXG | S_IRWXO); | ||||||
| 		if (args_has(self->args, 'a')) | 		if (args_has(self->args, 'a')) | ||||||
| 			f = fopen(path, "ab"); | 			f = fopen(path, "ab"); | ||||||
|   | |||||||
							
								
								
									
										16
									
								
								tmux.c
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								tmux.c
									
									
									
									
									
								
							| @@ -124,6 +124,22 @@ areshell(const char *shell) | |||||||
| 	return (0); | 	return (0); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | const char* | ||||||
|  | get_full_path(const char *wd, const char *path) | ||||||
|  | { | ||||||
|  | 	static char	newpath[MAXPATHLEN]; | ||||||
|  | 	char		oldpath[MAXPATHLEN]; | ||||||
|  |  | ||||||
|  | 	if (getcwd(oldpath, sizeof oldpath) == NULL) | ||||||
|  | 		return (NULL); | ||||||
|  | 	if (chdir(wd) != 0) | ||||||
|  | 		return (NULL); | ||||||
|  | 	if (realpath(path, newpath) != 0) | ||||||
|  | 		return (NULL); | ||||||
|  | 	chdir(oldpath); | ||||||
|  | 	return (newpath); | ||||||
|  | } | ||||||
|  |  | ||||||
| void | void | ||||||
| parseenvironment(void) | parseenvironment(void) | ||||||
| { | { | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							| @@ -1345,6 +1345,7 @@ void		 logfile(const char *); | |||||||
| const char	*getshell(void); | const char	*getshell(void); | ||||||
| int		 checkshell(const char *); | int		 checkshell(const char *); | ||||||
| int		 areshell(const char *); | int		 areshell(const char *); | ||||||
|  | const char*	 get_full_path(const char *, const char *); | ||||||
| void		 setblocking(int, int); | void		 setblocking(int, int); | ||||||
| __dead void	 shell_exec(const char *, const char *); | __dead void	 shell_exec(const char *, const char *); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Nicholas Marriott
					Nicholas Marriott