Пример #1
0
int main (int argc, char *argv[])
{
    int ch;
    bool hopt = false;
    char *config_filename = NULL;
    opt_t opt;

    memset (&opt, 0, sizeof (opt));
    opt.device = xstrdup ("USB1");

    prog = basename (argv[0]);

    while ((ch = getopt_long (argc, argv, OPTIONS, longopts, NULL)) != -1) {
        switch (ch) {
            case 'c': /* --config FILE */
                config_filename = xstrdup (optarg);
                break;
            default:
                break;
        }
    }
    if (!config_filename) {
        struct passwd *pw = getpwuid (getuid ());
        if (!pw)
            msg_exit ("Who are you?");
        if (asprintf (&config_filename, "%s/.sbig/config.ini", pw->pw_dir) < 0)
            oom ();
    }
    if (setenv ("SBIG_CONFIG_FILE", config_filename, 1) < 0)
        err_exit ("setenv");
    (void)ini_parse (config_filename, config_cb, &opt);

    optind = 0;
    while ((ch = getopt_long (argc, argv, OPTIONS, longopts, NULL)) != -1) {
        switch (ch) {
            case 'c': /* --config FILE */
                break;
            case 'X': /* --xpa-nsinet */
                if (opt.xpa_nsinet)
                    free (opt.xpa_nsinet);
                opt.xpa_nsinet = xstrdup (optarg);
                break;
            case 'x': /* --exec-dir */
                if (setenv ("SBIG_EXEC_DIR", optarg, 1) < 0)
                    err_exit ("setenv");
                break;
            case 'S': /* --sbig-udrv FILE */
                if (opt.sbigudrv)
                    free (opt.sbigudrv);
                opt.sbigudrv = xstrdup (optarg);                
                break;
            case 'd': /* --device DEV */
                if (opt.device)
                    free (opt.device);
                opt.device = xstrdup (optarg);
                break;
            case 'h': /* --help  */
                hopt = true;
                break;
            default:
                usage ();
                exit (1);
        }
    }
    argc -= optind;
    argv += optind;

    if (opt.sbigudrv) {
        if (setenv ("SBIG_UDRV", opt.sbigudrv, 1) < 0)
            err_exit ("setenv");
    }
    if (opt.xpa_nsinet) {
        if (setenv ("XPA_NSINET", opt.xpa_nsinet, 1) < 0)
            err_exit ("setenv");
    }
    if (setenv ("SBIG_DEVICE", opt.device, 1) < 0)
        err_exit ("setenv");

    if (!strcmp (dir_self (), X_BINDIR)) {
        if (setenv ("SBIG_EXEC_DIR", EXEC_DIR, 0) < 0)
            err_exit ("setenv");
        if (setenv ("SBIG_UDRV", PATH_SBIGUDRV, 0) < 0)
            err_exit ("setenv");
    } else {
        if (setenv ("SBIG_EXEC_DIR", ".", 0) < 0)
            err_exit ("setenv");
        if (setenv ("SBIG_UDRV", PATH_SBIGUDRV_BUILD, 0) < 0)
            err_exit ("setenv");
    }

    if (hopt) {
        if (argc > 0) {
            char *av[] = { argv[0], "--help", NULL };
            exec_subcommand (av);
        } else
            help ();
        exit (0);
    }
    if (argc == 0) {
        usage ();
        exit (1);
    }

    exec_subcommand (argv);
    fprintf (stderr, "`%s' is not an sbig command.  See 'sbig --help\n'",
             argv[0]);

    return 0;
}
Пример #2
0
static optparse_t * setup_optparse_parse_args (int argc, char *argv[])
{
    optparse_err_t e;
    struct optparse_option helpopt = {
        .name = "help", .key = 'h', .usage = "Display this message"
    };
    optparse_t *p = optparse_create ("flux");
    if (p == NULL)
        log_err_exit ("optparse_create");
    optparse_set (p, OPTPARSE_USAGE, "[OPTIONS] COMMAND ARGS");
    e = optparse_add_option_table (p, opts);
    if (e != OPTPARSE_SUCCESS)
        log_msg_exit ("optparse_add_option_table() failed");

    // Remove automatic `--help' in favor of our own usage() from above
    e = optparse_remove_option (p, "help");
    if (e != OPTPARSE_SUCCESS)
        log_msg_exit ("optparse_remove_option (\"help\")");
    e = optparse_add_option (p, &helpopt);
    if (e != OPTPARSE_SUCCESS)
        log_msg_exit ("optparse_add_option (\"help\")");

    // Don't print internal subcommands in --help (we print subcommands using
    //  emit_command_help() above.
    e = optparse_set (p, OPTPARSE_PRINT_SUBCMDS, 0);
    if (e != OPTPARSE_SUCCESS)
        log_msg_exit ("optparse_set (OPTPARSE_PRINT_SUBCMDS");

    register_builtin_subcommands (p);

    if (optparse_parse_args (p, argc, argv) < 0)
        exit (1);

    return (p);
}


int main (int argc, char *argv[])
{
    bool vopt = false;
    struct environment *env;
    optparse_t *p;
    const char *searchpath;
    const char *argv0 = argv[0];
    int flags = 0;

    log_init ("flux");

    p = setup_optparse_parse_args (argc, argv);

    if (!flux_is_installed ())
        flags |= CONF_FLAG_INTREE;
    optparse_set_data (p, "conf_flags", &flags);

    if (optparse_hasopt (p, "help")) {
        usage (p); // N.B. accesses "conf_flags"
        exit (0);
    }
    optind = optparse_optind (p);
    if (argc - optind == 0) {
        usage (p);
        exit (1);
    }
    vopt = optparse_hasopt (p, "verbose");

    /* prepare the environment 'env' that will be passed to subcommands.
     */
    env = environment_create ();

    /* Add PATH to env and prepend path to this executable if necessary.
     */
    setup_path (env, argv0);

    /* Prepend config values to env values.
     * Note special handling of lua ;; (default path).
     */
    environment_from_env (env, "LUA_CPATH", "", ';');
    environment_no_dedup_push_back (env, "LUA_CPATH", ";;");
    environment_push (env, "LUA_CPATH", flux_conf_get ("lua_cpath_add", flags));
    environment_push (env, "LUA_CPATH", getenv ("FLUX_LUA_CPATH_PREPEND"));

    environment_from_env (env, "LUA_PATH", "", ';');
    environment_no_dedup_push_back (env, "LUA_PATH", ";;");
    environment_push (env, "LUA_PATH", flux_conf_get ("lua_path_add", flags));
    environment_push (env, "LUA_PATH", getenv ("FLUX_LUA_PATH_PREPEND"));

    environment_from_env (env, "PYTHONPATH", "", ':');
    environment_push (env, "PYTHONPATH", flux_conf_get ("python_path", flags));
    environment_push (env, "PYTHONPATH", getenv ("FLUX_PYTHONPATH_PREPEND"));

    environment_from_env (env, "MANPATH", "", ':');
    environment_push (env, "MANPATH", flux_conf_get ("man_path", flags));

    environment_from_env (env, "FLUX_EXEC_PATH", "", ':');
    environment_push (env, "FLUX_EXEC_PATH",
                      flux_conf_get ("exec_path", flags));
    environment_push (env, "FLUX_EXEC_PATH", getenv ("FLUX_EXEC_PATH_PREPEND"));

    environment_from_env (env, "FLUX_CONNECTOR_PATH", "", ':');
    environment_push (env, "FLUX_CONNECTOR_PATH",
                      flux_conf_get ("connector_path", flags));
    environment_push (env, "FLUX_CONNECTOR_PATH",
                      getenv ("FLUX_CONNECTOR_PATH_PREPEND"));

    environment_from_env (env, "FLUX_MODULE_PATH", "", ':');
    environment_push (env, "FLUX_MODULE_PATH",
                      flux_conf_get ("module_path", flags));
    environment_push (env, "FLUX_MODULE_PATH",
                      getenv ("FLUX_MODULE_PATH_PREPEND"));

    /* Set FLUX_SEC_DIRECTORY, possibly to $HOME/.flux.
     */
    setup_keydir (env, flags);

    if (getenv ("FLUX_URI"))
        environment_from_env (env, "FLUX_URI", "", 0); /* pass-thru */

    environment_from_env (env, "FLUX_RC1_PATH",
                          flux_conf_get ("rc1_path", flags), 0);
    environment_from_env (env, "FLUX_RC3_PATH",
                          flux_conf_get ("rc3_path", flags), 0);
    environment_from_env (env, "FLUX_PMI_LIBRARY_PATH",
                          flux_conf_get ("pmi_library_path", flags), 0);
    environment_from_env (env, "FLUX_WRECK_LUA_PATTERN",
                          flux_conf_get ("wreck_lua_pattern", flags), 0);
    environment_from_env (env, "FLUX_WREXECD_PATH",
                          flux_conf_get ("wrexecd_path", flags), 0);

    environment_apply(env);
    optparse_set_data (p, "env", env);

    if (vopt)
        print_environment (env);
    if (optparse_get_subcommand (p, argv [optind])) {
        if (optparse_run_subcommand (p, argc, argv) < 0)
            exit (1);
    } else {
        searchpath = environment_get (env, "FLUX_EXEC_PATH");
        if (vopt)
            printf ("sub-command search path: %s\n", searchpath);
        exec_subcommand (searchpath, vopt, argv + optind);
    }

    environment_destroy (env);
    optparse_destroy (p);
    log_fini ();

    return 0;
}