Handle SIGTERM (and kill-server which uses it), a bit more neatly - tidy up

properly and print a nicer message. Same effect though :-)
pull/1/head
Nicholas Marriott 2009-01-21 22:47:31 +00:00
parent 9acc26711d
commit 392e135349
6 changed files with 72 additions and 10 deletions

View File

@ -1,5 +1,7 @@
21 January 2009
* Handle SIGTERM (and kill-server which uses it), a bit more neatly - tidy
up properly and print a nicer message. Same effect though :-).
* new-window now supports -k to kill target window if it exists.
* Bring back split-window -p and -l options to specify the height a percentage
or as a number of lines.
@ -995,7 +997,7 @@
(including mutt, emacs). No status bar yet and no key remapping or other
customisation.
$Id: CHANGES,v 1.229 2009-01-21 22:21:49 nicm Exp $
$Id: CHANGES,v 1.230 2009-01-21 22:47:31 nicm Exp $
LocalWords: showw utf UTF fulvio ciriaco joshe OSC APC gettime abc DEF OA clr
LocalWords: rivo nurges lscm Erdely eol smysession mysession ek dstname RB ms

View File

@ -1,4 +1,4 @@
/* $Id: client-msg.c,v 1.17 2009-01-18 12:09:42 nicm Exp $ */
/* $Id: client-msg.c,v 1.18 2009-01-21 22:47:31 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -27,6 +27,7 @@
int client_msg_fn_detach(struct hdr *, struct client_ctx *, char **);
int client_msg_fn_error(struct hdr *, struct client_ctx *, char **);
int client_msg_fn_shutdown(struct hdr *, struct client_ctx *, char **);
int client_msg_fn_exit(struct hdr *, struct client_ctx *, char **);
int client_msg_fn_exited(struct hdr *, struct client_ctx *, char **);
int client_msg_fn_suspend(struct hdr *, struct client_ctx *, char **);
@ -40,6 +41,7 @@ struct client_msg client_msg_table[] = {
{ MSG_ERROR, client_msg_fn_error },
{ MSG_EXIT, client_msg_fn_exit },
{ MSG_EXITED, client_msg_fn_exited },
{ MSG_SHUTDOWN, client_msg_fn_shutdown },
{ MSG_SUSPEND, client_msg_fn_suspend },
};
@ -94,6 +96,19 @@ client_msg_fn_detach(
return (0);
}
int
client_msg_fn_shutdown(
struct hdr *hdr, unused struct client_ctx *cctx, unused char **error)
{
if (hdr->size != 0)
fatalx("bad MSG_SHUTDOWN size");
client_write_server(cctx, MSG_EXITING, NULL, 0);
cctx->flags |= CCTX_SHUTDOWN;
return (0);
}
int
client_msg_fn_exit(
struct hdr *hdr, unused struct client_ctx *cctx, unused char **error)

View File

@ -1,4 +1,4 @@
/* $Id: client.c,v 1.41 2009-01-19 17:16:09 nicm Exp $ */
/* $Id: client.c,v 1.42 2009-01-21 22:47:31 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -184,6 +184,11 @@ out:
return (1);
}
if (cctx->flags & CCTX_SHUTDOWN) {
printf("[server exited]\n");
return (0);
}
if (cctx->flags & CCTX_EXIT) {
printf("[exited]\n");
return (0);

View File

@ -1,4 +1,4 @@
/* $Id: server.c,v 1.110 2009-01-20 19:35:03 nicm Exp $ */
/* $Id: server.c,v 1.111 2009-01-21 22:47:31 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -43,6 +43,7 @@
struct clients clients;
int server_main(const char *, int);
void server_shutdown(void);
void server_fill_windows(struct pollfd **);
void server_handle_windows(struct pollfd **);
void server_fill_clients(struct pollfd **);
@ -224,7 +225,11 @@ server_main(const char *srv_path, int srv_fd)
last = time(NULL);
pfds = NULL;
while (!sigterm) {
for (;;) {
/* If sigterm, kill all windows and clients. */
if (sigterm)
server_shutdown();
/* Initialise pollfd array. */
nfds = 1;
for (i = 0; i < ARRAY_LENGTH(&windows); i++) {
@ -247,7 +252,7 @@ server_main(const char *srv_path, int srv_fd)
/* Update socket permissions. */
xtimeout = INFTIM;
if (server_update_socket(srv_path) != 0)
if (sigterm || server_update_socket(srv_path) != 0)
xtimeout = 100;
/* Do the poll. */
@ -326,6 +331,34 @@ server_main(const char *srv_path, int srv_fd)
return (0);
}
/* Kill all clients. */
void
server_shutdown(void)
{
struct session *s;
struct client *c;
u_int i;
for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
s = ARRAY_ITEM(&sessions, i);
for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
c = ARRAY_ITEM(&clients, i);
if (c != NULL && c->session == s) {
s = NULL;
break;
}
}
if (s != NULL)
session_destroy(s);
}
for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
c = ARRAY_ITEM(&clients, i);
if (c != NULL)
server_write_client(c, MSG_SHUTDOWN, NULL, 0);
}
}
/* Fill window pollfds. */
void
server_fill_windows(struct pollfd **pfd)
@ -575,6 +608,10 @@ server_accept_client(int srv_fd)
return (NULL);
fatal("accept failed");
}
if (sigterm) {
close(fd);
return (NULL);
}
return (server_create_client(fd));
}

3
tmux.c
View File

@ -1,4 +1,4 @@
/* $Id: tmux.c,v 1.100 2009-01-20 19:35:03 nicm Exp $ */
/* $Id: tmux.c,v 1.101 2009-01-21 22:47:31 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -402,6 +402,7 @@ main(int argc, char **argv)
switch (hdr.type) {
case MSG_EXIT:
case MSG_SHUTDOWN:
n = 0;
goto out;
case MSG_ERROR:

8
tmux.h
View File

@ -1,4 +1,4 @@
/* $Id: tmux.h,v 1.246 2009-01-21 19:38:51 nicm Exp $ */
/* $Id: tmux.h,v 1.247 2009-01-21 22:47:31 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -19,7 +19,7 @@
#ifndef TMUX_H
#define TMUX_H
#define PROTOCOL_VERSION -10
#define PROTOCOL_VERSION -11
/* Shut up gcc warnings about empty if bodies. */
#define RB_AUGMENT(x) do {} while (0)
@ -360,8 +360,9 @@ enum hdrtype {
MSG_PRINT,
MSG_READY,
MSG_RESIZE,
MSG_UNLOCK,
MSG_SHUTDOWN,
MSG_SUSPEND,
MSG_UNLOCK,
MSG_WAKEUP,
};
@ -794,6 +795,7 @@ struct client_ctx {
#define CCTX_DETACH 0x1
#define CCTX_EXIT 0x2
#define CCTX_SHUTDOWN 0x4
int flags;
};