On Sun, Jan 10, 2016 at 8:10 AM, Michael Paquier <michael.paqu...@gmail.com> wrote: > On Sun, Jan 10, 2016 at 2:00 AM, Andrew Dunstan <and...@dunslane.net> wrote: >> I downloaded the official Cygwin packages into a Cygwin instance and checked >> how they do things. As I rather expected, they do not use pg_ctl at all to >> install or run as a service. Rather, they use the standard Cygwin service >> utility cygrunsrv. This is all managed via a SYSV style init script. > > Thanks for the investigation! > >> So if anything I'd be inclined to disable all the service-related code in >> pg_ctl for Cygwin, and treat it just as we treat Unix. > > We had better do the same for back branches then. Need of a patch?
OK, here is a patch to disable all the service-related code in pg_ctl for cygwin. This time it is not a blind shot and this compiles correctly. Changing the option layer is fine for me if this is HEAD-only. For back-branches, I would suggest to do nothing, the service-related code paths are not going to run anyway, any output going to stderr. -- Michael
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index 919d764..192f587 100644 --- a/src/bin/pg_ctl/pg_ctl.c +++ b/src/bin/pg_ctl/pg_ctl.c @@ -105,7 +105,7 @@ static char backup_file[MAXPGPATH]; static char recovery_file[MAXPGPATH]; static char promote_file[MAXPGPATH]; -#if defined(WIN32) || defined(__CYGWIN__) +#ifdef WIN32 static DWORD pgctl_start_type = SERVICE_AUTO_START; static SERVICE_STATUS status; static SERVICE_STATUS_HANDLE hStatus = (SERVICE_STATUS_HANDLE) 0; @@ -133,7 +133,7 @@ static void do_kill(pgpid_t pid); static void print_msg(const char *msg); static void adjust_data_dir(void); -#if defined(WIN32) || defined(__CYGWIN__) +#ifdef WIN32 #if (_MSC_VER >= 1800) #include <versionhelpers.h> #else @@ -165,7 +165,7 @@ static void unlimit_core_size(void); #endif -#if defined(WIN32) || defined(__CYGWIN__) +#ifdef WIN32 static void write_eventlog(int level, const char *line) { @@ -207,20 +207,11 @@ write_stderr(const char *fmt,...) va_list ap; va_start(ap, fmt); -#if !defined(WIN32) && !defined(__CYGWIN__) +#ifndef WIN32 /* On Unix, we just fprintf to stderr */ vfprintf(stderr, fmt, ap); #else -/* - * On Cygwin, we don't yet have a reliable mechanism to detect when - * we're being run as a service, so fall back to the old (and broken) - * stderr test. - */ -#ifdef __CYGWIN__ -#define pgwin32_is_service() (isatty(fileno(stderr))) -#endif - /* * On Win32, we print to stderr if running on a console, or write to * eventlog if running as a service @@ -718,7 +709,7 @@ test_postmaster_connection(pgpid_t pm_pid, bool do_checkpoint) #endif /* No response, or startup still in process; wait */ -#if defined(WIN32) +#ifdef WIN32 if (do_checkpoint) { /* @@ -1342,7 +1333,7 @@ do_kill(pgpid_t pid) } } -#if defined(WIN32) || defined(__CYGWIN__) +#ifdef WIN32 #if (_MSC_VER < 1800) static bool @@ -1408,20 +1399,6 @@ pgwin32_CommandLine(bool registration) } } -#ifdef __CYGWIN__ - /* need to convert to windows path */ - { - char buf[MAXPGPATH]; - -#if CYGWIN_VERSION_DLL_MAJOR >= 1007 - cygwin_conv_path(CCP_POSIX_TO_WIN_A, cmdPath, buf, sizeof(buf)); -#else - cygwin_conv_to_full_win32_path(cmdPath, buf); -#endif - strcpy(cmdPath, buf); - } -#endif - /* if path does not end in .exe, append it */ if (strlen(cmdPath) < 4 || pg_strcasecmp(cmdPath + strlen(cmdPath) - 4, ".exe") != 0) @@ -1926,7 +1903,7 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_ser */ return r; } -#endif /* defined(WIN32) || defined(__CYGWIN__) */ +#endif /* WIN32 */ static void do_advice(void) @@ -1950,7 +1927,7 @@ do_help(void) printf(_(" %s status [-D DATADIR]\n"), progname); printf(_(" %s promote [-D DATADIR] [-s]\n"), progname); printf(_(" %s kill SIGNALNAME PID\n"), progname); -#if defined(WIN32) || defined(__CYGWIN__) +#ifdef WIN32 printf(_(" %s register [-N SERVICENAME] [-U USERNAME] [-P PASSWORD] [-D DATADIR]\n" " [-S START-TYPE] [-w] [-t SECS] [-o \"OPTIONS\"]\n"), progname); printf(_(" %s unregister [-N SERVICENAME]\n"), progname); @@ -1958,7 +1935,7 @@ do_help(void) printf(_("\nCommon options:\n")); printf(_(" -D, --pgdata=DATADIR location of the database storage area\n")); -#if defined(WIN32) || defined(__CYGWIN__) +#ifdef WIN32 printf(_(" -e SOURCE event source for logging when running as a service\n")); #endif printf(_(" -s, --silent only print errors, no informational messages\n")); @@ -1991,7 +1968,7 @@ do_help(void) printf(_("\nAllowed signal names for kill:\n")); printf(" ABRT HUP INT QUIT TERM USR1 USR2\n"); -#if defined(WIN32) || defined(__CYGWIN__) +#ifdef WIN32 printf(_("\nOptions for register and unregister:\n")); printf(_(" -N SERVICENAME service name with which to register PostgreSQL server\n")); printf(_(" -P PASSWORD password of account to register PostgreSQL server\n")); @@ -2067,7 +2044,7 @@ set_sig(char *signame) } -#if defined(WIN32) || defined(__CYGWIN__) +#ifdef WIN32 static void set_starttype(char *starttypeopt) { @@ -2280,7 +2257,7 @@ main(int argc, char **argv) silent_mode = true; break; case 'S': -#if defined(WIN32) || defined(__CYGWIN__) +#ifdef WIN32 set_starttype(optarg); #else write_stderr(_("%s: -S option not supported on this platform\n"), @@ -2353,7 +2330,7 @@ main(int argc, char **argv) set_sig(argv[++optind]); killproc = atol(argv[++optind]); } -#if defined(WIN32) || defined(__CYGWIN__) +#ifdef WIN32 else if (strcmp(argv[optind], "register") == 0) ctl_command = REGISTER_COMMAND; else if (strcmp(argv[optind], "unregister") == 0) @@ -2457,7 +2434,7 @@ main(int argc, char **argv) case KILL_COMMAND: do_kill(killproc); break; -#if defined(WIN32) || defined(__CYGWIN__) +#ifdef WIN32 case REGISTER_COMMAND: pgwin32_doRegister(); break;
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers