diff options
author | Tiago Cunha <tcunha@gmx.com> | 2010-07-02 02:52:13 +0000 |
---|---|---|
committer | Tiago Cunha <tcunha@gmx.com> | 2010-07-02 02:52:13 +0000 |
commit | e4573de97b40a7aaebcdcd2a4b699b5f995fe506 (patch) | |
tree | 1aea2b2ab724c59657ca3b87d5b47dfbc400dd3b /cmd-load-buffer.c | |
parent | 63e76b555d8f3d40f9905fb65a58f6e7509d399d (diff) | |
download | rtmux-e4573de97b40a7aaebcdcd2a4b699b5f995fe506.tar.gz rtmux-e4573de97b40a7aaebcdcd2a4b699b5f995fe506.tar.bz2 rtmux-e4573de97b40a7aaebcdcd2a4b699b5f995fe506.zip |
Sync OpenBSD patchset 731:
Send all three of stdin, stdout, stderr from the client to the server, so that
commands can directly make use of them. This means that load-buffer and
save-buffer can have "-" as the file to read from stdin or write to stdout.
This is a protocol version bump so the tmux server will need to be restarted
after upgrade (or an older client used).
Diffstat (limited to 'cmd-load-buffer.c')
-rw-r--r-- | cmd-load-buffer.c | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/cmd-load-buffer.c b/cmd-load-buffer.c index d94ac6d9..2a0e4d1d 100644 --- a/cmd-load-buffer.c +++ b/cmd-load-buffer.c @@ -1,4 +1,4 @@ -/* $Id: cmd-load-buffer.c,v 1.15 2010-02-26 13:30:07 tcunha Exp $ */ +/* $Id: cmd-load-buffer.c,v 1.16 2010-07-02 02:52:13 tcunha Exp $ */ /* * Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org> @@ -16,10 +16,13 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include <sys/types.h> + #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <unistd.h> #include "tmux.h" @@ -45,7 +48,7 @@ cmd_load_buffer_exec(struct cmd *self, struct cmd_ctx *ctx) { struct cmd_buffer_data *data = self->data; struct session *s; - FILE *f; + FILE *f, *close_f; char *pdata, *new_pdata; size_t psize; u_int limit; @@ -54,9 +57,23 @@ cmd_load_buffer_exec(struct cmd *self, struct cmd_ctx *ctx) if ((s = cmd_find_session(ctx, data->target)) == NULL) return (-1); - if ((f = fopen(data->arg, "rb")) == NULL) { - ctx->error(ctx, "%s: %s", data->arg, strerror(errno)); - return (-1); + if (strcmp(data->arg, "-") == 0 ) { + if (ctx->cmdclient == NULL) { + ctx->error(ctx, "%s: can't read from stdin", data->arg); + return (-1); + } + f = ctx->cmdclient->stdin_file; + if (isatty(fileno(ctx->cmdclient->stdin_file))) { + ctx->error(ctx, "%s: stdin is a tty", data->arg); + return (-1); + } + close_f = NULL; + } else { + if ((f = fopen(data->arg, "rb")) == NULL) { + ctx->error(ctx, "%s: %s", data->arg, strerror(errno)); + return (-1); + } + close_f = f; } pdata = NULL; @@ -77,7 +94,8 @@ cmd_load_buffer_exec(struct cmd *self, struct cmd_ctx *ctx) if (pdata != NULL) pdata[psize] = '\0'; - fclose(f); + if (close_f != NULL) + fclose(close_f); limit = options_get_number(&s->options, "buffer-limit"); if (data->buffer == -1) { @@ -94,6 +112,7 @@ cmd_load_buffer_exec(struct cmd *self, struct cmd_ctx *ctx) error: if (pdata != NULL) xfree(pdata); - fclose(f); + if (close_f != NULL) + fclose(close_f); return (-1); } |