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; }
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; }