From dcddea596f9570603ee5a6cc1914b39bdb2313af Mon Sep 17 00:00:00 2001 From: John Date: Sat, 18 Dec 2021 10:19:17 +0100 Subject: [PATCH] also use env vars for parsing options --- contrib/docker/Dockerfile | 4 ++- contrib/docker/Dockerfile.release | 4 ++- contrib/docker/Dockerfile.template | 4 ++- src/ebusd/main.cpp | 45 +++++++++++++++++++++++++++++- 4 files changed, 53 insertions(+), 4 deletions(-) diff --git a/contrib/docker/Dockerfile b/contrib/docker/Dockerfile index ddd792ee..4a263fca 100755 --- a/contrib/docker/Dockerfile +++ b/contrib/docker/Dockerfile @@ -51,4 +51,6 @@ EXPOSE 8888 COPY --from=build /build/contrib/docker/docker-entrypoint.sh / ENTRYPOINT ["/docker-entrypoint.sh"] -CMD ["-f", "--scanconfig"] + +ENV EBUSD_FOREGROUND "" +CMD ["--scanconfig"] diff --git a/contrib/docker/Dockerfile.release b/contrib/docker/Dockerfile.release index b76deba5..755100e6 100644 --- a/contrib/docker/Dockerfile.release +++ b/contrib/docker/Dockerfile.release @@ -51,4 +51,6 @@ EXPOSE 8888 COPY contrib/docker/docker-entrypoint.sh / ENTRYPOINT ["/docker-entrypoint.sh"] -CMD ["-f", "--scanconfig"] + +ENV EBUSD_FOREGROUND "" +CMD ["--scanconfig"] diff --git a/contrib/docker/Dockerfile.template b/contrib/docker/Dockerfile.template index 2d5f1aee..e2423366 100644 --- a/contrib/docker/Dockerfile.template +++ b/contrib/docker/Dockerfile.template @@ -51,4 +51,6 @@ EXPOSE 8888 %EBUSD_COPYENTRY% ENTRYPOINT ["/docker-entrypoint.sh"] -CMD ["-f", "--scanconfig"] + +ENV EBUSD_FOREGROUND "" +CMD ["--scanconfig"] diff --git a/src/ebusd/main.cpp b/src/ebusd/main.cpp index 8ed83c7c..80d892a1 100644 --- a/src/ebusd/main.cpp +++ b/src/ebusd/main.cpp @@ -382,6 +382,10 @@ error_t parse_opt(int key, char *arg, struct argp_state *state) { } break; case 'i': // --inject + if (opt->injectMessages) { + argp_error(state, "invalid inject"); + return EINVAL; + } opt->injectMessages = true; break; @@ -1264,9 +1268,48 @@ bool parseMessage(const string& arg, bool onlyMasterSlave, MasterSymbolString* m */ int main(int argc, char* argv[]) { struct argp aargp = { argpoptions, parse_opt, nullptr, argpdoc, datahandler_getargs(), nullptr, nullptr }; - int arg_index = -1; setenv("ARGP_HELP_FMT", "no-dup-args-note", 0); + char envname[32] = "--"; // needs to cover at least max length of any option name plus "--" + char* envopt = envname+2; + for (char ** env = environ; *env; env++) { + char* pos = strchr(*env, '='); + if (!pos || strncmp(*env, "EBUSD_", sizeof("EBUSD_")-1)!=0) { + continue; + } + char* start = *env+sizeof("EBUSD_")-1; + size_t len = pos-start; + if (len<=1 || len>sizeof(envname)-3) { // no single char long args + continue; + } + strncpy(envopt, start, len); + envopt[len] = 0; + strlwr(envopt); + if (strcmp(envopt, "version")==0 || strcmp(envopt, "image")==0 || strcmp(envopt, "arch")==0 + || strcmp(envopt, "opts")==0 || strcmp(envopt, "inject")==0 + || strcmp(envopt, "checkconfig")==0 || strcmp(envopt, "dumpconfig")==0 + ) { + // ignore those defined in Dockerfile, EBUSD_OPTS, those with final args, and interactive ones + continue; + } + char* envargv[] = {envname, pos+1}; + int cnt = pos[1] ? 2 : 1; + if (strcmp(envopt, "scanconfig")==0 && pos[1] && strlen(*env)