--- rc.c 2002/01/30 17:29:15 1.3
+++ rc.c 2002/02/04 21:48:22 1.4
@@ -28,70 +28,150 @@
*/
#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
#include "rc.h"
-#include "ex.h" /* OSSP ex exception library */
-#include "str.h" /* OSSP str string library */
-#include "var.h" /* OSSP var variable library */
+#include "rc_p.h" /* FIXME, remove when options moves */
+#include "rc_strings.h" /* FIXME, remove when options moves */
+/* Third party headers for libraries linked in */
+#include "ex.h" /* OSSP ex exception library */
+#include "str.h" /* OSSP str string library */
+#include "var.h" /* OSSP var variable library */
+#include "popt.h" /* OSSP popt options library */
-void usage(char *szProgname)
+
+static void die(rc_return_t rv)
+{
+ fprintf(stderr, "OSSP rc: Error, dying.\n");
+ exit((int)rv);
+}
+
+void usage(popt_context optCon, rc_return_t rv, char *szError)
+{
+ popt_printusage(optCon, stderr, 0);
+ if (szError)
+ fprintf(stderr, "%s\n", szError);
+ exit((int)rv);
+}
+
+/*void usage(char *szProgname)
{
+ popt_peekarg(optCon) == NULL;
fprintf(stdout, "Usage: %s [-v|--verbose] [-h|--help]\n\
[-p|--print] [-e|--eval] [-c|--config]\
[-q|--query] [-r|--raw]\n<package>\
<command> [<command> ...]", szProgname);
-}
-
-int main(int argc, char *argv[])
-{
- int nOpt = 0; /* holds getopt(3) return value */
- int nFile = 0; /* for checking file existence */
+}*/
- int bVerbose = 0; /* v */
- int bHelp = 0; /* h */
- int bPrint = 0; /* p */
- int bEval = 0; /* e */
- int bConfig = 0; /* c */
- int bQuery = 0; /* q */
- int bRaw = 0; /* r */
-
- while ((nOpt = getopt(argc, argv, "vhpecqr:")) != -1)
- switch (nOpt) {
- case 'v':
- bVerbose = TRUE;
- break;
+int main(int argc, char *argv[]) {
+ char cOpt; /* For argument parsing */
+ int iBufpos = 0; /* For tracking options */
+ char *szCLIBuf;
+ char szFuncfile; /* Rc.func file name and location */
+ int nIter;
+ char pcBuf[BUFSIZ+1];
+ popt_context optCon; /* Context for parsing options */
+ rc_return_t nRet;
+
+ 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, 0, 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] [[section [args]] ...]");
+
+ if (argc < 2) {
+ popt_printusage(optCon, stderr, 0);
+ exit(1);
+ }
+
+ /* Now do options processing */
+ while ((cOpt = popt_getnextopt(optCon)) >= 0) {
+ switch (cOpt) {
case 'h':
- bHelp = TRUE;
+ pcBuf[iBufpos++] = 'h';
break;
- case 'p':
- bPrint = TRUE;
+ case 'V':
+ pcBuf[iBufpos++] = 'V';
break;
- case 'e':
- bEval = TRUE;
- break;
- case 'c':
- bConfig = TRUE;
+ case 'i':
+ pcBuf[iBufpos++] = 'i';
break;
case 'q':
- bQuery = TRUE;
- break;
- case 'r':
- bRaw = TRUE;
+ pcBuf[iBufpos++] = 'q';
break;
- case '?':
- default:
- usage(*argv);
}
+ }
- argc -= optind;
- argv += optind;
-
- /* check existence of file input to the run-command */
- if ((nFile = open(optarg, O_RDONLY, 0)) < 0)
- err(1, "%s", optarg);
+ szCLIBuf = (char *)popt_getarg(optCon);
+ if ((szCLIBuf == NULL))
+ usage(optCon, RC_ERR_ARG, "Specify at least one rcfile and section.");
+
+ if (cOpt < -1) {
+ /* An error occurred during option processing */
+ fprintf(stderr, "%s: %s\n",
+ popt_badoption(optCon, POPT_BADOPTION_NOALIAS),
+ popt_strerror(cOpt));
+ die(nRet);
+ }
+
+ /* Print out options, szCLIBuf chosen */
+ printf("Options chosen: ");
+ for (nIter = 0; nIter < iBufpos ; nIter++)
+ printf("-%c ", pcBuf[nIter]);
+ if (szFuncfile)
+ fprintf(stderr, "-f %s ", szFuncfile);
+ fprintf(stderr, "\nRun these commands: %s\n", szCLIBuf);
- return 0; /* success */
+ popt_freecontext(optCon);
+ exit(0);
}
|