mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Expand leading tilde on commands which expect a filename.
This commit is contained in:
		
							
								
								
									
										1
									
								
								TODO
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								TODO
									
									
									
									
									
								
							@@ -91,7 +91,6 @@
 | 
				
			|||||||
- status-active-fg/bg/attr would be nice to highlight active window, as would options to set
 | 
					- status-active-fg/bg/attr would be nice to highlight active window, as would options to set
 | 
				
			||||||
  the highlight stuff
 | 
					  the highlight stuff
 | 
				
			||||||
- XXX once env stuff is in, default-path and VISUAL/EDITOR should be picked up when session is started
 | 
					- XXX once env stuff is in, default-path and VISUAL/EDITOR should be picked up when session is started
 | 
				
			||||||
- expand leading ~ in source-file save-buffer etc
 | 
					 | 
				
			||||||
- the copy mode next-word behaviour is emacs style (end of word) rather than vi style (start of word) even in vi keys mode,
 | 
					- the copy mode next-word behaviour is emacs style (end of word) rather than vi style (start of word) even in vi keys mode,
 | 
				
			||||||
- when moving up from a blank line in copy mode it always assumes you were at the end of the line so it can be a bit funny. should remember last non-blank x position and use that
 | 
					- when moving up from a blank line in copy mode it always assumes you were at the end of the line so it can be a bit funny. should remember last non-blank x position and use that
 | 
				
			||||||
- paste-buffer etc should be able to handle \0, so needs a size member and no more strlen
 | 
					- paste-buffer etc should be able to handle \0, so needs a size member and no more strlen
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										44
									
								
								cmd-string.c
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								cmd-string.c
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
/* $Id: cmd-string.c,v 1.18 2009-07-09 18:03:28 nicm Exp $ */
 | 
					/* $Id: cmd-string.c,v 1.19 2009-07-13 18:03:18 tcunha Exp $ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
					 * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
				
			||||||
@@ -19,9 +19,11 @@
 | 
				
			|||||||
#include <sys/types.h>
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <errno.h>
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <pwd.h>
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "tmux.h"
 | 
					#include "tmux.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -33,6 +35,7 @@ int	cmd_string_getc(const char *, size_t *);
 | 
				
			|||||||
void	cmd_string_ungetc(const char *, size_t *);
 | 
					void	cmd_string_ungetc(const char *, size_t *);
 | 
				
			||||||
char   *cmd_string_string(const char *, size_t *, char, int);
 | 
					char   *cmd_string_string(const char *, size_t *, char, int);
 | 
				
			||||||
char   *cmd_string_variable(const char *, size_t *);
 | 
					char   *cmd_string_variable(const char *, size_t *);
 | 
				
			||||||
 | 
					char   *cmd_string_expand_tilde(const char *, size_t *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int
 | 
				
			||||||
cmd_string_getc(const char *s, size_t *p)
 | 
					cmd_string_getc(const char *s, size_t *p)
 | 
				
			||||||
@@ -154,6 +157,17 @@ cmd_string_parse(const char *s, struct cmd_list **cmdlist, char **cause)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			rval = 0;
 | 
								rval = 0;
 | 
				
			||||||
			goto out;
 | 
								goto out;
 | 
				
			||||||
 | 
							case '~':
 | 
				
			||||||
 | 
								if (have_arg == 0) {
 | 
				
			||||||
 | 
									if ((t = cmd_string_expand_tilde(s, &p)) == NULL)
 | 
				
			||||||
 | 
										goto error;
 | 
				
			||||||
 | 
									buf = xrealloc(buf, 1, len + strlen(t) + 1);
 | 
				
			||||||
 | 
									strlcpy(buf + len, t, strlen(t) + 1);
 | 
				
			||||||
 | 
									len += strlen(t);
 | 
				
			||||||
 | 
									xfree(t);
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								/* FALLTHROUGH */
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			if (len >= SIZE_MAX - 2)
 | 
								if (len >= SIZE_MAX - 2)
 | 
				
			||||||
				goto error;
 | 
									goto error;
 | 
				
			||||||
@@ -309,3 +323,31 @@ error:
 | 
				
			|||||||
		xfree(buf);
 | 
							xfree(buf);
 | 
				
			||||||
	return (NULL);
 | 
						return (NULL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char *
 | 
				
			||||||
 | 
					cmd_string_expand_tilde(const char *s, size_t *p)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct passwd	*pw;
 | 
				
			||||||
 | 
						char		*home, *path, *username;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						home = NULL;
 | 
				
			||||||
 | 
						if (cmd_string_getc(s, p) == '/') {
 | 
				
			||||||
 | 
							if ((home = getenv("HOME")) == NULL) {
 | 
				
			||||||
 | 
								if ((pw = getpwuid(getuid())) != NULL)
 | 
				
			||||||
 | 
									home = pw->pw_dir;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							cmd_string_ungetc(s, p);
 | 
				
			||||||
 | 
							if ((username = cmd_string_string(s, p, '/', 0)) == NULL)
 | 
				
			||||||
 | 
								return (NULL);
 | 
				
			||||||
 | 
							if ((pw = getpwnam(username)) != NULL)
 | 
				
			||||||
 | 
								home = pw->pw_dir;
 | 
				
			||||||
 | 
							if (username != NULL)
 | 
				
			||||||
 | 
								xfree(username);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (home == NULL)
 | 
				
			||||||
 | 
							return (NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						xasprintf(&path, "%s/", home);
 | 
				
			||||||
 | 
						return (path);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user