mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Pass current directory as a string rather than a file descriptor because
pledge doesn't let us pass directory file descriptors.
This commit is contained in:
		
							
								
								
									
										18
									
								
								client.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								client.c
									
									
									
									
									
								
							@@ -55,7 +55,7 @@ int		client_attached;
 | 
				
			|||||||
__dead void	client_exec(const char *);
 | 
					__dead void	client_exec(const char *);
 | 
				
			||||||
int		client_get_lock(char *);
 | 
					int		client_get_lock(char *);
 | 
				
			||||||
int		client_connect(struct event_base *, char *, int);
 | 
					int		client_connect(struct event_base *, char *, int);
 | 
				
			||||||
void		client_send_identify(const char *, int);
 | 
					void		client_send_identify(const char *, const char *);
 | 
				
			||||||
int		client_write_one(enum msgtype, int, const void *, size_t);
 | 
					int		client_write_one(enum msgtype, int, const void *, size_t);
 | 
				
			||||||
int		client_write_server(enum msgtype, const void *, size_t);
 | 
					int		client_write_server(enum msgtype, const void *, size_t);
 | 
				
			||||||
void		client_update_event(void);
 | 
					void		client_update_event(void);
 | 
				
			||||||
@@ -214,11 +214,11 @@ client_main(struct event_base *base, int argc, char **argv, int flags)
 | 
				
			|||||||
	struct cmd		*cmd;
 | 
						struct cmd		*cmd;
 | 
				
			||||||
	struct cmd_list		*cmdlist;
 | 
						struct cmd_list		*cmdlist;
 | 
				
			||||||
	struct msg_command_data	*data;
 | 
						struct msg_command_data	*data;
 | 
				
			||||||
	int			 cmdflags, fd, i, cwd;
 | 
						int			 cmdflags, fd, i;
 | 
				
			||||||
	const char*              ttynam;
 | 
						const char		*ttynam, *cwd;
 | 
				
			||||||
	pid_t			 ppid;
 | 
						pid_t			 ppid;
 | 
				
			||||||
	enum msgtype		 msg;
 | 
						enum msgtype		 msg;
 | 
				
			||||||
	char			*cause;
 | 
						char			*cause, path[PATH_MAX];
 | 
				
			||||||
	struct termios		 tio, saved_tio;
 | 
						struct termios		 tio, saved_tio;
 | 
				
			||||||
	size_t			 size;
 | 
						size_t			 size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -275,8 +275,8 @@ client_main(struct event_base *base, int argc, char **argv, int flags)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Save these before pledge(). */
 | 
						/* Save these before pledge(). */
 | 
				
			||||||
	if ((cwd = open(".", O_RDONLY)) == -1)
 | 
						if ((cwd = getcwd(path, sizeof path)) == NULL)
 | 
				
			||||||
		cwd = open("/", O_RDONLY);
 | 
							cwd = "/";
 | 
				
			||||||
	if ((ttynam = ttyname(STDIN_FILENO)) == NULL)
 | 
						if ((ttynam = ttyname(STDIN_FILENO)) == NULL)
 | 
				
			||||||
		ttynam = "";
 | 
							ttynam = "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -325,7 +325,7 @@ client_main(struct event_base *base, int argc, char **argv, int flags)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Send identify messages. */
 | 
						/* Send identify messages. */
 | 
				
			||||||
	client_send_identify(ttynam, cwd); /* closes cwd */
 | 
						client_send_identify(ttynam, cwd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Send first command. */
 | 
						/* Send first command. */
 | 
				
			||||||
	if (msg == MSG_COMMAND) {
 | 
						if (msg == MSG_COMMAND) {
 | 
				
			||||||
@@ -380,7 +380,7 @@ client_main(struct event_base *base, int argc, char **argv, int flags)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* Send identify messages to server. */
 | 
					/* Send identify messages to server. */
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
client_send_identify(const char *ttynam, int cwd)
 | 
					client_send_identify(const char *ttynam, const char *cwd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	const char	 *s;
 | 
						const char	 *s;
 | 
				
			||||||
	char		**ss;
 | 
						char		**ss;
 | 
				
			||||||
@@ -395,7 +395,7 @@ client_send_identify(const char *ttynam, int cwd)
 | 
				
			|||||||
	client_write_one(MSG_IDENTIFY_TERM, -1, s, strlen(s) + 1);
 | 
						client_write_one(MSG_IDENTIFY_TERM, -1, s, strlen(s) + 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	client_write_one(MSG_IDENTIFY_TTYNAME, -1, ttynam, strlen(ttynam) + 1);
 | 
						client_write_one(MSG_IDENTIFY_TTYNAME, -1, ttynam, strlen(ttynam) + 1);
 | 
				
			||||||
	client_write_one(MSG_IDENTIFY_CWD, cwd, NULL, 0);
 | 
						client_write_one(MSG_IDENTIFY_CWD, -1, cwd, strlen(cwd) + 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((fd = dup(STDIN_FILENO)) == -1)
 | 
						if ((fd = dup(STDIN_FILENO)) == -1)
 | 
				
			||||||
		fatal("dup failed");
 | 
							fatal("dup failed");
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1166,9 +1166,10 @@ server_client_msg_identify(struct client *c, struct imsg *imsg)
 | 
				
			|||||||
		c->ttyname = xstrdup(data);
 | 
							c->ttyname = xstrdup(data);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case MSG_IDENTIFY_CWD:
 | 
						case MSG_IDENTIFY_CWD:
 | 
				
			||||||
		if (datalen != 0)
 | 
							if (datalen == 0 || data[datalen - 1] != '\0')
 | 
				
			||||||
			fatalx("bad MSG_IDENTIFY_CWD size");
 | 
								fatalx("bad MSG_IDENTIFY_CWD string");
 | 
				
			||||||
		c->cwd = imsg->fd;
 | 
							if ((c->cwd = open(data, O_RDONLY)) == -1)
 | 
				
			||||||
 | 
								c->cwd = open("/", O_RDONLY);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case MSG_IDENTIFY_STDIN:
 | 
						case MSG_IDENTIFY_STDIN:
 | 
				
			||||||
		if (datalen != 0)
 | 
							if (datalen != 0)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								tmux.h
									
									
									
									
									
								
							@@ -395,11 +395,12 @@ enum msgtype {
 | 
				
			|||||||
	MSG_IDENTIFY_FLAGS = 100,
 | 
						MSG_IDENTIFY_FLAGS = 100,
 | 
				
			||||||
	MSG_IDENTIFY_TERM,
 | 
						MSG_IDENTIFY_TERM,
 | 
				
			||||||
	MSG_IDENTIFY_TTYNAME,
 | 
						MSG_IDENTIFY_TTYNAME,
 | 
				
			||||||
	MSG_IDENTIFY_CWD,
 | 
						MSG_IDENTIFY_OLDCWD, /* unused */
 | 
				
			||||||
	MSG_IDENTIFY_STDIN,
 | 
						MSG_IDENTIFY_STDIN,
 | 
				
			||||||
	MSG_IDENTIFY_ENVIRON,
 | 
						MSG_IDENTIFY_ENVIRON,
 | 
				
			||||||
	MSG_IDENTIFY_DONE,
 | 
						MSG_IDENTIFY_DONE,
 | 
				
			||||||
	MSG_IDENTIFY_CLIENTPID,
 | 
						MSG_IDENTIFY_CLIENTPID,
 | 
				
			||||||
 | 
						MSG_IDENTIFY_CWD,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	MSG_COMMAND = 200,
 | 
						MSG_COMMAND = 200,
 | 
				
			||||||
	MSG_DETACH,
 | 
						MSG_DETACH,
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user