mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Use an enum for client exit reasons, from George Nachman.
This commit is contained in:
		
							
								
								
									
										57
									
								
								client.c
									
									
									
									
									
								
							
							
						
						
									
										57
									
								
								client.c
									
									
									
									
									
								
							@@ -35,7 +35,16 @@
 | 
			
		||||
 | 
			
		||||
struct imsgbuf	client_ibuf;
 | 
			
		||||
struct event	client_event;
 | 
			
		||||
const char     *client_exitmsg;
 | 
			
		||||
enum {
 | 
			
		||||
	CLIENT_EXIT_NONE,
 | 
			
		||||
	CLIENT_EXIT_DETACHED,
 | 
			
		||||
	CLIENT_EXIT_DETACHED_HUP,
 | 
			
		||||
	CLIENT_EXIT_LOST_TTY,
 | 
			
		||||
	CLIENT_EXIT_TERMINATED,
 | 
			
		||||
	CLIENT_EXIT_LOST_SERVER,
 | 
			
		||||
	CLIENT_EXIT_EXITED,
 | 
			
		||||
	CLIENT_EXIT_SERVER_EXITED,
 | 
			
		||||
} client_exitreason = CLIENT_EXIT_NONE;
 | 
			
		||||
int		client_exitval;
 | 
			
		||||
enum msgtype	client_exittype;
 | 
			
		||||
int		client_attached;
 | 
			
		||||
@@ -121,6 +130,31 @@ failed:
 | 
			
		||||
	return (-1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Get exit string from reason number. */
 | 
			
		||||
const char *
 | 
			
		||||
client_exit_message(void)
 | 
			
		||||
{
 | 
			
		||||
	switch (client_exitreason) {
 | 
			
		||||
	case CLIENT_EXIT_NONE:
 | 
			
		||||
		break;
 | 
			
		||||
	case CLIENT_EXIT_DETACHED:
 | 
			
		||||
		return ("detached");
 | 
			
		||||
	case CLIENT_EXIT_DETACHED_HUP:
 | 
			
		||||
		return ("detached and SIGHUP");
 | 
			
		||||
	case CLIENT_EXIT_LOST_TTY:
 | 
			
		||||
		return ("lost tty");
 | 
			
		||||
	case CLIENT_EXIT_TERMINATED:
 | 
			
		||||
		return ("terminated");
 | 
			
		||||
	case CLIENT_EXIT_LOST_SERVER:
 | 
			
		||||
		return ("lost server");
 | 
			
		||||
	case CLIENT_EXIT_EXITED:
 | 
			
		||||
		return ("exited");
 | 
			
		||||
	case CLIENT_EXIT_SERVER_EXITED:
 | 
			
		||||
		return ("server exited");
 | 
			
		||||
	}
 | 
			
		||||
	return ("unknown reason");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Client main loop. */
 | 
			
		||||
int
 | 
			
		||||
client_main(int argc, char **argv, int flags)
 | 
			
		||||
@@ -170,7 +204,8 @@ client_main(int argc, char **argv, int flags)
 | 
			
		||||
	 * if the socket path matches $TMUX, this is probably the same server.
 | 
			
		||||
	 */
 | 
			
		||||
	if (shell_cmd == NULL && environ_path != NULL &&
 | 
			
		||||
	    cmdflags & CMD_CANTNEST && strcmp(socket_path, environ_path) == 0) {
 | 
			
		||||
	    (cmdflags & CMD_CANTNEST) &&
 | 
			
		||||
	    strcmp(socket_path, environ_path) == 0) {
 | 
			
		||||
		log_warnx("sessions should be nested with care. "
 | 
			
		||||
		    "unset $TMUX to force.");
 | 
			
		||||
		return (1);
 | 
			
		||||
@@ -223,8 +258,8 @@ client_main(int argc, char **argv, int flags)
 | 
			
		||||
 | 
			
		||||
	/* Print the exit message, if any, and exit. */
 | 
			
		||||
	if (client_attached) {
 | 
			
		||||
		if (client_exitmsg != NULL && !login_shell)
 | 
			
		||||
			printf("[%s]\n", client_exitmsg);
 | 
			
		||||
		if (client_exitreason != CLIENT_EXIT_NONE && !login_shell)
 | 
			
		||||
			printf("[%s]\n", client_exit_message());
 | 
			
		||||
 | 
			
		||||
		ppid = getppid();
 | 
			
		||||
		if (client_exittype == MSG_DETACHKILL && ppid > 1)
 | 
			
		||||
@@ -323,12 +358,12 @@ client_signal(int sig, unused short events, unused void *data)
 | 
			
		||||
	} else {
 | 
			
		||||
		switch (sig) {
 | 
			
		||||
		case SIGHUP:
 | 
			
		||||
			client_exitmsg = "lost tty";
 | 
			
		||||
			client_exitreason = CLIENT_EXIT_LOST_TTY;
 | 
			
		||||
			client_exitval = 1;
 | 
			
		||||
			client_write_server(MSG_EXITING, NULL, 0);
 | 
			
		||||
			break;
 | 
			
		||||
		case SIGTERM:
 | 
			
		||||
			client_exitmsg = "terminated";
 | 
			
		||||
			client_exitreason = CLIENT_EXIT_TERMINATED;
 | 
			
		||||
			client_exitval = 1;
 | 
			
		||||
			client_write_server(MSG_EXITING, NULL, 0);
 | 
			
		||||
			break;
 | 
			
		||||
@@ -380,7 +415,7 @@ client_callback(unused int fd, short events, void *data)
 | 
			
		||||
	return;
 | 
			
		||||
 | 
			
		||||
lost_server:
 | 
			
		||||
	client_exitmsg = "lost server";
 | 
			
		||||
	client_exitreason = CLIENT_EXIT_LOST_SERVER;
 | 
			
		||||
	client_exitval = 1;
 | 
			
		||||
	event_loopexit(NULL);
 | 
			
		||||
}
 | 
			
		||||
@@ -477,9 +512,9 @@ client_dispatch_attached(void)
 | 
			
		||||
 | 
			
		||||
			client_exittype = imsg.hdr.type;
 | 
			
		||||
			if (imsg.hdr.type == MSG_DETACHKILL)
 | 
			
		||||
				client_exitmsg = "detached and SIGHUP";
 | 
			
		||||
				client_exitreason = CLIENT_EXIT_DETACHED_HUP;
 | 
			
		||||
			else
 | 
			
		||||
				client_exitmsg = "detached";
 | 
			
		||||
				client_exitreason = CLIENT_EXIT_DETACHED;
 | 
			
		||||
			client_write_server(MSG_EXITING, NULL, 0);
 | 
			
		||||
			break;
 | 
			
		||||
		case MSG_EXIT:
 | 
			
		||||
@@ -488,7 +523,7 @@ client_dispatch_attached(void)
 | 
			
		||||
				fatalx("bad MSG_EXIT size");
 | 
			
		||||
 | 
			
		||||
			client_write_server(MSG_EXITING, NULL, 0);
 | 
			
		||||
			client_exitmsg = "exited";
 | 
			
		||||
			client_exitreason = CLIENT_EXIT_EXITED;
 | 
			
		||||
			break;
 | 
			
		||||
		case MSG_EXITED:
 | 
			
		||||
			if (datalen != 0)
 | 
			
		||||
@@ -501,7 +536,7 @@ client_dispatch_attached(void)
 | 
			
		||||
				fatalx("bad MSG_SHUTDOWN size");
 | 
			
		||||
 | 
			
		||||
			client_write_server(MSG_EXITING, NULL, 0);
 | 
			
		||||
			client_exitmsg = "server exited";
 | 
			
		||||
			client_exitreason = CLIENT_EXIT_SERVER_EXITED;
 | 
			
		||||
			client_exitval = 1;
 | 
			
		||||
			break;
 | 
			
		||||
		case MSG_SUSPEND:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user