/* rc - OSSP Run-command processor
** Copyright (c) 2002 Cable & Wireless Deutschland GmbH
** Copyright (c) 2002 The OSSP Project
** 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.c: Run-command processor ANSI C source file
*/
#include
#include "rc.h"
#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 */
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\
[ ...]", szProgname);
}*/
int main(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] [[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':
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))
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(RC_ERR_ARG);
}
/* 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);
exit(0);
}