mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Merge branch 'obsd-master'
This commit is contained in:
		
							
								
								
									
										23
									
								
								client.c
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								client.c
									
									
									
									
									
								
							@@ -97,7 +97,7 @@ client_get_lock(char *lockfile)
 | 
			
		||||
 | 
			
		||||
/* Connect client to server. */
 | 
			
		||||
static int
 | 
			
		||||
client_connect(struct event_base *base, const char *path, int start_server)
 | 
			
		||||
client_connect(struct event_base *base, const char *path, int flags)
 | 
			
		||||
{
 | 
			
		||||
	struct sockaddr_un	sa;
 | 
			
		||||
	size_t			size;
 | 
			
		||||
@@ -122,7 +122,7 @@ retry:
 | 
			
		||||
		log_debug("connect failed: %s", strerror(errno));
 | 
			
		||||
		if (errno != ECONNREFUSED && errno != ENOENT)
 | 
			
		||||
			goto failed;
 | 
			
		||||
		if (!start_server)
 | 
			
		||||
		if (~flags & CLIENT_STARTSERVER)
 | 
			
		||||
			goto failed;
 | 
			
		||||
		close(fd);
 | 
			
		||||
 | 
			
		||||
@@ -154,7 +154,7 @@ retry:
 | 
			
		||||
			close(lockfd);
 | 
			
		||||
			return (-1);
 | 
			
		||||
		}
 | 
			
		||||
		fd = server_start(client_proc, base, lockfd, lockfile);
 | 
			
		||||
		fd = server_start(client_proc, flags, base, lockfd, lockfile);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (locked && lockfd >= 0) {
 | 
			
		||||
@@ -238,7 +238,7 @@ client_main(struct event_base *base, int argc, char **argv, int flags)
 | 
			
		||||
	struct cmd_parse_result	*pr;
 | 
			
		||||
	struct cmd		*cmd;
 | 
			
		||||
	struct msg_command	*data;
 | 
			
		||||
	int			 cmdflags, fd, i;
 | 
			
		||||
	int			 fd, i;
 | 
			
		||||
	const char		*ttynam, *cwd;
 | 
			
		||||
	pid_t			 ppid;
 | 
			
		||||
	enum msgtype		 msg;
 | 
			
		||||
@@ -248,17 +248,13 @@ client_main(struct event_base *base, int argc, char **argv, int flags)
 | 
			
		||||
	/* Ignore SIGCHLD now or daemon() in the server will leave a zombie. */
 | 
			
		||||
	signal(SIGCHLD, SIG_IGN);
 | 
			
		||||
 | 
			
		||||
	/* Save the flags. */
 | 
			
		||||
	client_flags = flags;
 | 
			
		||||
 | 
			
		||||
	/* Set up the initial command. */
 | 
			
		||||
	cmdflags = 0;
 | 
			
		||||
	if (shell_command != NULL) {
 | 
			
		||||
		msg = MSG_SHELL;
 | 
			
		||||
		cmdflags = CMD_STARTSERVER;
 | 
			
		||||
		flags = CLIENT_STARTSERVER;
 | 
			
		||||
	} else if (argc == 0) {
 | 
			
		||||
		msg = MSG_COMMAND;
 | 
			
		||||
		cmdflags = CMD_STARTSERVER;
 | 
			
		||||
		flags |= CLIENT_STARTSERVER;
 | 
			
		||||
	} else {
 | 
			
		||||
		msg = MSG_COMMAND;
 | 
			
		||||
 | 
			
		||||
@@ -271,19 +267,22 @@ client_main(struct event_base *base, int argc, char **argv, int flags)
 | 
			
		||||
		if (pr->status == CMD_PARSE_SUCCESS) {
 | 
			
		||||
			TAILQ_FOREACH(cmd, &pr->cmdlist->list, qentry) {
 | 
			
		||||
				if (cmd->entry->flags & CMD_STARTSERVER)
 | 
			
		||||
					cmdflags |= CMD_STARTSERVER;
 | 
			
		||||
					flags |= CLIENT_STARTSERVER;
 | 
			
		||||
			}
 | 
			
		||||
			cmd_list_free(pr->cmdlist);
 | 
			
		||||
		} else
 | 
			
		||||
			free(pr->error);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Save the flags. */
 | 
			
		||||
	client_flags = flags;
 | 
			
		||||
 | 
			
		||||
	/* Create client process structure (starts logging). */
 | 
			
		||||
	client_proc = proc_start("client");
 | 
			
		||||
	proc_set_signals(client_proc, client_signal);
 | 
			
		||||
 | 
			
		||||
	/* Initialize the client socket and start the server. */
 | 
			
		||||
	fd = client_connect(base, socket_path, cmdflags & CMD_STARTSERVER);
 | 
			
		||||
	fd = client_connect(base, socket_path, client_flags);
 | 
			
		||||
	if (fd == -1) {
 | 
			
		||||
		if (errno == ECONNREFUSED) {
 | 
			
		||||
			fprintf(stderr, "no server running on %s\n",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								server.c
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								server.c
									
									
									
									
									
								
							@@ -44,6 +44,7 @@ struct clients		 clients;
 | 
			
		||||
 | 
			
		||||
struct tmuxproc		*server_proc;
 | 
			
		||||
static int		 server_fd = -1;
 | 
			
		||||
static int		 server_client_flags;
 | 
			
		||||
static int		 server_exit;
 | 
			
		||||
static struct event	 server_ev_accept;
 | 
			
		||||
 | 
			
		||||
@@ -97,7 +98,7 @@ server_check_marked(void)
 | 
			
		||||
 | 
			
		||||
/* Create server socket. */
 | 
			
		||||
static int
 | 
			
		||||
server_create_socket(char **cause)
 | 
			
		||||
server_create_socket(int flags, char **cause)
 | 
			
		||||
{
 | 
			
		||||
	struct sockaddr_un	sa;
 | 
			
		||||
	size_t			size;
 | 
			
		||||
@@ -116,7 +117,10 @@ server_create_socket(char **cause)
 | 
			
		||||
	if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
 | 
			
		||||
		goto fail;
 | 
			
		||||
 | 
			
		||||
	mask = umask(S_IXUSR|S_IXGRP|S_IRWXO);
 | 
			
		||||
	if (flags & CLIENT_DEFAULTSOCKET)
 | 
			
		||||
		mask = umask(S_IXUSR|S_IXGRP|S_IRWXO);
 | 
			
		||||
	else
 | 
			
		||||
		mask = umask(S_IXUSR|S_IRWXG|S_IRWXO);
 | 
			
		||||
	if (bind(fd, (struct sockaddr *)&sa, sizeof sa) == -1) {
 | 
			
		||||
		saved_errno = errno;
 | 
			
		||||
		close(fd);
 | 
			
		||||
@@ -145,8 +149,8 @@ fail:
 | 
			
		||||
 | 
			
		||||
/* Fork new server. */
 | 
			
		||||
int
 | 
			
		||||
server_start(struct tmuxproc *client, struct event_base *base, int lockfd,
 | 
			
		||||
    char *lockfile)
 | 
			
		||||
server_start(struct tmuxproc *client, int flags, struct event_base *base,
 | 
			
		||||
    int lockfd, char *lockfile)
 | 
			
		||||
{
 | 
			
		||||
	int		 pair[2];
 | 
			
		||||
	sigset_t	 set, oldset;
 | 
			
		||||
@@ -155,6 +159,7 @@ server_start(struct tmuxproc *client, struct event_base *base, int lockfd,
 | 
			
		||||
 | 
			
		||||
	if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pair) != 0)
 | 
			
		||||
		fatal("socketpair failed");
 | 
			
		||||
	server_client_flags = flags;
 | 
			
		||||
 | 
			
		||||
	sigfillset(&set);
 | 
			
		||||
	sigprocmask(SIG_BLOCK, &set, &oldset);
 | 
			
		||||
@@ -192,7 +197,7 @@ server_start(struct tmuxproc *client, struct event_base *base, int lockfd,
 | 
			
		||||
 | 
			
		||||
	gettimeofday(&start_time, NULL);
 | 
			
		||||
 | 
			
		||||
	server_fd = server_create_socket(&cause);
 | 
			
		||||
	server_fd = server_create_socket(flags, &cause);
 | 
			
		||||
	if (server_fd != -1)
 | 
			
		||||
		server_update_socket();
 | 
			
		||||
	c = server_client_create(pair[1]);
 | 
			
		||||
@@ -395,7 +400,7 @@ server_signal(int sig)
 | 
			
		||||
		break;
 | 
			
		||||
	case SIGUSR1:
 | 
			
		||||
		event_del(&server_ev_accept);
 | 
			
		||||
		fd = server_create_socket(NULL);
 | 
			
		||||
		fd = server_create_socket(server_client_flags, NULL);
 | 
			
		||||
		if (fd != -1) {
 | 
			
		||||
			close(server_fd);
 | 
			
		||||
			server_fd = fd;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								tmux.c
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								tmux.c
									
									
									
									
									
								
							@@ -368,12 +368,15 @@ main(int argc, char **argv)
 | 
			
		||||
			path[strcspn(path, ",")] = '\0';
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if (path == NULL && (path = make_label(label, &cause)) == NULL) {
 | 
			
		||||
		if (cause != NULL) {
 | 
			
		||||
			fprintf(stderr, "%s\n", cause);
 | 
			
		||||
			free(cause);
 | 
			
		||||
	if (path == NULL) {
 | 
			
		||||
		if ((path = make_label(label, &cause)) == NULL) {
 | 
			
		||||
			if (cause != NULL) {
 | 
			
		||||
				fprintf(stderr, "%s\n", cause);
 | 
			
		||||
				free(cause);
 | 
			
		||||
			}
 | 
			
		||||
			exit(1);
 | 
			
		||||
		}
 | 
			
		||||
		exit(1);
 | 
			
		||||
		flags |= CLIENT_DEFAULTSOCKET;
 | 
			
		||||
	}
 | 
			
		||||
	socket_path = path;
 | 
			
		||||
	free(label);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								tmux.h
									
									
									
									
									
								
							@@ -1579,6 +1579,8 @@ struct client {
 | 
			
		||||
#define CLIENT_REDRAWSTATUSALWAYS 0x1000000
 | 
			
		||||
#define CLIENT_REDRAWOVERLAY 0x2000000
 | 
			
		||||
#define CLIENT_CONTROL_NOOUTPUT 0x4000000
 | 
			
		||||
#define CLIENT_DEFAULTSOCKET 0x8000000
 | 
			
		||||
#define CLIENT_STARTSERVER 0x10000000
 | 
			
		||||
#define CLIENT_ALLREDRAWFLAGS		\
 | 
			
		||||
	(CLIENT_REDRAWWINDOW|		\
 | 
			
		||||
	 CLIENT_REDRAWSTATUS|		\
 | 
			
		||||
@@ -2202,7 +2204,7 @@ void	 server_clear_marked(void);
 | 
			
		||||
int	 server_is_marked(struct session *, struct winlink *,
 | 
			
		||||
	     struct window_pane *);
 | 
			
		||||
int	 server_check_marked(void);
 | 
			
		||||
int	 server_start(struct tmuxproc *, struct event_base *, int, char *);
 | 
			
		||||
int	 server_start(struct tmuxproc *, int, struct event_base *, int, char *);
 | 
			
		||||
void	 server_update_socket(void);
 | 
			
		||||
void	 server_add_accept(int);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user