int pgut_getopt(int argc, char **argv, pgut_option options[]) { int c; int optindex = 0; char *optstring; struct option *longopts; pgut_option *opt; pgut_init(argc, argv); /* Help message and version are handled at first. */ if (argc > 1) { if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0) { help(true); exit(1); } if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0) { printf("%s %s\n", PROGRAM_NAME, PROGRAM_VERSION); exit(1); } if (strcmp(argv[1], "--configuration") == 0) { printf("%s\n", PG_VERSION_STR); exit(0); } } /* Merge default and user options. */ longopts = option_merge(default_options, options); optstring = longopts_to_optstring(longopts); /* Assign named options */ while ((c = getopt_long(argc, argv, optstring, longopts, &optindex)) != -1) { opt = option_find(c, default_options, options); pgut_setopt(opt, optarg, SOURCE_CMDLINE); } /* Read environment variables */ option_from_env(options); (void) (dbname || (dbname = getenv("PGDATABASE")) || (dbname = getenv("PGUSER")) || (dbname = get_username())); return optind; }
/** * @brief Entry point for pg_bulkload command. * * Flow: * <ol> * <li> Parses command arguments. </li> * <li> Without -r option: Starts the loading. </li> * <li> With -r option: Starts the recovery. </li> * </ol> * * @param argc [in] Number of arguments. * @param argv [in] Argument list. * @return Returns zero if successful, 1 otherwise. */ int main(int argc, char *argv[]) { char cwd[MAXPGPATH]; char control_file[MAXPGPATH] = ""; int i; pgut_init(argc, argv); if (argc < 2) { help(false); return E_PG_OTHER; } if (getcwd(cwd, MAXPGPATH) == NULL) ereport(ERROR, (errcode(EXIT_FAILURE), errmsg("cannot read current directory: "))); i = pgut_getopt(argc, argv, options); for (; i < argc; i++) { if (control_file[0]) ereport(ERROR, (errcode(EXIT_FAILURE), errmsg("too many arguments"))); /* make absolute control file path */ if (is_absolute_path(argv[i])) strlcpy(control_file, argv[i], MAXPGPATH); else join_path_components(control_file, cwd, argv[i]); canonicalize_path(control_file); } /* * Determines data loading or recovery. */ if (recovery) { /* verify arguments */ if (!DataDir && (DataDir = getenv("PGDATA")) == NULL) elog(ERROR, "no $PGDATA specified"); if (strlen(DataDir) + MAX_LOADSTATUS_NAME >= MAXPGPATH) elog(ERROR, "too long $PGDATA path length"); if (control_file[0] != '\0') elog(ERROR, "invalid argument 'control file' for recovery"); return LoaderRecoveryMain(); } else { /* verify arguments */ if (DataDir) elog(ERROR, "invalid option '-D' for data load"); if (control_file[0]) bulkload_options = list_concat( ParseControlFile(control_file), bulkload_options); /* chdir control_file to the parent directory */ get_parent_directory(control_file); /* add path options */ for (i = 0; i < NUM_PATH_OPTIONS; i++) { const pgut_option *opt = &options[i]; const char *path = *(const char **) opt->var; char abspath[MAXPGPATH]; char item[MAXPGPATH + 32]; if (path == NULL) continue; if ((i == 0 || i == 1) && (pg_strcasecmp(path, "stdin") == 0 || type_function)) { /* special case for stdin and input from function */ strlcpy(abspath, path, lengthof(abspath)); } else if (is_absolute_path(path) || (i == 2 && !writer_binary)) { /* absolute path */ strlcpy(abspath, path, lengthof(abspath)); } else if (opt->source == SOURCE_FILE) { /* control file relative path */ join_path_components(abspath, control_file, path); } else { /* current working directory relative path */ join_path_components(abspath, cwd, path); } canonicalize_path(abspath); snprintf(item, lengthof(item), "%s=%s", opt->lname, abspath); bulkload_options = lappend(bulkload_options, pgut_strdup(item)); } return LoaderLoadMain(bulkload_options); } }
int pgut_getopt(int argc, char **argv, pgut_option options[]) { int c; int optindex = 0; char *optstring; struct option *longopts; pgut_option *opt; pgut_init(argc, argv); /* Help message and version are handled at first. */ if (argc > 1) { if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0) { help(true); exit(1); } if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0) { fprintf(stderr, "%s %s\n", PROGRAM_NAME, PROGRAM_VERSION); exit(1); } } /* Merge default and user options. */ longopts = option_merge(default_options, options); optstring = longopts_to_optstring(longopts); /* Assign named options */ while ((c = getopt_long(argc, argv, optstring, longopts, &optindex)) != -1) { /* Show help message if are specified '-?, --help' */ if (c == '?') { /* Actual help option given */ if (strcmp(argv[optind - 1], "-?") == 0 || strcmp(argv[optind - 1], "--help") == 0) { help(true); exit(1); } /* unknown option reported by getopt */ else { fprintf(stderr, "Try \"%s --help\" for more information.\n", PROGRAM_NAME); exit(EINVAL); } } /* Show version information if are specified '-V, --version' */ if (c == 'V') { fprintf(stderr, "%s %s\n", PROGRAM_NAME, PROGRAM_VERSION); exit(1); } opt = option_find(c, default_options, options); pgut_setopt(opt, optarg, SOURCE_CMDLINE); } /* Read environment variables */ option_from_env(options); return optind; }