version 1.46, 2010/04/04 18:48:37 |
version 1.47, 2010/04/04 19:02:09 |
|
|
window_pane_spawn(struct window_pane *wp, const char *cmd, const char *shell, |
window_pane_spawn(struct window_pane *wp, const char *cmd, const char *shell, |
const char *cwd, struct environ *env, struct termios *tio, char **cause) |
const char *cwd, struct environ *env, struct termios *tio, char **cause) |
{ |
{ |
struct winsize ws; |
struct winsize ws; |
int mode; |
int mode; |
char *argv0, **varp, *var; |
char *argv0; |
ARRAY_DECL(, char *) varlist; |
const char *ptr; |
struct environ_entry *envent; |
struct termios tio2; |
const char *ptr; |
|
struct termios tio2; |
|
u_int i; |
|
|
|
if (wp->fd != -1) { |
if (wp->fd != -1) { |
close(wp->fd); |
close(wp->fd); |
|
|
if (tcsetattr(STDIN_FILENO, TCSANOW, &tio2) != 0) |
if (tcsetattr(STDIN_FILENO, TCSANOW, &tio2) != 0) |
fatal("tcgetattr failed"); |
fatal("tcgetattr failed"); |
|
|
ARRAY_INIT(&varlist); |
environ_push(env); |
for (varp = environ; *varp != NULL; varp++) { |
|
var = xstrdup(*varp); |
|
var[strcspn(var, "=")] = '\0'; |
|
ARRAY_ADD(&varlist, var); |
|
} |
|
for (i = 0; i < ARRAY_LENGTH(&varlist); i++) { |
|
var = ARRAY_ITEM(&varlist, i); |
|
unsetenv(var); |
|
} |
|
RB_FOREACH(envent, environ, env) { |
|
if (envent->value != NULL) |
|
setenv(envent->name, envent->value, 1); |
|
} |
|
|
|
server_signal_clear(); |
server_signal_clear(); |
log_close(); |
log_close(); |