/*=export_func optionLoadOpt * private: * * what: Load an option rc/ini file * arg: + tOptions* + opts + program options descriptor + * arg: + tOptDesc* + odesc + the descriptor for this arg + * * doc: * Processes the options found in the file named with * odesc->optArg.argString. =*/ void optionLoadOpt(tOptions * opts, tOptDesc * odesc) { struct stat sb; if (opts <= OPTPROC_EMIT_LIMIT) return; /* * IF the option is not being disabled, THEN load the file. There must * be a file. (If it is being disabled, then the disablement processing * already took place. It must be done to suppress preloading of ini/rc * files.) */ if ( DISABLED_OPT(odesc) || ((odesc->fOptState & OPTST_RESET) != 0)) return; if (stat(odesc->optArg.argString, &sb) != 0) { if ((opts->fOptSet & OPTPROC_ERRSTOP) == 0) return; fserr_exit(opts->pzProgName, "stat", odesc->optArg.argString); /* NOT REACHED */ } if (! S_ISREG(sb.st_mode)) { if ((opts->fOptSet & OPTPROC_ERRSTOP) == 0) return; errno = EINVAL; fserr_exit(opts->pzProgName, "stat", odesc->optArg.argString); /* NOT REACHED */ } file_preset(opts, odesc->optArg.argString, DIRECTION_CALLED); }
/*=export_func optionLoadOpt * private: * * what: Load an option rc/ini file * arg: + tOptions* + pOpts + program options descriptor + * arg: + tOptDesc* + pOptDesc + the descriptor for this arg + * * doc: * Processes the options found in the file named with * pOptDesc->optArg.argString. =*/ void optionLoadOpt(tOptions* pOpts, tOptDesc* pOptDesc) { struct stat sb; /* * IF the option is not being disabled, THEN load the file. There must * be a file. (If it is being disabled, then the disablement processing * already took place. It must be done to suppress preloading of ini/rc * files.) */ if ( DISABLED_OPT(pOptDesc) || ((pOptDesc->fOptState & OPTST_RESET) != 0)) return; if (stat(pOptDesc->optArg.argString, &sb) != 0) { if ((pOpts->fOptSet & OPTPROC_ERRSTOP) == 0) return; fprintf(stderr, zFSErrOptLoad, errno, strerror(errno), pOptDesc->optArg.argString); exit(EX_NOINPUT); /* NOT REACHED */ } if (! S_ISREG(sb.st_mode)) { if ((pOpts->fOptSet & OPTPROC_ERRSTOP) == 0) return; fprintf(stderr, zNotFile, pOptDesc->optArg.argString); exit(EX_NOINPUT); /* NOT REACHED */ } file_preset(pOpts, pOptDesc->optArg.argString, DIRECTION_CALLED); }
/** * Load a configuration file. This may be invoked either from * scanning the "homerc" list, or from a specific file request. * (see "optionFileLoad()", the implementation for --load-opts) */ LOCAL void intern_file_load(tOptions * opts) { uint32_t svfl; int idx; int inc; char f_name[ AG_PATH_MAX+1 ]; if (opts->papzHomeList == NULL) return; svfl = opts->fOptSet; inc = DIRECTION_PRESET; /* * Never stop on errors in config files. */ opts->fOptSet &= ~OPTPROC_ERRSTOP; /* * Find the last RC entry (highest priority entry) */ for (idx = 0; opts->papzHomeList[ idx+1 ] != NULL; ++idx) ; /* * For every path in the home list, ... *TWICE* We start at the last * (highest priority) entry, work our way down to the lowest priority, * handling the immediate options. * Then we go back up, doing the normal options. */ for (;;) { struct stat sb; cch_t * path; /* * IF we've reached the bottom end, change direction */ if (idx < 0) { inc = DIRECTION_PROCESS; idx = 0; } path = opts->papzHomeList[ idx ]; /* * IF we've reached the top end, bail out */ if (path == NULL) break; idx += inc; if (! optionMakePath(f_name, (int)sizeof(f_name), path, opts->pzProgPath)) continue; /* * IF the file name we constructed is a directory, * THEN append the Resource Configuration file name * ELSE we must have the complete file name */ if (stat(f_name, &sb) != 0) continue; /* bogus name - skip the home list entry */ if (S_ISDIR(sb.st_mode)) { size_t len = strlen(f_name); size_t nln = strlen(opts->pzRcName) + 1; char * pz = f_name + len; if (len + 1 + nln >= sizeof(f_name)) continue; if (pz[-1] != DIRCH) *(pz++) = DIRCH; memcpy(pz, opts->pzRcName, nln); } file_preset(opts, f_name, inc); /* * IF we are now to skip config files AND we are presetting, * THEN change direction. We must go the other way. */ { tOptDesc * od = opts->pOptDesc + opts->specOptIdx.save_opts + 1; if (DISABLED_OPT(od) && PRESETTING(inc)) { idx -= inc; /* go back and reprocess current file */ inc = DIRECTION_PROCESS; } } } /* twice for every path in the home list, ... */ opts->fOptSet = svfl; }