/*-------------------------------------------------------------------------
 *
 * backend_startup.h
 *	  prototypes for backend_startup.c.
 *
 *
 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/tcop/backend_startup.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef BACKEND_STARTUP_H
#define BACKEND_STARTUP_H

#include "utils/timestamp.h"

/* GUCs */
extern PGDLLIMPORT bool Trace_connection_negotiation;
extern PGDLLIMPORT uint32 log_connections;
extern PGDLLIMPORT char *log_connections_string;

/* Other globals */
extern PGDLLIMPORT struct ConnectionTiming conn_timing;

/*
 * CAC_state is passed from postmaster to the backend process, to indicate
 * whether the connection should be accepted, or if the process should just
 * send an error to the client and close the connection.  Note that the
 * connection can fail for various reasons even if postmaster passed CAC_OK.
 */
typedef enum CAC_state
{
	CAC_OK,
	CAC_STARTUP,
	CAC_SHUTDOWN,
	CAC_RECOVERY,
	CAC_NOTHOTSTANDBY,
	CAC_TOOMANY,
} CAC_state;

/* Information passed from postmaster to backend process in 'startup_data' */
typedef struct BackendStartupData
{
	CAC_state	canAcceptConnections;

	/*
	 * Time at which the connection client socket is created. Only used for
	 * client and wal sender connections.
	 */
	TimestampTz socket_created;

	/*
	 * Time at which the postmaster initiates process creation -- either
	 * through fork or otherwise. Only used for client and wal sender
	 * connections.
	 */
	TimestampTz fork_started;
} BackendStartupData;

/*
 * Granular control over which messages to log for the log_connections GUC.
 *
 * RECEIPT, AUTHENTICATION, AUTHORIZATION, and SETUP_DURATIONS are different
 * aspects of connection establishment and backend setup for which we may emit
 * a log message.
 *
 * ALL is a convenience alias equivalent to all of the above aspects.
 *
 * ON is backwards compatibility alias for the connection aspects that were
 * logged in Postgres versions < 18.
 */
typedef enum LogConnectionOption
{
	LOG_CONNECTION_RECEIPT = (1 << 0),
	LOG_CONNECTION_AUTHENTICATION = (1 << 1),
	LOG_CONNECTION_AUTHORIZATION = (1 << 2),
	LOG_CONNECTION_SETUP_DURATIONS = (1 << 3),
	LOG_CONNECTION_ON =
		LOG_CONNECTION_RECEIPT |
		LOG_CONNECTION_AUTHENTICATION |
		LOG_CONNECTION_AUTHORIZATION,
	LOG_CONNECTION_ALL =
		LOG_CONNECTION_RECEIPT |
		LOG_CONNECTION_AUTHENTICATION |
		LOG_CONNECTION_AUTHORIZATION |
		LOG_CONNECTION_SETUP_DURATIONS,
} LogConnectionOption;

/*
 * A collection of timings of various stages of connection establishment and
 * setup for client backends and WAL senders.
 *
 * Used to emit the setup_durations log message for the log_connections GUC.
 */
typedef struct ConnectionTiming
{
	/*
	 * The time at which the client socket is created and the time at which
	 * the connection is fully set up and first ready for query. Together
	 * these represent the total connection establishment and setup time.
	 */
	TimestampTz socket_create;
	TimestampTz ready_for_use;

	/* Time at which process creation was initiated */
	TimestampTz fork_start;

	/* Time at which process creation was completed */
	TimestampTz fork_end;

	/* Time at which authentication started */
	TimestampTz auth_start;

	/* Time at which authentication was finished */
	TimestampTz auth_end;
} ConnectionTiming;

pg_noreturn extern void BackendMain(const void *startup_data, size_t startup_data_len);

#endif							/* BACKEND_STARTUP_H */
