mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-03 16:46:18 +00:00 
			
		
		
		
	Merge branch 'obsd-master'
Conflicts: Makefile cmd-list-commands.c cmd-suspend-client.c job.c tmux.h xmalloc.c
This commit is contained in:
		
							
								
								
									
										99
									
								
								cmd.c
									
									
									
									
									
								
							
							
						
						
									
										99
									
								
								cmd.c
									
									
									
									
									
								
							@@ -120,7 +120,7 @@ struct session	*cmd_choose_session_list(struct sessionslist *);
 | 
			
		||||
struct session	*cmd_choose_session(int);
 | 
			
		||||
struct client	*cmd_choose_client(struct clients *);
 | 
			
		||||
struct client	*cmd_lookup_client(const char *);
 | 
			
		||||
struct session	*cmd_lookup_session(const char *, int *);
 | 
			
		||||
struct session	*cmd_lookup_session(struct cmd_q *, const char *, int *);
 | 
			
		||||
struct session	*cmd_lookup_session_id(const char *);
 | 
			
		||||
struct winlink	*cmd_lookup_window(struct session *, const char *, int *);
 | 
			
		||||
int		 cmd_lookup_index(struct session *, const char *, int *);
 | 
			
		||||
@@ -221,7 +221,7 @@ cmd_stringify_argv(int argc, char **argv)
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < argc; i++) {
 | 
			
		||||
		len += strlen(argv[i]) + 1;
 | 
			
		||||
		buf = xrealloc(buf, 1, len);
 | 
			
		||||
		buf = xrealloc(buf, len);
 | 
			
		||||
 | 
			
		||||
		if (i == 0)
 | 
			
		||||
			*buf = '\0';
 | 
			
		||||
@@ -584,9 +584,11 @@ cmd_lookup_session_id(const char *arg)
 | 
			
		||||
 | 
			
		||||
/* Lookup a session by name. If no session is found, NULL is returned. */
 | 
			
		||||
struct session *
 | 
			
		||||
cmd_lookup_session(const char *name, int *ambiguous)
 | 
			
		||||
cmd_lookup_session(struct cmd_q *cmdq, const char *name, int *ambiguous)
 | 
			
		||||
{
 | 
			
		||||
	struct session	*s, *sfound;
 | 
			
		||||
	struct session		*s, *sfound;
 | 
			
		||||
	struct window		*w;
 | 
			
		||||
	struct window_pane	*wp;
 | 
			
		||||
 | 
			
		||||
	*ambiguous = 0;
 | 
			
		||||
 | 
			
		||||
@@ -594,6 +596,12 @@ cmd_lookup_session(const char *name, int *ambiguous)
 | 
			
		||||
	if ((s = cmd_lookup_session_id(name)) != NULL)
 | 
			
		||||
		return (s);
 | 
			
		||||
 | 
			
		||||
	/* Try as pane or window id. */
 | 
			
		||||
	if ((wp = cmd_lookup_paneid(name)) != NULL)
 | 
			
		||||
		return (cmd_window_session(cmdq, wp->window, NULL));
 | 
			
		||||
	if ((w = cmd_lookup_windowid(name)) != NULL)
 | 
			
		||||
		return (cmd_window_session(cmdq, w, NULL));
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Look for matches. First look for exact matches - session names must
 | 
			
		||||
	 * be unique so an exact match can't be ambigious and can just be
 | 
			
		||||
@@ -629,16 +637,30 @@ cmd_lookup_session(const char *name, int *ambiguous)
 | 
			
		||||
struct winlink *
 | 
			
		||||
cmd_lookup_window(struct session *s, const char *name, int *ambiguous)
 | 
			
		||||
{
 | 
			
		||||
	struct winlink	*wl, *wlfound;
 | 
			
		||||
	const char	*errstr;
 | 
			
		||||
	u_int		 idx;
 | 
			
		||||
	struct winlink		*wl, *wlfound;
 | 
			
		||||
	struct window		*w;
 | 
			
		||||
	struct window_pane	*wp;
 | 
			
		||||
	const char		*errstr;
 | 
			
		||||
	u_int			 idx;
 | 
			
		||||
 | 
			
		||||
	*ambiguous = 0;
 | 
			
		||||
 | 
			
		||||
	/* Try as a window id. */
 | 
			
		||||
	/* Try as pane or window id. */
 | 
			
		||||
	if ((wl = cmd_lookup_winlink_windowid(s, name)) != NULL)
 | 
			
		||||
	    return (wl);
 | 
			
		||||
 | 
			
		||||
	/* Lookup as pane or window id. */
 | 
			
		||||
	if ((wp = cmd_lookup_paneid(name)) != NULL) {
 | 
			
		||||
		wl = winlink_find_by_window(&s->windows, wp->window);
 | 
			
		||||
		if (wl != NULL)
 | 
			
		||||
			return (wl);
 | 
			
		||||
	}
 | 
			
		||||
	if ((w = cmd_lookup_windowid(name)) != NULL) {
 | 
			
		||||
		wl = winlink_find_by_window(&s->windows, w);
 | 
			
		||||
		if (wl != NULL)
 | 
			
		||||
			return (wl);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* First see if this is a valid window index in this session. */
 | 
			
		||||
	idx = strtonum(name, 0, INT_MAX, &errstr);
 | 
			
		||||
	if (errstr == NULL) {
 | 
			
		||||
@@ -785,13 +807,11 @@ cmd_window_session(struct cmd_q *cmdq, struct window *w, struct winlink **wlp)
 | 
			
		||||
struct session *
 | 
			
		||||
cmd_find_session(struct cmd_q *cmdq, const char *arg, int prefer_unattached)
 | 
			
		||||
{
 | 
			
		||||
	struct session		*s;
 | 
			
		||||
	struct window_pane	*wp;
 | 
			
		||||
	struct window		*w;
 | 
			
		||||
	struct client		*c;
 | 
			
		||||
	char			*tmparg;
 | 
			
		||||
	size_t			 arglen;
 | 
			
		||||
	int			 ambiguous;
 | 
			
		||||
	struct session	*s;
 | 
			
		||||
	struct client	*c;
 | 
			
		||||
	char		*tmparg;
 | 
			
		||||
	size_t		 arglen;
 | 
			
		||||
	int		 ambiguous;
 | 
			
		||||
 | 
			
		||||
	/* A NULL argument means the current session. */
 | 
			
		||||
	if (arg == NULL) {
 | 
			
		||||
@@ -800,12 +820,6 @@ cmd_find_session(struct cmd_q *cmdq, const char *arg, int prefer_unattached)
 | 
			
		||||
		return (s);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Lookup as pane id or window id. */
 | 
			
		||||
	if ((wp = cmd_lookup_paneid(arg)) != NULL)
 | 
			
		||||
		return (cmd_window_session(cmdq, wp->window, NULL));
 | 
			
		||||
	if ((w = cmd_lookup_windowid(arg)) != NULL)
 | 
			
		||||
		return (cmd_window_session(cmdq, w, NULL));
 | 
			
		||||
 | 
			
		||||
	/* Trim a single trailing colon if any. */
 | 
			
		||||
	tmparg = xstrdup(arg);
 | 
			
		||||
	arglen = strlen(tmparg);
 | 
			
		||||
@@ -821,7 +835,7 @@ cmd_find_session(struct cmd_q *cmdq, const char *arg, int prefer_unattached)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Find the session, if any. */
 | 
			
		||||
	s = cmd_lookup_session(tmparg, &ambiguous);
 | 
			
		||||
	s = cmd_lookup_session(cmdq, tmparg, &ambiguous);
 | 
			
		||||
 | 
			
		||||
	/* If it doesn't, try to match it as a client. */
 | 
			
		||||
	if (s == NULL && (c = cmd_lookup_client(tmparg)) != NULL)
 | 
			
		||||
@@ -843,12 +857,11 @@ cmd_find_session(struct cmd_q *cmdq, const char *arg, int prefer_unattached)
 | 
			
		||||
struct winlink *
 | 
			
		||||
cmd_find_window(struct cmd_q *cmdq, const char *arg, struct session **sp)
 | 
			
		||||
{
 | 
			
		||||
	struct session		*s;
 | 
			
		||||
	struct winlink		*wl;
 | 
			
		||||
	struct window_pane	*wp;
 | 
			
		||||
	const char		*winptr;
 | 
			
		||||
	char			*sessptr = NULL;
 | 
			
		||||
	int			 ambiguous = 0;
 | 
			
		||||
	struct session	*s;
 | 
			
		||||
	struct winlink	*wl;
 | 
			
		||||
	const char	*winptr;
 | 
			
		||||
	char		*sessptr = NULL;
 | 
			
		||||
	int		 ambiguous = 0;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Find the current session. There must always be a current session, if
 | 
			
		||||
@@ -866,14 +879,6 @@ cmd_find_window(struct cmd_q *cmdq, const char *arg, struct session **sp)
 | 
			
		||||
		return (s->curw);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Lookup as pane id. */
 | 
			
		||||
	if ((wp = cmd_lookup_paneid(arg)) != NULL) {
 | 
			
		||||
		s = cmd_window_session(cmdq, wp->window, &wl);
 | 
			
		||||
		if (sp != NULL)
 | 
			
		||||
			*sp = s;
 | 
			
		||||
		return (wl);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Time to look at the argument. If it is empty, that is an error. */
 | 
			
		||||
	if (*arg == '\0')
 | 
			
		||||
		goto not_found;
 | 
			
		||||
@@ -888,7 +893,7 @@ cmd_find_window(struct cmd_q *cmdq, const char *arg, struct session **sp)
 | 
			
		||||
 | 
			
		||||
	/* Try to lookup the session if present. */
 | 
			
		||||
	if (*sessptr != '\0') {
 | 
			
		||||
		if ((s = cmd_lookup_session(sessptr, &ambiguous)) == NULL)
 | 
			
		||||
		if ((s = cmd_lookup_session(cmdq, sessptr, &ambiguous)) == NULL)
 | 
			
		||||
			goto no_session;
 | 
			
		||||
	}
 | 
			
		||||
	if (sp != NULL)
 | 
			
		||||
@@ -939,7 +944,8 @@ no_colon:
 | 
			
		||||
lookup_session:
 | 
			
		||||
	if (ambiguous)
 | 
			
		||||
		goto not_found;
 | 
			
		||||
	if (*arg != '\0' && (s = cmd_lookup_session(arg, &ambiguous)) == NULL)
 | 
			
		||||
	if (*arg != '\0' &&
 | 
			
		||||
	    (s = cmd_lookup_session(cmdq, arg, &ambiguous)) == NULL)
 | 
			
		||||
		goto no_session;
 | 
			
		||||
 | 
			
		||||
	if (sp != NULL)
 | 
			
		||||
@@ -1029,7 +1035,7 @@ cmd_find_index(struct cmd_q *cmdq, const char *arg, struct session **sp)
 | 
			
		||||
 | 
			
		||||
	/* Try to lookup the session if present. */
 | 
			
		||||
	if (sessptr != NULL && *sessptr != '\0') {
 | 
			
		||||
		if ((s = cmd_lookup_session(sessptr, &ambiguous)) == NULL)
 | 
			
		||||
		if ((s = cmd_lookup_session(cmdq, sessptr, &ambiguous)) == NULL)
 | 
			
		||||
			goto no_session;
 | 
			
		||||
	}
 | 
			
		||||
	if (sp != NULL)
 | 
			
		||||
@@ -1077,7 +1083,8 @@ no_colon:
 | 
			
		||||
lookup_session:
 | 
			
		||||
	if (ambiguous)
 | 
			
		||||
		goto not_found;
 | 
			
		||||
	if (*arg != '\0' && (s = cmd_lookup_session(arg, &ambiguous)) == NULL)
 | 
			
		||||
	if (*arg != '\0' &&
 | 
			
		||||
	    (s = cmd_lookup_session(cmdq, arg, &ambiguous)) == NULL)
 | 
			
		||||
		goto no_session;
 | 
			
		||||
 | 
			
		||||
	if (sp != NULL)
 | 
			
		||||
@@ -1191,7 +1198,13 @@ cmd_find_pane(struct cmd_q *cmdq,
 | 
			
		||||
		*wpp = wl->window->active;
 | 
			
		||||
	else if (paneptr[0] == '+' || paneptr[0] == '-')
 | 
			
		||||
		*wpp = cmd_find_pane_offset(paneptr, wl);
 | 
			
		||||
	else {
 | 
			
		||||
	else if (paneptr[0] == '!' && paneptr[1] == '\0') {
 | 
			
		||||
		if (wl->window->last == NULL) {
 | 
			
		||||
			cmdq_error(cmdq, "no last pane");
 | 
			
		||||
			goto error;
 | 
			
		||||
		}
 | 
			
		||||
		*wpp = wl->window->last;
 | 
			
		||||
	} else {
 | 
			
		||||
		idx = strtonum(paneptr, 0, INT_MAX, &errstr);
 | 
			
		||||
		if (errstr != NULL)
 | 
			
		||||
			goto lookup_string;
 | 
			
		||||
@@ -1288,11 +1301,11 @@ cmd_template_replace(const char *template, const char *s, int idx)
 | 
			
		||||
			ptr++;
 | 
			
		||||
 | 
			
		||||
			len += strlen(s);
 | 
			
		||||
			buf = xrealloc(buf, 1, len + 1);
 | 
			
		||||
			buf = xrealloc(buf, len + 1);
 | 
			
		||||
			strlcat(buf, s, len + 1);
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		buf = xrealloc(buf, 1, len + 2);
 | 
			
		||||
		buf = xrealloc(buf, len + 2);
 | 
			
		||||
		buf[len++] = ch;
 | 
			
		||||
		buf[len] = '\0';
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user