mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Sync OpenBSD patchset 968:
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
									
									
									
									
									
								
							@@ -127,6 +127,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
									
									
									
									
									
								
							@@ -1341,6 +1341,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