also use env vars for parsing options

This commit is contained in:
John
2021-12-18 10:51:46 +01:00
parent 8af96e41d0
commit dcddea596f
4 changed files with 53 additions and 4 deletions
+3 -1
View File
@@ -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"]
+3 -1
View File
@@ -51,4 +51,6 @@ EXPOSE 8888
COPY contrib/docker/docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["-f", "--scanconfig"]
ENV EBUSD_FOREGROUND ""
CMD ["--scanconfig"]
+3 -1
View File
@@ -51,4 +51,6 @@ EXPOSE 8888
%EBUSD_COPYENTRY%
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["-f", "--scanconfig"]
ENV EBUSD_FOREGROUND ""
CMD ["--scanconfig"]
+44 -1
View File
@@ -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)<sizeof(envname)-3) {
// only really special case: OPTION_ARG_OPTIONAL with non-empty arg needs to use "=" syntax
cnt = 1;
strcat(envopt, pos);
}
int idx = -1;
opt.injectMessages = true; // for skipping unknown values
error_t err = argp_parse(&aargp, cnt, envargv, ARGP_PARSE_ARGV0|ARGP_SILENT|ARGP_IN_ORDER,
&idx, &opt);
if (err!=0 && idx==-1) { // ignore args for non-arg boolean options
logError(lf_main, "invalid/unknown argument in env: %s", envopt);
}
opt.injectMessages = false; // restore
}
int arg_index = -1;
if (argp_parse(&aargp, argc, argv, ARGP_IN_ORDER, &arg_index, &opt) != 0) {
logError(lf_main, "invalid arguments");
return EINVAL;