} else if (ret == 0) {
return plug_closing(s->plug, NULL, 0, 0);
} else {
- return plug_receive(s->plug, 1, buf, ret);
+ return plug_receive(s->plug, 0, buf, ret);
}
} else if (event == 2) {
assert(fd == s->to_cmd);
Socket platform_new_connection(SockAddr addr, char *hostname,
int port, int privport,
int oobinline, int nodelay, int keepalive,
- Plug plug, const Config *cfg)
+ Plug plug, Conf *conf)
{
char *cmd;
Local_Proxy_Socket ret;
int to_cmd_pipe[2], from_cmd_pipe[2], pid;
- if (cfg->proxy_type != PROXY_CMD)
+ if (conf_get_int(conf, CONF_proxy_type) != PROXY_CMD)
return NULL;
- cmd = format_telnet_command(addr, port, cfg);
+ cmd = format_telnet_command(addr, port, conf);
ret = snew(struct Socket_localproxy_tag);
ret->fn = &socket_fn_table;
ret->error = dupprintf("pipe: %s", strerror(errno));
return (Socket)ret;
}
+ cloexec(to_cmd_pipe[1]);
+ cloexec(from_cmd_pipe[0]);
pid = fork();
ret->error = dupprintf("fork: %s", strerror(errno));
return (Socket)ret;
} else if (pid == 0) {
- int i;
close(0);
close(1);
dup2(to_cmd_pipe[0], 0);
dup2(from_cmd_pipe[1], 1);
- for (i = 3; i < 127; i++)
- close(i);
+ close(to_cmd_pipe[0]);
+ close(from_cmd_pipe[1]);
fcntl(0, F_SETFD, 0);
fcntl(1, F_SETFD, 0);
execl("/bin/sh", "sh", "-c", cmd, (void *)NULL);
_exit(255);
}
+ sfree(cmd);
+
close(to_cmd_pipe[0]);
close(from_cmd_pipe[1]);