version 1.34, 2013/10/10 12:07:36 |
version 1.35, 2013/10/10 12:26:35 |
|
|
|
|
#include <sys/types.h> |
#include <sys/types.h> |
|
|
|
#include <errno.h> |
|
#include <fcntl.h> |
#include <stdlib.h> |
#include <stdlib.h> |
|
#include <string.h> |
|
#include <unistd.h> |
|
|
#include "tmux.h" |
#include "tmux.h" |
|
|
|
|
struct session *s; |
struct session *s; |
struct winlink *wl; |
struct winlink *wl; |
struct client *c; |
struct client *c; |
const char *cmd, *cwd, *template; |
const char *cmd, *template; |
char *cause, *cp; |
char *cause, *cp; |
int idx, last, detached; |
int idx, last, detached, cwd, fd = -1; |
struct format_tree *ft; |
struct format_tree *ft; |
|
|
if (args_has(args, 'a')) { |
if (args_has(args, 'a')) { |
|
|
cmd = options_get_string(&s->options, "default-command"); |
cmd = options_get_string(&s->options, "default-command"); |
else |
else |
cmd = args->argv[0]; |
cmd = args->argv[0]; |
cwd = cmdq_default_path(cmdq, args_get(args, 'c')); |
|
|
|
|
if (args_has(args, 'c')) { |
|
ft = format_create(); |
|
if ((c = cmd_find_client(cmdq, NULL, 1)) != NULL) |
|
format_client(ft, c); |
|
format_session(ft, s); |
|
format_winlink(ft, s, s->curw); |
|
format_window_pane(ft, s->curw->window->active); |
|
cp = format_expand(ft, args_get(args, 'c')); |
|
format_free(ft); |
|
|
|
fd = open(cp, O_RDONLY|O_DIRECTORY); |
|
free(cp); |
|
if (fd == -1) { |
|
cmdq_error(cmdq, "bad working directory: %s", |
|
strerror(errno)); |
|
return (CMD_RETURN_ERROR); |
|
} |
|
cwd = fd; |
|
} else if (cmdq->client->session == NULL) |
|
cwd = cmdq->client->cwd; |
|
else |
|
cwd = s->cwd; |
|
|
if (idx == -1) |
if (idx == -1) |
idx = -1 - options_get_number(&s->options, "base-index"); |
idx = -1 - options_get_number(&s->options, "base-index"); |
wl = session_new(s, args_get(args, 'n'), cmd, cwd, idx, &cause); |
wl = session_new(s, args_get(args, 'n'), cmd, cwd, idx, &cause); |
if (wl == NULL) { |
if (wl == NULL) { |
cmdq_error(cmdq, "create window failed: %s", cause); |
cmdq_error(cmdq, "create window failed: %s", cause); |
free(cause); |
free(cause); |
return (CMD_RETURN_ERROR); |
goto error; |
} |
} |
if (!detached) { |
if (!detached) { |
session_select(s, wl->idx); |
session_select(s, wl->idx); |
|
|
format_free(ft); |
format_free(ft); |
} |
} |
|
|
|
if (fd != -1) |
|
close(fd); |
return (CMD_RETURN_NORMAL); |
return (CMD_RETURN_NORMAL); |
|
|
|
error: |
|
if (fd != -1) |
|
close(fd); |
|
return (CMD_RETURN_ERROR); |
} |
} |