]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: httpterm: add support httpterm run mode 20260108-httpterm flx04/20260108-httpterm
authorFrederic Lecaille <flecaille@haproxy.com>
Mon, 26 Jan 2026 15:37:39 +0000 (16:37 +0100)
committerFrederic Lecaille <flecaille@haproxy.com>
Wed, 28 Jan 2026 15:09:40 +0000 (16:09 +0100)
Rely on the binary name to decide the mode which will be used by
the built process. If its name begin with "httpterm" substring,
the httpterm mode will be run. This is done by init_early() function
which set httpterm_mode to 1 if this is the case.

When in httpterm mode, the process call init_args() as for haproxy
but skip the haproxy command line arguments parsing. This is done
by init_httpterm_cfg() which parse the httpterm command line arguments.
This function also initalize the struct cfgfile httpterm_cfg variable.
Then parse_cfg() is called to by main() to configure the frontend
used by httpterm, depending on the arguments of its command line.

backup_env() is skipped in this httpterm mode. This is also the case
for the master worker which is not initialized.

include/haproxy/global.h
src/haproxy.c

index b4a7a406bc29c41c8c2f1d1ebd87ef220f6cc670..ef6edc7f3781ab0ec10589f6f62859c3dd88cf76 100644 (file)
@@ -54,6 +54,8 @@ extern char **old_argv;
 extern const char *old_unixsocket;
 extern int daemon_fd[2];
 extern int devnullfd;
+extern int httpterm_mode;
+extern struct cfgfile httpterm_cfg;
 
 struct proxy;
 struct server;
index 4498367b334bae63b4db13fd42ad377566d3c2c4..b0443b8e642d93e0bea82a32aa9c724f9d974a18 100644 (file)
@@ -88,6 +88,7 @@
 #include <haproxy/filters.h>
 #include <haproxy/global.h>
 #include <haproxy/hlua.h>
+#include <haproxy/hstream.h>
 #include <haproxy/http_rules.h>
 #include <haproxy/limits.h>
 #if defined(USE_LINUX_CAP)
@@ -150,6 +151,8 @@ char **init_env;            /* to keep current process env variables backup */
 int  pidfd = -1;               /* FD to keep PID */
 int daemon_fd[2] = {-1, -1};   /* pipe to communicate with parent process */
 int devnullfd = -1;
+int httpterm_mode;
+struct cfgfile httpterm_cfg;
 
 static int stopped_tgroups;
 static int stop_detected;
@@ -1439,6 +1442,7 @@ static void init_early(int argc, char **argv)
                exit(EXIT_FAILURE);
        }
 
+       httpterm_mode = !strncmp(progname, "httpterm", strlen("httpterm"));
        chunk_initlen(&global.log_tag, strdup(progname), len, len);
 }
 
@@ -1489,6 +1493,9 @@ static void init_args(int argc, char **argv)
                exit(EXIT_FAILURE);
        }
 
+       if (httpterm_mode)
+               return;
+
        /* skip program name and start */
        argc--; argv++;
        while (argc > 0) {
@@ -3256,6 +3263,9 @@ int main(int argc, char **argv)
 
        RUN_INITCALLS(STG_INIT);
 
+       if (httpterm_mode)
+               init_httpterm_cfg(argc, argv, &httpterm_cfg);
+
        /* Late init step: SSL crypto libs init and check, Lua lib init, ACL init,
         * set modes from cmdline and change dir, if this option is provided via
         * cmdline.
@@ -3294,11 +3304,14 @@ int main(int argc, char **argv)
        /* backup initial process env, because parse_cfg() could modify it with
         * setenv/unsetenv/presetenv/resetenv keywords.
         */
-       if (backup_env() != 0)
+       if (!httpterm_mode && backup_env() != 0)
                exit(EXIT_FAILURE);
 
-       /* parse conf in discovery mode and set modes from config */
-       read_cfg_in_discovery_mode(argc, argv);
+       if (!httpterm_mode)
+               /* parse conf in discovery mode and set modes from config */
+               read_cfg_in_discovery_mode(argc, argv);
+       else
+               parse_cfg(&httpterm_cfg);
 
        /* From this stage all runtime modes are known. So let's do below some
         * preparation steps and then let's apply all discovered modes.
@@ -3341,7 +3354,7 @@ int main(int argc, char **argv)
        }
 
        /* Worker, daemon, foreground modes read the rest of the config */
-       if (!master) {
+       if (!master && !httpterm_mode) {
                usermsgs_clr("config");
                if (global.mode & MODE_MWORKER) {
                        if (clean_env() != 0) {