Use an enum for client exit reasons, from George Nachman.

This commit is contained in:
Nicholas Marriott 2012-04-23 23:18:43 +00:00
parent 0f9e0d1cfe
commit d3e432069b
1 changed files with 46 additions and 11 deletions

View File

@ -35,7 +35,16 @@
struct imsgbuf client_ibuf; struct imsgbuf client_ibuf;
struct event client_event; 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; int client_exitval;
enum msgtype client_exittype; enum msgtype client_exittype;
int client_attached; int client_attached;
@ -121,6 +130,31 @@ failed:
return (-1); 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. */ /* Client main loop. */
int int
client_main(int argc, char **argv, int flags) 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 the socket path matches $TMUX, this is probably the same server.
*/ */
if (shell_cmd == NULL && environ_path != NULL && 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. " log_warnx("sessions should be nested with care. "
"unset $TMUX to force."); "unset $TMUX to force.");
return (1); return (1);
@ -223,8 +258,8 @@ client_main(int argc, char **argv, int flags)
/* Print the exit message, if any, and exit. */ /* Print the exit message, if any, and exit. */
if (client_attached) { if (client_attached) {
if (client_exitmsg != NULL && !login_shell) if (client_exitreason != CLIENT_EXIT_NONE && !login_shell)
printf("[%s]\n", client_exitmsg); printf("[%s]\n", client_exit_message());
ppid = getppid(); ppid = getppid();
if (client_exittype == MSG_DETACHKILL && ppid > 1) if (client_exittype == MSG_DETACHKILL && ppid > 1)
@ -323,12 +358,12 @@ client_signal(int sig, unused short events, unused void *data)
} else { } else {
switch (sig) { switch (sig) {
case SIGHUP: case SIGHUP:
client_exitmsg = "lost tty"; client_exitreason = CLIENT_EXIT_LOST_TTY;
client_exitval = 1; client_exitval = 1;
client_write_server(MSG_EXITING, NULL, 0); client_write_server(MSG_EXITING, NULL, 0);
break; break;
case SIGTERM: case SIGTERM:
client_exitmsg = "terminated"; client_exitreason = CLIENT_EXIT_TERMINATED;
client_exitval = 1; client_exitval = 1;
client_write_server(MSG_EXITING, NULL, 0); client_write_server(MSG_EXITING, NULL, 0);
break; break;
@ -380,7 +415,7 @@ client_callback(unused int fd, short events, void *data)
return; return;
lost_server: lost_server:
client_exitmsg = "lost server"; client_exitreason = CLIENT_EXIT_LOST_SERVER;
client_exitval = 1; client_exitval = 1;
event_loopexit(NULL); event_loopexit(NULL);
} }
@ -477,9 +512,9 @@ client_dispatch_attached(void)
client_exittype = imsg.hdr.type; client_exittype = imsg.hdr.type;
if (imsg.hdr.type == MSG_DETACHKILL) if (imsg.hdr.type == MSG_DETACHKILL)
client_exitmsg = "detached and SIGHUP"; client_exitreason = CLIENT_EXIT_DETACHED_HUP;
else else
client_exitmsg = "detached"; client_exitreason = CLIENT_EXIT_DETACHED;
client_write_server(MSG_EXITING, NULL, 0); client_write_server(MSG_EXITING, NULL, 0);
break; break;
case MSG_EXIT: case MSG_EXIT:
@ -488,7 +523,7 @@ client_dispatch_attached(void)
fatalx("bad MSG_EXIT size"); fatalx("bad MSG_EXIT size");
client_write_server(MSG_EXITING, NULL, 0); client_write_server(MSG_EXITING, NULL, 0);
client_exitmsg = "exited"; client_exitreason = CLIENT_EXIT_EXITED;
break; break;
case MSG_EXITED: case MSG_EXITED:
if (datalen != 0) if (datalen != 0)
@ -501,7 +536,7 @@ client_dispatch_attached(void)
fatalx("bad MSG_SHUTDOWN size"); fatalx("bad MSG_SHUTDOWN size");
client_write_server(MSG_EXITING, NULL, 0); client_write_server(MSG_EXITING, NULL, 0);
client_exitmsg = "server exited"; client_exitreason = CLIENT_EXIT_SERVER_EXITED;
client_exitval = 1; client_exitval = 1;
break; break;
case MSG_SUSPEND: case MSG_SUSPEND: