commit - 82c452fabb98831c03c09da5d642ea6b77a3ad3d
commit + c56ccc84283eb9c7c5b4acd3ecdf245669145031
blob - 80507c7c4b075bc8ecfd33e4ddd560f7c0373fec
blob + 81359413f8f1662fb683a115f0f596b0b9c9adfe
--- lstun.c
+++ lstun.c
}
static void
+conn_free(struct conn *c)
+{
+ if (c->sourcebev != NULL)
+ bufferevent_free(c->sourcebev);
+ if (c->tobev != NULL)
+ bufferevent_free(c->tobev);
+
+ if (evtimer_pending(&c->waitev, NULL))
+ evtimer_del(&c->waitev);
+
+ close(c->source);
+ close(c->to);
+
+ free(c);
+}
+
+static void
killing_time(int fd, short event, void *data)
{
if (ssh_pid == -1)
log_info("closing connection (event=%x)", event);
- bufferevent_free(c->sourcebev);
- bufferevent_free(c->tobev);
-
- close(c->source);
- close(c->to);
+ conn_free(c);
- free(c);
-
if (--conn == 0) {
log_debug("scheduling ssh termination (%llds)",
(long long)timeout.tv_sec);
hints.ai_socktype = SOCK_STREAM;
r = getaddrinfo(ssh_host, ssh_port, &hints, &res0);
- if (r != 0)
- fatal("getaddrinfo(\"%s\", \"%s\"): %s",
+ if (r != 0) {
+ log_warnx("getaddrinfo(\"%s\", \"%s\"): %s",
ssh_host, ssh_port, gai_strerror(r));
+ return -1;
+ }
for (res = res0; res; res = res->ai_next) {
sock = socket(res->ai_family, res->ai_socktype,
c->sourcebev = bufferevent_new(c->source, sreadcb, nopcb, errcb, c);
c->tobev = bufferevent_new(c->to, treadcb, nopcb, errcb, c);
- if (c->sourcebev == NULL || c->tobev == NULL)
- fatal("bufferevent_new");
+ if (c->sourcebev == NULL || c->tobev == NULL) {
+ log_warn("bufferevent_new");
+ conn_free(c);
+ return;
+ }
+
bufferevent_enable(c->sourcebev, EV_READ|EV_WRITE);
bufferevent_enable(c->tobev, EV_READ|EV_WRITE);
}