Index: src/backend/postmaster/pgstat.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/postmaster/pgstat.c,v
retrieving revision 1.71
diff -c -r1.71 pgstat.c
*** src/backend/postmaster/pgstat.c	24 May 2004 02:47:47 -0000	1.71
--- src/backend/postmaster/pgstat.c	24 May 2004 21:07:19 -0000
***************
*** 452,460 ****
  pgstat_forkexec(STATS_PROCESS_TYPE procType)
  {
  	pid_t pid;
! 	char *av[15];
  	int ac = 0, bufc = 0, i;
! 	char pgstatBuf[12][MAXPGPATH];
  
  	av[ac++] = "postgres";
  	switch (procType)
--- 452,460 ----
  pgstat_forkexec(STATS_PROCESS_TYPE procType)
  {
  	pid_t pid;
! 	char *av[17];
  	int ac = 0, bufc = 0, i;
! 	char pgstatBuf[14][MAXPGPATH];
  
  	av[ac++] = "postgres";
  	switch (procType)
***************
*** 490,495 ****
--- 490,499 ----
  	snprintf(pgstatBuf[bufc++],MAXPGPATH,"\"%s\"",postgres_exec_path);
  	snprintf(pgstatBuf[bufc++],MAXPGPATH,"\"%s\"",DataDir);
  
+ 	/* + locales */
+ 	snprintf(pgstatBuf[bufc++],MAXPGPATH,"\"%s\"",setlocale(LC_COLLATE, NULL));
+ 	snprintf(pgstatBuf[bufc++],MAXPGPATH,"\"%s\"",setlocale(LC_CTYPE, NULL));
+ 
  	/* Add to the arg list */
  	Assert(bufc <= lengthof(pgstatBuf));
  	for (i = 0; i < bufc; i++)
***************
*** 520,526 ****
  static void
  pgstat_parseArgs(PGSTAT_FORK_ARGS)
  {
! 	Assert(argc == 14);
  
  	if (find_my_exec(argv[0], my_exec_path) < 0)
  		elog(FATAL,
--- 524,530 ----
  static void
  pgstat_parseArgs(PGSTAT_FORK_ARGS)
  {
! 	Assert(argc == 16);
  
  	if (find_my_exec(argv[0], my_exec_path) < 0)
  		elog(FATAL,
***************
*** 542,547 ****
--- 546,553 ----
  	StrNCpy(pgStat_fname,	argv[argc++],MAXPGPATH);
  	StrNCpy(postgres_exec_path,	argv[argc++],MAXPGPATH);
  	DataDir			= strdup(argv[argc++]);
+ 	setlocale(LC_COLLATE, argv[argc++]);
+ 	setlocale(LC_CTYPE, argv[argc++]);
  
  	read_nondefault_variables();
  }
Index: src/backend/postmaster/postmaster.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/postmaster/postmaster.c,v
retrieving revision 1.394
diff -c -r1.394 postmaster.c
*** src/backend/postmaster/postmaster.c	23 May 2004 03:50:45 -0000	1.394
--- src/backend/postmaster/postmaster.c	25 May 2004 21:01:21 -0000
***************
*** 3305,3310 ****
--- 3305,3312 ----
  {
  	char	filename[MAXPGPATH];
  	FILE	*fp;
+ 	char    str_buf[MAXPGPATH];
+ 
  	get_tmp_backend_file_name(filename,++tmpBackendFileNum);
  
  	/* Open file */
***************
*** 3361,3366 ****
--- 3363,3373 ----
  
  	fwrite((void *)my_exec_path, MAXPGPATH, 1, fp);
  
+ 	StrNCpy(str_buf, setlocale(LC_COLLATE, NULL), MAXPGPATH);
+ 	fwrite((void *)str_buf, MAXPGPATH, 1, fp);
+ 	StrNCpy(str_buf, setlocale(LC_CTYPE, NULL), MAXPGPATH);
+ 	fwrite((void *)str_buf, MAXPGPATH, 1, fp);
+ 
  	/* Release file */
  	if (FreeFile(fp))
  	{
***************
*** 3378,3383 ****
--- 3385,3392 ----
  {
  	char	filename[MAXPGPATH];
  	FILE	*fp;
+ 	char    str_buf[MAXPGPATH];
+ 
  	get_tmp_backend_file_name(filename,id);
  
  	/* Open file */
***************
*** 3424,3429 ****
--- 3433,3443 ----
  	read_var(PostmasterPid,fp);
  
  	fread((void *)my_exec_path, MAXPGPATH, 1, fp);
+ 
+ 	fread((void *)str_buf, MAXPGPATH, 1, fp);
+ 	setlocale(LC_COLLATE, str_buf);
+ 	fread((void *)str_buf, MAXPGPATH, 1, fp);
+ 	setlocale(LC_CTYPE, str_buf);
  
  	/* Release file */
  	FreeFile(fp);
Index: src/backend/utils/adt/pg_locale.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/utils/adt/pg_locale.c,v
retrieving revision 1.25
diff -c -r1.25 pg_locale.c
*** src/backend/utils/adt/pg_locale.c	19 Jan 2004 19:04:40 -0000	1.25
--- src/backend/utils/adt/pg_locale.c	25 May 2004 20:41:49 -0000
***************
*** 123,128 ****
--- 123,129 ----
  const char *
  locale_messages_assign(const char *value, bool doit, GucSource source)
  {
+ 	char *retval;
  	/*
  	 * LC_MESSAGES category does not exist everywhere, but accept it
  	 * anyway
***************
*** 130,139 ****
  #ifdef LC_MESSAGES
  	if (doit)
  	{
! 		if (!setlocale(LC_MESSAGES, value))
  			return NULL;
  	}
! 	else
  		value = locale_xxx_assign(LC_MESSAGES, value, false, source);
  #endif
  	return value;
--- 131,148 ----
  #ifdef LC_MESSAGES
  	if (doit)
  	{
! 		char *retval = setlocale(LC_MESSAGES, value);
! #ifndef WIN32
! 		if (!retval)
  			return NULL;
+ #else
+ 		/* Win32 returns NULL when you set LC_MESSAGES to "". So we just
+ 		 * set it, and ignore it */
+ 		if (value[0] && !retval)
+ 			return NULL;
+ #endif
  	}
! 	else 
  		value = locale_xxx_assign(LC_MESSAGES, value, false, source);
  #endif
  	return value;
