/** * check for preset values from a config files or envrionment variables * * @param[in,out] opts the structure with the option names to check */ static tSuccess do_presets(tOptions * opts) { tOptDesc * od = NULL; if (! SUCCESSFUL(immediate_opts(opts))) return FAILURE; /* * IF this option set has a --save-opts option, then it also * has a --load-opts option. See if a command line option has disabled * option presetting. */ if ( (opts->specOptIdx.save_opts != NO_EQUIVALENT) && (opts->specOptIdx.save_opts != 0)) { od = opts->pOptDesc + opts->specOptIdx.save_opts + 1; if (DISABLED_OPT(od)) return SUCCESS; } /* * Until we return from this procedure, disable non-presettable opts */ opts->fOptSet |= OPTPROC_PRESETTING; /* * IF there are no config files, * THEN do any environment presets and leave. */ if (opts->papzHomeList == NULL) { env_presets(opts, ENV_ALL); } else { env_presets(opts, ENV_IMM); /* * Check to see if environment variables have disabled presetting. */ if ((od != NULL) && ! DISABLED_OPT(od)) intern_file_load(opts); /* * ${PROGRAM_LOAD_OPTS} value of "no" cannot disable other environment * variable options. Only the loading of .rc files. */ env_presets(opts, ENV_NON_IMM); } opts->fOptSet &= ~OPTPROC_PRESETTING; return SUCCESS; }
/* * doPrognameEnv - check for preset values from the ${PROGNAME} * environment variable. This is accomplished by parsing the text into * tokens, temporarily replacing the arg vector and calling * immediate_opts and/or regular_opts. */ LOCAL void doPrognameEnv(tOptions * pOpts, teEnvPresetType type) { char const* pczOptStr = getenv(pOpts->pzPROGNAME); token_list_t* pTL; int sv_argc; tAoUI sv_flag; char** sv_argv; /* * No such beast? Then bail now. */ if (pczOptStr == NULL) return; /* * Tokenize the string. If there's nothing of interest, we'll bail * here immediately. */ pTL = ao_string_tokenize(pczOptStr); if (pTL == NULL) return; /* * Substitute our $PROGNAME argument list for the real one */ sv_argc = pOpts->origArgCt; sv_argv = pOpts->origArgVect; sv_flag = pOpts->fOptSet; /* * We add a bogus pointer to the start of the list. The program name * has already been pulled from "argv", so it won't get dereferenced. * The option scanning code will skip the "program name" at the start * of this list of tokens, so we accommodate this way .... */ pOpts->origArgVect = (char**)(pTL->tkn_list - 1); pOpts->origArgCt = pTL->tkn_ct + 1; pOpts->fOptSet &= ~OPTPROC_ERRSTOP; pOpts->curOptIdx = 1; pOpts->pzCurOpt = NULL; switch (type) { case ENV_IMM: (void)immediate_opts(pOpts); break; case ENV_ALL: (void)immediate_opts(pOpts); pOpts->curOptIdx = 1; pOpts->pzCurOpt = NULL; /* FALLTHROUGH */ case ENV_NON_IMM: (void)regular_opts(pOpts); } /* * Free up the temporary arg vector and restore the original program args. */ free(pTL); pOpts->origArgVect = sv_argv; pOpts->origArgCt = sv_argc; pOpts->fOptSet = sv_flag; }