=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cmd-save-buffer.c,v retrieving revision 1.46 retrieving revision 1.47 diff -c -r1.46 -r1.47 *** src/usr.bin/tmux/cmd-save-buffer.c 2019/06/13 21:44:13 1.46 --- src/usr.bin/tmux/cmd-save-buffer.c 2019/12/12 11:39:56 1.47 *************** *** 1,4 **** ! /* $OpenBSD: cmd-save-buffer.c,v 1.46 2019/06/13 21:44:13 nicm Exp $ */ /* * Copyright (c) 2009 Tiago Cunha --- 1,4 ---- ! /* $OpenBSD: cmd-save-buffer.c,v 1.47 2019/12/12 11:39:56 nicm Exp $ */ /* * Copyright (c) 2009 Tiago Cunha *************** *** 56,61 **** --- 56,75 ---- .exec = cmd_save_buffer_exec }; + static void + cmd_save_buffer_done(__unused struct client *c, const char *path, int error, + __unused int closed, __unused struct evbuffer *buffer, void *data) + { + struct cmdq_item *item = data; + + if (!closed) + return; + + if (error != 0) + cmdq_error(item, "%s: %s", path, strerror(error)); + cmdq_continue(item); + } + static enum cmd_retval cmd_save_buffer_exec(struct cmd *self, struct cmdq_item *item) { *************** *** 65,82 **** struct winlink *wl = item->target.wl; struct window_pane *wp = item->target.wp; struct paste_buffer *pb; ! const char *bufname, *bufdata, *start, *end, *flags; ! char *msg, *path, *file; ! size_t size, used, msglen, bufsize; ! FILE *f; ! if (!args_has(args, 'b')) { if ((pb = paste_get_top(NULL)) == NULL) { cmdq_error(item, "no buffers"); return (CMD_RETURN_ERROR); } } else { - bufname = args_get(args, 'b'); pb = paste_get_name(bufname); if (pb == NULL) { cmdq_error(item, "no buffer %s", bufname); --- 79,95 ---- struct winlink *wl = item->target.wl; struct window_pane *wp = item->target.wp; struct paste_buffer *pb; ! int flags; ! const char *bufname = args_get(args, 'b'), *bufdata; ! size_t bufsize; ! char *path; ! if (bufname == NULL) { if ((pb = paste_get_top(NULL)) == NULL) { cmdq_error(item, "no buffers"); return (CMD_RETURN_ERROR); } } else { pb = paste_get_name(bufname); if (pb == NULL) { cmdq_error(item, "no buffer %s", bufname); *************** *** 89,162 **** path = xstrdup("-"); else path = format_single(item, args->argv[0], c, s, wl, wp); - if (strcmp(path, "-") == 0) { - free(path); - c = item->client; - if (c == NULL) { - cmdq_error(item, "can't write to stdout"); - return (CMD_RETURN_ERROR); - } - if (c->session == NULL || (c->flags & CLIENT_CONTROL)) - goto do_stdout; - goto do_print; - } - - flags = "wb"; if (args_has(self->args, 'a')) ! flags = "ab"; ! ! file = server_client_get_path(item->client, path); free(path); ! f = fopen(file, flags); ! if (f == NULL) { ! cmdq_error(item, "%s: %s", file, strerror(errno)); ! free(file); ! return (CMD_RETURN_ERROR); ! } ! ! if (fwrite(bufdata, 1, bufsize, f) != bufsize) { ! cmdq_error(item, "%s: write error", file); ! fclose(f); ! free(file); ! return (CMD_RETURN_ERROR); ! } ! ! fclose(f); ! free(file); ! ! return (CMD_RETURN_NORMAL); ! ! do_stdout: ! evbuffer_add(c->stdout_data, bufdata, bufsize); ! server_client_push_stdout(c); ! return (CMD_RETURN_NORMAL); ! ! do_print: ! if (bufsize > (INT_MAX / 4) - 1) { ! cmdq_error(item, "buffer too big"); ! return (CMD_RETURN_ERROR); ! } ! msg = NULL; ! ! used = 0; ! while (used != bufsize) { ! start = bufdata + used; ! end = memchr(start, '\n', bufsize - used); ! if (end != NULL) ! size = end - start; ! else ! size = bufsize - used; ! ! msglen = size * 4 + 1; ! msg = xrealloc(msg, msglen); ! ! strvisx(msg, start, size, VIS_OCTAL|VIS_TAB); ! cmdq_print(item, "%s", msg); ! ! used += size + (end != NULL); ! } ! ! free(msg); ! return (CMD_RETURN_NORMAL); } --- 102,114 ---- path = xstrdup("-"); else path = format_single(item, args->argv[0], c, s, wl, wp); if (args_has(self->args, 'a')) ! flags = O_APPEND; ! else ! flags = 0; ! file_write(item->client, path, flags, bufdata, bufsize, ! cmd_save_buffer_done, item); free(path); ! return (CMD_RETURN_WAIT); }