Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
Postgres FD Implementation
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Abuhujair Javed
Postgres FD Implementation
Commits
b86327c1
Commit
b86327c1
authored
Nov 30, 2012
by
Bruce Momjian
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Split initdb.c main() code into multiple functions, for easier
maintenance.
parent
12ee6ec7
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
366 additions
and
302 deletions
+366
-302
src/bin/initdb/initdb.c
src/bin/initdb/initdb.c
+366
-302
No files found.
src/bin/initdb/initdb.c
View file @
b86327c1
...
...
@@ -144,6 +144,7 @@ static char infoversion[100];
static
bool
caught_signal
=
false
;
static
bool
output_failed
=
false
;
static
int
output_errno
=
0
;
static
char
*
pgdata_native
;
/* defaults */
static
int
n_connections
=
10
;
...
...
@@ -172,6 +173,27 @@ static char *authwarning = NULL;
static
const
char
*
boot_options
=
"-F"
;
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 */
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
void
setlocales
(
void
);
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
static
int
CreateRestrictedProcess
(
char
*
cmd
,
PROCESS_INFORMATION
*
processInfo
);
...
...
@@ -2823,242 +2854,9 @@ check_need_password(const char *authmethodlocal, const char *authmethodhost)
}
}
int
main
(
int
argc
,
char
*
argv
[]
)
void
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
/*
* Before we execute another program, make sure that we are running with a
...
...
@@ -3101,6 +2899,35 @@ main(int argc, char *argv[])
}
}
#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
...
...
@@ -3108,16 +2935,23 @@ main(int argc, char *argv[])
* need quotes otherwise on Windows because paths there are most likely to
* have embedded spaces.
*/
pgdenv
=
pg_malloc
(
8
+
strlen
(
pg_data
));
sprintf
(
pgdenv
,
"PGDATA=%s"
,
pg_data
);
putenv
(
pgdenv
);
pgdata_set_env
=
pg_malloc
(
8
+
strlen
(
pg_data
));
sprintf
(
pgdata_set_env
,
"PGDATA=%s"
,
pg_data
);
putenv
(
pgdata_set_env
);
}
void
setup_bin_paths
(
const
char
*
argv0
)
{
int
ret
;
if
((
ret
=
find_other_exec
(
argv
[
0
]
,
"postgres"
,
PG_BACKEND_VERSIONSTR
,
if
((
ret
=
find_other_exec
(
argv
0
,
"postgres"
,
PG_BACKEND_VERSIONSTR
,
backend_exec
))
<
0
)
{
char
full_path
[
MAXPGPATH
];
if
(
find_my_exec
(
argv
[
0
]
,
full_path
)
<
0
)
if
(
find_my_exec
(
argv
0
,
full_path
)
<
0
)
strlcpy
(
full_path
,
progname
,
sizeof
(
full_path
));
if
(
ret
==
-
1
)
...
...
@@ -3153,63 +2987,15 @@ main(int argc, char *argv[])
}
canonicalize_path
(
share_path
);
}
effective_user
=
get_id
();
if
(
strlen
(
username
)
==
0
)
username
=
effective_user
;
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
\n
share_path=%s
\n
PGPATH=%s
\n
"
"POSTGRES_SUPERUSERNAME=%s
\n
POSTGRES_BKI=%s
\n
"
"POSTGRES_DESCR=%s
\n
POSTGRES_SHDESCR=%s
\n
"
"POSTGRESQL_CONF_SAMPLE=%s
\n
"
"PG_HBA_SAMPLE=%s
\n
PG_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_locale_encoding
(
void
)
{
int
user_enc
;
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
&&
strcmp
(
lc_ctype
,
lc_time
)
==
0
&&
strcmp
(
lc_ctype
,
lc_numeric
)
==
0
&&
...
...
@@ -3289,6 +3075,60 @@ main(int argc, char *argv[])
!
check_locale_encoding
(
lc_collate
,
user_enc
))
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
\n
share_path=%s
\n
PGPATH=%s
\n
"
"POSTGRES_SUPERUSERNAME=%s
\n
POSTGRES_BKI=%s
\n
"
"POSTGRES_DESCR=%s
\n
POSTGRES_SHDESCR=%s
\n
"
"POSTGRESQL_CONF_SAMPLE=%s
\n
"
"PG_HBA_SAMPLE=%s
\n
PG_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
)
{
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
"
),
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 */
#ifdef SIGHUP
pqsignal
(
SIGHUP
,
trapsig
);
...
...
@@ -3345,6 +3183,18 @@ main(int argc, char *argv[])
pqsignal
(
SIGPIPE
,
SIG_IGN
);
#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
))
{
case
0
:
...
...
@@ -3554,7 +3404,7 @@ main(int argc, char *argv[])
fprintf
(
stderr
,
"%s"
,
authwarning
);
/* Get directory specification used to start this executable */
strlcpy
(
bin_dir
,
argv
[
0
]
,
sizeof
(
bin_dir
));
strlcpy
(
bin_dir
,
argv
0
,
sizeof
(
bin_dir
));
get_parent_directory
(
bin_dir
);
printf
(
_
(
"
\n
Success. You can now start the database server using:
\n\n
"
...
...
@@ -3562,9 +3412,223 @@ main(int argc, char *argv[])
"or
\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
,
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
,
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
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment