Index: src/backend/postmaster/pgstat.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/postmaster/pgstat.c,v
retrieving revision 1.58
diff -c -r1.58 pgstat.c
*** src/backend/postmaster/pgstat.c	2 Feb 2004 16:37:46 -0000	1.58
--- src/backend/postmaster/pgstat.c	8 Mar 2004 07:48:08 -0000
***************
*** 51,56 ****
--- 51,60 ----
  #include "utils/ps_status.h"
  #include "utils/syscache.h"
  
+ #ifdef EXEC_BACKEND
+ #include "utils/guc.h"
+ #endif
+ 
  #ifdef WIN32
  extern pid_t win32_forkexec(const char* path, char *argv[]);
  #endif
***************
*** 158,163 ****
--- 162,178 ----
   * ------------------------------------------------------------
   */
  
+ #ifdef EXEC_BACKEND
+ 
+ void
+ pgstat_init_forkexec_backend(void)
+ {
+ 	Assert(DataDir != NULL);
+ 	snprintf(pgStat_fname, MAXPGPATH,
+ 			 PGSTAT_STAT_FILENAME, DataDir);
+ }
+ 
+ #endif
  
  /* ----------
   * pgstat_init() -
***************
*** 364,372 ****
  pgstat_forkexec(STATS_PROCESS_TYPE procType)
  {
  	pid_t pid;
! 	char *av[11];
  	int ac = 0, bufc = 0, i;
! 	char pgstatBuf[8][MAXPGPATH];
  
  	av[ac++] = "postgres";
  	switch (procType)
--- 379,387 ----
  pgstat_forkexec(STATS_PROCESS_TYPE procType)
  {
  	pid_t pid;
! 	char *av[13];
  	int ac = 0, bufc = 0, i;
! 	char pgstatBuf[10][MAXPGPATH];
  
  	av[ac++] = "postgres";
  	switch (procType)
***************
*** 391,401 ****
--- 406,420 ----
  	snprintf(pgstatBuf[bufc++],MAXPGPATH,"%d",pgStatPipe[0]);
  	snprintf(pgstatBuf[bufc++],MAXPGPATH,"%d",pgStatPipe[1]);
  
+ 	/* + misc */
+ 	snprintf(pgstatBuf[bufc++],MAXPGPATH,"%d",MaxBackends);
+ 
  	/* + the pstat file names, and postgres pathname */
  	/* FIXME: [fork/exec] whitespaces in directories? */
  	snprintf(pgstatBuf[bufc++],MAXPGPATH,"%s",pgStat_tmpfname);
  	snprintf(pgstatBuf[bufc++],MAXPGPATH,"%s",pgStat_fname);
  	snprintf(pgstatBuf[bufc++],MAXPGPATH,"%s",pg_pathname);
+ 	snprintf(pgstatBuf[bufc++],MAXPGPATH,"%s",DataDir);
  
  	/* Add to the arg list */
  	Assert(bufc <= lengthof(pgstatBuf));
***************
*** 427,442 ****
  static void
  pgstat_parseArgs(PGSTAT_FORK_ARGS)
  {
! 	Assert(argc == 8);
  	argc = 0;
  	pgStatSock 		= atoi(argv[argc++]);
  	pgStatPmPipe[0]	= atoi(argv[argc++]);
  	pgStatPmPipe[1]	= atoi(argv[argc++]);
  	pgStatPipe[0]	= atoi(argv[argc++]);
  	pgStatPipe[1]	= atoi(argv[argc++]);
  	strncpy(pgStat_tmpfname,argv[argc++],MAXPGPATH);
  	strncpy(pgStat_fname,	argv[argc++],MAXPGPATH);
  	strncpy(pg_pathname,	argv[argc++],MAXPGPATH);
  }
  
  #endif
--- 446,465 ----
  static void
  pgstat_parseArgs(PGSTAT_FORK_ARGS)
  {
! 	Assert(argc == 10);
  	argc = 0;
  	pgStatSock 		= atoi(argv[argc++]);
  	pgStatPmPipe[0]	= atoi(argv[argc++]);
  	pgStatPmPipe[1]	= atoi(argv[argc++]);
  	pgStatPipe[0]	= atoi(argv[argc++]);
  	pgStatPipe[1]	= atoi(argv[argc++]);
+ 	MaxBackends		= atoi(argv[argc++]);
  	strncpy(pgStat_tmpfname,argv[argc++],MAXPGPATH);
  	strncpy(pgStat_fname,	argv[argc++],MAXPGPATH);
  	strncpy(pg_pathname,	argv[argc++],MAXPGPATH);
+ 	DataDir			= strdup(argv[argc++]);
+ 
+ 	read_nondefault_variables();
  }
  
  #endif
***************
*** 504,510 ****
  #endif
  
  #ifdef EXEC_BACKEND
! 	switch ((pgStatSock = (int) pgstat_forkexec(STAT_PROC_BUFFER)))
  #else
  	switch ((pgStatPid = (int) fork()))
  #endif
--- 527,533 ----
  #endif
  
  #ifdef EXEC_BACKEND
! 	switch ((pgStatPid = (int) pgstat_forkexec(STAT_PROC_BUFFER)))
  #else
  	switch ((pgStatPid = (int) fork()))
  #endif
***************
*** 1344,1349 ****
--- 1367,1376 ----
  	/* In EXEC case we will not have inherited these settings */
  	IsPostmasterEnvironment = true;
  	whereToSendOutput = None;
+ 
+ 	/* Setup global context */
+ 	MemoryContextInit(); /* before any elog'ing can occur */
+ 	InitializeGUCOptions();
  #endif
  
  	MyProcPid = getpid();		/* reset MyProcPid */
***************
*** 1382,1388 ****
  pgstat_main(PGSTAT_FORK_ARGS)
  {
  	pgstat_mainInit(); /* Note: for *both* EXEC_BACKEND and regular cases */
- 
  #ifdef EXEC_BACKEND
  	pgstat_parseArgs(argc,argv);
  #endif
--- 1409,1414 ----
***************
*** 1458,1466 ****
  	HASHCTL		hash_ctl;
  
  #ifdef EXEC_BACKEND
! 	MemoryContextInit(); /* before any elog'ing can occur */
! 
! 	pgstat_mainInit();
  	pgstat_parseArgs(argc,argv);
  #else
  	MyProcPid = getpid();		/* reset MyProcPid */
--- 1484,1490 ----
  	HASHCTL		hash_ctl;
  
  #ifdef EXEC_BACKEND
! 	pgstat_mainInit();  /* Note: only in EXEC_BACKEND case */
  	pgstat_parseArgs(argc,argv);
  #else
  	MyProcPid = getpid();		/* reset MyProcPid */
Index: src/backend/postmaster/postmaster.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/postmaster/postmaster.c,v
retrieving revision 1.370
diff -c -r1.370 postmaster.c
*** src/backend/postmaster/postmaster.c	5 Mar 2004 01:11:04 -0000	1.370
--- src/backend/postmaster/postmaster.c	8 Mar 2004 07:48:11 -0000
***************
*** 2720,2725 ****
--- 2720,2728 ----
  	read_nondefault_variables();
  	read_backend_variables(backendID,&port);
  
+ 	/* Remaining initialization */
+ 	pgstat_init_forkexec_backend();
+ 
  	/* FIXME: [fork/exec] Ugh */
  	load_hba();
  	load_ident();
Index: src/include/pgstat.h
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/include/pgstat.h,v
retrieving revision 1.20
diff -c -r1.20 pgstat.h
*** src/include/pgstat.h	2 Mar 2004 18:37:52 -0000	1.20
--- src/include/pgstat.h	8 Mar 2004 07:48:16 -0000
***************
*** 368,373 ****
--- 368,376 ----
   * Functions called from postmaster
   * ----------
   */
+ #ifdef EXEC_BACKEND
+ extern void pgstat_init_forkexec_backend(void);
+ #endif
  extern void pgstat_init(void);
  extern void pgstat_start(void);
  extern bool pgstat_ispgstat(int pid);
