PostgreSQL Source Code git master
Data Structures | Macros | Typedefs | Functions | Variables
miscinit.c File Reference
#include "postgres.h"
#include <sys/param.h>
#include <signal.h>
#include <time.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <grp.h>
#include <pwd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <utime.h>
#include "access/htup_details.h"
#include "access/parallel.h"
#include "catalog/pg_authid.h"
#include "common/file_perm.h"
#include "libpq/libpq.h"
#include "libpq/pqsignal.h"
#include "mb/pg_wchar.h"
#include "miscadmin.h"
#include "pgstat.h"
#include "postmaster/autovacuum.h"
#include "postmaster/interrupt.h"
#include "postmaster/postmaster.h"
#include "replication/slotsync.h"
#include "storage/fd.h"
#include "storage/ipc.h"
#include "storage/latch.h"
#include "storage/pg_shmem.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "storage/procarray.h"
#include "utils/builtins.h"
#include "utils/guc.h"
#include "utils/inval.h"
#include "utils/memutils.h"
#include "utils/pidfile.h"
#include "utils/syscache.h"
#include "utils/varlena.h"
#include "postmaster/proctypelist.h"
Include dependency graph for miscinit.c:

Go to the source code of this file.

Data Structures

 

Macros

#define  DIRECTORY_LOCK_FILE   "postmaster.pid"
 
#define  PG_PROCTYPE(bktype, description, main_func, shmem_attach)    case bktype: backendDesc = description; break;
 

Typedefs

 

Functions

void  InitPostmasterChild (void)
 
void  InitStandaloneProcess (const char *argv0)
 
void  SwitchToSharedLatch (void)
 
void  InitProcessLocalLatch (void)
 
void  SwitchBackToLocalLatch (void)
 
const char *  GetBackendTypeDesc (BackendType backendType)
 
void  SetDatabasePath (const char *path)
 
void  checkDataDir (void)
 
void  SetDataDir (const char *dir)
 
void  ChangeToDataDir (void)
 
Oid  GetUserId (void)
 
 
static void  SetOuterUserId (Oid userid, bool is_superuser)
 
 
 
static void  SetSessionUserId (Oid userid, bool is_superuser)
 
const char *  GetSystemUser (void)
 
 
void  SetAuthenticatedUserId (Oid userid)
 
void  GetUserIdAndSecContext (Oid *userid, int *sec_context)
 
void  SetUserIdAndSecContext (Oid userid, int sec_context)
 
bool  InLocalUserIdChange (void)
 
 
bool  InNoForceRLSOperation (void)
 
void  GetUserIdAndContext (Oid *userid, bool *sec_def_context)
 
void  SetUserIdAndContext (Oid userid, bool sec_def_context)
 
bool  has_rolreplication (Oid roleid)
 
void  InitializeSessionUserId (const char *rolename, Oid roleid, bool bypass_login_check)
 
 
void  InitializeSystemUser (const char *authn_id, const char *auth_method)
 
 
 
 
void  SetCurrentRoleId (Oid roleid, bool is_superuser)
 
char *  GetUserNameFromId (Oid roleid, bool noerr)
 
 
void  SerializeClientConnectionInfo (Size maxsize PG_USED_FOR_ASSERTS_ONLY, char *start_address)
 
void  RestoreClientConnectionInfo (char *conninfo)
 
static void  UnlinkLockFiles (int status, Datum arg)
 
static void  CreateLockFile (const char *filename, bool amPostmaster, const char *socketDir, bool isDDLock, const char *refName)
 
void  CreateDataDirLockFile (bool amPostmaster)
 
void  CreateSocketLockFile (const char *socketfile, bool amPostmaster, const char *socketDir)
 
void  TouchSocketLockFiles (void)
 
void  AddToDataDirLockFile (int target_line, const char *str)
 
bool  RecheckDataDirLockFile (void)
 
void  ValidatePgVersion (const char *path)
 
static void  load_libraries (const char *libraries, const char *gucname, bool restricted)
 
 
 
void  process_shmem_requests (void)
 
void  pg_bindtextdomain (const char *domain)
 

Variables

 
 
static Listlock_files = NIL
 
 
 
 
 
 
 
static const char *  SystemUser = NULL
 
static bool  SessionUserIsSuperuser = false
 
static int  SecurityRestrictionContext = 0
 
static bool  SetRoleIsActive = false
 
 
 
 
 
 
 
 
 

Macro Definition Documentation

DIRECTORY_LOCK_FILE

#define DIRECTORY_LOCK_FILE   "postmaster.pid"

Definition at line 60 of file miscinit.c.

PG_PROCTYPE

#define PG_PROCTYPE (   bktype,
  main_func,
  shmem_attach 
)     case bktype: backendDesc = description; break;

Typedef Documentation

SerializedClientConnectionInfo

Function Documentation

AddToDataDirLockFile()

void AddToDataDirLockFile ( int  target_line,
const char *  str 
)

Definition at line 1519 of file miscinit.c.

1520{
1521 int fd;
1522 int len;
1523 int lineno;
1524 char *srcptr;
1525 char *destptr;
1526 char srcbuffer[BLCKSZ];
1527 char destbuffer[BLCKSZ];
1528
1529 fd = open(DIRECTORY_LOCK_FILE, O_RDWR | PG_BINARY, 0);
1530 if (fd < 0)
1531 {
1532 ereport(LOG,
1534 errmsg("could not open file \"%s\": %m",
1536 return;
1537 }
1538 pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ);
1539 len = read(fd, srcbuffer, sizeof(srcbuffer) - 1);
1541 if (len < 0)
1542 {
1543 ereport(LOG,
1545 errmsg("could not read from file \"%s\": %m",
1547 close(fd);
1548 return;
1549 }
1550 srcbuffer[len] = '0円';
1551
1552 /*
1553 * Advance over lines we are not supposed to rewrite, then copy them to
1554 * destbuffer.
1555 */
1556 srcptr = srcbuffer;
1557 for (lineno = 1; lineno < target_line; lineno++)
1558 {
1559 char *eol = strchr(srcptr, '\n');
1560
1561 if (eol == NULL)
1562 break; /* not enough lines in file yet */
1563 srcptr = eol + 1;
1564 }
1565 memcpy(destbuffer, srcbuffer, srcptr - srcbuffer);
1566 destptr = destbuffer + (srcptr - srcbuffer);
1567
1568 /*
1569 * Fill in any missing lines before the target line, in case lines are
1570 * added to the file out of order.
1571 */
1572 for (; lineno < target_line; lineno++)
1573 {
1574 if (destptr < destbuffer + sizeof(destbuffer))
1575 *destptr++ = '\n';
1576 }
1577
1578 /*
1579 * Write or rewrite the target line.
1580 */
1581 snprintf(destptr, destbuffer + sizeof(destbuffer) - destptr, "%s\n", str);
1582 destptr += strlen(destptr);
1583
1584 /*
1585 * If there are more lines in the old file, append them to destbuffer.
1586 */
1587 if ((srcptr = strchr(srcptr, '\n')) != NULL)
1588 {
1589 srcptr++;
1590 snprintf(destptr, destbuffer + sizeof(destbuffer) - destptr, "%s",
1591 srcptr);
1592 }
1593
1594 /*
1595 * And rewrite the data. Since we write in a single kernel call, this
1596 * update should appear atomic to onlookers.
1597 */
1598 len = strlen(destbuffer);
1599 errno = 0;
1600 pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE);
1601 if (pg_pwrite(fd, destbuffer, len, 0) != len)
1602 {
1604 /* if write didn't set errno, assume problem is no disk space */
1605 if (errno == 0)
1606 errno = ENOSPC;
1607 ereport(LOG,
1609 errmsg("could not write to file \"%s\": %m",
1611 close(fd);
1612 return;
1613 }
1615 pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC);
1616 if (pg_fsync(fd) != 0)
1617 {
1618 ereport(LOG,
1620 errmsg("could not write to file \"%s\": %m",
1622 }
1624 if (close(fd) != 0)
1625 {
1626 ereport(LOG,
1628 errmsg("could not write to file \"%s\": %m",
1630 }
1631}
#define PG_BINARY
Definition: c.h:1272
int errcode_for_file_access(void)
Definition: elog.c:877
int errmsg(const char *fmt,...)
Definition: elog.c:1071
#define LOG
Definition: elog.h:31
#define ereport(elevel,...)
Definition: elog.h:150
int pg_fsync(int fd)
Definition: fd.c:386
const char * str
#define close(a)
Definition: win32.h:12
#define read(a, b, c)
Definition: win32.h:13
#define DIRECTORY_LOCK_FILE
Definition: miscinit.c:60
const void size_t len
#define pg_pwrite
Definition: port.h:227
#define snprintf
Definition: port.h:239
static int fd(const char *x, int i)
Definition: preproc-init.c:105
static void pgstat_report_wait_start(uint32 wait_event_info)
Definition: wait_event.h:69
static void pgstat_report_wait_end(void)
Definition: wait_event.h:85

References close, DIRECTORY_LOCK_FILE, ereport, errcode_for_file_access(), errmsg(), fd(), len, LOG, PG_BINARY, pg_fsync(), pg_pwrite, pgstat_report_wait_end(), pgstat_report_wait_start(), read, snprintf, and str.

Referenced by InternalIpcMemoryCreate(), PostmasterMain(), process_pm_child_exit(), process_pm_pmsignal(), and process_pm_shutdown_request().

ChangeToDataDir()

void ChangeToDataDir ( void  )

Definition at line 409 of file miscinit.c.

410{
412
413 if (chdir(DataDir) < 0)
416 errmsg("could not change directory to \"%s\": %m",
417 DataDir)));
418}
#define FATAL
Definition: elog.h:41
char * DataDir
Definition: globals.c:71
Assert(PointerIsAligned(start, uint64))

References Assert(), DataDir, ereport, errcode_for_file_access(), errmsg(), and FATAL.

Referenced by BootstrapModeMain(), PostgresSingleUserMain(), and PostmasterMain().

checkDataDir()

void checkDataDir ( void  )

Definition at line 296 of file miscinit.c.

297{
298 struct stat stat_buf;
299
301
302 if (stat(DataDir, &stat_buf) != 0)
303 {
304 if (errno == ENOENT)
307 errmsg("data directory \"%s\" does not exist",
308 DataDir)));
309 else
312 errmsg("could not read permissions of directory \"%s\": %m",
313 DataDir)));
314 }
315
316 /* eventual chdir would fail anyway, but let's test ... */
317 if (!S_ISDIR(stat_buf.st_mode))
319 (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
320 errmsg("specified data directory \"%s\" is not a directory",
321 DataDir)));
322
323 /*
324 * Check that the directory belongs to my userid; if not, reject.
325 *
326 * This check is an essential part of the interlock that prevents two
327 * postmasters from starting in the same directory (see CreateLockFile()).
328 * Do not remove or weaken it.
329 *
330 * XXX can we safely enable this check on Windows?
331 */
332#if !defined(WIN32) && !defined(__CYGWIN__)
333 if (stat_buf.st_uid != geteuid())
335 (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
336 errmsg("data directory \"%s\" has wrong ownership",
337 DataDir),
338 errhint("The server must be started by the user that owns the data directory.")));
339#endif
340
341 /*
342 * Check if the directory has correct permissions. If not, reject.
343 *
344 * Only two possible modes are allowed, 0700 and 0750. The latter mode
345 * indicates that group read/execute should be allowed on all newly
346 * created files and directories.
347 *
348 * XXX temporarily suppress check when on Windows, because there may not
349 * be proper support for Unix-y file permissions. Need to think of a
350 * reasonable check to apply on Windows.
351 */
352#if !defined(WIN32) && !defined(__CYGWIN__)
353 if (stat_buf.st_mode & PG_MODE_MASK_GROUP)
355 (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
356 errmsg("data directory \"%s\" has invalid permissions",
357 DataDir),
358 errdetail("Permissions should be u=rwx (0700) or u=rwx,g=rx (0750).")));
359#endif
360
361 /*
362 * Reset creation modes and mask based on the mode of the data directory.
363 *
364 * The mask was set earlier in startup to disallow group permissions on
365 * newly created files and directories. However, if group read/execute
366 * are present on the data directory then modify the create modes and mask
367 * to allow group read/execute on newly created files and directories and
368 * set the data_directory_mode GUC.
369 *
370 * Suppress when on Windows, because there may not be proper support for
371 * Unix-y file permissions.
372 */
373#if !defined(WIN32) && !defined(__CYGWIN__)
374 SetDataDirectoryCreatePerm(stat_buf.st_mode);
375
376 umask(pg_mode_mask);
378#endif
379
380 /* Check for PG_VERSION */
382}
int errdetail(const char *fmt,...)
Definition: elog.c:1207
int errhint(const char *fmt,...)
Definition: elog.c:1321
int errcode(int sqlerrcode)
Definition: elog.c:854
void SetDataDirectoryCreatePerm(int dataDirMode)
Definition: file_perm.c:34
int pg_mode_mask
Definition: file_perm.c:25
int pg_dir_create_mode
Definition: file_perm.c:18
#define PG_MODE_MASK_GROUP
Definition: file_perm.h:29
int data_directory_mode
Definition: globals.c:77
void ValidatePgVersion(const char *path)
Definition: miscinit.c:1718
Definition: win32_port.h:255
#define stat
Definition: win32_port.h:274
#define S_ISDIR(m)
Definition: win32_port.h:315

References Assert(), data_directory_mode, DataDir, ereport, errcode(), errcode_for_file_access(), errdetail(), errhint(), errmsg(), FATAL, pg_dir_create_mode, pg_mode_mask, PG_MODE_MASK_GROUP, S_ISDIR, SetDataDirectoryCreatePerm(), stat::st_mode, stat::st_uid, stat, and ValidatePgVersion().

Referenced by BootstrapModeMain(), PostgresSingleUserMain(), and PostmasterMain().

CreateDataDirLockFile()

void CreateDataDirLockFile ( bool  amPostmaster )

Definition at line 1463 of file miscinit.c.

1464{
1465 CreateLockFile(DIRECTORY_LOCK_FILE, amPostmaster, "", true, DataDir);
1466}
static void CreateLockFile(const char *filename, bool amPostmaster, const char *socketDir, bool isDDLock, const char *refName)
Definition: miscinit.c:1158

References CreateLockFile(), DataDir, and DIRECTORY_LOCK_FILE.

Referenced by BootstrapModeMain(), PostgresSingleUserMain(), and PostmasterMain().

CreateLockFile()

static void CreateLockFile ( const char *  filename,
bool  amPostmaster,
const char *  socketDir,
bool  isDDLock,
const char *  refName 
)
static

Definition at line 1158 of file miscinit.c.

1161{
1162 int fd;
1163 char buffer[MAXPGPATH * 2 + 256];
1164 int ntries;
1165 int len;
1166 int encoded_pid;
1167 pid_t other_pid;
1168 pid_t my_pid,
1169 my_p_pid,
1170 my_gp_pid;
1171 const char *envvar;
1172
1173 /*
1174 * If the PID in the lockfile is our own PID or our parent's or
1175 * grandparent's PID, then the file must be stale (probably left over from
1176 * a previous system boot cycle). We need to check this because of the
1177 * likelihood that a reboot will assign exactly the same PID as we had in
1178 * the previous reboot, or one that's only one or two counts larger and
1179 * hence the lockfile's PID now refers to an ancestor shell process. We
1180 * allow pg_ctl to pass down its parent shell PID (our grandparent PID)
1181 * via the environment variable PG_GRANDPARENT_PID; this is so that
1182 * launching the postmaster via pg_ctl can be just as reliable as
1183 * launching it directly. There is no provision for detecting
1184 * further-removed ancestor processes, but if the init script is written
1185 * carefully then all but the immediate parent shell will be root-owned
1186 * processes and so the kill test will fail with EPERM. Note that we
1187 * cannot get a false negative this way, because an existing postmaster
1188 * would surely never launch a competing postmaster or pg_ctl process
1189 * directly.
1190 */
1191 my_pid = getpid();
1192
1193#ifndef WIN32
1194 my_p_pid = getppid();
1195#else
1196
1197 /*
1198 * Windows hasn't got getppid(), but doesn't need it since it's not using
1199 * real kill() either...
1200 */
1201 my_p_pid = 0;
1202#endif
1203
1204 envvar = getenv("PG_GRANDPARENT_PID");
1205 if (envvar)
1206 my_gp_pid = atoi(envvar);
1207 else
1208 my_gp_pid = 0;
1209
1210 /*
1211 * We need a loop here because of race conditions. But don't loop forever
1212 * (for example, a non-writable $PGDATA directory might cause a failure
1213 * that won't go away). 100 tries seems like plenty.
1214 */
1215 for (ntries = 0;; ntries++)
1216 {
1217 /*
1218 * Try to create the lock file --- O_EXCL makes this atomic.
1219 *
1220 * Think not to make the file protection weaker than 0600/0640. See
1221 * comments below.
1222 */
1223 fd = open(filename, O_RDWR | O_CREAT | O_EXCL, pg_file_create_mode);
1224 if (fd >= 0)
1225 break; /* Success; exit the retry loop */
1226
1227 /*
1228 * Couldn't create the pid file. Probably it already exists.
1229 */
1230 if ((errno != EEXIST && errno != EACCES) || ntries > 100)
1231 ereport(FATAL,
1233 errmsg("could not create lock file \"%s\": %m",
1234 filename)));
1235
1236 /*
1237 * Read the file to get the old owner's PID. Note race condition
1238 * here: file might have been deleted since we tried to create it.
1239 */
1240 fd = open(filename, O_RDONLY, pg_file_create_mode);
1241 if (fd < 0)
1242 {
1243 if (errno == ENOENT)
1244 continue; /* race condition; try again */
1245 ereport(FATAL,
1247 errmsg("could not open lock file \"%s\": %m",
1248 filename)));
1249 }
1250 pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_CREATE_READ);
1251 if ((len = read(fd, buffer, sizeof(buffer) - 1)) < 0)
1252 ereport(FATAL,
1254 errmsg("could not read lock file \"%s\": %m",
1255 filename)));
1257 close(fd);
1258
1259 if (len == 0)
1260 {
1261 ereport(FATAL,
1262 (errcode(ERRCODE_LOCK_FILE_EXISTS),
1263 errmsg("lock file \"%s\" is empty", filename),
1264 errhint("Either another server is starting, or the lock file is the remnant of a previous server startup crash.")));
1265 }
1266
1267 buffer[len] = '0円';
1268 encoded_pid = atoi(buffer);
1269
1270 /* if pid < 0, the pid is for postgres, not postmaster */
1271 other_pid = (pid_t) (encoded_pid < 0 ? -encoded_pid : encoded_pid);
1272
1273 if (other_pid <= 0)
1274 elog(FATAL, "bogus data in lock file \"%s\": \"%s\"",
1275 filename, buffer);
1276
1277 /*
1278 * Check to see if the other process still exists
1279 *
1280 * Per discussion above, my_pid, my_p_pid, and my_gp_pid can be
1281 * ignored as false matches.
1282 *
1283 * Normally kill() will fail with ESRCH if the given PID doesn't
1284 * exist.
1285 *
1286 * We can treat the EPERM-error case as okay because that error
1287 * implies that the existing process has a different userid than we
1288 * do, which means it cannot be a competing postmaster. A postmaster
1289 * cannot successfully attach to a data directory owned by a userid
1290 * other than its own, as enforced in checkDataDir(). Also, since we
1291 * create the lockfiles mode 0600/0640, we'd have failed above if the
1292 * lockfile belonged to another userid --- which means that whatever
1293 * process kill() is reporting about isn't the one that made the
1294 * lockfile. (NOTE: this last consideration is the only one that
1295 * keeps us from blowing away a Unix socket file belonging to an
1296 * instance of Postgres being run by someone else, at least on
1297 * machines where /tmp hasn't got a stickybit.)
1298 */
1299 if (other_pid != my_pid && other_pid != my_p_pid &&
1300 other_pid != my_gp_pid)
1301 {
1302 if (kill(other_pid, 0) == 0 ||
1303 (errno != ESRCH && errno != EPERM))
1304 {
1305 /* lockfile belongs to a live process */
1306 ereport(FATAL,
1307 (errcode(ERRCODE_LOCK_FILE_EXISTS),
1308 errmsg("lock file \"%s\" already exists",
1309 filename),
1310 isDDLock ?
1311 (encoded_pid < 0 ?
1312 errhint("Is another postgres (PID %d) running in data directory \"%s\"?",
1313 (int) other_pid, refName) :
1314 errhint("Is another postmaster (PID %d) running in data directory \"%s\"?",
1315 (int) other_pid, refName)) :
1316 (encoded_pid < 0 ?
1317 errhint("Is another postgres (PID %d) using socket file \"%s\"?",
1318 (int) other_pid, refName) :
1319 errhint("Is another postmaster (PID %d) using socket file \"%s\"?",
1320 (int) other_pid, refName))));
1321 }
1322 }
1323
1324 /*
1325 * No, the creating process did not exist. However, it could be that
1326 * the postmaster crashed (or more likely was kill -9'd by a clueless
1327 * admin) but has left orphan backends behind. Check for this by
1328 * looking to see if there is an associated shmem segment that is
1329 * still in use.
1330 *
1331 * Note: because postmaster.pid is written in multiple steps, we might
1332 * not find the shmem ID values in it; we can't treat that as an
1333 * error.
1334 */
1335 if (isDDLock)
1336 {
1337 char *ptr = buffer;
1338 unsigned long id1,
1339 id2;
1340 int lineno;
1341
1342 for (lineno = 1; lineno < LOCK_FILE_LINE_SHMEM_KEY; lineno++)
1343 {
1344 if ((ptr = strchr(ptr, '\n')) == NULL)
1345 break;
1346 ptr++;
1347 }
1348
1349 if (ptr != NULL &&
1350 sscanf(ptr, "%lu %lu", &id1, &id2) == 2)
1351 {
1352 if (PGSharedMemoryIsInUse(id1, id2))
1353 ereport(FATAL,
1354 (errcode(ERRCODE_LOCK_FILE_EXISTS),
1355 errmsg("pre-existing shared memory block (key %lu, ID %lu) is still in use",
1356 id1, id2),
1357 errhint("Terminate any old server processes associated with data directory \"%s\".",
1358 refName)));
1359 }
1360 }
1361
1362 /*
1363 * Looks like nobody's home. Unlink the file and try again to create
1364 * it. Need a loop because of possible race condition against other
1365 * would-be creators.
1366 */
1367 if (unlink(filename) < 0)
1368 ereport(FATAL,
1370 errmsg("could not remove old lock file \"%s\": %m",
1371 filename),
1372 errhint("The file seems accidentally left over, but "
1373 "it could not be removed. Please remove the file "
1374 "by hand and try again.")));
1375 }
1376
1377 /*
1378 * Successfully created the file, now fill it. See comment in pidfile.h
1379 * about the contents. Note that we write the same first five lines into
1380 * both datadir and socket lockfiles; although more stuff may get added to
1381 * the datadir lockfile later.
1382 */
1383 snprintf(buffer, sizeof(buffer), "%d\n%s\n" INT64_FORMAT "\n%d\n%s\n",
1384 amPostmaster ? (int) my_pid : -((int) my_pid),
1385 DataDir,
1388 socketDir);
1389
1390 /*
1391 * In a standalone backend, the next line (LOCK_FILE_LINE_LISTEN_ADDR)
1392 * will never receive data, so fill it in as empty now.
1393 */
1394 if (isDDLock && !amPostmaster)
1395 strlcat(buffer, "\n", sizeof(buffer));
1396
1397 errno = 0;
1398 pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_CREATE_WRITE);
1399 if (write(fd, buffer, strlen(buffer)) != strlen(buffer))
1400 {
1401 int save_errno = errno;
1402
1403 close(fd);
1404 unlink(filename);
1405 /* if write didn't set errno, assume problem is no disk space */
1406 errno = save_errno ? save_errno : ENOSPC;
1407 ereport(FATAL,
1409 errmsg("could not write lock file \"%s\": %m", filename)));
1410 }
1412
1413 pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_CREATE_SYNC);
1414 if (pg_fsync(fd) != 0)
1415 {
1416 int save_errno = errno;
1417
1418 close(fd);
1419 unlink(filename);
1420 errno = save_errno;
1421 ereport(FATAL,
1423 errmsg("could not write lock file \"%s\": %m", filename)));
1424 }
1426 if (close(fd) != 0)
1427 {
1428 int save_errno = errno;
1429
1430 unlink(filename);
1431 errno = save_errno;
1432 ereport(FATAL,
1434 errmsg("could not write lock file \"%s\": %m", filename)));
1435 }
1436
1437 /*
1438 * Arrange to unlink the lock file(s) at proc_exit. If this is the first
1439 * one, set up the on_proc_exit function to do it; then add this lock file
1440 * to the list of files to unlink.
1441 */
1442 if (lock_files == NIL)
1444
1445 /*
1446 * Use lcons so that the lock files are unlinked in reverse order of
1447 * creation; this is critical!
1448 */
1450}
#define INT64_FORMAT
Definition: c.h:556
#define elog(elevel,...)
Definition: elog.h:226
int pg_file_create_mode
Definition: file_perm.c:19
pg_time_t MyStartTime
Definition: globals.c:48
#define write(a, b, c)
Definition: win32.h:14
void on_proc_exit(pg_on_exit_callback function, Datum arg)
Definition: ipc.c:309
List * lcons(void *datum, List *list)
Definition: list.c:495
char * pstrdup(const char *in)
Definition: mcxt.c:1759
static List * lock_files
Definition: miscinit.c:67
static void UnlinkLockFiles(int status, Datum arg)
Definition: miscinit.c:1124
#define MAXPGPATH
static char * filename
Definition: pg_dumpall.c:120
#define NIL
Definition: pg_list.h:68
#define LOCK_FILE_LINE_SHMEM_KEY
Definition: pidfile.h:43
size_t strlcat(char *dst, const char *src, size_t siz)
Definition: strlcat.c:33
int PostPortNumber
Definition: postmaster.c:203
bool PGSharedMemoryIsInUse(unsigned long id1, unsigned long id2)
Definition: sysv_shmem.c:317
#define kill(pid, sig)
Definition: win32_port.h:493

References close, DataDir, elog, ereport, errcode(), errcode_for_file_access(), errhint(), errmsg(), FATAL, fd(), filename, INT64_FORMAT, kill, lcons(), len, LOCK_FILE_LINE_SHMEM_KEY, lock_files, MAXPGPATH, MyStartTime, NIL, on_proc_exit(), pg_file_create_mode, pg_fsync(), PGSharedMemoryIsInUse(), pgstat_report_wait_end(), pgstat_report_wait_start(), PostPortNumber, pstrdup(), read, snprintf, strlcat(), UnlinkLockFiles(), and write.

Referenced by CreateDataDirLockFile(), and CreateSocketLockFile().

CreateSocketLockFile()

void CreateSocketLockFile ( const char *  socketfile,
bool  amPostmaster,
const char *  socketDir 
)

Definition at line 1472 of file miscinit.c.

1474{
1475 char lockfile[MAXPGPATH];
1476
1477 snprintf(lockfile, sizeof(lockfile), "%s.lock", socketfile);
1478 CreateLockFile(lockfile, amPostmaster, socketDir, false, socketfile);
1479}

References CreateLockFile(), MAXPGPATH, and snprintf.

Referenced by Lock_AF_UNIX().

EstimateClientConnectionInfoSpace()

Size EstimateClientConnectionInfoSpace ( void  )

Definition at line 1035 of file miscinit.c.

1036{
1037 Size size = 0;
1038
1039 size = add_size(size, sizeof(SerializedClientConnectionInfo));
1040
1042 size = add_size(size, strlen(MyClientConnectionInfo.authn_id) + 1);
1043
1044 return size;
1045}
size_t Size
Definition: c.h:610
ClientConnectionInfo MyClientConnectionInfo
Definition: miscinit.c:1018
Size add_size(Size s1, Size s2)
Definition: shmem.c:493
const char * authn_id
Definition: libpq-be.h:99

References add_size(), ClientConnectionInfo::authn_id, and MyClientConnectionInfo.

Referenced by InitializeParallelDSM().

GetAuthenticatedUserId()

Oid GetAuthenticatedUserId ( void  )

Definition at line 545 of file miscinit.c.

546{
548 return AuthenticatedUserId;
549}
#define OidIsValid(objectId)
Definition: c.h:774
static Oid AuthenticatedUserId
Definition: miscinit.c:449

References Assert(), AuthenticatedUserId, and OidIsValid.

Referenced by check_session_authorization(), and InitializeParallelDSM().

GetBackendTypeDesc()

const char * GetBackendTypeDesc ( BackendType  backendType )

Definition at line 263 of file miscinit.c.

264{
265 const char *backendDesc = gettext_noop("unknown process type");
266
267 switch (backendType)
268 {
269#define PG_PROCTYPE(bktype, description, main_func, shmem_attach) \
270 case bktype: backendDesc = description; break;
272#undef PG_PROCTYPE
273 }
274 return backendDesc;
275}
#define gettext_noop(x)
Definition: c.h:1195

References gettext_noop.

Referenced by BackendInitialize(), BackendStartup(), CleanupBackend(), CountChildren(), get_backend_type_for_log(), init_ps_display(), pg_stat_get_activity(), pg_stat_io_build_tuples(), and signal_child().

GetCurrentRoleId()

Oid GetCurrentRoleId ( void  )

Definition at line 935 of file miscinit.c.

936{
937 if (SetRoleIsActive)
938 return OuterUserId;
939 else
940 return InvalidOid;
941}
static Oid OuterUserId
Definition: miscinit.c:451
static bool SetRoleIsActive
Definition: miscinit.c:461
#define InvalidOid
Definition: postgres_ext.h:37

References InvalidOid, OuterUserId, and SetRoleIsActive.

Referenced by check_role(), InitializeParallelDSM(), and show_role().

GetOuterUserId()

Oid GetOuterUserId ( void  )

Definition at line 480 of file miscinit.c.

481{
483 return OuterUserId;
484}

References Assert(), OidIsValid, and OuterUserId.

Referenced by DropRole(), and RenameRole().

GetSessionUserId()

Oid GetSessionUserId ( void  )

Definition at line 508 of file miscinit.c.

509{
511 return SessionUserId;
512}
static Oid SessionUserId
Definition: miscinit.c:450

References Assert(), OidIsValid, and SessionUserId.

Referenced by check_role(), check_session_authorization(), DropRole(), get_rolespec_oid(), get_rolespec_tuple(), InitializeParallelDSM(), InitPostgres(), pgstat_bestart_final(), RenameRole(), and session_user().

GetSessionUserIsSuperuser()

bool GetSessionUserIsSuperuser ( void  )

Definition at line 515 of file miscinit.c.

516{
519}
static bool SessionUserIsSuperuser
Definition: miscinit.c:456

References Assert(), OidIsValid, SessionUserId, and SessionUserIsSuperuser.

Referenced by check_session_authorization(), and InitializeParallelDSM().

GetSystemUser()

const char * GetSystemUser ( void  )

Definition at line 535 of file miscinit.c.

536{
537 return SystemUser;
538}
static const char * SystemUser
Definition: miscinit.c:453

References SystemUser.

Referenced by system_user().

GetUserId()

Oid GetUserId ( void  )

Definition at line 469 of file miscinit.c.

470{
472 return CurrentUserId;
473}
static Oid CurrentUserId
Definition: miscinit.c:452

References Assert(), CurrentUserId, and OidIsValid.

Referenced by AfterTriggerSaveEvent(), AggregateCreate(), all_rows_selectable(), AlterCollation(), AlterDatabase(), AlterDatabaseOwner(), AlterDatabaseRefreshColl(), AlterDatabaseSet(), AlterEventTrigger(), AlterEventTriggerOwner_internal(), AlterExtensionNamespace(), AlterForeignServer(), AlterForeignServerOwner_internal(), AlterFunction(), AlterObjectNamespace_internal(), AlterObjectOwner_internal(), AlterObjectRename_internal(), AlterOperator(), AlterOpFamilyAdd(), AlterPublication(), AlterPublicationOwner_internal(), AlterRole(), AlterRoleSet(), AlterSchemaOwner_internal(), AlterStatistics(), AlterSubscription(), AlterSubscriptionOwner_internal(), AlterSystemSetConfigFile(), AlterTableMoveAll(), AlterTableSpaceOptions(), AlterTSConfiguration(), AlterTSDictionary(), AlterType(), AlterTypeNamespace_oid(), AlterTypeOwner(), ATExecChangeOwner(), ATPrepAlterColumnType(), ATPrepSetTableSpace(), ATSimplePermissions(), bbsink_server_new(), be_lo_unlink(), binary_upgrade_create_empty_extension(), binary_upgrade_logical_slot_has_caught_up(), brin_desummarize_range(), BuildCachedPlan(), BuildDescForRelation(), BuildIndexValueDescription(), calculate_database_size(), calculate_tablespace_size(), call_pltcl_start_proc(), check_enable_rls(), check_search_path(), check_temp_tablespaces(), CheckCachedPlan(), checkDomainOwner(), checkEnumOwner(), checkFkeyPermissions(), CheckFunctionValidatorAccess(), CheckMyDatabase(), CheckSlotPermissions(), CommentObject(), compile_plperl_function(), compile_pltcl_function(), CompleteCachedPlan(), compute_return_type(), ConfigOptionIsVisible(), convert_and_check_filename(), CreateCast(), CreateConversionCommand(), createdb(), CreateEventTrigger(), CreateExtensionInternal(), CreateForeignDataWrapper(), CreateForeignServer(), CreateForeignTable(), CreateFunction(), CreateOpFamily(), CreateProceduralLanguage(), CreatePublication(), CreateRole(), CreateStatistics(), CreateSubscription(), CreateTableSpace(), CreateTransform(), CreateTriggerFiringOn(), current_user(), currtid_internal(), currval_oid(), DefineAggregate(), DefineCollation(), DefineDomain(), DefineEnum(), DefineIndex(), DefineOpClass(), DefineOperator(), DefineOpFamily(), DefineQueryRewrite(), DefineRange(), DefineRelation(), DefineTSConfiguration(), DefineTSDictionary(), DefineType(), do_setval(), DoCopy(), dropdb(), DropOwnedObjects(), DropRole(), DropSubscription(), DropTableSpace(), emit_audit_message(), EnableDisableRule(), ExecAlterDefaultPrivilegesStmt(), ExecAlterExtensionContentsStmt(), ExecAlterExtensionStmt(), ExecAlterObjectDependsStmt(), ExecBuildGroupingEqual(), ExecBuildParamSetEqual(), ExecBuildSlotPartitionKeyDescription(), ExecBuildSlotValueDescription(), ExecCheckOneRelPerms(), ExecCheckpoint(), ExecGetResultRelCheckAsUser(), ExecGrant_Attribute(), ExecGrant_common(), ExecGrant_Largeobject(), ExecGrant_Parameter(), ExecGrant_Relation(), ExecInitAgg(), ExecInitExprRec(), ExecInitFunc(), ExecInitWindowAgg(), ExecReindex(), ExecSecLabelStmt(), execute_extension_script(), ExecuteCallStmt(), ExecuteDoStmt(), ExecuteGrantStmt(), ExecuteTruncateGuts(), extension_is_trusted(), file_fdw_validator(), findRangeCanonicalFunction(), findRangeSubtypeDiffFunction(), FinishPreparedTransaction(), fmgr_security_definer(), get_connect_string(), get_other_operator(), get_rel_from_relname(), get_rolespec_oid(), get_rolespec_tuple(), get_row_security_policies(), get_tables_to_cluster(), get_tables_to_cluster_partitioned(), GetConfigOptionValues(), gin_clean_pending_list(), GrantRole(), HandleFunctionRequest(), has_any_column_privilege_id(), has_any_column_privilege_name(), has_column_privilege_id_attnum(), has_column_privilege_id_name(), has_column_privilege_name_attnum(), has_column_privilege_name_name(), has_database_privilege_id(), has_database_privilege_name(), has_foreign_data_wrapper_privilege_id(), has_foreign_data_wrapper_privilege_name(), has_function_privilege_id(), has_function_privilege_name(), has_language_privilege_id(), has_language_privilege_name(), has_largeobject_privilege_id(), has_parameter_privilege_name(), has_schema_privilege_id(), has_schema_privilege_name(), has_sequence_privilege_id(), has_sequence_privilege_name(), has_server_privilege_id(), has_server_privilege_name(), has_table_privilege_id(), has_table_privilege_name(), has_tablespace_privilege_id(), has_tablespace_privilege_name(), has_type_privilege_id(), has_type_privilege_name(), have_createdb_privilege(), have_createrole_privilege(), heap_force_common(), ImportForeignSchema(), init_sexpr(), InitializeSearchPath(), InitPostgres(), InitTempTableNamespace(), inline_function(), inline_set_returning_function(), insert_username(), interpret_function_parameter_list(), inv_create(), inv_open(), LargeObjectCreate(), lastval(), LockViewRecurse(), LogicalRepSyncTableStart(), lookup_agg_function(), LookupCreationNamespace(), LookupExplicitNamespace(), MergeAttributes(), movedb(), nextval_internal(), OperatorCreate(), OperatorShellMake(), pg_get_sequence_data(), pg_has_role_id(), pg_has_role_name(), pg_import_system_collations(), pg_prewarm(), pg_sequence_last_value(), pg_sequence_parameters(), pg_signal_backend(), pg_stat_get_wal_receiver(), pg_stat_get_wal_senders(), pg_stat_statements_internal(), pgrowlocks(), pgss_store(), pgstat_get_backend_current_activity(), pltcl_fetch_interp(), postgresBeginDirectModify(), postgresBeginForeignScan(), postgresExecForeignTruncate(), postgresGetForeignRelSize(), postgresImportForeignSchema(), PrepareTempTablespaces(), PrepareTransaction(), PublicationAddTables(), RangeVarCallbackForAlterRelation(), RangeVarCallbackForDropRelation(), RangeVarCallbackForLockTable(), RangeVarCallbackForPolicy(), RangeVarCallbackForReindexIndex(), RangeVarCallbackForRenameRule(), RangeVarCallbackForRenameTrigger(), RangeVarCallbackMaintainsTable(), RangeVarCallbackOwnsRelation(), RangeVarGetAndCheckCreationNamespace(), ReassignOwnedObjects(), recomputeNamespacePath(), REGRESS_exec_check_perms(), REGRESS_object_access_hook(), REGRESS_object_access_hook_str(), REGRESS_utility_command(), ReindexMultipleInternal(), ReindexMultipleTables(), RemoveObjects(), renameatt_check(), RenameDatabase(), RenameRole(), RenameSchema(), RenameTableSpace(), RenameType(), RevalidateCachedQuery(), RI_Initial_Check(), ri_ReportViolation(), select_perl_context(), set_config_option(), set_foreign_rel_properties(), shell_check_detail(), stats_lock_check_privileges(), superuser(), TargetPrivilegesCheck(), TerminateOtherDBBackends(), transformTableLikeClause(), truncate_check_perms(), user_mapping_ddl_aclcheck(), vacuum_is_permitted_for_relation(), validate_option_array_item(), ValidateJoinEstimator(), ValidateOperatorReference(), and ValidateRestrictionEstimator().

GetUserIdAndContext()

void GetUserIdAndContext ( Oiduserid,
bool *  sec_def_context 
)

Definition at line 661 of file miscinit.c.

662{
663 *userid = CurrentUserId;
664 *sec_def_context = InLocalUserIdChange();
665}
bool InLocalUserIdChange(void)
Definition: miscinit.c:630

References CurrentUserId, and InLocalUserIdChange().

GetUserIdAndSecContext()

void GetUserIdAndSecContext ( Oiduserid,
int *  sec_context 
)

Definition at line 612 of file miscinit.c.

613{
614 *userid = CurrentUserId;
615 *sec_context = SecurityRestrictionContext;
616}
static int SecurityRestrictionContext
Definition: miscinit.c:458

References CurrentUserId, and SecurityRestrictionContext.

Referenced by AfterTriggerExecute(), amcheck_lock_relation_and_check(), brin_summarize_range(), cluster_rel(), ComputeIndexAttrs(), CreateSchemaCommand(), DefineIndex(), do_analyze_rel(), execute_extension_script(), fmgr_security_definer(), index_build(), index_concurrently_build(), InitializeParallelDSM(), PushTransaction(), RefreshMatViewByOid(), reindex_index(), ReindexRelationConcurrently(), ri_PerformCheck(), ri_PlanCheck(), StartTransaction(), SwitchToUntrustedUser(), vacuum_rel(), and validate_index().

GetUserNameFromId()

char * GetUserNameFromId ( Oid  roleid,
bool  noerr 
)

Definition at line 988 of file miscinit.c.

989{
990 HeapTuple tuple;
991 char *result;
992
993 tuple = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
994 if (!HeapTupleIsValid(tuple))
995 {
996 if (!noerr)
998 (errcode(ERRCODE_UNDEFINED_OBJECT),
999 errmsg("invalid role OID: %u", roleid)));
1000 result = NULL;
1001 }
1002 else
1003 {
1004 result = pstrdup(NameStr(((Form_pg_authid) GETSTRUCT(tuple))->rolname));
1005 ReleaseSysCache(tuple);
1006 }
1007 return result;
1008}
#define NameStr(name)
Definition: c.h:751
#define ERROR
Definition: elog.h:39
#define HeapTupleIsValid(tuple)
Definition: htup.h:78
static void * GETSTRUCT(const HeapTupleData *tuple)
Definition: htup_details.h:728
NameData rolname
Definition: pg_authid.h:34
FormData_pg_authid * Form_pg_authid
Definition: pg_authid.h:56
static Datum ObjectIdGetDatum(Oid X)
Definition: postgres.h:262
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:264
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:220

References ereport, errcode(), errmsg(), ERROR, GETSTRUCT(), HeapTupleIsValid, NameStr, ObjectIdGetDatum(), pstrdup(), ReleaseSysCache(), rolname, and SearchSysCache1().

Referenced by AddRoleMems(), check_can_set_role(), check_object_ownership(), check_role_grantor(), check_role_membership_authorization(), current_user(), DelRoleMems(), DropOwnedObjects(), execute_extension_script(), getObjectDescription(), getObjectIdentityParts(), insert_username(), LogicalRepSyncTableStart(), ReassignOwnedObjects(), regroleout(), session_user(), SwitchToUntrustedUser(), and TargetPrivilegesCheck().

has_rolreplication()

bool has_rolreplication ( Oid  roleid )

Definition at line 688 of file miscinit.c.

689{
690 bool result = false;
691 HeapTuple utup;
692
693 /* Superusers bypass all permission checking. */
694 if (superuser_arg(roleid))
695 return true;
696
697 utup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
698 if (HeapTupleIsValid(utup))
699 {
700 result = ((Form_pg_authid) GETSTRUCT(utup))->rolreplication;
701 ReleaseSysCache(utup);
702 }
703 return result;
704}
bool rolreplication
Definition: pg_authid.h:40
bool superuser_arg(Oid roleid)
Definition: superuser.c:56

References GETSTRUCT(), HeapTupleIsValid, ObjectIdGetDatum(), ReleaseSysCache(), rolreplication, SearchSysCache1(), and superuser_arg().

Referenced by AlterRole(), binary_upgrade_logical_slot_has_caught_up(), CheckSlotPermissions(), CreateRole(), and InitPostgres().

InitializeSessionUserId()

void InitializeSessionUserId ( const char *  rolename,
Oid  roleid,
bool  bypass_login_check 
)

Definition at line 710 of file miscinit.c.

712{
713 HeapTuple roleTup;
714 Form_pg_authid rform;
715 char *rname;
716 bool is_superuser;
717
718 /*
719 * In a parallel worker, we don't have to do anything here.
720 * ParallelWorkerMain already set our output variables, and we aren't
721 * going to enforce either rolcanlogin or rolconnlimit. Furthermore, we
722 * don't really want to perform a catalog lookup for the role: we don't
723 * want to fail if it's been dropped.
724 */
726 {
727 Assert(bypass_login_check);
728 return;
729 }
730
731 /*
732 * Don't do scans if we're bootstrapping, none of the system catalogs
733 * exist yet, and they should be owned by postgres anyway.
734 */
736
737 /*
738 * Make sure syscache entries are flushed for recent catalog changes. This
739 * allows us to find roles that were created on-the-fly during
740 * authentication.
741 */
743
744 /*
745 * Look up the role, either by name if that's given or by OID if not.
746 */
747 if (rolename != NULL)
748 {
749 roleTup = SearchSysCache1(AUTHNAME, PointerGetDatum(rolename));
750 if (!HeapTupleIsValid(roleTup))
752 (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
753 errmsg("role \"%s\" does not exist", rolename)));
754 }
755 else
756 {
757 roleTup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(roleid));
758 if (!HeapTupleIsValid(roleTup))
760 (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
761 errmsg("role with OID %u does not exist", roleid)));
762 }
763
764 rform = (Form_pg_authid) GETSTRUCT(roleTup);
765 roleid = rform->oid;
766 rname = NameStr(rform->rolname);
767 is_superuser = rform->rolsuper;
768
770
771 /*
772 * Set SessionUserId and related variables, including "role", via the GUC
773 * mechanisms.
774 *
775 * Note: ideally we would use PGC_S_DYNAMIC_DEFAULT here, so that
776 * session_authorization could subsequently be changed from
777 * pg_db_role_setting entries. Instead, session_authorization in
778 * pg_db_role_setting has no effect. Changing that would require solving
779 * two problems:
780 *
781 * 1. If pg_db_role_setting has values for both session_authorization and
782 * role, we could not be sure which order those would be applied in, and
783 * it would matter.
784 *
785 * 2. Sites may have years-old session_authorization entries. There's not
786 * been any particular reason to remove them. Ending the dormancy of
787 * those entries could seriously change application behavior, so only a
788 * major release should do that.
789 */
790 SetConfigOption("session_authorization", rname,
792
793 /*
794 * These next checks are not enforced when in standalone mode, so that
795 * there is a way to recover from sillinesses like "UPDATE pg_authid SET
796 * rolcanlogin = false;".
797 */
799 {
800 /*
801 * Is role allowed to login at all? (But background workers can
802 * override this by setting bypass_login_check.)
803 */
804 if (!bypass_login_check && !rform->rolcanlogin)
806 (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
807 errmsg("role \"%s\" is not permitted to log in",
808 rname)));
809
810 /*
811 * Check connection limit for this role. We enforce the limit only
812 * for regular backends, since other process types have their own
813 * PGPROC pools.
814 *
815 * There is a race condition here --- we create our PGPROC before
816 * checking for other PGPROCs. If two backends did this at about the
817 * same time, they might both think they were over the limit, while
818 * ideally one should succeed and one fail. Getting that to work
819 * exactly seems more trouble than it is worth, however; instead we
820 * just document that the connection limit is approximate.
821 */
822 if (rform->rolconnlimit >= 0 &&
824 !is_superuser &&
825 CountUserBackends(roleid) > rform->rolconnlimit)
827 (errcode(ERRCODE_TOO_MANY_CONNECTIONS),
828 errmsg("too many connections for role \"%s\"",
829 rname)));
830 }
831
832 ReleaseSysCache(roleTup);
833}
bool InitializingParallelWorker
Definition: parallel.c:121
bool IsUnderPostmaster
Definition: globals.c:120
void SetConfigOption(const char *name, const char *value, GucContext context, GucSource source)
Definition: guc.c:4337
@ PGC_S_OVERRIDE
Definition: guc.h:123
@ PGC_BACKEND
Definition: guc.h:77
void AcceptInvalidationMessages(void)
Definition: inval.c:930
#define IsBootstrapProcessingMode()
Definition: miscadmin.h:476
#define AmRegularBackendProcess()
Definition: miscadmin.h:380
void SetAuthenticatedUserId(Oid userid)
Definition: miscinit.c:552
static bool is_superuser(Archive *fout)
Definition: pg_dump.c:5040
static Datum PointerGetDatum(const void *X)
Definition: postgres.h:332
int CountUserBackends(Oid roleid)
Definition: procarray.c:3662

References AcceptInvalidationMessages(), AmRegularBackendProcess, Assert(), CountUserBackends(), ereport, errcode(), errmsg(), FATAL, GETSTRUCT(), HeapTupleIsValid, InitializingParallelWorker, is_superuser(), IsBootstrapProcessingMode, IsUnderPostmaster, NameStr, ObjectIdGetDatum(), PGC_BACKEND, PGC_S_OVERRIDE, PointerGetDatum(), ReleaseSysCache(), SearchSysCache1(), SetAuthenticatedUserId(), and SetConfigOption().

Referenced by InitPostgres().

InitializeSessionUserIdStandalone()

void InitializeSessionUserIdStandalone ( void  )

Definition at line 840 of file miscinit.c.

841{
842 /*
843 * This function should only be called in single-user mode, in autovacuum
844 * workers, in slot sync worker and in background workers.
845 */
848
849 /* call only once */
851
852 AuthenticatedUserId = BOOTSTRAP_SUPERUSERID;
853
854 /*
855 * XXX Ideally we'd do this via SetConfigOption("session_authorization"),
856 * but we lack the role name needed to do that, and we can't fetch it
857 * because one reason for this special case is to be able to start up even
858 * if something's happened to the BOOTSTRAP_SUPERUSERID's pg_authid row.
859 * Since we don't set the GUC itself, C code will see the value as NULL,
860 * and current_setting() will report an empty string within this session.
861 */
862 SetSessionAuthorization(BOOTSTRAP_SUPERUSERID, true);
863
864 /* We could do SetConfigOption("role"), but let's be consistent */
866}
#define AmAutoVacuumWorkerProcess()
Definition: miscadmin.h:382
#define AmBackgroundWorkerProcess()
Definition: miscadmin.h:383
#define AmLogicalSlotSyncWorkerProcess()
Definition: miscadmin.h:385
void SetSessionAuthorization(Oid userid, bool is_superuser)
Definition: miscinit.c:920
void SetCurrentRoleId(Oid roleid, bool is_superuser)
Definition: miscinit.c:956

References AmAutoVacuumWorkerProcess, AmBackgroundWorkerProcess, AmLogicalSlotSyncWorkerProcess, Assert(), AuthenticatedUserId, InvalidOid, IsUnderPostmaster, OidIsValid, SetCurrentRoleId(), and SetSessionAuthorization().

Referenced by InitPostgres().

InitializeSystemUser()

void InitializeSystemUser ( const char *  authn_id,
const char *  auth_method 
)

Definition at line 874 of file miscinit.c.

875{
876 char *system_user;
877
878 /* call only once */
879 Assert(SystemUser == NULL);
880
881 /*
882 * InitializeSystemUser should be called only when authn_id is not NULL,
883 * meaning that auth_method is valid.
884 */
885 Assert(authn_id != NULL);
886
887 system_user = psprintf("%s:%s", auth_method, authn_id);
888
889 /* Store SystemUser in long-lived storage */
892}
char * MemoryContextStrdup(MemoryContext context, const char *string)
Definition: mcxt.c:1746
void pfree(void *pointer)
Definition: mcxt.c:1594
MemoryContext TopMemoryContext
Definition: mcxt.c:166
Datum system_user(PG_FUNCTION_ARGS)
Definition: miscinit.c:898
char * psprintf(const char *fmt,...)
Definition: psprintf.c:43
static char * authn_id
Definition: validator.c:41

References Assert(), authn_id, MemoryContextStrdup(), pfree(), psprintf(), system_user(), SystemUser, and TopMemoryContext.

Referenced by InitPostgres(), and ParallelWorkerMain().

InitPostmasterChild()

void InitPostmasterChild ( void  )

Definition at line 96 of file miscinit.c.

97{
98 IsUnderPostmaster = true; /* we are a postmaster subprocess now */
99
100 /*
101 * Start our win32 signal implementation. This has to be done after we
102 * read the backend variables, because we need to pick up the signal pipe
103 * from the parent process.
104 */
105#ifdef WIN32
107#endif
108
110
111 /*
112 * make sure stderr is in binary mode before anything can possibly be
113 * written to it, in case it's actually the syslogger pipe, so the pipe
114 * chunking protocol isn't disturbed. Non-logpipe data gets translated on
115 * redirection (e.g. via pg_ctl -l) anyway.
116 */
117#ifdef WIN32
118 _setmode(fileno(stderr), _O_BINARY);
119#endif
120
121 /* We don't want the postmaster's proc_exit() handlers */
123
124 /* In EXEC_BACKEND case we will not have inherited BlockSig etc values */
125#ifdef EXEC_BACKEND
126 pqinitmask();
127#endif
128
129 /* Initialize process-local latch support */
133
134 /*
135 * If possible, make this process a group leader, so that the postmaster
136 * can signal any child processes too. Not all processes will have
137 * children, but for consistency we make all postmaster child processes do
138 * this.
139 */
140#ifdef HAVE_SETSID
141 if (setsid() < 0)
142 elog(FATAL, "setsid() failed: %m");
143#endif
144
145 /*
146 * Every postmaster child process is expected to respond promptly to
147 * SIGQUIT at all times. Therefore we centrally remove SIGQUIT from
148 * BlockSig and install a suitable signal handler. (Client-facing
149 * processes may choose to replace this default choice of handler with
150 * quickdie().) All other blockable signals remain blocked for now.
151 */
153
154 sigdelset(&BlockSig, SIGQUIT);
155 sigprocmask(SIG_SETMASK, &BlockSig, NULL);
156
157 /* Request a signal if the postmaster dies, if possible. */
159
160 /* Don't give the pipe to subprograms that we execute. */
161#ifndef WIN32
162 if (fcntl(postmaster_alive_fds[POSTMASTER_FD_WATCH], F_SETFD, FD_CLOEXEC) < 0)
165 errmsg_internal("could not set postmaster death monitoring pipe to FD_CLOEXEC mode: %m")));
166#endif
167}
void pqinitmask(void)
Definition: pqsignal.c:41
sigset_t BlockSig
Definition: pqsignal.c:23
int errcode_for_socket_access(void)
Definition: elog.c:954
int errmsg_internal(const char *fmt,...)
Definition: elog.c:1161
void SignalHandlerForCrashExit(SIGNAL_ARGS)
Definition: interrupt.c:73
void on_exit_reset(void)
Definition: ipc.c:416
void InitializeLatchWaitSet(void)
Definition: latch.c:35
void InitProcessLocalLatch(void)
Definition: miscinit.c:235
void PostmasterDeathSignalInit(void)
Definition: pmsignal.c:407
#define pqsignal
Definition: port.h:531
void InitProcessGlobals(void)
Definition: postmaster.c:1935
int postmaster_alive_fds[2]
Definition: postmaster.c:483
#define POSTMASTER_FD_WATCH
Definition: postmaster.h:83
void pgwin32_signal_initialize(void)
Definition: signal.c:79
void InitializeWaitEventSupport(void)
Definition: waiteventset.c:241
#define SIGQUIT
Definition: win32_port.h:159

References BlockSig, elog, ereport, errcode_for_socket_access(), errmsg_internal(), FATAL, InitializeLatchWaitSet(), InitializeWaitEventSupport(), InitProcessGlobals(), InitProcessLocalLatch(), IsUnderPostmaster, on_exit_reset(), pgwin32_signal_initialize(), postmaster_alive_fds, POSTMASTER_FD_WATCH, PostmasterDeathSignalInit(), pqinitmask(), pqsignal, SignalHandlerForCrashExit(), and SIGQUIT.

Referenced by postmaster_child_launch().

InitProcessLocalLatch()

void InitProcessLocalLatch ( void  )

Definition at line 235 of file miscinit.c.

236{
239}
struct Latch * MyLatch
Definition: globals.c:63
void InitLatch(Latch *latch)
Definition: latch.c:63
static Latch LocalLatchData
Definition: miscinit.c:69

References InitLatch(), LocalLatchData, and MyLatch.

Referenced by InitPostmasterChild(), InitStandaloneProcess(), and PostmasterMain().

InitStandaloneProcess()

void InitStandaloneProcess ( const char *  argv0 )

Definition at line 175 of file miscinit.c.

176{
178
180
181 /*
182 * Start our win32 signal implementation
183 */
184#ifdef WIN32
186#endif
187
189
190 /* Initialize process-local latch support */
194
195 /*
196 * For consistency with InitPostmasterChild, initialize signal mask here.
197 * But we don't unblock SIGQUIT or provide a default handler for it.
198 */
199 pqinitmask();
200 sigprocmask(SIG_SETMASK, &BlockSig, NULL);
201
202 /* Compute paths, no postmaster to inherit from */
203 if (my_exec_path[0] == '0円')
204 {
206 elog(FATAL, "%s: could not locate my own executable path",
207 argv0);
208 }
209
210 if (pkglib_path[0] == '0円')
212}
int find_my_exec(const char *argv0, char *retpath)
Definition: exec.c:161
char pkglib_path[MAXPGPATH]
Definition: globals.c:82
bool IsPostmasterEnvironment
Definition: globals.c:119
char my_exec_path[MAXPGPATH]
Definition: globals.c:81
@ B_STANDALONE_BACKEND
Definition: miscadmin.h:349
BackendType MyBackendType
Definition: miscinit.c:64
static char * argv0
Definition: pg_ctl.c:93
void get_pkglib_path(const char *my_exec_path, char *ret_path)
Definition: path.c:956

References argv0, Assert(), B_STANDALONE_BACKEND, BlockSig, elog, FATAL, find_my_exec(), get_pkglib_path(), InitializeLatchWaitSet(), InitializeWaitEventSupport(), InitProcessGlobals(), InitProcessLocalLatch(), IsPostmasterEnvironment, my_exec_path, MyBackendType, pgwin32_signal_initialize(), pkglib_path, and pqinitmask().

Referenced by BootstrapModeMain(), and PostgresSingleUserMain().

InLocalUserIdChange()

bool InLocalUserIdChange ( void  )

Definition at line 630 of file miscinit.c.

631{
633}
#define SECURITY_LOCAL_USERID_CHANGE
Definition: miscadmin.h:317

References SECURITY_LOCAL_USERID_CHANGE, and SecurityRestrictionContext.

Referenced by GetUserIdAndContext(), and set_config_with_handle().

InNoForceRLSOperation()

bool InNoForceRLSOperation ( void  )

Definition at line 648 of file miscinit.c.

649{
651}
#define SECURITY_NOFORCE_RLS
Definition: miscadmin.h:319

References SECURITY_NOFORCE_RLS, and SecurityRestrictionContext.

Referenced by check_enable_rls().

InSecurityRestrictedOperation()

bool InSecurityRestrictedOperation ( void  )

Definition at line 639 of file miscinit.c.

640{
642}
#define SECURITY_RESTRICTED_OPERATION
Definition: miscadmin.h:318

References SECURITY_RESTRICTED_OPERATION, and SecurityRestrictionContext.

Referenced by afterTriggerMarkEvents(), CheckRestrictedOperation(), DefineRelation(), PerformCursorOpen(), set_config_with_handle(), and SetUserIdAndContext().

load_libraries()

static void load_libraries ( const char *  libraries,
const char *  gucname,
bool  restricted 
)
static

Definition at line 1799 of file miscinit.c.

1800{
1801 char *rawstring;
1802 List *elemlist;
1803 ListCell *l;
1804
1805 if (libraries == NULL || libraries[0] == '0円')
1806 return; /* nothing to do */
1807
1808 /* Need a modifiable copy of string */
1809 rawstring = pstrdup(libraries);
1810
1811 /* Parse string into list of filename paths */
1812 if (!SplitDirectoriesString(rawstring, ',', &elemlist))
1813 {
1814 /* syntax error in list */
1815 list_free_deep(elemlist);
1816 pfree(rawstring);
1817 ereport(LOG,
1818 (errcode(ERRCODE_SYNTAX_ERROR),
1819 errmsg("invalid list syntax in parameter \"%s\"",
1820 gucname)));
1821 return;
1822 }
1823
1824 foreach(l, elemlist)
1825 {
1826 /* Note that filename was already canonicalized */
1827 char *filename = (char *) lfirst(l);
1828 char *expanded = NULL;
1829
1830 /* If restricting, insert $libdir/plugins if not mentioned already */
1831 if (restricted && first_dir_separator(filename) == NULL)
1832 {
1833 expanded = psprintf("$libdir/plugins/%s", filename);
1834 filename = expanded;
1835 }
1838 (errmsg_internal("loaded library \"%s\"", filename)));
1839 if (expanded)
1840 pfree(expanded);
1841 }
1842
1843 list_free_deep(elemlist);
1844 pfree(rawstring);
1845}
static bool restricted
Definition: command.c:199
void load_file(const char *filename, bool restricted)
Definition: dfmgr.c:149
#define DEBUG1
Definition: elog.h:30
void list_free_deep(List *list)
Definition: list.c:1560
#define lfirst(lc)
Definition: pg_list.h:172
char * first_dir_separator(const char *filename)
Definition: path.c:110
Definition: pg_list.h:54
Definition: pg_list.h:46
bool SplitDirectoriesString(char *rawstring, char separator, List **namelist)
Definition: varlena.c:2871

References DEBUG1, ereport, errcode(), errmsg(), errmsg_internal(), filename, first_dir_separator(), lfirst, list_free_deep(), load_file(), LOG, pfree(), psprintf(), pstrdup(), restricted, and SplitDirectoriesString().

Referenced by process_session_preload_libraries(), and process_shared_preload_libraries().

pg_bindtextdomain()

void pg_bindtextdomain ( const char *  domain )

Definition at line 1888 of file miscinit.c.

1889{
1890#ifdef ENABLE_NLS
1891 if (my_exec_path[0] != '0円')
1892 {
1893 char locale_path[MAXPGPATH];
1894
1895 get_locale_path(my_exec_path, locale_path);
1896 bindtextdomain(domain, locale_path);
1897 pg_bind_textdomain_codeset(domain);
1898 }
1899#endif
1900}
void get_locale_path(const char *my_exec_path, char *ret_path)
Definition: path.c:965

References get_locale_path(), MAXPGPATH, and my_exec_path.

Referenced by _PG_init().

process_session_preload_libraries()

void process_session_preload_libraries ( void  )

Definition at line 1865 of file miscinit.c.

1866{
1868 "session_preload_libraries",
1869 false);
1871 "local_preload_libraries",
1872 true);
1873}
char * session_preload_libraries_string
Definition: miscinit.c:1781
char * local_preload_libraries_string
Definition: miscinit.c:1783
static void load_libraries(const char *libraries, const char *gucname, bool restricted)
Definition: miscinit.c:1799

References load_libraries(), local_preload_libraries_string, and session_preload_libraries_string.

Referenced by InitPostgres().

process_shared_preload_libraries()

void process_shared_preload_libraries ( void  )

Definition at line 1851 of file miscinit.c.

1852{
1855 "shared_preload_libraries",
1856 false);
1859}
bool process_shared_preload_libraries_done
Definition: miscinit.c:1787
char * shared_preload_libraries_string
Definition: miscinit.c:1782
bool process_shared_preload_libraries_in_progress
Definition: miscinit.c:1786

References load_libraries(), process_shared_preload_libraries_done, process_shared_preload_libraries_in_progress, and shared_preload_libraries_string.

Referenced by PostgresSingleUserMain(), and PostmasterMain().

process_shmem_requests()

void process_shmem_requests ( void  )

Definition at line 1879 of file miscinit.c.

1880{
1885}
bool process_shmem_requests_in_progress
Definition: miscinit.c:1790
shmem_request_hook_type shmem_request_hook
Definition: miscinit.c:1789

References process_shmem_requests_in_progress, and shmem_request_hook.

Referenced by PostgresSingleUserMain(), and PostmasterMain().

RecheckDataDirLockFile()

bool RecheckDataDirLockFile ( void  )

Definition at line 1646 of file miscinit.c.

1647{
1648 int fd;
1649 int len;
1650 long file_pid;
1651 char buffer[BLCKSZ];
1652
1653 fd = open(DIRECTORY_LOCK_FILE, O_RDWR | PG_BINARY, 0);
1654 if (fd < 0)
1655 {
1656 /*
1657 * There are many foreseeable false-positive error conditions. For
1658 * safety, fail only on enumerated clearly-something-is-wrong
1659 * conditions.
1660 */
1661 switch (errno)
1662 {
1663 case ENOENT:
1664 case ENOTDIR:
1665 /* disaster */
1666 ereport(LOG,
1668 errmsg("could not open file \"%s\": %m",
1670 return false;
1671 default:
1672 /* non-fatal, at least for now */
1673 ereport(LOG,
1675 errmsg("could not open file \"%s\": %m; continuing anyway",
1677 return true;
1678 }
1679 }
1680 pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ);
1681 len = read(fd, buffer, sizeof(buffer) - 1);
1683 if (len < 0)
1684 {
1685 ereport(LOG,
1687 errmsg("could not read from file \"%s\": %m",
1689 close(fd);
1690 return true; /* treat read failure as nonfatal */
1691 }
1692 buffer[len] = '0円';
1693 close(fd);
1694 file_pid = atol(buffer);
1695 if (file_pid == getpid())
1696 return true; /* all is well */
1697
1698 /* Trouble: someone's overwritten the lock file */
1699 ereport(LOG,
1700 (errmsg("lock file \"%s\" contains wrong PID: %ld instead of %ld",
1701 DIRECTORY_LOCK_FILE, file_pid, (long) getpid())));
1702 return false;
1703}

References close, DIRECTORY_LOCK_FILE, ereport, errcode_for_file_access(), errmsg(), fd(), len, LOG, PG_BINARY, pgstat_report_wait_end(), pgstat_report_wait_start(), and read.

Referenced by ServerLoop().

RestoreClientConnectionInfo()

void RestoreClientConnectionInfo ( char *  conninfo )

Definition at line 1084 of file miscinit.c.

1085{
1087
1088 memcpy(&serialized, conninfo, sizeof(serialized));
1089
1090 /* Copy the fields back into place */
1093
1094 if (serialized.authn_id_len >= 0)
1095 {
1096 char *authn_id;
1097
1098 authn_id = conninfo + sizeof(serialized);
1100 authn_id);
1101 }
1102}
UserAuth auth_method
Definition: libpq-be.h:105

References SerializedClientConnectionInfo::auth_method, ClientConnectionInfo::auth_method, ClientConnectionInfo::authn_id, authn_id, SerializedClientConnectionInfo::authn_id_len, MemoryContextStrdup(), MyClientConnectionInfo, and TopMemoryContext.

Referenced by ParallelWorkerMain().

SerializeClientConnectionInfo()

void SerializeClientConnectionInfo ( Size maxsize  PG_USED_FOR_ASSERTS_ONLY,
char *  start_address 
)

Definition at line 1051 of file miscinit.c.

1053{
1054 SerializedClientConnectionInfo serialized = {0};
1055
1056 serialized.authn_id_len = -1;
1058
1060 serialized.authn_id_len = strlen(MyClientConnectionInfo.authn_id);
1061
1062 /* Copy serialized representation to buffer */
1063 Assert(maxsize >= sizeof(serialized));
1064 memcpy(start_address, &serialized, sizeof(serialized));
1065
1066 maxsize -= sizeof(serialized);
1067 start_address += sizeof(serialized);
1068
1069 /* Copy authn_id into the space after the struct */
1070 if (serialized.authn_id_len >= 0)
1071 {
1072 Assert(maxsize >= (serialized.authn_id_len + 1));
1073 memcpy(start_address,
1075 /* include the NULL terminator to ease deserialization */
1076 serialized.authn_id_len + 1);
1077 }
1078}

References Assert(), SerializedClientConnectionInfo::auth_method, ClientConnectionInfo::auth_method, ClientConnectionInfo::authn_id, SerializedClientConnectionInfo::authn_id_len, and MyClientConnectionInfo.

Referenced by InitializeParallelDSM().

SetAuthenticatedUserId()

void SetAuthenticatedUserId ( Oid  userid )

Definition at line 552 of file miscinit.c.

553{
554 Assert(OidIsValid(userid));
555
556 /* call only once */
558
559 AuthenticatedUserId = userid;
560
561 /* Also mark our PGPROC entry with the authenticated user id */
562 /* (We assume this is an atomic store so no lock is needed) */
563 MyProc->roleId = userid;
564}
PGPROC * MyProc
Definition: proc.c:66
Oid roleId
Definition: proc.h:225

References Assert(), AuthenticatedUserId, MyProc, OidIsValid, and PGPROC::roleId.

Referenced by InitializeSessionUserId(), and ParallelWorkerMain().

SetCurrentRoleId()

void SetCurrentRoleId ( Oid  roleid,
bool  is_superuser 
)

Definition at line 956 of file miscinit.c.

957{
958 /*
959 * Get correct info if it's SET ROLE NONE
960 *
961 * If SessionUserId hasn't been set yet, do nothing beyond updating
962 * SetRoleIsActive --- the eventual SetSessionAuthorization call will
963 * update the derived state. This is needed since we will get called
964 * during GUC initialization.
965 */
966 if (!OidIsValid(roleid))
967 {
968 SetRoleIsActive = false;
969
971 return;
972
973 roleid = SessionUserId;
975 }
976 else
977 SetRoleIsActive = true;
978
980}
static void SetOuterUserId(Oid userid, bool is_superuser)
Definition: miscinit.c:488

References is_superuser(), OidIsValid, SessionUserId, SessionUserIsSuperuser, SetOuterUserId(), and SetRoleIsActive.

Referenced by assign_role(), InitializeSessionUserIdStandalone(), and ParallelWorkerMain().

SetDatabasePath()

void SetDatabasePath ( const char *  path )

Definition at line 283 of file miscinit.c.

284{
285 /* This should happen only once per process */
288}
char * DatabasePath
Definition: globals.c:104

References Assert(), DatabasePath, MemoryContextStrdup(), and TopMemoryContext.

Referenced by InitPostgres().

SetDataDir()

void SetDataDir ( const char *  dir )

Definition at line 389 of file miscinit.c.

390{
391 char *new;
392
393 Assert(dir);
394
395 /* If presented path is relative, convert to absolute */
396 new = make_absolute_path(dir);
397
398 free(DataDir);
399 DataDir = new;
400}
#define free(a)
Definition: header.h:65
char * make_absolute_path(const char *path)
Definition: path.c:807

References Assert(), DataDir, free, and make_absolute_path().

Referenced by SelectConfigFiles().

SetOuterUserId()

static void SetOuterUserId ( Oid  userid,
bool  is_superuser 
)
static

Definition at line 488 of file miscinit.c.

489{
491 Assert(OidIsValid(userid));
492 OuterUserId = userid;
493
494 /* We force the effective user ID to match, too */
495 CurrentUserId = userid;
496
497 /* Also update the is_superuser GUC to match OuterUserId's property */
498 SetConfigOption("is_superuser",
499 is_superuser ? "on" : "off",
501}
@ PGC_S_DYNAMIC_DEFAULT
Definition: guc.h:114
@ PGC_INTERNAL
Definition: guc.h:73

References Assert(), CurrentUserId, is_superuser(), OidIsValid, OuterUserId, PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT, SecurityRestrictionContext, and SetConfigOption().

Referenced by SetCurrentRoleId(), and SetSessionAuthorization().

SetSessionAuthorization()

void SetSessionAuthorization ( Oid  userid,
bool  is_superuser 
)

Definition at line 920 of file miscinit.c.

921{
923
924 if (!SetRoleIsActive)
926}
static void SetSessionUserId(Oid userid, bool is_superuser)
Definition: miscinit.c:522

References is_superuser(), SetOuterUserId(), SetRoleIsActive, and SetSessionUserId().

Referenced by assign_session_authorization(), InitializeSessionUserIdStandalone(), and ParallelWorkerMain().

SetSessionUserId()

static void SetSessionUserId ( Oid  userid,
bool  is_superuser 
)
static

Definition at line 522 of file miscinit.c.

523{
525 Assert(OidIsValid(userid));
526 SessionUserId = userid;
528}

References Assert(), is_superuser(), OidIsValid, SecurityRestrictionContext, SessionUserId, and SessionUserIsSuperuser.

Referenced by SetSessionAuthorization().

SetUserIdAndContext()

void SetUserIdAndContext ( Oid  userid,
bool  sec_def_context 
)

Definition at line 668 of file miscinit.c.

669{
670 /* We throw the same error SET ROLE would. */
673 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
674 errmsg("cannot set parameter \"%s\" within security-restricted operation",
675 "role")));
676 CurrentUserId = userid;
677 if (sec_def_context)
679 else
680 SecurityRestrictionContext &= ~SECURITY_LOCAL_USERID_CHANGE;
681}
bool InSecurityRestrictedOperation(void)
Definition: miscinit.c:639

References CurrentUserId, ereport, errcode(), errmsg(), ERROR, InSecurityRestrictedOperation(), SECURITY_LOCAL_USERID_CHANGE, and SecurityRestrictionContext.

SetUserIdAndSecContext()

void SetUserIdAndSecContext ( Oid  userid,
int  sec_context 
)

Definition at line 619 of file miscinit.c.

620{
621 CurrentUserId = userid;
622 SecurityRestrictionContext = sec_context;
623}

References CurrentUserId, and SecurityRestrictionContext.

Referenced by AbortSubTransaction(), AbortTransaction(), AfterTriggerExecute(), amcheck_lock_relation_and_check(), brin_summarize_range(), cluster_rel(), ComputeIndexAttrs(), CreateSchemaCommand(), DefineIndex(), do_analyze_rel(), execute_extension_script(), fmgr_security_definer(), index_build(), index_concurrently_build(), ParallelWorkerMain(), refresh_by_match_merge(), RefreshMatViewByOid(), reindex_index(), ReindexRelationConcurrently(), RestoreUserContext(), ri_PerformCheck(), ri_PlanCheck(), SwitchToUntrustedUser(), vacuum_rel(), and validate_index().

SwitchBackToLocalLatch()

void SwitchBackToLocalLatch ( void  )

Definition at line 242 of file miscinit.c.

243{
245 Assert(MyProc != NULL && MyLatch == &MyProc->procLatch);
246
248
249 if (FeBeWaitSet)
251 MyLatch);
252
254}
void SetLatch(Latch *latch)
Definition: latch.c:290
#define FeBeWaitSetLatchPos
Definition: libpq.h:64
WaitEventSet * FeBeWaitSet
Definition: pqcomm.c:166
Latch procLatch
Definition: proc.h:186
void ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
Definition: waiteventset.c:656
#define WL_LATCH_SET
Definition: waiteventset.h:34

References Assert(), FeBeWaitSet, FeBeWaitSetLatchPos, LocalLatchData, ModifyWaitEvent(), MyLatch, MyProc, PGPROC::procLatch, SetLatch(), and WL_LATCH_SET.

Referenced by AuxiliaryProcKill(), and ProcKill().

SwitchToSharedLatch()

void SwitchToSharedLatch ( void  )

Definition at line 215 of file miscinit.c.

216{
218 Assert(MyProc != NULL);
219
221
222 if (FeBeWaitSet)
224 MyLatch);
225
226 /*
227 * Set the shared latch as the local one might have been set. This
228 * shouldn't normally be necessary as code is supposed to check the
229 * condition before waiting for the latch, but a bit care can't hurt.
230 */
232}

References Assert(), FeBeWaitSet, FeBeWaitSetLatchPos, LocalLatchData, ModifyWaitEvent(), MyLatch, MyProc, PGPROC::procLatch, SetLatch(), and WL_LATCH_SET.

Referenced by InitAuxiliaryProcess(), and InitProcess().

system_user()

Datum system_user ( PG_FUNCTION_ARGS  )

Definition at line 898 of file miscinit.c.

899{
900 const char *sysuser = GetSystemUser();
901
902 if (sysuser)
904 else
906}
#define CStringGetTextDatum(s)
Definition: builtins.h:97
#define PG_RETURN_NULL()
Definition: fmgr.h:345
#define PG_RETURN_DATUM(x)
Definition: fmgr.h:353
const char * GetSystemUser(void)
Definition: miscinit.c:535

References CStringGetTextDatum, GetSystemUser(), PG_RETURN_DATUM, and PG_RETURN_NULL.

Referenced by check_ident_usermap(), check_usermap(), and InitializeSystemUser().

TouchSocketLockFiles()

void TouchSocketLockFiles ( void  )

Definition at line 1490 of file miscinit.c.

1491{
1492 ListCell *l;
1493
1494 foreach(l, lock_files)
1495 {
1496 char *socketLockFile = (char *) lfirst(l);
1497
1498 /* No need to touch the data directory lock file, we trust */
1499 if (strcmp(socketLockFile, DIRECTORY_LOCK_FILE) == 0)
1500 continue;
1501
1502 /* we just ignore any error here */
1503 (void) utime(socketLockFile, NULL);
1504 }
1505}

References DIRECTORY_LOCK_FILE, lfirst, and lock_files.

Referenced by ServerLoop().

UnlinkLockFiles()

static void UnlinkLockFiles ( int  status,
Datum  arg 
)
static

Definition at line 1124 of file miscinit.c.

1125{
1126 ListCell *l;
1127
1128 foreach(l, lock_files)
1129 {
1130 char *curfile = (char *) lfirst(l);
1131
1132 unlink(curfile);
1133 /* Should we complain if the unlink fails? */
1134 }
1135 /* Since we're about to exit, no need to reclaim storage */
1136
1137 /*
1138 * Lock file removal should always be the last externally visible action
1139 * of a postmaster or standalone backend, while we won't come here at all
1140 * when exiting postmaster child processes. Therefore, this is a good
1141 * place to log completion of shutdown. We could alternatively teach
1142 * proc_exit() to do it, but that seems uglier. In a standalone backend,
1143 * use NOTICE elevel to be less chatty.
1144 */
1146 (errmsg("database system is shut down")));
1147}
#define NOTICE
Definition: elog.h:35

References ereport, errmsg(), IsPostmasterEnvironment, lfirst, lock_files, LOG, and NOTICE.

Referenced by CreateLockFile().

ValidatePgVersion()

void ValidatePgVersion ( const char *  path )

Definition at line 1718 of file miscinit.c.

1719{
1720 char full_path[MAXPGPATH];
1721 FILE *file;
1722 int ret;
1723 long file_major;
1724 long my_major;
1725 char *endptr;
1726 char file_version_string[64];
1727 const char *my_version_string = PG_VERSION;
1728
1729 my_major = strtol(my_version_string, &endptr, 10);
1730
1731 snprintf(full_path, sizeof(full_path), "%s/PG_VERSION", path);
1732
1733 file = AllocateFile(full_path, "r");
1734 if (!file)
1735 {
1736 if (errno == ENOENT)
1737 ereport(FATAL,
1738 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1739 errmsg("\"%s\" is not a valid data directory",
1740 path),
1741 errdetail("File \"%s\" is missing.", full_path)));
1742 else
1743 ereport(FATAL,
1745 errmsg("could not open file \"%s\": %m", full_path)));
1746 }
1747
1748 file_version_string[0] = '0円';
1749 ret = fscanf(file, "%63s", file_version_string);
1750 file_major = strtol(file_version_string, &endptr, 10);
1751
1752 if (ret != 1 || endptr == file_version_string)
1753 ereport(FATAL,
1754 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1755 errmsg("\"%s\" is not a valid data directory",
1756 path),
1757 errdetail("File \"%s\" does not contain valid data.",
1758 full_path),
1759 errhint("You might need to initdb.")));
1760
1761 FreeFile(file);
1762
1763 if (my_major != file_major)
1764 ereport(FATAL,
1765 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1766 errmsg("database files are incompatible with server"),
1767 errdetail("The data directory was initialized by PostgreSQL version %s, "
1768 "which is not compatible with this version %s.",
1769 file_version_string, my_version_string)));
1770}
int FreeFile(FILE *file)
Definition: fd.c:2840
FILE * AllocateFile(const char *name, const char *mode)
Definition: fd.c:2641

References AllocateFile(), ereport, errcode(), errcode_for_file_access(), errdetail(), errhint(), errmsg(), FATAL, FreeFile(), MAXPGPATH, and snprintf.

Referenced by checkDataDir(), and InitPostgres().

Variable Documentation

AuthenticatedUserId

Oid AuthenticatedUserId = InvalidOid
static

Definition at line 449 of file miscinit.c.

Referenced by GetAuthenticatedUserId(), InitializeSessionUserIdStandalone(), and SetAuthenticatedUserId().

CurrentUserId

Oid CurrentUserId = InvalidOid
static

Definition at line 452 of file miscinit.c.

Referenced by GetUserId(), GetUserIdAndContext(), GetUserIdAndSecContext(), SetOuterUserId(), SetUserIdAndContext(), and SetUserIdAndSecContext().

IgnoreSystemIndexes

bool IgnoreSystemIndexes = false

Definition at line 81 of file miscinit.c.

Referenced by AuxiliaryProcessMainCommon(), BootstrapModeMain(), get_relation_info(), systable_beginscan(), and systable_beginscan_ordered().

local_preload_libraries_string

char* local_preload_libraries_string = NULL

Definition at line 1783 of file miscinit.c.

Referenced by process_session_preload_libraries().

LocalLatchData

Latch LocalLatchData
static

Definition at line 69 of file miscinit.c.

Referenced by InitProcessLocalLatch(), SwitchBackToLocalLatch(), and SwitchToSharedLatch().

lock_files

List* lock_files = NIL
static

Definition at line 67 of file miscinit.c.

Referenced by CreateLockFile(), TouchSocketLockFiles(), and UnlinkLockFiles().

Mode

Definition at line 62 of file miscinit.c.

MyBackendType

BackendType MyBackendType

Definition at line 64 of file miscinit.c.

Referenced by AutoVacLauncherMain(), AutoVacWorkerMain(), BackgroundWorkerMain(), BackgroundWriterMain(), CheckpointerMain(), CreateRestartPoint(), get_backend_type_for_log(), init_ps_display(), InitStandaloneProcess(), InvalidatePossiblyObsoleteSlot(), IoWorkerMain(), pgaio_init_backend(), pgaio_worker_error_callback(), PgArchiverMain(), pgstat_bestart_final(), pgstat_bestart_initial(), pgstat_count_backend_io_op(), pgstat_count_backend_io_op_time(), pgstat_count_io_op(), pgstat_flush_backend(), pgstat_io_flush_cb(), pgstat_should_report_connstat(), pgstat_write_statsfile(), PostgresMain(), ProcessStartupPacket(), ReplSlotSyncWorkerMain(), send_message_to_server_log(), standard_ProcessUtility(), StartupProcessMain(), SysLoggerMain(), WalReceiverMain(), WalSummarizerMain(), WalWriterMain(), write_csvlog(), and write_jsonlog().

MyClientConnectionInfo

ClientConnectionInfo MyClientConnectionInfo

Definition at line 1018 of file miscinit.c.

Referenced by auth_peer(), ClientAuthentication(), EstimateClientConnectionInfoSpace(), InitPostgres(), ParallelWorkerMain(), RestoreClientConnectionInfo(), SerializeClientConnectionInfo(), set_authn_id(), and validate().

OuterUserId

Oid OuterUserId = InvalidOid
static

Definition at line 451 of file miscinit.c.

Referenced by GetCurrentRoleId(), GetOuterUserId(), and SetOuterUserId().

process_shared_preload_libraries_done

bool process_shared_preload_libraries_done = false

Definition at line 1787 of file miscinit.c.

Referenced by check_wal_consistency_checking(), InitializeWalConsistencyChecking(), and process_shared_preload_libraries().

process_shared_preload_libraries_in_progress

bool process_shared_preload_libraries_in_progress = false

Definition at line 1786 of file miscinit.c.

Referenced by _PG_init(), apw_start_leader_worker(), init_custom_variable(), pgstat_register_kind(), process_shared_preload_libraries(), RegisterBackgroundWorker(), and RegisterCustomRmgr().

process_shmem_requests_in_progress

bool process_shmem_requests_in_progress = false

Definition at line 1790 of file miscinit.c.

Referenced by process_shmem_requests(), RequestAddinShmemSpace(), and RequestNamedLWLockTranche().

SecurityRestrictionContext

int SecurityRestrictionContext = 0
static

Definition at line 458 of file miscinit.c.

Referenced by GetUserIdAndSecContext(), InLocalUserIdChange(), InNoForceRLSOperation(), InSecurityRestrictedOperation(), SetOuterUserId(), SetSessionUserId(), SetUserIdAndContext(), and SetUserIdAndSecContext().

session_preload_libraries_string

char* session_preload_libraries_string = NULL

Definition at line 1781 of file miscinit.c.

Referenced by process_session_preload_libraries().

SessionUserId

Oid SessionUserId = InvalidOid
static

Definition at line 450 of file miscinit.c.

Referenced by GetSessionUserId(), GetSessionUserIsSuperuser(), SetCurrentRoleId(), and SetSessionUserId().

SessionUserIsSuperuser

bool SessionUserIsSuperuser = false
static

Definition at line 456 of file miscinit.c.

Referenced by GetSessionUserIsSuperuser(), SetCurrentRoleId(), and SetSessionUserId().

SetRoleIsActive

bool SetRoleIsActive = false
static

Definition at line 461 of file miscinit.c.

Referenced by GetCurrentRoleId(), SetCurrentRoleId(), and SetSessionAuthorization().

shared_preload_libraries_string

char* shared_preload_libraries_string = NULL

Definition at line 1782 of file miscinit.c.

Referenced by process_shared_preload_libraries().

shmem_request_hook

shmem_request_hook_type shmem_request_hook = NULL

Definition at line 1789 of file miscinit.c.

Referenced by _PG_init(), and process_shmem_requests().

SystemUser

const char* SystemUser = NULL
static

Definition at line 453 of file miscinit.c.

Referenced by GetSystemUser(), and InitializeSystemUser().

AltStyle によって変換されたページ (->オリジナル) /