mirror of
https://github.com/tmate-io/tmate.git
synced 2024-11-08 01:04:06 +01:00
Sync OpenBSD patchset 734:
Return the command client return code with MSG_EXIT now that MSG_ERROR and MSG_PRINT are unused. New clients should be compatible with old tmux servers but vice versa may print an error.
This commit is contained in:
parent
46f27eab22
commit
ad6a528f61
@ -1,4 +1,4 @@
|
|||||||
/* $Id: cmd-if-shell.c,v 1.8 2009-11-14 17:56:39 tcunha Exp $ */
|
/* $Id: cmd-if-shell.c,v 1.9 2010-07-17 14:36:40 tcunha Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org>
|
* Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org>
|
||||||
@ -104,10 +104,13 @@ cmd_if_shell_free(void *data)
|
|||||||
{
|
{
|
||||||
struct cmd_if_shell_data *cdata = data;
|
struct cmd_if_shell_data *cdata = data;
|
||||||
struct cmd_ctx *ctx = &cdata->ctx;
|
struct cmd_ctx *ctx = &cdata->ctx;
|
||||||
|
struct msg_exit_data exitdata;
|
||||||
|
|
||||||
if (ctx->cmdclient != NULL) {
|
if (ctx->cmdclient != NULL) {
|
||||||
ctx->cmdclient->references--;
|
ctx->cmdclient->references--;
|
||||||
server_write_client(ctx->cmdclient, MSG_EXIT, NULL, 0);
|
exitdata.retcode = ctx->cmdclient->retcode;
|
||||||
|
server_write_client(
|
||||||
|
ctx->cmdclient, MSG_EXIT, &exitdata, sizeof exitdata);
|
||||||
}
|
}
|
||||||
if (ctx->curclient != NULL)
|
if (ctx->curclient != NULL)
|
||||||
ctx->curclient->references--;
|
ctx->curclient->references--;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $Id: cmd-run-shell.c,v 1.7 2010-06-06 00:04:59 tcunha Exp $ */
|
/* $Id: cmd-run-shell.c,v 1.8 2010-07-17 14:36:40 tcunha Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org>
|
* Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org>
|
||||||
@ -131,10 +131,13 @@ cmd_run_shell_free(void *data)
|
|||||||
{
|
{
|
||||||
struct cmd_run_shell_data *cdata = data;
|
struct cmd_run_shell_data *cdata = data;
|
||||||
struct cmd_ctx *ctx = &cdata->ctx;
|
struct cmd_ctx *ctx = &cdata->ctx;
|
||||||
|
struct msg_exit_data exitdata;
|
||||||
|
|
||||||
if (ctx->cmdclient != NULL) {
|
if (ctx->cmdclient != NULL) {
|
||||||
ctx->cmdclient->references--;
|
ctx->cmdclient->references--;
|
||||||
server_write_client(ctx->cmdclient, MSG_EXIT, NULL, 0);
|
exitdata.retcode = ctx->cmdclient->retcode;
|
||||||
|
server_write_client(
|
||||||
|
ctx->cmdclient, MSG_EXIT, &exitdata, sizeof exitdata);
|
||||||
}
|
}
|
||||||
if (ctx->curclient != NULL)
|
if (ctx->curclient != NULL)
|
||||||
ctx->curclient->references--;
|
ctx->curclient->references--;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $Id: server-client.c,v 1.34 2010-07-02 02:52:13 tcunha Exp $ */
|
/* $Id: server-client.c,v 1.35 2010-07-17 14:36:40 tcunha Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -663,6 +663,8 @@ server_client_msg_error(struct cmd_ctx *ctx, const char *fmt, ...)
|
|||||||
|
|
||||||
fputc('\n', ctx->cmdclient->stderr_file);
|
fputc('\n', ctx->cmdclient->stderr_file);
|
||||||
fflush(ctx->cmdclient->stderr_file);
|
fflush(ctx->cmdclient->stderr_file);
|
||||||
|
|
||||||
|
ctx->cmdclient->retcode = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Callback to send print message to client. */
|
/* Callback to send print message to client. */
|
||||||
@ -700,10 +702,11 @@ server_client_msg_info(struct cmd_ctx *ctx, const char *fmt, ...)
|
|||||||
void
|
void
|
||||||
server_client_msg_command(struct client *c, struct msg_command_data *data)
|
server_client_msg_command(struct client *c, struct msg_command_data *data)
|
||||||
{
|
{
|
||||||
struct cmd_ctx ctx;
|
struct cmd_ctx ctx;
|
||||||
struct cmd_list *cmdlist = NULL;
|
struct cmd_list *cmdlist = NULL;
|
||||||
int argc;
|
struct msg_exit_data exitdata;
|
||||||
char **argv, *cause;
|
int argc;
|
||||||
|
char **argv, *cause;
|
||||||
|
|
||||||
ctx.error = server_client_msg_error;
|
ctx.error = server_client_msg_error;
|
||||||
ctx.print = server_client_msg_print;
|
ctx.print = server_client_msg_print;
|
||||||
@ -734,15 +737,18 @@ server_client_msg_command(struct client *c, struct msg_command_data *data)
|
|||||||
}
|
}
|
||||||
cmd_free_argv(argc, argv);
|
cmd_free_argv(argc, argv);
|
||||||
|
|
||||||
if (cmd_list_exec(cmdlist, &ctx) != 1)
|
if (cmd_list_exec(cmdlist, &ctx) != 1) {
|
||||||
server_write_client(c, MSG_EXIT, NULL, 0);
|
exitdata.retcode = c->retcode;
|
||||||
|
server_write_client(c, MSG_EXIT, &exitdata, sizeof exitdata);
|
||||||
|
}
|
||||||
cmd_list_free(cmdlist);
|
cmd_list_free(cmdlist);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
if (cmdlist != NULL)
|
if (cmdlist != NULL)
|
||||||
cmd_list_free(cmdlist);
|
cmd_list_free(cmdlist);
|
||||||
server_write_client(c, MSG_EXIT, NULL, 0);
|
exitdata.retcode = c->retcode;
|
||||||
|
server_write_client(c, MSG_EXIT, &exitdata, sizeof exitdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Handle identify message. */
|
/* Handle identify message. */
|
||||||
|
16
tmux.c
16
tmux.c
@ -1,4 +1,4 @@
|
|||||||
/* $Id: tmux.c,v 1.213 2010-07-02 02:52:13 tcunha Exp $ */
|
/* $Id: tmux.c,v 1.214 2010-07-17 14:36:41 tcunha Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -60,7 +60,6 @@ char *makesockpath(const char *);
|
|||||||
__dead void shell_exec(const char *, const char *);
|
__dead void shell_exec(const char *, const char *);
|
||||||
|
|
||||||
struct imsgbuf *main_ibuf;
|
struct imsgbuf *main_ibuf;
|
||||||
int main_exitval;
|
|
||||||
|
|
||||||
void main_signal(int, short, unused void *);
|
void main_signal(int, short, unused void *);
|
||||||
void main_callback(int, short, void *);
|
void main_callback(int, short, void *);
|
||||||
@ -565,7 +564,6 @@ main(int argc, char **argv)
|
|||||||
events |= EV_WRITE;
|
events |= EV_WRITE;
|
||||||
event_once(main_ibuf->fd, events, main_callback, shellcmd, NULL);
|
event_once(main_ibuf->fd, events, main_callback, shellcmd, NULL);
|
||||||
|
|
||||||
main_exitval = 0;
|
|
||||||
event_dispatch();
|
event_dispatch();
|
||||||
|
|
||||||
clear_signals();
|
clear_signals();
|
||||||
@ -614,6 +612,7 @@ main_dispatch(const char *shellcmd)
|
|||||||
struct imsg imsg;
|
struct imsg imsg;
|
||||||
ssize_t n, datalen;
|
ssize_t n, datalen;
|
||||||
struct msg_shell_data shelldata;
|
struct msg_shell_data shelldata;
|
||||||
|
struct msg_exit_data exitdata;
|
||||||
|
|
||||||
if ((n = imsg_read(main_ibuf)) == -1 || n == 0)
|
if ((n = imsg_read(main_ibuf)) == -1 || n == 0)
|
||||||
fatalx("imsg_read failed");
|
fatalx("imsg_read failed");
|
||||||
@ -628,10 +627,13 @@ main_dispatch(const char *shellcmd)
|
|||||||
switch (imsg.hdr.type) {
|
switch (imsg.hdr.type) {
|
||||||
case MSG_EXIT:
|
case MSG_EXIT:
|
||||||
case MSG_SHUTDOWN:
|
case MSG_SHUTDOWN:
|
||||||
if (datalen != 0)
|
if (datalen != sizeof exitdata) {
|
||||||
fatalx("bad MSG_EXIT size");
|
if (datalen != 0)
|
||||||
|
fatalx("bad MSG_EXIT size");
|
||||||
exit(main_exitval);
|
exit(0);
|
||||||
|
}
|
||||||
|
memcpy(&exitdata, imsg.data, sizeof exitdata);
|
||||||
|
exit(exitdata.retcode);
|
||||||
case MSG_READY:
|
case MSG_READY:
|
||||||
if (datalen != 0)
|
if (datalen != 0)
|
||||||
fatalx("bad MSG_READY size");
|
fatalx("bad MSG_READY size");
|
||||||
|
7
tmux.h
7
tmux.h
@ -1,4 +1,4 @@
|
|||||||
/* $Id: tmux.h,v 1.569 2010-07-02 02:56:07 tcunha Exp $ */
|
/* $Id: tmux.h,v 1.570 2010-07-17 14:36:41 tcunha Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -412,6 +412,10 @@ struct msg_shell_data {
|
|||||||
char shell[MAXPATHLEN];
|
char shell[MAXPATHLEN];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct msg_exit_data {
|
||||||
|
int retcode;
|
||||||
|
};
|
||||||
|
|
||||||
/* Mode key commands. */
|
/* Mode key commands. */
|
||||||
enum mode_key_cmd {
|
enum mode_key_cmd {
|
||||||
MODEKEY_NONE,
|
MODEKEY_NONE,
|
||||||
@ -1080,6 +1084,7 @@ struct message_entry {
|
|||||||
struct client {
|
struct client {
|
||||||
struct imsgbuf ibuf;
|
struct imsgbuf ibuf;
|
||||||
struct event event;
|
struct event event;
|
||||||
|
int retcode;
|
||||||
|
|
||||||
struct timeval creation_time;
|
struct timeval creation_time;
|
||||||
struct timeval activity_time;
|
struct timeval activity_time;
|
||||||
|
Loading…
Reference in New Issue
Block a user