mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +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", | ||||
|   | ||||
							
								
								
									
										15
									
								
								server.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								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; | ||||
|  | ||||
| 	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; | ||||
|   | ||||
							
								
								
									
										5
									
								
								tmux.c
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								tmux.c
									
									
									
									
									
								
							| @@ -368,13 +368,16 @@ main(int argc, char **argv) | ||||
| 			path[strcspn(path, ",")] = '\0'; | ||||
| 		} | ||||
| 	} | ||||
| 	if (path == NULL && (path = make_label(label, &cause)) == NULL) { | ||||
| 	if (path == NULL) { | ||||
| 		if ((path = make_label(label, &cause)) == NULL) { | ||||
| 			if (cause != NULL) { | ||||
| 				fprintf(stderr, "%s\n", cause); | ||||
| 				free(cause); | ||||
| 			} | ||||
| 			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
	 Thomas Adam
					Thomas Adam