OSSP CVS Repository

ossp - ossp-pkg/rc/rc.c 1.5
Not logged in
[Honeypot]  [Browse]  [Directory]  [Home]  [Login
[Reports]  [Search]  [Ticket]  [Timeline
  [Raw

ossp-pkg/rc/rc.c 1.5
/*  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.c: Run-command processor ANSI C source file
*/

#include <stdio.h>

#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<package>\
                     <command> [<command> ...]", szProgname);
}*/

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':
                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(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);

    popt_freecontext(optCon);
    exit(0);
}

CVSTrac 2.0.1