Sync OpenBSD patchset 863:

Add a -P option to detach to HUP the client's parent process (usually
causing it to exit as well).
This commit is contained in:
Tiago Cunha 2011-03-19 23:27:35 +00:00
parent 34bb013b92
commit d0cca3924e
4 changed files with 35 additions and 11 deletions

View File

@ -1,4 +1,4 @@
/* $Id: client.c,v 1.101 2011-01-21 23:44:13 tcunha Exp $ */ /* $Id: client.c,v 1.102 2011-03-19 23:27:35 tcunha Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -36,6 +36,7 @@ struct imsgbuf client_ibuf;
struct event client_event; struct event client_event;
const char *client_exitmsg; const char *client_exitmsg;
int client_exitval; int client_exitval;
enum msgtype client_exittype;
int client_attached; int client_attached;
int client_connect(char *, int); int client_connect(char *, int);
@ -100,6 +101,7 @@ client_main(int argc, char **argv, int flags)
struct cmd_list *cmdlist; struct cmd_list *cmdlist;
struct msg_command_data cmddata; struct msg_command_data cmddata;
int cmdflags, fd; int cmdflags, fd;
pid_t ppid;
enum msgtype msg; enum msgtype msg;
char *cause; char *cause;
@ -194,8 +196,14 @@ client_main(int argc, char **argv, int flags)
event_dispatch(); event_dispatch();
/* Print the exit message, if any, and exit. */ /* Print the exit message, if any, and exit. */
if (client_attached && client_exitmsg != NULL && !login_shell) if (client_attached) {
printf("[%s]\n", client_exitmsg); if (client_exitmsg != NULL && !login_shell)
printf("[%s]\n", client_exitmsg);
ppid = getppid();
if (client_exittype == MSG_DETACHKILL && ppid > 1)
kill(ppid, SIGHUP);
}
return (client_exitval); return (client_exitval);
} }
@ -436,12 +444,17 @@ client_dispatch_attached(void)
log_debug("client got %d", imsg.hdr.type); log_debug("client got %d", imsg.hdr.type);
switch (imsg.hdr.type) { switch (imsg.hdr.type) {
case MSG_DETACHKILL:
case MSG_DETACH: case MSG_DETACH:
if (datalen != 0) if (datalen != 0)
fatalx("bad MSG_DETACH size"); fatalx("bad MSG_DETACH size");
client_exittype = imsg.hdr.type;
if (imsg.hdr.type == MSG_DETACHKILL)
client_exitmsg = "detached and SIGHUP";
else
client_exitmsg = "detached";
client_write_server(MSG_EXITING, NULL, 0); client_write_server(MSG_EXITING, NULL, 0);
client_exitmsg = "detached";
break; break;
case MSG_EXIT: case MSG_EXIT:
if (datalen != 0 && if (datalen != 0 &&

View File

@ -1,4 +1,4 @@
/* $Id: cmd-detach-client.c,v 1.12 2011-01-07 14:45:34 tcunha Exp $ */ /* $Id: cmd-detach-client.c,v 1.13 2011-03-19 23:27:35 tcunha Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -28,8 +28,8 @@ int cmd_detach_client_exec(struct cmd *, struct cmd_ctx *);
const struct cmd_entry cmd_detach_client_entry = { const struct cmd_entry cmd_detach_client_entry = {
"detach-client", "detach", "detach-client", "detach",
"t:", 0, 0, "t:P", 0, 0,
CMD_TARGET_CLIENT_USAGE, "[-P] " CMD_TARGET_CLIENT_USAGE,
CMD_READONLY, CMD_READONLY,
NULL, NULL,
NULL, NULL,
@ -45,7 +45,10 @@ cmd_detach_client_exec(struct cmd *self, struct cmd_ctx *ctx)
if ((c = cmd_find_client(ctx, args_get(args, 't'))) == NULL) if ((c = cmd_find_client(ctx, args_get(args, 't'))) == NULL)
return (-1); return (-1);
server_write_client(c, MSG_DETACH, NULL, 0); if (args_has(args, 'P'))
server_write_client(c, MSG_DETACHKILL, NULL, 0);
else
server_write_client(c, MSG_DETACH, NULL, 0);
return (0); return (0);
} }

11
tmux.1
View File

@ -1,4 +1,4 @@
.\" $Id: tmux.1,v 1.295 2011-01-21 23:55:26 tcunha Exp $ .\" $Id: tmux.1,v 1.296 2011-03-19 23:27:35 tcunha Exp $
.\" .\"
.\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> .\" Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
.\" .\"
@ -554,10 +554,17 @@ If no server is started,
.Ic attach-session .Ic attach-session
will attempt to start it; this will fail unless sessions are created in the will attempt to start it; this will fail unless sessions are created in the
configuration file. configuration file.
.It Ic detach-client Op Fl t Ar target-client .It Xo Ic detach-client
.Op Fl P
.Op Fl t Ar target-client
.Xc
.D1 (alias: Ic detach ) .D1 (alias: Ic detach )
Detach the current client if bound to a key, or the specified client with Detach the current client if bound to a key, or the specified client with
.Fl t . .Fl t .
If
.Fl P
is given, send SIGHUP to the parent process of the client, typically causing it
to exit.
.It Ic has-session Op Fl t Ar target-session .It Ic has-session Op Fl t Ar target-session
.D1 (alias: Ic has ) .D1 (alias: Ic has )
Report an error and exit with 1 if the specified session does not exist. Report an error and exit with 1 if the specified session does not exist.

3
tmux.h
View File

@ -1,4 +1,4 @@
/* $Id: tmux.h,v 1.610 2011-02-15 15:20:03 tcunha Exp $ */ /* $Id: tmux.h,v 1.611 2011-03-19 23:27:35 tcunha Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -371,6 +371,7 @@ enum msgtype {
MSG_SHELL, MSG_SHELL,
MSG_STDERR, MSG_STDERR,
MSG_STDOUT, MSG_STDOUT,
MSG_DETACHKILL
}; };
/* /*