commit - 1d9a178e6081328b51cc98a09db94b310f12b811
commit + 82c452fabb98831c03c09da5d642ea6b77a3ad3d
blob - 776309b48bd61a27a68a2d8d90e7c45a0da6c5ac
blob + 80507c7c4b075bc8ecfd33e4ddd560f7c0373fec
--- lstun.c
+++ lstun.c
#endif
#define MAXSOCK 32
-#define MAXCONN 64
#define BACKOFF 1
#define RETRIES 16
struct bufferevent *sourcebev;
int to;
struct bufferevent *tobev;
-} conns[MAXCONN];
+};
static void
sig_handler(int sig, short event, void *data)
close(c->source);
close(c->to);
- c->source = -1;
- c->to = -1;
+ free(c);
if (--conn == 0) {
log_debug("scheduling ssh termination (%llds)",
static void
do_accept(int fd, short event, void *data)
{
- int s, i;
+ struct conn *c;
+ int s;
log_debug("incoming connection");
if ((s = accept(fd, NULL, 0)) == -1)
fatal("accept");
-
- if (conn == MAXCONN) {
- log_warnx("dropping the connection, too many already");
- close(s);
- return;
- }
conn++;
if (ssh_pid == -1)
spawn_ssh();
- for (i = 0; i < MAXCONN; ++i) {
- if (conns[i].source != -1)
- continue;
-
- conns[i].source = s;
- conns[i].ntentative = 0;
- conns[i].retry.tv_sec = BACKOFF;
- conns[i].retry.tv_usec = 0;
- evtimer_set(&conns[i].waitev, try_to_connect, &conns[i]);
- evtimer_add(&conns[i].waitev, &conns[i].retry);
- break;
+ if ((c = calloc(1, sizeof(*c))) == NULL) {
+ log_warn("calloc");
+ close(s);
+ return;
}
+
+ c->source = s;
+ c->retry.tv_sec = BACKOFF;
+ evtimer_set(&c->waitev, try_to_connect, c);
+ evtimer_add(&c->waitev, &c->retry);
}
static const char *
ssh_dest = argv[0];
- for (i = 0; i < MAXCONN; ++i) {
- conns[i].source = -1;
- conns[i].to = -1;
- }
-
log_init(debug, LOG_DAEMON);
log_setverbose(verbose);