15494e770Schristos /* $OpenBSD$ */
2698d5317Sjmmv
3698d5317Sjmmv /*
4698d5317Sjmmv * Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org>
5698d5317Sjmmv *
6698d5317Sjmmv * Permission to use, copy, modify, and distribute this software for any
7698d5317Sjmmv * purpose with or without fee is hereby granted, provided that the above
8698d5317Sjmmv * copyright notice and this permission notice appear in all copies.
9698d5317Sjmmv *
10698d5317Sjmmv * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11698d5317Sjmmv * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12698d5317Sjmmv * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13698d5317Sjmmv * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14698d5317Sjmmv * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15698d5317Sjmmv * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16698d5317Sjmmv * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17698d5317Sjmmv */
18698d5317Sjmmv
19698d5317Sjmmv #include <sys/types.h>
20698d5317Sjmmv
21698d5317Sjmmv #include <errno.h>
22928fc495Schristos #include <fcntl.h>
23698d5317Sjmmv #include <stdio.h>
24698d5317Sjmmv #include <stdlib.h>
25698d5317Sjmmv #include <string.h>
26698d5317Sjmmv #include <unistd.h>
27698d5317Sjmmv
28698d5317Sjmmv #include "tmux.h"
29698d5317Sjmmv
30698d5317Sjmmv /*
31928fc495Schristos * Loads a paste buffer from a file.
32698d5317Sjmmv */
33698d5317Sjmmv
34e9a2d6faSchristos static enum cmd_retval cmd_load_buffer_exec(struct cmd *, struct cmdq_item *);
35e9a2d6faSchristos
36698d5317Sjmmv const struct cmd_entry cmd_load_buffer_entry = {
37f26e8bc9Schristos .name = "load-buffer",
38f26e8bc9Schristos .alias = "loadb",
39f26e8bc9Schristos
4046548964Swiz .args = { "b:t:w", 1, 1, NULL },
41e271dbb8Schristos .usage = CMD_BUFFER_USAGE " " CMD_TARGET_CLIENT_USAGE " path",
42f26e8bc9Schristos
43e271dbb8Schristos .flags = CMD_AFTERHOOK|CMD_CLIENT_TFLAG|CMD_CLIENT_CANFAIL,
44f26e8bc9Schristos .exec = cmd_load_buffer_exec
45698d5317Sjmmv };
46698d5317Sjmmv
47e9a2d6faSchristos struct cmd_load_buffer_data {
48e271dbb8Schristos struct client *client;
49e9a2d6faSchristos struct cmdq_item *item;
5068e6ba84Schristos char *name;
51e9a2d6faSchristos };
52e9a2d6faSchristos
5368e6ba84Schristos static void
cmd_load_buffer_done(__unused struct client * c,const char * path,int error,int closed,struct evbuffer * buffer,void * data)5468e6ba84Schristos cmd_load_buffer_done(__unused struct client *c, const char *path, int error,
5568e6ba84Schristos int closed, struct evbuffer *buffer, void *data)
5668e6ba84Schristos {
5768e6ba84Schristos struct cmd_load_buffer_data *cdata = data;
58e271dbb8Schristos struct client *tc = cdata->client;
5968e6ba84Schristos struct cmdq_item *item = cdata->item;
6068e6ba84Schristos void *bdata = EVBUFFER_DATA(buffer);
6168e6ba84Schristos size_t bsize = EVBUFFER_LENGTH(buffer);
6268e6ba84Schristos void *copy;
6368e6ba84Schristos char *cause;
6468e6ba84Schristos
6568e6ba84Schristos if (!closed)
6668e6ba84Schristos return;
6768e6ba84Schristos
6868e6ba84Schristos if (error != 0)
6968e6ba84Schristos cmdq_error(item, "%s: %s", path, strerror(error));
7068e6ba84Schristos else if (bsize != 0) {
7168e6ba84Schristos copy = xmalloc(bsize);
7268e6ba84Schristos memcpy(copy, bdata, bsize);
7368e6ba84Schristos if (paste_set(copy, bsize, cdata->name, &cause) != 0) {
7468e6ba84Schristos cmdq_error(item, "%s", cause);
7568e6ba84Schristos free(cause);
7668e6ba84Schristos free(copy);
77e271dbb8Schristos } else if (tc != NULL &&
78e271dbb8Schristos tc->session != NULL &&
79e271dbb8Schristos (~tc->flags & CLIENT_DEAD))
80*f844e94eSwiz tty_set_selection(&tc->tty, "", copy, bsize);
81e271dbb8Schristos if (tc != NULL)
82e271dbb8Schristos server_client_unref(tc);
8368e6ba84Schristos }
8468e6ba84Schristos cmdq_continue(item);
8568e6ba84Schristos
8668e6ba84Schristos free(cdata->name);
8768e6ba84Schristos free(cdata);
8868e6ba84Schristos }
8968e6ba84Schristos
90e9a2d6faSchristos static enum cmd_retval
cmd_load_buffer_exec(struct cmd * self,struct cmdq_item * item)91e9a2d6faSchristos cmd_load_buffer_exec(struct cmd *self, struct cmdq_item *item)
92698d5317Sjmmv {
93e271dbb8Schristos struct args *args = cmd_get_args(self);
94e271dbb8Schristos struct client *tc = cmdq_get_target_client(item);
95e9a2d6faSchristos struct cmd_load_buffer_data *cdata;
9668e6ba84Schristos const char *bufname = args_get(args, 'b');
9768e6ba84Schristos char *path;
98698d5317Sjmmv
99e271dbb8Schristos cdata = xcalloc(1, sizeof *cdata);
10068e6ba84Schristos cdata->item = item;
10168e6ba84Schristos if (bufname != NULL)
10268e6ba84Schristos cdata->name = xstrdup(bufname);
103e271dbb8Schristos if (args_has(args, 'w') && tc != NULL) {
104e271dbb8Schristos cdata->client = tc;
105e271dbb8Schristos cdata->client->references++;
106e271dbb8Schristos }
107698d5317Sjmmv
10846548964Swiz path = format_single_from_target(item, args_string(args, 0));
109e271dbb8Schristos file_read(cmdq_get_client(item), path, cmd_load_buffer_done, cdata);
110c7e17de0Schristos free(path);
111c7e17de0Schristos
112928fc495Schristos return (CMD_RETURN_WAIT);
113698d5317Sjmmv }
114