Factor out the reset / closing of a relay connection. Currently only
relay_close is using this but I want to use this in relay_http.c to close
the backend connection after a request is done.
OK?
--
:wq Claudio
Index: relay.c
===================================================================
RCS file: /cvs/src/usr.sbin/relayd/relay.c,v
retrieving revision 1.234
diff -u -p -r1.234 relay.c
--- relay.c 28 Nov 2017 00:17:56 -0000 1.234
+++ relay.c 28 Nov 2017 00:47:41 -0000
@@ -1698,17 +1698,8 @@ relay_close(struct rsession *con, const
(*proto->close)(con);
free(con->se_priv);
- if (con->se_in.bev != NULL)
- bufferevent_free(con->se_in.bev);
- if (con->se_in.output != NULL)
- evbuffer_free(con->se_in.output);
- if (con->se_in.tls != NULL)
- tls_close(con->se_in.tls);
- tls_free(con->se_in.tls);
- tls_config_free(con->se_in.tls_cfg);
- free(con->se_in.tlscert);
- if (con->se_in.s != -1) {
- close(con->se_in.s);
+
+ if (relay_reset_event(&con->se_in)) {
if (con->se_out.s == -1) {
/*
* the output was never connected,
@@ -1719,26 +1710,18 @@ relay_close(struct rsession *con, const
__func__, relay_inflight);
}
}
+ if (con->se_in.output != NULL)
+ evbuffer_free(con->se_in.output);
- if (con->se_out.bev != NULL)
- bufferevent_free(con->se_out.bev);
- if (con->se_out.output != NULL)
- evbuffer_free(con->se_out.output);
- if (con->se_out.tls != NULL)
- tls_close(con->se_out.tls);
- tls_free(con->se_out.tls);
- tls_config_free(con->se_out.tls_cfg);
- free(con->se_out.tlscert);
- if (con->se_out.s != -1) {
- close(con->se_out.s);
-
+ if (relay_reset_event(&con->se_out)) {
/* Some file descriptors are available again. */
if (evtimer_pending(&rlay->rl_evt, NULL)) {
evtimer_del(&rlay->rl_evt);
event_add(&rlay->rl_ev, NULL);
}
}
- con->se_out.state = STATE_INIT;
+ if (con->se_out.output != NULL)
+ evbuffer_free(con->se_out.output);
if (con->se_log != NULL)
evbuffer_free(con->se_log);
@@ -1753,6 +1736,34 @@ relay_close(struct rsession *con, const
free(con);
relay_sessions--;
+}
+
+int
+relay_reset_event(struct ctl_relay_event *cre)
+{
+ int rv = 0;
+
+ DPRINTF("%s: state %d dir %d", __func__, cre->state, cre->dir);
+
+ if (cre->bev != NULL)
+ bufferevent_free(cre->bev);
+ if (cre->tls != NULL)
+ tls_close(cre->tls);
+ tls_free(cre->tls);
+ tls_config_free(cre->tls_cfg);
+ free(cre->tlscert);
+ if (cre->s != -1) {
+ close(cre->s);
+ rv = 1;
+ }
+ cre->state = STATE_DONE;
+ cre->bev = NULL;
+ cre->tls = NULL;
+ cre->tls_cfg = NULL;
+ cre->tlscert = NULL;
+ cre->s = -1;
+
+ return (rv);
}
int
Index: relayd.h
===================================================================
RCS file: /cvs/src/usr.sbin/relayd/relayd.h,v
retrieving revision 1.245
diff -u -p -r1.245 relayd.h
--- relayd.h 27 Nov 2017 23:21:16 -0000 1.245
+++ relayd.h 28 Nov 2017 00:47:41 -0000
@@ -192,7 +192,8 @@ enum relay_state {
STATE_INIT,
STATE_PENDING,
STATE_PRECONNECT,
- STATE_CONNECTED
+ STATE_CONNECTED,
+ STATE_DONE
};
struct ctl_relay_event {
@@ -1172,6 +1173,7 @@ int relay_session_cmp(struct rsession *
char *relay_load_fd(int, off_t *);
int relay_load_certfiles(struct relay *);
void relay_close(struct rsession *, const char *);
+int relay_reset_event(struct ctl_relay_event *);
void relay_natlook(int, short, void *);
void relay_session(struct rsession *);
int relay_from_table(struct rsession *);