mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Merge show-buffer into save-buffer.
This commit is contained in:
		@@ -122,7 +122,6 @@ dist_tmux_SOURCES = \
 | 
			
		||||
	cmd-set-buffer.c \
 | 
			
		||||
	cmd-set-environment.c \
 | 
			
		||||
	cmd-set-option.c \
 | 
			
		||||
	cmd-show-buffer.c \
 | 
			
		||||
	cmd-show-environment.c \
 | 
			
		||||
	cmd-show-messages.c \
 | 
			
		||||
	cmd-show-options.c \
 | 
			
		||||
 
 | 
			
		||||
@@ -41,6 +41,16 @@ const struct cmd_entry cmd_save_buffer_entry = {
 | 
			
		||||
	cmd_save_buffer_exec
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const struct cmd_entry cmd_show_buffer_entry = {
 | 
			
		||||
	"show-buffer", "showb",
 | 
			
		||||
	"b:", 0, 0,
 | 
			
		||||
	CMD_BUFFER_USAGE,
 | 
			
		||||
	0,
 | 
			
		||||
	NULL,
 | 
			
		||||
	NULL,
 | 
			
		||||
	cmd_save_buffer_exec
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum cmd_retval
 | 
			
		||||
cmd_save_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
{
 | 
			
		||||
@@ -49,10 +59,13 @@ cmd_save_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
	struct session          *s;
 | 
			
		||||
	struct paste_buffer	*pb;
 | 
			
		||||
	const char		*path, *newpath, *wd;
 | 
			
		||||
	char			*cause;
 | 
			
		||||
	char			*cause, *start, *end;
 | 
			
		||||
	size_t			 size, used;
 | 
			
		||||
	int			 buffer;
 | 
			
		||||
	mode_t			 mask;
 | 
			
		||||
	FILE			*f;
 | 
			
		||||
	char			*msg;
 | 
			
		||||
	size_t			 msglen;
 | 
			
		||||
 | 
			
		||||
	if (!args_has(args, 'b')) {
 | 
			
		||||
		if ((pb = paste_get_top(&global_buffers)) == NULL) {
 | 
			
		||||
@@ -74,50 +87,88 @@ cmd_save_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	path = args->argv[0];
 | 
			
		||||
	if (self->entry == &cmd_show_buffer_entry)
 | 
			
		||||
		path = "-";
 | 
			
		||||
	else
 | 
			
		||||
		path = args->argv[0];
 | 
			
		||||
	if (strcmp(path, "-") == 0) {
 | 
			
		||||
		c = ctx->curclient;
 | 
			
		||||
		if (c == NULL || !(c->flags & CLIENT_CONTROL))
 | 
			
		||||
			c = ctx->cmdclient;
 | 
			
		||||
		if (c == NULL) {
 | 
			
		||||
			ctx->error(ctx, "can't write to stdout");
 | 
			
		||||
			return (CMD_RETURN_ERROR);
 | 
			
		||||
		}
 | 
			
		||||
		evbuffer_add(c->stdout_data, pb->data, pb->size);
 | 
			
		||||
		server_push_stdout(c);
 | 
			
		||||
	} else {
 | 
			
		||||
		c = ctx->cmdclient;
 | 
			
		||||
		if (c != NULL)
 | 
			
		||||
			wd = c->cwd;
 | 
			
		||||
		else if ((s = cmd_current_session(ctx, 0)) != NULL) {
 | 
			
		||||
			wd = options_get_string(&s->options, "default-path");
 | 
			
		||||
			if (*wd == '\0')
 | 
			
		||||
				wd = s->cwd;
 | 
			
		||||
		} else
 | 
			
		||||
			wd = NULL;
 | 
			
		||||
		if (wd != NULL && *wd != '\0') {
 | 
			
		||||
			newpath = get_full_path(wd, path);
 | 
			
		||||
			if (newpath != NULL)
 | 
			
		||||
				path = newpath;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		mask = umask(S_IRWXG | S_IRWXO);
 | 
			
		||||
		if (args_has(self->args, 'a'))
 | 
			
		||||
			f = fopen(path, "ab");
 | 
			
		||||
		else
 | 
			
		||||
			f = fopen(path, "wb");
 | 
			
		||||
		umask(mask);
 | 
			
		||||
		if (f == NULL) {
 | 
			
		||||
			ctx->error(ctx, "%s: %s", path, strerror(errno));
 | 
			
		||||
			return (CMD_RETURN_ERROR);
 | 
			
		||||
		}
 | 
			
		||||
		if (fwrite(pb->data, 1, pb->size, f) != pb->size) {
 | 
			
		||||
			ctx->error(ctx, "%s: fwrite error", path);
 | 
			
		||||
			fclose(f);
 | 
			
		||||
			return (CMD_RETURN_ERROR);
 | 
			
		||||
		}
 | 
			
		||||
		fclose(f);
 | 
			
		||||
			goto do_stdout;
 | 
			
		||||
		c = ctx->curclient;
 | 
			
		||||
		if (c->flags & CLIENT_CONTROL)
 | 
			
		||||
			goto do_stdout;
 | 
			
		||||
		if (c != NULL)
 | 
			
		||||
			goto do_print;
 | 
			
		||||
		ctx->error(ctx, "can't write to stdout");
 | 
			
		||||
		return (CMD_RETURN_ERROR);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c = ctx->cmdclient;
 | 
			
		||||
	if (c != NULL)
 | 
			
		||||
		wd = c->cwd;
 | 
			
		||||
	else if ((s = cmd_current_session(ctx, 0)) != NULL) {
 | 
			
		||||
		wd = options_get_string(&s->options, "default-path");
 | 
			
		||||
		if (*wd == '\0')
 | 
			
		||||
			wd = s->cwd;
 | 
			
		||||
	} else
 | 
			
		||||
		wd = NULL;
 | 
			
		||||
	if (wd != NULL && *wd != '\0') {
 | 
			
		||||
		newpath = get_full_path(wd, path);
 | 
			
		||||
		if (newpath != NULL)
 | 
			
		||||
			path = newpath;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mask = umask(S_IRWXG | S_IRWXO);
 | 
			
		||||
	if (args_has(self->args, 'a'))
 | 
			
		||||
		f = fopen(path, "ab");
 | 
			
		||||
	else
 | 
			
		||||
		f = fopen(path, "wb");
 | 
			
		||||
	umask(mask);
 | 
			
		||||
	if (f == NULL) {
 | 
			
		||||
		ctx->error(ctx, "%s: %s", path, strerror(errno));
 | 
			
		||||
		return (CMD_RETURN_ERROR);
 | 
			
		||||
	}
 | 
			
		||||
	if (fwrite(pb->data, 1, pb->size, f) != pb->size) {
 | 
			
		||||
		ctx->error(ctx, "%s: fwrite error", path);
 | 
			
		||||
		fclose(f);
 | 
			
		||||
		return (CMD_RETURN_ERROR);
 | 
			
		||||
	}
 | 
			
		||||
	fclose(f);
 | 
			
		||||
 | 
			
		||||
	return (CMD_RETURN_NORMAL);
 | 
			
		||||
 | 
			
		||||
do_stdout:
 | 
			
		||||
	evbuffer_add(c->stdout_data, pb->data, pb->size);
 | 
			
		||||
	server_push_stdout(c);
 | 
			
		||||
	return (CMD_RETURN_NORMAL);
 | 
			
		||||
 | 
			
		||||
do_print:
 | 
			
		||||
	if (pb->size > (INT_MAX / 4) - 1) {
 | 
			
		||||
		ctx->error(ctx, "buffer too big");
 | 
			
		||||
		return (CMD_RETURN_ERROR);
 | 
			
		||||
	}
 | 
			
		||||
	msg = NULL;
 | 
			
		||||
	msglen = 0;
 | 
			
		||||
 | 
			
		||||
	used = 0;
 | 
			
		||||
	while (used != pb->size) {
 | 
			
		||||
		start = pb->data + used;
 | 
			
		||||
		end = memchr(start, '\n', pb->size - used);
 | 
			
		||||
		if (end != NULL)
 | 
			
		||||
			size = end - start;
 | 
			
		||||
		else
 | 
			
		||||
			size = pb->size - used;
 | 
			
		||||
 | 
			
		||||
		msglen = size * 4 + 1;
 | 
			
		||||
		msg = xrealloc(msg, 1, msglen);
 | 
			
		||||
 | 
			
		||||
		strvisx(msg, start, size, VIS_OCTAL|VIS_TAB);
 | 
			
		||||
		ctx->print(ctx, "%s", msg);
 | 
			
		||||
 | 
			
		||||
		used += size + (end != NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	free(msg);
 | 
			
		||||
	return (CMD_RETURN_NORMAL);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,111 +0,0 @@
 | 
			
		||||
/* $Id$ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
 *
 | 
			
		||||
 * Permission to use, copy, modify, and distribute this software for any
 | 
			
		||||
 * purpose with or without fee is hereby granted, provided that the above
 | 
			
		||||
 * copyright notice and this permission notice appear in all copies.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 | 
			
		||||
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 | 
			
		||||
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 | 
			
		||||
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 | 
			
		||||
 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
 | 
			
		||||
 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
 | 
			
		||||
 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
#include "tmux.h"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Show a paste buffer.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
enum cmd_retval	 cmd_show_buffer_exec(struct cmd *, struct cmd_ctx *);
 | 
			
		||||
 | 
			
		||||
const struct cmd_entry cmd_show_buffer_entry = {
 | 
			
		||||
	"show-buffer", "showb",
 | 
			
		||||
	"b:", 0, 0,
 | 
			
		||||
	CMD_BUFFER_USAGE,
 | 
			
		||||
	0,
 | 
			
		||||
	NULL,
 | 
			
		||||
	NULL,
 | 
			
		||||
	cmd_show_buffer_exec
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum cmd_retval
 | 
			
		||||
cmd_show_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
{
 | 
			
		||||
	struct args		*args = self->args;
 | 
			
		||||
	struct session		*s;
 | 
			
		||||
	struct paste_buffer	*pb;
 | 
			
		||||
	int			 buffer;
 | 
			
		||||
	char			*in, *buf, *ptr, *cause;
 | 
			
		||||
	size_t			 size, len;
 | 
			
		||||
	u_int			 width;
 | 
			
		||||
 | 
			
		||||
	if ((s = cmd_find_session(ctx, NULL, 0)) == NULL)
 | 
			
		||||
		return (CMD_RETURN_ERROR);
 | 
			
		||||
 | 
			
		||||
	if (!args_has(args, 'b')) {
 | 
			
		||||
		if ((pb = paste_get_top(&global_buffers)) == NULL) {
 | 
			
		||||
			ctx->error(ctx, "no buffers");
 | 
			
		||||
			return (CMD_RETURN_ERROR);
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		buffer = args_strtonum(args, 'b', 0, INT_MAX, &cause);
 | 
			
		||||
		if (cause != NULL) {
 | 
			
		||||
			ctx->error(ctx, "buffer %s", cause);
 | 
			
		||||
			free(cause);
 | 
			
		||||
			return (CMD_RETURN_ERROR);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		pb = paste_get_index(&global_buffers, buffer);
 | 
			
		||||
		if (pb == NULL) {
 | 
			
		||||
			ctx->error(ctx, "no buffer %d", buffer);
 | 
			
		||||
			return (CMD_RETURN_ERROR);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	size = pb->size;
 | 
			
		||||
	if (size > SIZE_MAX / 4 - 1)
 | 
			
		||||
		size = SIZE_MAX / 4 - 1;
 | 
			
		||||
	in = xmalloc(size * 4 + 1);
 | 
			
		||||
	strvisx(in, pb->data, size, VIS_OCTAL|VIS_TAB);
 | 
			
		||||
 | 
			
		||||
	width = s->sx;
 | 
			
		||||
	if (ctx->cmdclient != NULL)
 | 
			
		||||
		width = ctx->cmdclient->tty.sx;
 | 
			
		||||
 | 
			
		||||
	buf = xmalloc(width + 1);
 | 
			
		||||
	len = 0;
 | 
			
		||||
 | 
			
		||||
	ptr = in;
 | 
			
		||||
	do {
 | 
			
		||||
		buf[len++] = *ptr++;
 | 
			
		||||
 | 
			
		||||
		if (len == width || buf[len - 1] == '\n') {
 | 
			
		||||
			if (buf[len - 1] == '\n')
 | 
			
		||||
				len--;
 | 
			
		||||
			buf[len] = '\0';
 | 
			
		||||
 | 
			
		||||
			ctx->print(ctx, "%s", buf);
 | 
			
		||||
			len = 0;
 | 
			
		||||
		}
 | 
			
		||||
	} while (*ptr != '\0');
 | 
			
		||||
 | 
			
		||||
	if (len != 0) {
 | 
			
		||||
		buf[len] = '\0';
 | 
			
		||||
		ctx->print(ctx, "%s", buf);
 | 
			
		||||
	}
 | 
			
		||||
	free(buf);
 | 
			
		||||
 | 
			
		||||
	free(in);
 | 
			
		||||
 | 
			
		||||
	return (CMD_RETURN_NORMAL);
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user