Annotation of embedaddon/ntp/sntp/libopts/environment.c, revision 1.1

1.1     ! misho       1: 
        !             2: /**
        !             3:  * \file environment.c
        !             4:  *
        !             5:  * Time-stamp:      "2011-04-06 09:35:55 bkorb"
        !             6:  *
        !             7:  *  This file contains all of the routines that must be linked into
        !             8:  *  an executable to use the generated option processing.  The optional
        !             9:  *  routines are in separately compiled modules so that they will not
        !            10:  *  necessarily be linked in.
        !            11:  *
        !            12:  *  This file is part of AutoOpts, a companion to AutoGen.
        !            13:  *  AutoOpts is free software.
        !            14:  *  AutoOpts is Copyright (c) 1992-2011 by Bruce Korb - all rights reserved
        !            15:  *
        !            16:  *  AutoOpts is available under any one of two licenses.  The license
        !            17:  *  in use must be one of these two and the choice is under the control
        !            18:  *  of the user of the license.
        !            19:  *
        !            20:  *   The GNU Lesser General Public License, version 3 or later
        !            21:  *      See the files "COPYING.lgplv3" and "COPYING.gplv3"
        !            22:  *
        !            23:  *   The Modified Berkeley Software Distribution License
        !            24:  *      See the file "COPYING.mbsd"
        !            25:  *
        !            26:  *  These files have the following md5sums:
        !            27:  *
        !            28:  *  43b91e8ca915626ed3818ffb1b71248b pkg/libopts/COPYING.gplv3
        !            29:  *  06a1a2e4760c90ea5e1dad8dfaac4d39 pkg/libopts/COPYING.lgplv3
        !            30:  *  66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
        !            31:  */
        !            32: 
        !            33: /* = = = START-STATIC-FORWARD = = = */
        !            34: static void
        !            35: do_env_opt(tOptState * os, char * env_name,
        !            36:             tOptions* pOpts, teEnvPresetType type);
        !            37: /* = = = END-STATIC-FORWARD = = = */
        !            38: 
        !            39: /*
        !            40:  *  doPrognameEnv - check for preset values from the ${PROGNAME}
        !            41:  *  environment variable.  This is accomplished by parsing the text into
        !            42:  *  tokens, temporarily replacing the arg vector and calling
        !            43:  *  doImmediateOpts and/or doRegularOpts.
        !            44:  */
        !            45: LOCAL void
        !            46: doPrognameEnv(tOptions* pOpts, teEnvPresetType type)
        !            47: {
        !            48:     char const*   pczOptStr = getenv(pOpts->pzPROGNAME);
        !            49:     token_list_t* pTL;
        !            50:     int           sv_argc;
        !            51:     tAoUI         sv_flag;
        !            52:     char**        sv_argv;
        !            53: 
        !            54:     /*
        !            55:      *  No such beast?  Then bail now.
        !            56:      */
        !            57:     if (pczOptStr == NULL)
        !            58:         return;
        !            59: 
        !            60:     /*
        !            61:      *  Tokenize the string.  If there's nothing of interest, we'll bail
        !            62:      *  here immediately.
        !            63:      */
        !            64:     pTL = ao_string_tokenize(pczOptStr);
        !            65:     if (pTL == NULL)
        !            66:         return;
        !            67: 
        !            68:     /*
        !            69:      *  Substitute our $PROGNAME argument list for the real one
        !            70:      */
        !            71:     sv_argc = pOpts->origArgCt;
        !            72:     sv_argv = pOpts->origArgVect;
        !            73:     sv_flag = pOpts->fOptSet;
        !            74: 
        !            75:     /*
        !            76:      *  We add a bogus pointer to the start of the list.  The program name
        !            77:      *  has already been pulled from "argv", so it won't get dereferenced.
        !            78:      *  The option scanning code will skip the "program name" at the start
        !            79:      *  of this list of tokens, so we accommodate this way ....
        !            80:      */
        !            81:     pOpts->origArgVect = (char**)(pTL->tkn_list - 1);
        !            82:     pOpts->origArgCt   = pTL->tkn_ct   + 1;
        !            83:     pOpts->fOptSet    &= ~OPTPROC_ERRSTOP;
        !            84: 
        !            85:     pOpts->curOptIdx   = 1;
        !            86:     pOpts->pzCurOpt    = NULL;
        !            87: 
        !            88:     switch (type) {
        !            89:     case ENV_IMM:
        !            90:         (void)doImmediateOpts(pOpts);
        !            91:         break;
        !            92: 
        !            93:     case ENV_ALL:
        !            94:         (void)doImmediateOpts(pOpts);
        !            95:         pOpts->curOptIdx = 1;
        !            96:         pOpts->pzCurOpt  = NULL;
        !            97:         /* FALLTHROUGH */
        !            98: 
        !            99:     case ENV_NON_IMM:
        !           100:         (void)doRegularOpts(pOpts);
        !           101:     }
        !           102: 
        !           103:     /*
        !           104:      *  Free up the temporary arg vector and restore the original program args.
        !           105:      */
        !           106:     free(pTL);
        !           107:     pOpts->origArgVect = sv_argv;
        !           108:     pOpts->origArgCt   = sv_argc;
        !           109:     pOpts->fOptSet     = sv_flag;
        !           110: }
        !           111: 
        !           112: static void
        !           113: do_env_opt(tOptState * os, char * env_name,
        !           114:             tOptions* pOpts, teEnvPresetType type)
        !           115: {
        !           116:     os->pzOptArg = getenv(env_name);
        !           117:     if (os->pzOptArg == NULL)
        !           118:         return;
        !           119: 
        !           120:     os->flags   = OPTST_PRESET | OPTST_ALLOC_ARG | os->pOD->fOptState;
        !           121:     os->optType = TOPT_UNDEFINED;
        !           122: 
        !           123:     if (  (os->pOD->pz_DisablePfx != NULL)
        !           124:        && (streqvcmp(os->pzOptArg, os->pOD->pz_DisablePfx) == 0)) {
        !           125:         os->flags |= OPTST_DISABLED;
        !           126:         os->pzOptArg = NULL;
        !           127:     }
        !           128: 
        !           129:     switch (type) {
        !           130:     case ENV_IMM:
        !           131:         /*
        !           132:          *  Process only immediate actions
        !           133:          */
        !           134:         if (DO_IMMEDIATELY(os->flags))
        !           135:             break;
        !           136:         return;
        !           137: 
        !           138:     case ENV_NON_IMM:
        !           139:         /*
        !           140:          *  Process only NON immediate actions
        !           141:          */
        !           142:         if (DO_NORMALLY(os->flags) || DO_SECOND_TIME(os->flags))
        !           143:             break;
        !           144:         return;
        !           145: 
        !           146:     default: /* process everything */
        !           147:         break;
        !           148:     }
        !           149: 
        !           150:     /*
        !           151:      *  Make sure the option value string is persistent and consistent.
        !           152:      *
        !           153:      *  The interpretation of the option value depends
        !           154:      *  on the type of value argument the option takes
        !           155:      */
        !           156:     if (OPTST_GET_ARGTYPE(os->pOD->fOptState) == OPARG_TYPE_NONE) {
        !           157:         /*
        !           158:          *  Ignore any value.
        !           159:          */
        !           160:         os->pzOptArg = NULL;
        !           161: 
        !           162:     } else if (os->pzOptArg[0] == NUL) {
        !           163:         /*
        !           164:          * If the argument is the empty string and the argument is
        !           165:          * optional, then treat it as if the option was not specified.
        !           166:          */
        !           167:         if ((os->pOD->fOptState & OPTST_ARG_OPTIONAL) == 0)
        !           168:             return;
        !           169:         os->pzOptArg = NULL;
        !           170: 
        !           171:     } else {
        !           172:         AGDUPSTR(os->pzOptArg, os->pzOptArg, "option argument");
        !           173:         os->flags |= OPTST_ALLOC_ARG;
        !           174:     }
        !           175: 
        !           176:     handle_opt(pOpts, os);
        !           177: }
        !           178: 
        !           179: /*
        !           180:  *  doEnvPresets - check for preset values from the envrionment
        !           181:  *  This routine should process in all, immediate or normal modes....
        !           182:  */
        !           183: LOCAL void
        !           184: doEnvPresets(tOptions* pOpts, teEnvPresetType type)
        !           185: {
        !           186:     int        ct;
        !           187:     tOptState  st;
        !           188:     char*      pzFlagName;
        !           189:     size_t     spaceLeft;
        !           190:     char       zEnvName[ AO_NAME_SIZE ];
        !           191: 
        !           192:     /*
        !           193:      *  Finally, see if we are to look at the environment
        !           194:      *  variables for initial values.
        !           195:      */
        !           196:     if ((pOpts->fOptSet & OPTPROC_ENVIRON) == 0)
        !           197:         return;
        !           198: 
        !           199:     doPrognameEnv(pOpts, type);
        !           200: 
        !           201:     ct  = pOpts->presetOptCt;
        !           202:     st.pOD = pOpts->pOptDesc;
        !           203: 
        !           204:     pzFlagName = zEnvName
        !           205:         + snprintf(zEnvName, sizeof(zEnvName), "%s_", pOpts->pzPROGNAME);
        !           206:     spaceLeft = AO_NAME_SIZE - (pzFlagName - zEnvName) - 1;
        !           207: 
        !           208:     for (;ct-- > 0; st.pOD++) {
        !           209:         size_t nln;
        !           210: 
        !           211:         /*
        !           212:          *  If presetting is disallowed, then skip this entry
        !           213:          */
        !           214:         if (  ((st.pOD->fOptState & OPTST_NO_INIT) != 0)
        !           215:            || (st.pOD->optEquivIndex != NO_EQUIVALENT)  )
        !           216:             continue;
        !           217: 
        !           218:         /*
        !           219:          *  IF there is no such environment variable,
        !           220:          *  THEN skip this entry, too.
        !           221:          */
        !           222:         nln = strlen(st.pOD->pz_NAME) + 1;
        !           223:         if (nln <= spaceLeft) {
        !           224:             /*
        !           225:              *  Set up the option state
        !           226:              */
        !           227:             memcpy(pzFlagName, st.pOD->pz_NAME, nln);
        !           228:             do_env_opt(&st, zEnvName, pOpts, type);
        !           229:         }
        !           230:     }
        !           231: 
        !           232:     /*
        !           233:      *  Special handling for ${PROGNAME_LOAD_OPTS}
        !           234:      */
        !           235:     if (  (pOpts->specOptIdx.save_opts != NO_EQUIVALENT)
        !           236:        && (pOpts->specOptIdx.save_opts != 0)) {
        !           237:         size_t nln;
        !           238:         st.pOD = pOpts->pOptDesc + pOpts->specOptIdx.save_opts + 1;
        !           239: 
        !           240:         if (st.pOD->pz_NAME == NULL)
        !           241:             return;
        !           242: 
        !           243:         nln = strlen(st.pOD->pz_NAME) + 1;
        !           244:             
        !           245:         if (nln > spaceLeft)
        !           246:             return;
        !           247: 
        !           248:         memcpy(pzFlagName, st.pOD->pz_NAME, nln);
        !           249:         do_env_opt(&st, zEnvName, pOpts, type);
        !           250:     }
        !           251: }
        !           252: 
        !           253: /*
        !           254:  * Local Variables:
        !           255:  * mode: C
        !           256:  * c-file-style: "stroustrup"
        !           257:  * indent-tabs-mode: nil
        !           258:  * End:
        !           259:  * end of autoopts/environment.c */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>