]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: dns: Refactor dns appctx creation
authorChristopher Faulet <cfaulet@haproxy.com>
Thu, 12 May 2022 13:24:46 +0000 (15:24 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Tue, 17 May 2022 14:13:21 +0000 (16:13 +0200)
A .init callback function is defined for the dns_session_applet applet. This
function finishes the appctx startup by calling appctx_finalize_startup()
and its handles the stream customization.

src/dns.c

index 716514b04805bfb41266e180e503fa5a087c7f23..839d613ee269f86ada8c86ef6378e32d7612e181 100644 (file)
--- a/src/dns.c
+++ b/src/dns.c
@@ -815,6 +815,41 @@ void dns_session_free(struct dns_session *ds)
 
 static struct appctx *dns_session_create(struct dns_session *ds);
 
+static int dns_session_init(struct appctx *appctx)
+{
+       struct dns_session *ds = appctx->svcctx;
+       struct stream *s;
+       struct sockaddr_storage *addr = NULL;
+
+       if (!sockaddr_alloc(&addr, &ds->dss->srv->addr, sizeof(ds->dss->srv->addr)))
+               goto error;
+
+       if (appctx_finalize_startup(appctx, ds->dss->srv->proxy, &BUF_NULL) == -1)
+               goto error;
+
+       s = appctx_strm(appctx);
+       s->csb->dst = addr;
+       s->csb->flags |= CS_FL_NOLINGER;
+       s->target = &ds->dss->srv->obj_type;
+       s->flags = SF_ASSIGNED;
+
+       s->do_log = NULL;
+       s->uniq_id = 0;
+
+       s->res.flags |= CF_READ_DONTWAIT;
+       /* for rto and rex to eternity to not expire on idle recv:
+        * We are using a syslog server.
+        */
+       s->res.rto = TICK_ETERNITY;
+       s->res.rex = TICK_ETERNITY;
+
+       ds->appctx = appctx;
+       return 0;
+
+  error:
+       return -1;
+}
+
 /*
  * Function to release a DNS tcp session
  */
@@ -908,6 +943,7 @@ static struct applet dns_session_applet = {
        .obj_type = OBJ_TYPE_APPLET,
        .name = "<STRMDNS>", /* used for logging */
        .fct = dns_session_io_handler,
+       .init = dns_session_init,
        .release = dns_session_release,
 };
 
@@ -918,56 +954,22 @@ static struct applet dns_session_applet = {
 static struct appctx *dns_session_create(struct dns_session *ds)
 {
        struct appctx *appctx;
-       struct session *sess;
-       struct conn_stream *cs;
-       struct stream *s;
-       struct applet *applet = &dns_session_applet;
-       struct sockaddr_storage *addr = NULL;
 
-       appctx = appctx_new(applet, NULL);
+       appctx = appctx_new(&dns_session_applet, NULL);
        if (!appctx)
                goto out_close;
        appctx->svcctx = (void *)ds;
 
-       sess = session_new(ds->dss->srv->proxy, NULL, &appctx->obj_type);
-       if (!sess) {
+       if (appctx_init(appctx) == -1) {
                ha_alert("out of memory in dns_session_create().\n");
                goto out_free_appctx;
        }
-       appctx->sess = sess;
-
-       if (!sockaddr_alloc(&addr, &ds->dss->srv->addr, sizeof(ds->dss->srv->addr)))
-               goto out_free_appctx;
-
-       cs = cs_new_from_endp(appctx->endp, sess, &BUF_NULL);
-       if (!cs) {
-               ha_alert("Failed to initialize stream in dns_session_create().\n");
-               goto out_free_addr;
-       }
-
-       s = DISGUISE(cs_strm(cs));
-       s->csb->dst = addr;
-       s->csb->flags |= CS_FL_NOLINGER;
-       s->target = &ds->dss->srv->obj_type;
-       s->flags = SF_ASSIGNED;
 
-       s->do_log = NULL;
-       s->uniq_id = 0;
-
-       s->res.flags |= CF_READ_DONTWAIT;
-       /* for rto and rex to eternity to not expire on idle recv:
-        * We are using a syslog server.
-        */
-       s->res.rto = TICK_ETERNITY;
-       s->res.rex = TICK_ETERNITY;
-       ds->appctx = appctx;
        return appctx;
 
        /* Error unrolling */
- out_free_addr:
-       sockaddr_free(&addr);
  out_free_appctx:
-       appctx_free(appctx);
+       appctx_free_on_early_error(appctx);
  out_close:
        return NULL;
 }