*** /dev/null Tue Mar 11 06:03:49 2025
--- - Tue Mar 11 06:03:56 2025
***************
*** 0 ****
--- 1,167 ----
+ /* rc - OSSP Run-command processor
+ ** Copyright (c) 2002 Cable & Wireless Deutschland GmbH
+ ** Copyright (c) 2002 The OSSP Project <http://www.ossp.org/>
+ ** Copyright (c) 2002 Ralf S. Engelschall
+ **
+ ** This file is part of OSSP rc, a portable Run-command processor
+ ** which can be found at http://www.ossp.org/pkg/rc/
+ **
+ ** Permission to use, copy, modify, and distribute this software for
+ ** any purpose with or without fee is hereby granted, provided that
+ ** the above copyright notice and this permission notice appear in all
+ ** copies.
+ **
+ ** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ ** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ ** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ ** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+ ** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ ** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ ** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ ** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ ** SUCH DAMAGE.
+ **
+ ** rc_option.c: Run-command processor ISO C source file
+ */
+
+ #include <stdio.h>
+
+ #include "rc.h"
+ #include "rc_option.h" /* Values and other for popt */
+ #include "rc_const.h" /* Strings and other constants */
+
+ #ifdef HAVE_CONFIG_H
+ #include "rc_config.h"
+ #endif
+
+ /* Third party headers for libraries linked in */
+ #include "ex.h" /* OSSP ex exception library */
+ #include "popt.h" /* OSSP popt options library */
+
+ /* Define the ability to throw OSSP ex exceptions */
+ #define RC_THROW(rv) \
+ ( (rv) != RC_OK && (ex_catching && !ex_shielding) \
+ ? (ex_throw(ossprc_id, NULL, (rv)), (rv)) : (rv))
+
+ /* Unique identifier to use with OSSP ex library */
+ const char ossprc_id[] = "OSSP rc";
+
+
+ rc_return_t parseopts(int argc, char *argv[])
+ {
+ char cOpt = 0; /* For argument parsing */
+ int iBufpos = 0; /* For tracking options */
+ char *szCLIBuf = NULL;
+ char *szFuncfile = NULL; /* Rc.func file name and location */
+ int nIter = 0;
+ char pcBuf[BUFSIZ+1];
+ popt_context optCon; /* Context for parsing options */
+
+ struct popt_option optionsTable[] = {
+ /* Long options with short keys but no arguments */
+ { "usage", '?', POPT_ARG_NONE, 0, RC_USE_VAL, RC_USE_DESC, NULL },
+ { "debug", 'd', POPT_ARG_NONE, 0, RC_DBG_VAL, RC_DBG_DESC, NULL },
+ { "version", 'V', POPT_ARG_NONE, 0, RC_VER_VAL, RC_VER_DESC, NULL },
+ { "eval", 'e', POPT_ARG_NONE, 0, RC_EVL_VAL, RC_EVL_DESC, NULL },
+ { "help", 'h', POPT_ARG_NONE, 0, RC_HLP_VAL, RC_HLP_DESC, NULL },
+ { "info", 'i', POPT_ARG_NONE, 0, RC_INF_VAL, RC_INF_DESC, NULL },
+ { "labels", 'l', POPT_ARG_NONE, 0, RC_LBL_VAL, RC_LBL_DESC, NULL },
+ { "print", 'p', POPT_ARG_NONE, 0, RC_PRN_VAL, RC_PRN_DESC, NULL },
+ { "silent", 's', POPT_ARG_NONE, 0, RC_SIL_VAL, RC_SIL_DESC, NULL },
+ { "raw", 'r', POPT_ARG_NONE, 0, RC_RAW_VAL, RC_RAW_DESC, NULL },
+ { "verbose", 'v', POPT_ARG_NONE, 0, RC_VRB_VAL, RC_VRB_DESC, NULL },
+ { "exec", 'x', POPT_ARG_NONE, 0, RC_EXC_VAL, RC_EXC_DESC, NULL },
+
+ /* Single argument long options with short keys */
+ { "locate", 'L', POPT_ARG_STRING, 0, RC_LOC_VAL, RC_LOC_DESC, "regx" },
+ { "conf", 'c', POPT_ARG_STRING, 0, RC_CNF_VAL, RC_CNF_DESC, "path" },
+ { "func", 'f', POPT_ARG_STRING, &szFuncfile,\
+ RC_FNC_VAL, RC_FNC_DESC, "path" },
+ { "query", 'q', POPT_ARG_STRING, 0, RC_QRY_VAL, RC_QRY_DESC, "varx" },
+ { "tmp", 't', POPT_ARG_STRING, 0, RC_TMP_VAL, RC_TMP_DESC, "path" },
+
+ /* Single argument long options without short keys */
+ { "RequireOwner", 0, POPT_ARG_STRING, 0,\
+ RC_OWN_VAL, RC_OWN_DESC, "user" },
+ { "RequireGroup", 0, POPT_ARG_STRING, 0,\
+ RC_GRP_VAL, RC_GRP_DESC, "group" },
+ { "RequireUmask", 0, POPT_ARG_INT, 0,\
+ RC_MSK_VAL, RC_MSK_DESC, "umask" },
+ { "ParseEnvAss", 0, POPT_ARG_STRING, 0,\
+ RC_ASS_VAL, RC_ASS_DESC, "regx" },
+ { "ParseSectionDef", 0, POPT_ARG_STRING, 0,\
+ RC_DEF_VAL, RC_DEF_DESC, "regx" },
+ { "ParseSectionRef", 0, POPT_ARG_STRING, 0,\
+ RC_REF_VAL, RC_REF_DESC, "regx" },
+ { "ParseSectionParam", 0, POPT_ARG_STRING, 0,\
+ RC_PRM_VAL, RC_PRM_DESC, "regx" },
+ { "ParseTerminal", 0, POPT_ARG_STRING, 0,\
+ RC_TRM_VAL, RC_TRM_DESC, "regx" },
+ { "NameConfig", 0, POPT_ARG_STRING, 0,\
+ RC_NCF_VAL, RC_NCF_DESC, "name" },
+ { "NameCommon", 0, POPT_ARG_STRING, 0,\
+ RC_CMN_VAL, RC_CMN_DESC, "name" },
+ { "NameDefault", 0, POPT_ARG_STRING, 0,\
+ RC_DFL_VAL, RC_DFL_DESC, "name" },
+ { "NameError", 0, POPT_ARG_STRING, 0,\
+ RC_ERR_VAL, RC_ERR_DESC, "name" },
+
+ POPT_AUTOHELP
+ { NULL, 0, 0, NULL, 0 }
+ };
+
+ optCon = popt_getcontext(NULL, argc, (const char **)argv, optionsTable, 0);
+ popt_setotheroptionhelp(optCon, "[options] <rcfile> <sections [args]>");
+
+ if (argc < 2) {
+ popt_printusage(optCon, stderr, 0);
+ return(RC_THROW(RC_ERR_USE));
+ }
+
+ /* Now do options processing */
+ while ((cOpt = popt_getnextopt(optCon)) >= 0) {
+ switch (cOpt) {
+ case 'h':
+ pcBuf[iBufpos++] = 'h';
+ break;
+ case 'V':
+ pcBuf[iBufpos++] = 'V';
+ break;
+ case 'i':
+ pcBuf[iBufpos++] = 'i';
+ break;
+ case 'q':
+ pcBuf[iBufpos++] = 'q';
+ break;
+ }
+ }
+
+ szCLIBuf = (char *)popt_getarg(optCon);
+ if ((szCLIBuf == NULL)) {
+ fprintf(stderr, "Please specify at least one rcfile and section.\n");
+ popt_printusage(optCon, stderr, 0);
+ return(RC_THROW(RC_ERR_USE));
+ }
+
+ if (cOpt < -1) {
+ /* An error occurred during option processing */
+ fprintf(stderr, "%s: %s\n",
+ popt_badoption(optCon, POPT_BADOPTION_NOALIAS),
+ popt_strerror(cOpt));
+ return(RC_THROW(RC_ERR_INT));
+ }
+
+ /* Print out options, szCLIBuf chosen */
+ fprintf(stderr, "Options chosen: ");
+ for (nIter = 0; nIter < iBufpos ; nIter++)
+ fprintf(stderr, "-%c ", pcBuf[nIter]);
+ if (szFuncfile)
+ fprintf(stderr, "-f %s ", szFuncfile);
+ fprintf(stderr, "\nRun these commands: %s\n", szCLIBuf);
+
+ popt_freecontext(optCon);
+ return(RC_THROW(RC_OK));
+ }
|