继续分析,
如下这段,因为条件不成立,被跳过:
/* Create transaction log symlink, if required */
if (strcmp(xlog_dir, "") != )
{ fprintf(stderr,"In main function -----------------190\n"); char *linkloc; /* clean up xlog directory name, check it's absolute */
canonicalize_path(xlog_dir);
if (!is_absolute_path(xlog_dir))
{
fprintf(stderr, _("%s: transaction log directory location must be an absolute path\n"), progname);
exit_nicely();
} /* check if the specified xlog directory exists/is empty */
switch (pg_check_dir(xlog_dir))
{
case :
/* xlog directory not there, must create it */
printf(_("creating directory %s ... "),
xlog_dir);
fflush(stdout); if (pg_mkdir_p(xlog_dir, S_IRWXU) != )
{
fprintf(stderr, _("%s: could not create directory \"%s\": %s\n"),
progname, xlog_dir, strerror(errno));
exit_nicely();
}
else
check_ok(); made_new_xlogdir = true;
break; case :
/* Present but empty, fix permissions and use it */
printf(_("fixing permissions on existing directory %s ... "),
xlog_dir);
fflush(stdout); if (chmod(xlog_dir, S_IRWXU) != )
{
fprintf(stderr, _("%s: could not change permissions of directory \"%s\": %s\n"),
progname, xlog_dir, strerror(errno));
exit_nicely();
}
else
check_ok(); found_existing_xlogdir = true;
break; case :
/* Present and not empty */
fprintf(stderr,
_("%s: directory \"%s\" exists but is not empty\n"),
progname, xlog_dir);
fprintf(stderr,
_("If you want to store the transaction log there, either\n"
"remove or empty the directory \"%s\".\n"),
xlog_dir);
exit_nicely(); default:
/* Trouble accessing directory */
fprintf(stderr, _("%s: could not access directory \"%s\": %s\n"),
progname, xlog_dir, strerror(errno));
exit_nicely();
} /* form name of the place where the symlink must go */
linkloc = (char *) pg_malloc(strlen(pg_data) + + );
sprintf(linkloc, "%s/pg_xlog", pg_data); #ifdef HAVE_SYMLINK
if (symlink(xlog_dir, linkloc) != )
{
fprintf(stderr, _("%s: could not create symbolic link \"%s\": %s\n"),
progname, linkloc, strerror(errno));
exit_nicely();
}
#else
fprintf(stderr, _("%s: symlinks are not supported on this platform"));
exit_nicely();
#endif
}
接下来:
开始创建各个子目录
/* Create required subdirectories */
printf(_("creating subdirectories ... "));
fflush(stdout); for (i = ; i < (sizeof(subdirs) / sizeof(char *)); i++)
{
if (!mkdatadir(subdirs[i]))
exit_nicely();
}
加入调试代码后,可以看到,上述建立的各子目录分别是:
subdirs[0] is: global
subdirs[1] is: pg_xlog
subdirs[2] is: pg_xlog/archive_status
subdirs[3] is: pg_clog
subdirs[4] is: pg_notify
subdirs[5] is: pg_serial
subdirs[6] is: pg_subtrans
subdirs[7] is: pg_twophase
subdirs[8] is: pg_multixact/members
subdirs[9] is: pg_multixact/offsets
subdirs[10] is: base
subdirs[11] is: base/1
subdirs[12] is: pg_tblspc
subdirs[13] is: pg_stat_tmp
想起来了,前面有过定义的:
static const char *subdirs[] = {
"global",
"pg_xlog",
"pg_xlog/archive_status",
"pg_clog",
"pg_notify",
"pg_serial",
"pg_subtrans",
"pg_twophase",
"pg_multixact/members",
"pg_multixact/offsets",
"base",
"base/1",
"pg_tblspc",
"pg_stat_tmp"
};
而接下来,就是:
check_ok();
这个check_ok ,其注释就说得很清楚:
/*
* call exit_nicely() if we got a signal, or else output "ok".
*/
static void
check_ok(void)
{
if (caught_signal)
{
printf(_("caught signal\n"));
fflush(stdout);
exit_nicely();
}
else if (output_failed)
{
printf(_("could not write to child process: %s\n"),
strerror(output_errno));
fflush(stdout);
exit_nicely();
}
else
{
/* all seems well */
printf(_("ok\n"));
fflush(stdout);
}
}