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:
		
							
								
								
									
										56
									
								
								server.c
									
									
									
									
									
								
							
							
						
						
									
										56
									
								
								server.c
									
									
									
									
									
								
							@@ -49,7 +49,6 @@ static struct event	 server_ev_accept;
 | 
			
		||||
 | 
			
		||||
struct cmd_find_state	 marked_pane;
 | 
			
		||||
 | 
			
		||||
static int	server_create_socket(void);
 | 
			
		||||
static int	server_loop(void);
 | 
			
		||||
static void	server_send_exit(void);
 | 
			
		||||
static void	server_accept(int, short, void *);
 | 
			
		||||
@@ -98,39 +97,62 @@ server_check_marked(void)
 | 
			
		||||
 | 
			
		||||
/* Create server socket. */
 | 
			
		||||
static int
 | 
			
		||||
server_create_socket(void)
 | 
			
		||||
server_create_socket(char **cause)
 | 
			
		||||
{
 | 
			
		||||
	struct sockaddr_un	sa;
 | 
			
		||||
	size_t			size;
 | 
			
		||||
	mode_t			mask;
 | 
			
		||||
	int			fd;
 | 
			
		||||
	int			fd, saved_errno;
 | 
			
		||||
 | 
			
		||||
	memset(&sa, 0, sizeof sa);
 | 
			
		||||
	sa.sun_family = AF_UNIX;
 | 
			
		||||
	size = strlcpy(sa.sun_path, socket_path, sizeof sa.sun_path);
 | 
			
		||||
	if (size >= sizeof sa.sun_path) {
 | 
			
		||||
		errno = ENAMETOOLONG;
 | 
			
		||||
		return (-1);
 | 
			
		||||
		goto fail;
 | 
			
		||||
	}
 | 
			
		||||
	unlink(sa.sun_path);
 | 
			
		||||
 | 
			
		||||
	if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
 | 
			
		||||
		return (-1);
 | 
			
		||||
		goto fail;
 | 
			
		||||
 | 
			
		||||
	mask = umask(S_IXUSR|S_IXGRP|S_IRWXO);
 | 
			
		||||
	if (bind(fd, (struct sockaddr *) &sa, sizeof(sa)) == -1) {
 | 
			
		||||
	if (bind(fd, (struct sockaddr *)&sa, sizeof sa) == -1) {
 | 
			
		||||
		saved_errno = errno;
 | 
			
		||||
		close(fd);
 | 
			
		||||
		return (-1);
 | 
			
		||||
		errno = saved_errno;
 | 
			
		||||
		goto fail;
 | 
			
		||||
	}
 | 
			
		||||
	umask(mask);
 | 
			
		||||
 | 
			
		||||
	if (listen(fd, 128) == -1) {
 | 
			
		||||
		saved_errno = errno;
 | 
			
		||||
		close(fd);
 | 
			
		||||
		return (-1);
 | 
			
		||||
		errno = saved_errno;
 | 
			
		||||
		goto fail;
 | 
			
		||||
	}
 | 
			
		||||
	setblocking(fd, 0);
 | 
			
		||||
 | 
			
		||||
	return (fd);
 | 
			
		||||
 | 
			
		||||
fail:
 | 
			
		||||
	if (cause != NULL) {
 | 
			
		||||
		xasprintf(cause, "error creating %s (%s)", socket_path,
 | 
			
		||||
		    strerror(errno));
 | 
			
		||||
	}
 | 
			
		||||
	return (-1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Server error callback. */
 | 
			
		||||
static enum cmd_retval
 | 
			
		||||
server_start_error(struct cmdq_item *item, void *data)
 | 
			
		||||
{
 | 
			
		||||
	char	*error = data;
 | 
			
		||||
 | 
			
		||||
	cmdq_error(item, "%s", error);
 | 
			
		||||
	free(error);
 | 
			
		||||
 | 
			
		||||
	return (CMD_RETURN_NORMAL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Fork new server. */
 | 
			
		||||
@@ -141,6 +163,8 @@ server_start(struct tmuxproc *client, struct event_base *base, int lockfd,
 | 
			
		||||
	int		 pair[2];
 | 
			
		||||
	struct job	*job;
 | 
			
		||||
	sigset_t	 set, oldset;
 | 
			
		||||
	struct client	*c;
 | 
			
		||||
	char		*cause = NULL;
 | 
			
		||||
 | 
			
		||||
	if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pair) != 0)
 | 
			
		||||
		fatal("socketpair failed");
 | 
			
		||||
@@ -182,11 +206,10 @@ server_start(struct tmuxproc *client, struct event_base *base, int lockfd,
 | 
			
		||||
 | 
			
		||||
	gettimeofday(&start_time, NULL);
 | 
			
		||||
 | 
			
		||||
	server_fd = server_create_socket();
 | 
			
		||||
	if (server_fd == -1)
 | 
			
		||||
		fatal("couldn't create socket");
 | 
			
		||||
	server_update_socket();
 | 
			
		||||
	server_client_create(pair[1]);
 | 
			
		||||
	server_fd = server_create_socket(&cause);
 | 
			
		||||
	if (server_fd != -1)
 | 
			
		||||
		server_update_socket();
 | 
			
		||||
	c = server_client_create(pair[1]);
 | 
			
		||||
 | 
			
		||||
	if (lockfd >= 0) {
 | 
			
		||||
		unlink(lockfile);
 | 
			
		||||
@@ -194,6 +217,11 @@ server_start(struct tmuxproc *client, struct event_base *base, int lockfd,
 | 
			
		||||
		close(lockfd);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (cause != NULL) {
 | 
			
		||||
		cmdq_append(c, cmdq_get_callback(server_start_error, cause));
 | 
			
		||||
		c->flags |= CLIENT_EXIT;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	start_cfg();
 | 
			
		||||
 | 
			
		||||
	server_add_accept(0);
 | 
			
		||||
@@ -374,7 +402,7 @@ server_signal(int sig)
 | 
			
		||||
		break;
 | 
			
		||||
	case SIGUSR1:
 | 
			
		||||
		event_del(&server_ev_accept);
 | 
			
		||||
		fd = server_create_socket();
 | 
			
		||||
		fd = server_create_socket(NULL);
 | 
			
		||||
		if (fd != -1) {
 | 
			
		||||
			close(server_fd);
 | 
			
		||||
			server_fd = fd;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user