Commit 4cdf51e6 authored by Bruce Momjian's avatar Bruce Momjian

Drops in the CreateProcess calls for Win32 (essentially wrapping up the

fork/exec portion of the port), and fixes a handful of whitespace issues

Claudio Natoli
parent ca7a1f0c
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/main/main.c,v 1.70 2004/01/06 23:15:22 momjian Exp $ * $PostgreSQL: pgsql/src/backend/main/main.c,v 1.71 2004/01/11 03:49:31 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -87,6 +87,19 @@ main(int argc, char *argv[]) ...@@ -87,6 +87,19 @@ main(int argc, char *argv[])
#endif #endif
#endif /* NOFIXADE || NOPRINTADE */ #endif /* NOFIXADE || NOPRINTADE */
#if defined(WIN32)
{
WSADATA wsaData;
int err = WSAStartup(MAKEWORD(2,2), &wsaData);
if (err != 0)
{
fprintf(stderr, "%s: WSAStartup failed: %d\n",
argv[0], err);
exit(1);
}
}
#endif
#ifdef __BEOS__ #ifdef __BEOS__
/* BeOS-specific actions on startup */ /* BeOS-specific actions on startup */
beos_startup(argc, argv); beos_startup(argc, argv);
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
* *
* Copyright (c) 2001-2003, PostgreSQL Global Development Group * Copyright (c) 2001-2003, PostgreSQL Global Development Group
* *
* $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.52 2004/01/09 04:58:09 momjian Exp $ * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.53 2004/01/11 03:49:31 momjian Exp $
* ---------- * ----------
*/ */
#include "postgres.h" #include "postgres.h"
...@@ -50,6 +50,9 @@ ...@@ -50,6 +50,9 @@
#include "utils/ps_status.h" #include "utils/ps_status.h"
#include "utils/syscache.h" #include "utils/syscache.h"
#ifdef WIN32
extern pid_t win32_forkexec(const char* path, char *argv[]);
#endif
/* ---------- /* ----------
* GUC parameters * GUC parameters
...@@ -402,10 +405,13 @@ pgstat_forkexec(STATS_PROCESS_TYPE procType) ...@@ -402,10 +405,13 @@ pgstat_forkexec(STATS_PROCESS_TYPE procType)
Assert(ac <= lengthof(av)); Assert(ac <= lengthof(av));
/* Fire off execv in child */ /* Fire off execv in child */
#ifdef WIN32
pid = win32_forkexec(pg_pathname,av);
#else
if ((pid = fork()) == 0 && (execv(pg_pathname,av) == -1)) if ((pid = fork()) == 0 && (execv(pg_pathname,av) == -1))
/* FIXME: [fork/exec] suggestions for what to do here? Can't call elog... */ /* FIXME: [fork/exec] suggestions for what to do here? Can't call elog... */
abort(); abort();
#endif
return pid; /* Parent returns pid */ return pid; /* Parent returns pid */
} }
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.357 2004/01/09 23:27:20 momjian Exp $ * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.358 2004/01/11 03:49:31 momjian Exp $
* *
* NOTES * NOTES
* *
...@@ -297,6 +297,10 @@ postmaster_error(const char *fmt,...) ...@@ -297,6 +297,10 @@ postmaster_error(const char *fmt,...)
__attribute__((format(printf, 1, 2))); __attribute__((format(printf, 1, 2)));
#ifdef EXEC_BACKEND #ifdef EXEC_BACKEND
#ifdef WIN32
pid_t win32_forkexec(const char* path, char *argv[]);
#endif
static pid_t Backend_forkexec(Port *port); static pid_t Backend_forkexec(Port *port);
static unsigned long tmpBackendFileNum = 0; static unsigned long tmpBackendFileNum = 0;
...@@ -923,7 +927,12 @@ pmdaemonize(int argc, char *argv[]) ...@@ -923,7 +927,12 @@ pmdaemonize(int argc, char *argv[])
getitimer(ITIMER_PROF, &prof_itimer); getitimer(ITIMER_PROF, &prof_itimer);
#endif #endif
#ifdef WIN32
/* FIXME: [fork/exec] to be implemented? */
abort();
#else
pid = fork(); pid = fork();
#endif
if (pid == (pid_t) -1) if (pid == (pid_t) -1)
{ {
postmaster_error("could not fork background process: %s", postmaster_error("could not fork background process: %s",
...@@ -2692,6 +2701,9 @@ Backend_forkexec(Port *port) ...@@ -2692,6 +2701,9 @@ Backend_forkexec(Port *port)
av[ac++] = NULL; av[ac++] = NULL;
Assert(ac <= lengthof(av)); Assert(ac <= lengthof(av));
#ifdef WIN32
pid = win32_forkexec(pg_pathname,av); /* logs on error */
#else
/* Fire off execv in child */ /* Fire off execv in child */
if ((pid = fork()) == 0 && (execv(pg_pathname,av) == -1)) if ((pid = fork()) == 0 && (execv(pg_pathname,av) == -1))
/* /*
...@@ -2699,7 +2711,7 @@ Backend_forkexec(Port *port) ...@@ -2699,7 +2711,7 @@ Backend_forkexec(Port *port)
* Probably OK to issue error (unlike pgstat case) * Probably OK to issue error (unlike pgstat case)
*/ */
abort(); abort();
#endif
return pid; /* Parent returns pid */ return pid; /* Parent returns pid */
} }
...@@ -3039,12 +3051,16 @@ SSDataBase(int xlop) ...@@ -3039,12 +3051,16 @@ SSDataBase(int xlop)
#ifdef EXEC_BACKEND #ifdef EXEC_BACKEND
/* EXEC_BACKEND case; fork/exec here */ /* EXEC_BACKEND case; fork/exec here */
#ifdef WIN32
pid = win32_forkexec(pg_pathname,av); /* logs on error */
#else
if ((pid = fork()) == 0 && (execv(pg_pathname,av) == -1)) if ((pid = fork()) == 0 && (execv(pg_pathname,av) == -1))
{ {
/* in child */ /* in child */
elog(ERROR,"unable to execv in SSDataBase: %m"); elog(ERROR,"unable to execv in SSDataBase: %m");
exit(0); exit(0);
} }
#endif
#else #else
BootstrapMain(ac, av); BootstrapMain(ac, av);
ExitPostmaster(0); ExitPostmaster(0);
...@@ -3335,3 +3351,52 @@ read_backend_variables(unsigned long id, Port *port) ...@@ -3335,3 +3351,52 @@ read_backend_variables(unsigned long id, Port *port)
} }
#endif #endif
#ifdef WIN32
pid_t win32_forkexec(const char* path, char *argv[])
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
char *p;
int i;
char cmdLine[MAXPGPATH];
/* Format the cmd line */
snprintf(cmdLine,sizeof(cmdLine),"%s",path);
i = 0;
while (argv[++i] != NULL)
{
/* FIXME: [fork/exec] some strlen checks might be prudent here */
strcat(cmdLine," ");
strcat(cmdLine,argv[i]);
}
/*
* The following snippet can disappear when we consistently
* use forward slashes.
*/
p = cmdLine;
while (*(p++) != '\0')
if (*p == '/') *p = '\\';
memset(&pi,0,sizeof(pi));
memset(&si,0,sizeof(si));
si.cb = sizeof(si);
if (!CreateProcess(NULL,cmdLine,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi))
{
elog(ERROR,"CreateProcess call failed (%d): %m",GetLastError());
return -1;
}
/*
FIXME: [fork/exec] we might need to keep the following handle/s,
depending on how we implement signalling.
*/
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return pi.dwProcessId;
}
#endif
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/storage/freespace/freespace.c,v 1.28 2003/12/20 17:31:21 momjian Exp $ * $PostgreSQL: pgsql/src/backend/storage/freespace/freespace.c,v 1.29 2004/01/11 03:49:31 momjian Exp $
* *
* *
* NOTES: * NOTES:
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/storage/ipc/pmsignal.c,v 1.7 2003/12/20 17:31:21 momjian Exp $ * $PostgreSQL: pgsql/src/backend/storage/ipc/pmsignal.c,v 1.8 2004/01/11 03:49:31 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/storage/ipc/shmem.c,v 1.77 2003/12/30 00:03:03 tgl Exp $ * $PostgreSQL: pgsql/src/backend/storage/ipc/shmem.c,v 1.78 2004/01/11 03:49:31 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment