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 *);

Reply via email to