version 1.24, 2013/03/24 09:27:20 |
version 1.25, 2013/03/24 09:54:10 |
|
|
* Open pipe to redirect pane output. If already open, close first. |
* Open pipe to redirect pane output. If already open, close first. |
*/ |
*/ |
|
|
enum cmd_retval cmd_pipe_pane_exec(struct cmd *, struct cmd_ctx *); |
enum cmd_retval cmd_pipe_pane_exec(struct cmd *, struct cmd_q *); |
|
|
void cmd_pipe_pane_error_callback(struct bufferevent *, short, void *); |
void cmd_pipe_pane_error_callback(struct bufferevent *, short, void *); |
|
|
|
|
}; |
}; |
|
|
enum cmd_retval |
enum cmd_retval |
cmd_pipe_pane_exec(struct cmd *self, struct cmd_ctx *ctx) |
cmd_pipe_pane_exec(struct cmd *self, struct cmd_q *cmdq) |
{ |
{ |
struct args *args = self->args; |
struct args *args = self->args; |
struct client *c; |
struct client *c; |
|
|
char *command; |
char *command; |
int old_fd, pipe_fd[2], null_fd; |
int old_fd, pipe_fd[2], null_fd; |
|
|
if (cmd_find_pane(ctx, args_get(args, 't'), NULL, &wp) == NULL) |
if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL) |
return (CMD_RETURN_ERROR); |
return (CMD_RETURN_ERROR); |
c = cmd_find_client(ctx, NULL, 1); |
c = cmd_find_client(cmdq, NULL, 1); |
|
|
/* Destroy the old pipe. */ |
/* Destroy the old pipe. */ |
old_fd = wp->pipe_fd; |
old_fd = wp->pipe_fd; |
|
|
|
|
/* Open the new pipe. */ |
/* Open the new pipe. */ |
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pipe_fd) != 0) { |
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pipe_fd) != 0) { |
ctx->error(ctx, "socketpair error: %s", strerror(errno)); |
cmdq_error(cmdq, "socketpair error: %s", strerror(errno)); |
return (CMD_RETURN_ERROR); |
return (CMD_RETURN_ERROR); |
} |
} |
|
|
/* Fork the child. */ |
/* Fork the child. */ |
switch (fork()) { |
switch (fork()) { |
case -1: |
case -1: |
ctx->error(ctx, "fork error: %s", strerror(errno)); |
cmdq_error(cmdq, "fork error: %s", strerror(errno)); |
return (CMD_RETURN_ERROR); |
return (CMD_RETURN_ERROR); |
case 0: |
case 0: |
/* Child process. */ |
/* Child process. */ |