您的位置:首页 > 数据库

PostgreSQL的 initdb 源代码分析之四

2013-07-05 16:55 344 查看
继续分析:

if (pwprompt && pwfilename)
{
fprintf(stderr, _("%s: password prompt and password file cannot be specified together\n"), progname);
exit(1);
}

if (authmethod == NULL || !strlen(authmethod))
{
authwarning = _("\nWARNING: enabling \"trust\" authentication for local connections\n"
"You can change this by editing pg_hba.conf or using the -A option the\n"
"next time you run initdb.\n");
authmethod = "trust";
}

if (strcmp(authmethod, "md5") &&
strcmp(authmethod, "peer") &&
strcmp(authmethod, "ident") &&
strcmp(authmethod, "trust") &&

#ifdef USE_PAM
strcmp(authmethod, "pam") &&
strncmp(authmethod, "pam ", 4) &&        /* pam with space = param */
#endif

strcmp(authmethod, "crypt") &&
strcmp(authmethod, "password")
)

/*
* Kerberos methods not listed because they are not supported over
* local connections and are rejected in hba.c
*/
{
fprintf(stderr, _("%s: unrecognized authentication method \"%s\"\n"),
progname, authmethod);
exit(1);
}

if ((!strcmp(authmethod, "md5") ||
!strcmp(authmethod, "crypt") ||
!strcmp(authmethod, "password")) &&
!(pwprompt || pwfilename))
{
fprintf(stderr, _("%s: must specify a password for the superuser to enable %s authentication\n"),
        progname, authmethod);
exit(1);
}

/*
* When ident is specified, use peer for local connections. Mirrored, when
* peer is specified, use ident for TCP connections.
*/
if (strcmp(authmethod, "ident") == 0)
authmethodlocal = "peer";
else if (strcmp(authmethod, "peer") == 0)
{
authmethodlocal = "peer";
authmethod = "ident";
}
else
authmethodlocal = authmethod;


因为我在运行initdb的时候,未指定认证方式,所以缺省的认证方式将被设置为 trust。

接下来,因为我运行initdb是指定了 -D 参数,所以如下一段也被跳过:

if (strlen(pg_data) == 0)
{
pgdenv = getenv("PGDATA");
if (pgdenv && strlen(pgdenv))
{
/* PGDATA found */
pg_data = xstrdup(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);
}
}


接下来,canonicalize_path 是处理一些多余的/,或windows和unix平台的斜线和反斜线的统一处理。

pg_data_native = pg_data;

canonicalize_path(pg_data);


接下来,Win32平台相关代码也忽略:

#ifdef WIN32

/*
* Before we execute another program, make sure that we are running with a
* restricted token. If not, re-execute ourselves with one.
*/

if ((restrict_env = getenv("PG_RESTRICT_EXEC")) == NULL
|| strcmp(restrict_env, "1") != 0)
{
PROCESS_INFORMATION pi;
char       *cmdline;

ZeroMemory(&pi, sizeof(pi));

cmdline = xstrdup(GetCommandLine());

putenv("PG_RESTRICT_EXEC=1");

if (!CreateRestrictedProcess(cmdline, &pi))
{
fprintf(stderr, "Failed to re-exec with restricted token: %lu.\n", GetLastError());
}
else
{
/*
* Successfully re-execed. Now wait for child process to capture
* exitcode.
*/
DWORD        x;

CloseHandle(pi.hThread);
WaitForSingleObject(pi.hProcess, INFINITE);

if (!GetExitCodeProcess(pi.hProcess, &x))
{
fprintf(stderr, "Failed to get exit code from subprocess: %lu\n", GetLastError());
exit(1);
}
exit(x);
}
}
#endif


接下来,进行存储,也是和windows平台有点关系,加入了双引号:

/*
* we have to set PGDATA for postgres rather than pass it on the command
* line to avoid dumb quoting problems on Windows, and we would especially
* 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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: