=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cmd-new-window.c,v retrieving revision 1.34 retrieving revision 1.35 diff -c -r1.34 -r1.35 *** src/usr.bin/tmux/cmd-new-window.c 2013/10/10 12:07:36 1.34 --- src/usr.bin/tmux/cmd-new-window.c 2013/10/10 12:26:35 1.35 *************** *** 1,4 **** ! /* $OpenBSD: cmd-new-window.c,v 1.34 2013/10/10 12:07:36 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cmd-new-window.c,v 1.35 2013/10/10 12:26:35 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 18,24 **** --- 18,28 ---- #include + #include + #include #include + #include + #include #include "tmux.h" *************** *** 45,53 **** struct session *s; struct winlink *wl; struct client *c; ! const char *cmd, *cwd, *template; char *cause, *cp; ! int idx, last, detached; struct format_tree *ft; if (args_has(args, 'a')) { --- 49,57 ---- struct session *s; struct winlink *wl; struct client *c; ! const char *cmd, *template; char *cause, *cp; ! int idx, last, detached, cwd, fd = -1; struct format_tree *ft; if (args_has(args, 'a')) { *************** *** 102,116 **** cmd = options_get_string(&s->options, "default-command"); else cmd = args->argv[0]; - cwd = cmdq_default_path(cmdq, args_get(args, 'c')); if (idx == -1) idx = -1 - options_get_number(&s->options, "base-index"); wl = session_new(s, args_get(args, 'n'), cmd, cwd, idx, &cause); if (wl == NULL) { cmdq_error(cmdq, "create window failed: %s", cause); free(cause); ! return (CMD_RETURN_ERROR); } if (!detached) { session_select(s, wl->idx); --- 106,142 ---- cmd = options_get_string(&s->options, "default-command"); else cmd = args->argv[0]; + 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) idx = -1 - options_get_number(&s->options, "base-index"); wl = session_new(s, args_get(args, 'n'), cmd, cwd, idx, &cause); if (wl == NULL) { cmdq_error(cmdq, "create window failed: %s", cause); free(cause); ! goto error; } if (!detached) { session_select(s, wl->idx); *************** *** 136,140 **** --- 162,173 ---- format_free(ft); } + if (fd != -1) + close(fd); return (CMD_RETURN_NORMAL); + + error: + if (fd != -1) + close(fd); + return (CMD_RETURN_ERROR); }