mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-27 08:39:28 +08:00
Split initdb.c main() code into multiple functions, for easier
maintenance.
This commit is contained in:
parent
12ee6ec71f
commit
b86327c1c5
@ -144,6 +144,7 @@ static char infoversion[100];
|
|||||||
static bool caught_signal = false;
|
static bool caught_signal = false;
|
||||||
static bool output_failed = false;
|
static bool output_failed = false;
|
||||||
static int output_errno = 0;
|
static int output_errno = 0;
|
||||||
|
static char *pgdata_native;
|
||||||
|
|
||||||
/* defaults */
|
/* defaults */
|
||||||
static int n_connections = 10;
|
static int n_connections = 10;
|
||||||
@ -172,6 +173,27 @@ static char *authwarning = NULL;
|
|||||||
static const char *boot_options = "-F";
|
static const char *boot_options = "-F";
|
||||||
static const char *backend_options = "--single -F -O -c search_path=pg_catalog -c exit_on_error=true";
|
static const char *backend_options = "--single -F -O -c search_path=pg_catalog -c exit_on_error=true";
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
char *restrict_env;
|
||||||
|
#endif
|
||||||
|
const char *subdirs[] = {
|
||||||
|
"global",
|
||||||
|
"pg_xlog",
|
||||||
|
"pg_xlog/archive_status",
|
||||||
|
"pg_clog",
|
||||||
|
"pg_notify",
|
||||||
|
"pg_serial",
|
||||||
|
"pg_snapshots",
|
||||||
|
"pg_subtrans",
|
||||||
|
"pg_twophase",
|
||||||
|
"pg_multixact/members",
|
||||||
|
"pg_multixact/offsets",
|
||||||
|
"base",
|
||||||
|
"base/1",
|
||||||
|
"pg_tblspc",
|
||||||
|
"pg_stat_tmp"
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* path to 'initdb' binary directory */
|
/* path to 'initdb' binary directory */
|
||||||
static char bin_path[MAXPGPATH];
|
static char bin_path[MAXPGPATH];
|
||||||
@ -227,6 +249,15 @@ static bool check_locale_name(int category, const char *locale,
|
|||||||
static bool check_locale_encoding(const char *locale, int encoding);
|
static bool check_locale_encoding(const char *locale, int encoding);
|
||||||
static void setlocales(void);
|
static void setlocales(void);
|
||||||
static void usage(const char *progname);
|
static void usage(const char *progname);
|
||||||
|
void get_restricted_token(void);
|
||||||
|
void setup_pgdata(void);
|
||||||
|
void setup_bin_paths(const char *argv0);
|
||||||
|
void setup_data_file_paths(void);
|
||||||
|
void setup_locale_encoding(void);
|
||||||
|
void setup_signals_and_umask(void);
|
||||||
|
void setup_text_search(void);
|
||||||
|
void process(const char *argv0);
|
||||||
|
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
static int CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo);
|
static int CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo);
|
||||||
@ -2823,242 +2854,9 @@ check_need_password(const char *authmethodlocal, const char *authmethodhost)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
void
|
||||||
main(int argc, char *argv[])
|
get_restricted_token(void)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
* options with no short version return a low integer, the rest return
|
|
||||||
* their short version value
|
|
||||||
*/
|
|
||||||
static struct option long_options[] = {
|
|
||||||
{"pgdata", required_argument, NULL, 'D'},
|
|
||||||
{"encoding", required_argument, NULL, 'E'},
|
|
||||||
{"locale", required_argument, NULL, 1},
|
|
||||||
{"lc-collate", required_argument, NULL, 2},
|
|
||||||
{"lc-ctype", required_argument, NULL, 3},
|
|
||||||
{"lc-monetary", required_argument, NULL, 4},
|
|
||||||
{"lc-numeric", required_argument, NULL, 5},
|
|
||||||
{"lc-time", required_argument, NULL, 6},
|
|
||||||
{"lc-messages", required_argument, NULL, 7},
|
|
||||||
{"no-locale", no_argument, NULL, 8},
|
|
||||||
{"text-search-config", required_argument, NULL, 'T'},
|
|
||||||
{"auth", required_argument, NULL, 'A'},
|
|
||||||
{"auth-local", required_argument, NULL, 10},
|
|
||||||
{"auth-host", required_argument, NULL, 11},
|
|
||||||
{"pwprompt", no_argument, NULL, 'W'},
|
|
||||||
{"pwfile", required_argument, NULL, 9},
|
|
||||||
{"username", required_argument, NULL, 'U'},
|
|
||||||
{"help", no_argument, NULL, '?'},
|
|
||||||
{"version", no_argument, NULL, 'V'},
|
|
||||||
{"debug", no_argument, NULL, 'd'},
|
|
||||||
{"show", no_argument, NULL, 's'},
|
|
||||||
{"noclean", no_argument, NULL, 'n'},
|
|
||||||
{"nosync", no_argument, NULL, 'N'},
|
|
||||||
{"xlogdir", required_argument, NULL, 'X'},
|
|
||||||
{NULL, 0, NULL, 0}
|
|
||||||
};
|
|
||||||
|
|
||||||
int c,
|
|
||||||
i,
|
|
||||||
ret;
|
|
||||||
int option_index;
|
|
||||||
char *effective_user;
|
|
||||||
char *pgdenv; /* PGDATA value gotten from and sent to
|
|
||||||
* environment */
|
|
||||||
char bin_dir[MAXPGPATH];
|
|
||||||
char *pg_data_native;
|
|
||||||
int user_enc;
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
char *restrict_env;
|
|
||||||
#endif
|
|
||||||
static const char *subdirs[] = {
|
|
||||||
"global",
|
|
||||||
"pg_xlog",
|
|
||||||
"pg_xlog/archive_status",
|
|
||||||
"pg_clog",
|
|
||||||
"pg_notify",
|
|
||||||
"pg_serial",
|
|
||||||
"pg_snapshots",
|
|
||||||
"pg_subtrans",
|
|
||||||
"pg_twophase",
|
|
||||||
"pg_multixact/members",
|
|
||||||
"pg_multixact/offsets",
|
|
||||||
"base",
|
|
||||||
"base/1",
|
|
||||||
"pg_tblspc",
|
|
||||||
"pg_stat_tmp"
|
|
||||||
};
|
|
||||||
|
|
||||||
progname = get_progname(argv[0]);
|
|
||||||
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("initdb"));
|
|
||||||
|
|
||||||
if (argc > 1)
|
|
||||||
{
|
|
||||||
if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
|
|
||||||
{
|
|
||||||
usage(progname);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
|
|
||||||
{
|
|
||||||
puts("initdb (PostgreSQL) " PG_VERSION);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* process command-line options */
|
|
||||||
|
|
||||||
while ((c = getopt_long(argc, argv, "dD:E:L:nNU:WA:sT:X:", long_options, &option_index)) != -1)
|
|
||||||
{
|
|
||||||
switch (c)
|
|
||||||
{
|
|
||||||
case 'A':
|
|
||||||
authmethodlocal = authmethodhost = pg_strdup(optarg);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* When ident is specified, use peer for local connections.
|
|
||||||
* Mirrored, when peer is specified, use ident for TCP/IP
|
|
||||||
* connections.
|
|
||||||
*/
|
|
||||||
if (strcmp(authmethodhost, "ident") == 0)
|
|
||||||
authmethodlocal = "peer";
|
|
||||||
else if (strcmp(authmethodlocal, "peer") == 0)
|
|
||||||
authmethodhost = "ident";
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
authmethodlocal = pg_strdup(optarg);
|
|
||||||
break;
|
|
||||||
case 11:
|
|
||||||
authmethodhost = pg_strdup(optarg);
|
|
||||||
break;
|
|
||||||
case 'D':
|
|
||||||
pg_data = pg_strdup(optarg);
|
|
||||||
break;
|
|
||||||
case 'E':
|
|
||||||
encoding = pg_strdup(optarg);
|
|
||||||
break;
|
|
||||||
case 'W':
|
|
||||||
pwprompt = true;
|
|
||||||
break;
|
|
||||||
case 'U':
|
|
||||||
username = pg_strdup(optarg);
|
|
||||||
break;
|
|
||||||
case 'd':
|
|
||||||
debug = true;
|
|
||||||
printf(_("Running in debug mode.\n"));
|
|
||||||
break;
|
|
||||||
case 'n':
|
|
||||||
noclean = true;
|
|
||||||
printf(_("Running in noclean mode. Mistakes will not be cleaned up.\n"));
|
|
||||||
break;
|
|
||||||
case 'N':
|
|
||||||
do_sync = false;
|
|
||||||
break;
|
|
||||||
case 'L':
|
|
||||||
share_path = pg_strdup(optarg);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
locale = pg_strdup(optarg);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
lc_collate = pg_strdup(optarg);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
lc_ctype = pg_strdup(optarg);
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
lc_monetary = pg_strdup(optarg);
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
lc_numeric = pg_strdup(optarg);
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
lc_time = pg_strdup(optarg);
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
lc_messages = pg_strdup(optarg);
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
locale = "C";
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
pwfilename = pg_strdup(optarg);
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
show_setting = true;
|
|
||||||
break;
|
|
||||||
case 'T':
|
|
||||||
default_text_search_config = pg_strdup(optarg);
|
|
||||||
break;
|
|
||||||
case 'X':
|
|
||||||
xlog_dir = pg_strdup(optarg);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* getopt_long already emitted a complaint */
|
|
||||||
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
|
|
||||||
progname);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Non-option argument specifies data directory as long as it wasn't
|
|
||||||
* already specified with -D / --pgdata
|
|
||||||
*/
|
|
||||||
if (optind < argc && strlen(pg_data) == 0)
|
|
||||||
{
|
|
||||||
pg_data = pg_strdup(argv[optind]);
|
|
||||||
optind++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (optind < argc)
|
|
||||||
{
|
|
||||||
fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
|
|
||||||
progname, argv[optind]);
|
|
||||||
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
|
|
||||||
progname);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pwprompt && pwfilename)
|
|
||||||
{
|
|
||||||
fprintf(stderr, _("%s: password prompt and password file cannot be specified together\n"), progname);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
check_authmethod_unspecified(&authmethodlocal);
|
|
||||||
check_authmethod_unspecified(&authmethodhost);
|
|
||||||
|
|
||||||
check_authmethod_valid(authmethodlocal, auth_methods_local, "local");
|
|
||||||
check_authmethod_valid(authmethodhost, auth_methods_host, "host");
|
|
||||||
|
|
||||||
check_need_password(authmethodlocal, authmethodhost);
|
|
||||||
|
|
||||||
if (strlen(pg_data) == 0)
|
|
||||||
{
|
|
||||||
pgdenv = getenv("PGDATA");
|
|
||||||
if (pgdenv && strlen(pgdenv))
|
|
||||||
{
|
|
||||||
/* PGDATA found */
|
|
||||||
pg_data = pg_strdup(pgdenv);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fprintf(stderr,
|
|
||||||
_("%s: no data directory specified\n"
|
|
||||||
"You must identify the directory where the data for this database system\n"
|
|
||||||
"will reside. Do this with either the invocation option -D or the\n"
|
|
||||||
"environment variable PGDATA.\n"),
|
|
||||||
progname);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pg_data_native = pg_data;
|
|
||||||
canonicalize_path(pg_data);
|
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
/*
|
/*
|
||||||
* Before we execute another program, make sure that we are running with a
|
* Before we execute another program, make sure that we are running with a
|
||||||
@ -3101,6 +2899,35 @@ main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
setup_pgdata(void)
|
||||||
|
{
|
||||||
|
char *pgdata_get_env, *pgdata_set_env;
|
||||||
|
|
||||||
|
if (strlen(pg_data) == 0)
|
||||||
|
{
|
||||||
|
pgdata_get_env = getenv("PGDATA");
|
||||||
|
if (pgdata_get_env && strlen(pgdata_get_env))
|
||||||
|
{
|
||||||
|
/* PGDATA found */
|
||||||
|
pg_data = pg_strdup(pgdata_get_env);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr,
|
||||||
|
_("%s: no data directory specified\n"
|
||||||
|
"You must identify the directory where the data for this database system\n"
|
||||||
|
"will reside. Do this with either the invocation option -D or the\n"
|
||||||
|
"environment variable PGDATA.\n"),
|
||||||
|
progname);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pgdata_native = pg_strdup(pg_data);
|
||||||
|
canonicalize_path(pg_data);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* we have to set PGDATA for postgres rather than pass it on the command
|
* we have to set PGDATA for postgres rather than pass it on the command
|
||||||
@ -3108,16 +2935,23 @@ main(int argc, char *argv[])
|
|||||||
* need quotes otherwise on Windows because paths there are most likely to
|
* need quotes otherwise on Windows because paths there are most likely to
|
||||||
* have embedded spaces.
|
* have embedded spaces.
|
||||||
*/
|
*/
|
||||||
pgdenv = pg_malloc(8 + strlen(pg_data));
|
pgdata_set_env = pg_malloc(8 + strlen(pg_data));
|
||||||
sprintf(pgdenv, "PGDATA=%s", pg_data);
|
sprintf(pgdata_set_env, "PGDATA=%s", pg_data);
|
||||||
putenv(pgdenv);
|
putenv(pgdata_set_env);
|
||||||
|
}
|
||||||
|
|
||||||
if ((ret = find_other_exec(argv[0], "postgres", PG_BACKEND_VERSIONSTR,
|
|
||||||
|
void
|
||||||
|
setup_bin_paths(const char *argv0)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if ((ret = find_other_exec(argv0, "postgres", PG_BACKEND_VERSIONSTR,
|
||||||
backend_exec)) < 0)
|
backend_exec)) < 0)
|
||||||
{
|
{
|
||||||
char full_path[MAXPGPATH];
|
char full_path[MAXPGPATH];
|
||||||
|
|
||||||
if (find_my_exec(argv[0], full_path) < 0)
|
if (find_my_exec(argv0, full_path) < 0)
|
||||||
strlcpy(full_path, progname, sizeof(full_path));
|
strlcpy(full_path, progname, sizeof(full_path));
|
||||||
|
|
||||||
if (ret == -1)
|
if (ret == -1)
|
||||||
@ -3153,63 +2987,15 @@ main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
canonicalize_path(share_path);
|
canonicalize_path(share_path);
|
||||||
|
}
|
||||||
|
|
||||||
effective_user = get_id();
|
void
|
||||||
if (strlen(username) == 0)
|
setup_locale_encoding(void)
|
||||||
username = effective_user;
|
{
|
||||||
|
int user_enc;
|
||||||
set_input(&bki_file, "postgres.bki");
|
|
||||||
set_input(&desc_file, "postgres.description");
|
|
||||||
set_input(&shdesc_file, "postgres.shdescription");
|
|
||||||
set_input(&hba_file, "pg_hba.conf.sample");
|
|
||||||
set_input(&ident_file, "pg_ident.conf.sample");
|
|
||||||
set_input(&conf_file, "postgresql.conf.sample");
|
|
||||||
set_input(&conversion_file, "conversion_create.sql");
|
|
||||||
set_input(&dictionary_file, "snowball_create.sql");
|
|
||||||
set_input(&info_schema_file, "information_schema.sql");
|
|
||||||
set_input(&features_file, "sql_features.txt");
|
|
||||||
set_input(&system_views_file, "system_views.sql");
|
|
||||||
|
|
||||||
set_info_version();
|
|
||||||
|
|
||||||
if (show_setting || debug)
|
|
||||||
{
|
|
||||||
fprintf(stderr,
|
|
||||||
"VERSION=%s\n"
|
|
||||||
"PGDATA=%s\nshare_path=%s\nPGPATH=%s\n"
|
|
||||||
"POSTGRES_SUPERUSERNAME=%s\nPOSTGRES_BKI=%s\n"
|
|
||||||
"POSTGRES_DESCR=%s\nPOSTGRES_SHDESCR=%s\n"
|
|
||||||
"POSTGRESQL_CONF_SAMPLE=%s\n"
|
|
||||||
"PG_HBA_SAMPLE=%s\nPG_IDENT_SAMPLE=%s\n",
|
|
||||||
PG_VERSION,
|
|
||||||
pg_data, share_path, bin_path,
|
|
||||||
username, bki_file,
|
|
||||||
desc_file, shdesc_file,
|
|
||||||
conf_file,
|
|
||||||
hba_file, ident_file);
|
|
||||||
if (show_setting)
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
check_input(bki_file);
|
|
||||||
check_input(desc_file);
|
|
||||||
check_input(shdesc_file);
|
|
||||||
check_input(hba_file);
|
|
||||||
check_input(ident_file);
|
|
||||||
check_input(conf_file);
|
|
||||||
check_input(conversion_file);
|
|
||||||
check_input(dictionary_file);
|
|
||||||
check_input(info_schema_file);
|
|
||||||
check_input(features_file);
|
|
||||||
check_input(system_views_file);
|
|
||||||
|
|
||||||
setlocales();
|
setlocales();
|
||||||
|
|
||||||
printf(_("The files belonging to this database system will be owned "
|
|
||||||
"by user \"%s\".\n"
|
|
||||||
"This user must also own the server process.\n\n"),
|
|
||||||
effective_user);
|
|
||||||
|
|
||||||
if (strcmp(lc_ctype, lc_collate) == 0 &&
|
if (strcmp(lc_ctype, lc_collate) == 0 &&
|
||||||
strcmp(lc_ctype, lc_time) == 0 &&
|
strcmp(lc_ctype, lc_time) == 0 &&
|
||||||
strcmp(lc_ctype, lc_numeric) == 0 &&
|
strcmp(lc_ctype, lc_numeric) == 0 &&
|
||||||
@ -3289,6 +3075,60 @@ main(int argc, char *argv[])
|
|||||||
!check_locale_encoding(lc_collate, user_enc))
|
!check_locale_encoding(lc_collate, user_enc))
|
||||||
exit(1); /* check_locale_encoding printed the error */
|
exit(1); /* check_locale_encoding printed the error */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
setup_data_file_paths(void)
|
||||||
|
{
|
||||||
|
set_input(&bki_file, "postgres.bki");
|
||||||
|
set_input(&desc_file, "postgres.description");
|
||||||
|
set_input(&shdesc_file, "postgres.shdescription");
|
||||||
|
set_input(&hba_file, "pg_hba.conf.sample");
|
||||||
|
set_input(&ident_file, "pg_ident.conf.sample");
|
||||||
|
set_input(&conf_file, "postgresql.conf.sample");
|
||||||
|
set_input(&conversion_file, "conversion_create.sql");
|
||||||
|
set_input(&dictionary_file, "snowball_create.sql");
|
||||||
|
set_input(&info_schema_file, "information_schema.sql");
|
||||||
|
set_input(&features_file, "sql_features.txt");
|
||||||
|
set_input(&system_views_file, "system_views.sql");
|
||||||
|
|
||||||
|
if (show_setting || debug)
|
||||||
|
{
|
||||||
|
fprintf(stderr,
|
||||||
|
"VERSION=%s\n"
|
||||||
|
"PGDATA=%s\nshare_path=%s\nPGPATH=%s\n"
|
||||||
|
"POSTGRES_SUPERUSERNAME=%s\nPOSTGRES_BKI=%s\n"
|
||||||
|
"POSTGRES_DESCR=%s\nPOSTGRES_SHDESCR=%s\n"
|
||||||
|
"POSTGRESQL_CONF_SAMPLE=%s\n"
|
||||||
|
"PG_HBA_SAMPLE=%s\nPG_IDENT_SAMPLE=%s\n",
|
||||||
|
PG_VERSION,
|
||||||
|
pg_data, share_path, bin_path,
|
||||||
|
username, bki_file,
|
||||||
|
desc_file, shdesc_file,
|
||||||
|
conf_file,
|
||||||
|
hba_file, ident_file);
|
||||||
|
if (show_setting)
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
check_input(bki_file);
|
||||||
|
check_input(desc_file);
|
||||||
|
check_input(shdesc_file);
|
||||||
|
check_input(hba_file);
|
||||||
|
check_input(ident_file);
|
||||||
|
check_input(conf_file);
|
||||||
|
check_input(conversion_file);
|
||||||
|
check_input(dictionary_file);
|
||||||
|
check_input(info_schema_file);
|
||||||
|
check_input(features_file);
|
||||||
|
check_input(system_views_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
setup_text_search(void)
|
||||||
|
{
|
||||||
if (strlen(default_text_search_config) == 0)
|
if (strlen(default_text_search_config) == 0)
|
||||||
{
|
{
|
||||||
default_text_search_config = find_matching_ts_config(lc_ctype);
|
default_text_search_config = find_matching_ts_config(lc_ctype);
|
||||||
@ -3318,14 +3158,12 @@ main(int argc, char *argv[])
|
|||||||
printf(_("The default text search configuration will be set to \"%s\".\n"),
|
printf(_("The default text search configuration will be set to \"%s\".\n"),
|
||||||
default_text_search_config);
|
default_text_search_config);
|
||||||
|
|
||||||
printf("\n");
|
}
|
||||||
|
|
||||||
umask(S_IRWXG | S_IRWXO);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* now we are starting to do real work, trap signals so we can clean up
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
void
|
||||||
|
setup_signals_and_umask(void)
|
||||||
|
{
|
||||||
/* some of these are not valid on Windows */
|
/* some of these are not valid on Windows */
|
||||||
#ifdef SIGHUP
|
#ifdef SIGHUP
|
||||||
pqsignal(SIGHUP, trapsig);
|
pqsignal(SIGHUP, trapsig);
|
||||||
@ -3345,6 +3183,18 @@ main(int argc, char *argv[])
|
|||||||
pqsignal(SIGPIPE, SIG_IGN);
|
pqsignal(SIGPIPE, SIG_IGN);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
umask(S_IRWXG | S_IRWXO);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
process(const char *argv0)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char bin_dir[MAXPGPATH];
|
||||||
|
|
||||||
|
setup_signals_and_umask();
|
||||||
|
|
||||||
switch (pg_check_dir(pg_data))
|
switch (pg_check_dir(pg_data))
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
@ -3554,7 +3404,7 @@ main(int argc, char *argv[])
|
|||||||
fprintf(stderr, "%s", authwarning);
|
fprintf(stderr, "%s", authwarning);
|
||||||
|
|
||||||
/* Get directory specification used to start this executable */
|
/* Get directory specification used to start this executable */
|
||||||
strlcpy(bin_dir, argv[0], sizeof(bin_dir));
|
strlcpy(bin_dir, argv0, sizeof(bin_dir));
|
||||||
get_parent_directory(bin_dir);
|
get_parent_directory(bin_dir);
|
||||||
|
|
||||||
printf(_("\nSuccess. You can now start the database server using:\n\n"
|
printf(_("\nSuccess. You can now start the database server using:\n\n"
|
||||||
@ -3562,9 +3412,223 @@ main(int argc, char *argv[])
|
|||||||
"or\n"
|
"or\n"
|
||||||
" %s%s%spg_ctl%s -D %s%s%s -l logfile start\n\n"),
|
" %s%s%spg_ctl%s -D %s%s%s -l logfile start\n\n"),
|
||||||
QUOTE_PATH, bin_dir, (strlen(bin_dir) > 0) ? DIR_SEP : "", QUOTE_PATH,
|
QUOTE_PATH, bin_dir, (strlen(bin_dir) > 0) ? DIR_SEP : "", QUOTE_PATH,
|
||||||
QUOTE_PATH, pg_data_native, QUOTE_PATH,
|
QUOTE_PATH, pgdata_native, QUOTE_PATH,
|
||||||
QUOTE_PATH, bin_dir, (strlen(bin_dir) > 0) ? DIR_SEP : "", QUOTE_PATH,
|
QUOTE_PATH, bin_dir, (strlen(bin_dir) > 0) ? DIR_SEP : "", QUOTE_PATH,
|
||||||
QUOTE_PATH, pg_data_native, QUOTE_PATH);
|
QUOTE_PATH, pgdata_native, QUOTE_PATH);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
static struct option long_options[] = {
|
||||||
|
{"pgdata", required_argument, NULL, 'D'},
|
||||||
|
{"encoding", required_argument, NULL, 'E'},
|
||||||
|
{"locale", required_argument, NULL, 1},
|
||||||
|
{"lc-collate", required_argument, NULL, 2},
|
||||||
|
{"lc-ctype", required_argument, NULL, 3},
|
||||||
|
{"lc-monetary", required_argument, NULL, 4},
|
||||||
|
{"lc-numeric", required_argument, NULL, 5},
|
||||||
|
{"lc-time", required_argument, NULL, 6},
|
||||||
|
{"lc-messages", required_argument, NULL, 7},
|
||||||
|
{"no-locale", no_argument, NULL, 8},
|
||||||
|
{"text-search-config", required_argument, NULL, 'T'},
|
||||||
|
{"auth", required_argument, NULL, 'A'},
|
||||||
|
{"auth-local", required_argument, NULL, 10},
|
||||||
|
{"auth-host", required_argument, NULL, 11},
|
||||||
|
{"pwprompt", no_argument, NULL, 'W'},
|
||||||
|
{"pwfile", required_argument, NULL, 9},
|
||||||
|
{"username", required_argument, NULL, 'U'},
|
||||||
|
{"help", no_argument, NULL, '?'},
|
||||||
|
{"version", no_argument, NULL, 'V'},
|
||||||
|
{"debug", no_argument, NULL, 'd'},
|
||||||
|
{"show", no_argument, NULL, 's'},
|
||||||
|
{"noclean", no_argument, NULL, 'n'},
|
||||||
|
{"nosync", no_argument, NULL, 'N'},
|
||||||
|
{"xlogdir", required_argument, NULL, 'X'},
|
||||||
|
{NULL, 0, NULL, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* options with no short version return a low integer, the rest return
|
||||||
|
* their short version value
|
||||||
|
*/
|
||||||
|
int c;
|
||||||
|
int option_index;
|
||||||
|
char *effective_user;
|
||||||
|
|
||||||
|
progname = get_progname(argv[0]);
|
||||||
|
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("initdb"));
|
||||||
|
|
||||||
|
if (argc > 1)
|
||||||
|
{
|
||||||
|
if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
|
||||||
|
{
|
||||||
|
usage(progname);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
|
||||||
|
{
|
||||||
|
puts("initdb (PostgreSQL) " PG_VERSION);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* process command-line options */
|
||||||
|
|
||||||
|
while ((c = getopt_long(argc, argv, "dD:E:L:nNU:WA:sT:X:", long_options, &option_index)) != -1)
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case 'A':
|
||||||
|
authmethodlocal = authmethodhost = pg_strdup(optarg);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When ident is specified, use peer for local connections.
|
||||||
|
* Mirrored, when peer is specified, use ident for TCP/IP
|
||||||
|
* connections.
|
||||||
|
*/
|
||||||
|
if (strcmp(authmethodhost, "ident") == 0)
|
||||||
|
authmethodlocal = "peer";
|
||||||
|
else if (strcmp(authmethodlocal, "peer") == 0)
|
||||||
|
authmethodhost = "ident";
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
authmethodlocal = pg_strdup(optarg);
|
||||||
|
break;
|
||||||
|
case 11:
|
||||||
|
authmethodhost = pg_strdup(optarg);
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
pg_data = pg_strdup(optarg);
|
||||||
|
break;
|
||||||
|
case 'E':
|
||||||
|
encoding = pg_strdup(optarg);
|
||||||
|
break;
|
||||||
|
case 'W':
|
||||||
|
pwprompt = true;
|
||||||
|
break;
|
||||||
|
case 'U':
|
||||||
|
username = pg_strdup(optarg);
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
debug = true;
|
||||||
|
printf(_("Running in debug mode.\n"));
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
noclean = true;
|
||||||
|
printf(_("Running in noclean mode. Mistakes will not be cleaned up.\n"));
|
||||||
|
break;
|
||||||
|
case 'N':
|
||||||
|
do_sync = false;
|
||||||
|
break;
|
||||||
|
case 'L':
|
||||||
|
share_path = pg_strdup(optarg);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
locale = pg_strdup(optarg);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
lc_collate = pg_strdup(optarg);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
lc_ctype = pg_strdup(optarg);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
lc_monetary = pg_strdup(optarg);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
lc_numeric = pg_strdup(optarg);
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
lc_time = pg_strdup(optarg);
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
lc_messages = pg_strdup(optarg);
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
locale = "C";
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
pwfilename = pg_strdup(optarg);
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
show_setting = true;
|
||||||
|
break;
|
||||||
|
case 'T':
|
||||||
|
default_text_search_config = pg_strdup(optarg);
|
||||||
|
break;
|
||||||
|
case 'X':
|
||||||
|
xlog_dir = pg_strdup(optarg);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* getopt_long already emitted a complaint */
|
||||||
|
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
|
||||||
|
progname);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Non-option argument specifies data directory as long as it wasn't
|
||||||
|
* already specified with -D / --pgdata
|
||||||
|
*/
|
||||||
|
if (optind < argc && strlen(pg_data) == 0)
|
||||||
|
{
|
||||||
|
pg_data = pg_strdup(argv[optind]);
|
||||||
|
optind++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (optind < argc)
|
||||||
|
{
|
||||||
|
fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
|
||||||
|
progname, argv[optind]);
|
||||||
|
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
|
||||||
|
progname);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pwprompt && pwfilename)
|
||||||
|
{
|
||||||
|
fprintf(stderr, _("%s: password prompt and password file cannot be specified together\n"), progname);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
check_authmethod_unspecified(&authmethodlocal);
|
||||||
|
check_authmethod_unspecified(&authmethodhost);
|
||||||
|
|
||||||
|
check_authmethod_valid(authmethodlocal, auth_methods_local, "local");
|
||||||
|
check_authmethod_valid(authmethodhost, auth_methods_host, "host");
|
||||||
|
|
||||||
|
check_need_password(authmethodlocal, authmethodhost);
|
||||||
|
|
||||||
|
get_restricted_token();
|
||||||
|
|
||||||
|
setup_pgdata();
|
||||||
|
|
||||||
|
setup_bin_paths(argv[0]);
|
||||||
|
|
||||||
|
effective_user = get_id();
|
||||||
|
if (strlen(username) == 0)
|
||||||
|
username = effective_user;
|
||||||
|
|
||||||
|
printf(_("The files belonging to this database system will be owned "
|
||||||
|
"by user \"%s\".\n"
|
||||||
|
"This user must also own the server process.\n\n"),
|
||||||
|
effective_user);
|
||||||
|
|
||||||
|
set_info_version();
|
||||||
|
|
||||||
|
setup_data_file_paths();
|
||||||
|
|
||||||
|
setup_locale_encoding();
|
||||||
|
|
||||||
|
setup_text_search();
|
||||||
|
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
process(argv[0]);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user