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 client	*c = ctx->cmdclient;
 | 
			
		||||
	struct session  *s;
 | 
			
		||||
	FILE		*f;
 | 
			
		||||
	const char	*path;
 | 
			
		||||
	const char	*path, *newpath, *wd;
 | 
			
		||||
	char		*pdata, *new_pdata, *cause;
 | 
			
		||||
	size_t		 psize;
 | 
			
		||||
	u_int		 limit;
 | 
			
		||||
@@ -93,6 +94,19 @@ cmd_load_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
		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) {
 | 
			
		||||
		ctx->error(ctx, "%s: %s", path, strerror(errno));
 | 
			
		||||
		return (-1);
 | 
			
		||||
 
 | 
			
		||||
@@ -45,8 +45,9 @@ cmd_save_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
{
 | 
			
		||||
	struct args		*args = self->args;
 | 
			
		||||
	struct client		*c = ctx->cmdclient;
 | 
			
		||||
	struct session          *s;
 | 
			
		||||
	struct paste_buffer	*pb;
 | 
			
		||||
	const char		*path;
 | 
			
		||||
	const char		*path, *newpath, *wd;
 | 
			
		||||
	char			*cause;
 | 
			
		||||
	int			 buffer;
 | 
			
		||||
	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);
 | 
			
		||||
	} 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);
 | 
			
		||||
		if (args_has(self->args, 'a'))
 | 
			
		||||
			f = fopen(path, "ab");
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										16
									
								
								tmux.c
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								tmux.c
									
									
									
									
									
								
							@@ -127,6 +127,22 @@ areshell(const char *shell)
 | 
			
		||||
	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
 | 
			
		||||
parseenvironment(void)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user