Re: pg_ctl.c - Mailing list pgsql-patches

From Magnus Hagander
Subject Re: pg_ctl.c
Date
Msg-id 6BCB9D8A16AC4241919521715F4D8BCE34BB32@algol.sollentuna.se
Whole thread Raw
In response to pg_ctl.c  (Bruce Momjian <pgman@candle.pha.pa.us>)
Responses Re: pg_ctl.c  (Bruce Momjian <pgman@candle.pha.pa.us>)
List pgsql-patches
Seems it needs an implementation of the "pgwin32 special kill". Try
stealing the one from  backend/port/win32/signal.c (look for pqkill).

Perhaps this function (not the rest of signal.c!) should be moved into
port/, instead of backend/port. IIRC it depends on no other backend
code.

//Magnus

> -----Original Message-----
> From: Thomas Hallgren [mailto:thhal@mailblocks.com]
> Sent: Thursday, May 27, 2004 10:53 AM
> To: pgsql-patches@postgresql.org
> Subject: Re: [PATCHES] pg_ctl.c
>
> Neither the version in CVS head nor the version you attached
> here links on
> win32 (msys/mingw). I get the following:
>
> gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
> -Wmissing-declaratio ns pg_ctl.o
> ec.o -L../../../src/interfaces/libpq -lpq -L../../../src/port
>   -lz -lreadli
> ne -lwsock32 -lm  -lpgport -lws2_32 -o pg_ctl.exe
> pg_ctl.o(.text+0xa3c):pg_ctl.c: undefined reference to `kill'
> pg_ctl.o(.text+0xc4c):pg_ctl.c: undefined reference to `kill'
> pg_ctl.o(.text+0xe5a):pg_ctl.c: undefined reference to `kill'
> pg_ctl.o(.text+0x1058):pg_ctl.c: undefined reference to `kill'
>
> Regards,
>
> Thomas Hallgren
>
> "Bruce Momjian" <pgman@candle.pha.pa.us> wrote in message
> news:200405261459.i4QExWT28671@candle.pha.pa.us...
> > OK, here is a new version with lots of fixes.
> >
> > --
> >   Bruce Momjian                        |  http://candle.pha.pa.us
> >   pgman@candle.pha.pa.us               |  (610) 359-1001
> >   +  If your life is a hard drive,     |  13 Roberts Road
> >   +  Christ can be your backup.        |  Newtown Square,
> Pennsylvania
> 19073
> >
>
>
> --------------------------------------------------------------
> --------------
> ----
>
>
> >
> /*------------------------------------------------------------
> -------------
> >  *
> >  * pg_ctl --- start/stops/restarts the PostgreSQL server
> >  *
> >  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development
> > Group
> >  *
> >  * $PostgreSQL: pgsql-server/src/bin/initdb/initdb.c,v 1.32
> 2004/05/18
> 03:36:36 momjian Exp $
> >  *
> >
> *-------------------------------------------------------------
> ------------
> >  */
> >
> > #include "postgres_fe.h"
> > #include "libpq-fe.h"
> >
> > #include <signal.h>
> > #include <errno.h>
> > #include <sys/types.h>
> > #include <sys/stat.h>
> >
> > #include "libpq/pqsignal.h"
> > #include "getopt_long.h"
> >
> > #ifndef HAVE_OPTRESET
> > int optreset;
> > #endif
> >
> >
> > #define _(x) gettext((x))
> >
> > #define WHITESPACE "\f\n\r\t\v" /* as defined by isspace() */
> >
> > /* postmaster version ident string */
> > #define PM_VERSIONSTR "postmaster (PostgreSQL) " PG_VERSION "\n"
> >
> >
> > typedef enum
> > {
> > SMART_MODE,
> > FAST_MODE,
> > IMMEDIATE_MODE
> > } ShutdownMode;
> >
> >
> > typedef enum
> > {
> > NO_COMMAND = 0,
> > START_COMMAND,
> > STOP_COMMAND,
> > RESTART_COMMAND,
> > RELOAD_COMMAND,
> > STATUS_COMMAND,
> > KILL_COMMAND
> > } CtlCommand;
> >
> >
> > static bool do_wait = false;
> > static bool wait_set = false;
> > static int wait_seconds = 60;
> > static bool silence_echo = false;
> > static ShutdownMode shutdown_mode = SMART_MODE; static int sig =
> > SIGTERM; /* default */ static int killproc; static CtlCommand
> > ctl_command = NO_COMMAND; static char *pg_data_opts = NULL; static
> > char *pg_data = NULL; static char *post_opts = NULL; static
> const char
> > *progname; static char *log_file = NULL; static char
> *postgres_path =
> > NULL; static char *argv0 = NULL;
> >
> > static void *xmalloc(size_t size);
> > static char *xstrdup(const char *s);
> > static void do_advice(void);
> > static void do_help(void);
> > static void set_mode(char *modeopt);
> > static void set_sig(char *signame);
> > static void do_start();
> > static void do_stop(void);
> > static void do_restart(void);
> > static void do_reload(void);
> > static void do_status(void);
> > static void do_kill(void);
> > static long get_pgpid(void);
> > static char **readfile(char *path);
> > static int start_postmaster(void);
> > static bool test_postmaster_connection(void);
> >
> > static char def_postopts_file[MAXPGPATH]; static char
> > postopts_file[MAXPGPATH]; static char pid_file[MAXPGPATH];
> static char
> > conf_file[MAXPGPATH];
> >
> > /*
> >  * routines to check memory allocations and fail noisily.
> >  */
> >
> > static void *
> > xmalloc(size_t size)
> > {
> > void    *result;
> >
> > result = malloc(size);
> > if (!result)
> > {
> > fprintf(stderr, _("%s: out of memory\n"), progname);
> exit(1); } return
> > result; }
> >
> >
> >
> > static char *
> > xstrdup(const char *s)
> > {
> > char    *result;
> >
> > result = strdup(s);
> > if (!result)
> > {
> > fprintf(stderr, _("%s: out of memory\n"), progname);
> exit(1); } return
> > result; }
> >
> >
> >
> > static long
> > get_pgpid(void)
> > {
> > FILE    *pidf;
> > long pid;
> >
> > pidf = fopen(pid_file, "r");
> > if (pidf == NULL)
> > {
> > /* No pid file, not an error on startup */ if (errno ==
> ENOENT) return
> > 0; else { perror("openning pid file"); exit(1); } } fscanf(pidf,
> > "%ld", &pid); fclose(pidf); return pid; }
> >
> >
> > /*
> >  * get the lines from a text file - return NULL if file can't be
> > opened  */ static char ** readfile(char *path) {
> > FILE    *infile;
> > int maxlength = 0,
> > linelen = 0;
> > int nlines = 0;
> > char   **result;
> > char    *buffer;
> > int c;
> >
> > if ((infile = fopen(path, "r")) == NULL) return NULL;
> >
> > /* pass over the file twice - the first time to size the result */
> >
> > while ((c = fgetc(infile)) != EOF)
> > {
> > linelen++;
> > if (c == '\n')
> > {
> > nlines++;
> > if (linelen > maxlength)
> > maxlength = linelen;
> > linelen = 0;
> > }
> > }
> >
> > /* handle last line without a terminating newline (yuck) */ if
> > (linelen)
> > nlines++;
> > if (linelen > maxlength)
> > maxlength = linelen;
> >
> > /* set up the result and the line buffer */
> >
> > result = (char **) xmalloc((nlines + 1) * sizeof(char *)); buffer =
> > (char *) xmalloc(maxlength + 1);
> >
> > /* now reprocess the file and store the lines */ rewind(infile);
> > nlines = 0; while (fgets(buffer, maxlength + 1, infile) != NULL)
> > result[nlines++] = xstrdup(buffer);
> >
> > fclose(infile);
> > result[nlines] = NULL;
> >
> > return result;
> > }
> >
> >
> >
> > /*
> >  * start/test/stop routines
> >  */
> >
> > static int
> > start_postmaster(void)
> > {
> > /*
> > * Since there might be quotes to handle here, it is easier simply
> > * to pass everything to a shell to process them.
> > */
> > char cmd[MAXPGPATH];
> >
> > /* Does '&' work on Win32? */
> > if (log_file != NULL)
> > snprintf(cmd, MAXPGPATH, "\"%s\" %s < %s >>\"%s\" 2>&1 &",
> > postgres_path, post_opts, DEVNULL, log_file); else snprintf(cmd,
> > MAXPGPATH, "\"%s\" %s < %s 2>&1 &", postgres_path, post_opts,
> > DEVNULL); return system(cmd); }
> >
> >
> >
> > /* Find the pgport and try a connection */ static bool
> > test_postmaster_connection(void)
> > {
> > PGconn    *conn;
> > bool success = false;
> > int i;
> > char portstr[32];
> > char *p;
> >
> >
> > *portstr = '\0';
> >
> > /* post_opts */
> > for (p = post_opts; *p;)
> > {
> > /* advance past whitespace/quoting */
> > while (isspace(*p) || *p == '\'' || *p == '"')
> > p++;
> >
> > if (strncmp(p, "-p", strlen("-p")) == 0)
> > {
> > p += strlen("-p");
> > /* advance past whitespace/quoting */
> > while (isspace(*p) || *p == '\'' || *p == '"')
> > p++;
> > StrNCpy(portstr, p, Min(strcspn(p, "\"'"WHITESPACE) + 1,
> > sizeof(portstr)));
> > /* keep looking, maybe there is another -p */
> > }
> > /* Advance to next whitespace */
> > while (!isspace(*p))
> > p++;
> > }
> >
> > /* config file */
> > if (!*portstr)
> > {
> > char   **optlines;
> >
> > optlines = readfile(conf_file);
> > if (optlines != NULL)
> > {
> > for (;*optlines != NULL; optlines++)
> > {
> > p = *optlines;
> >
> > while (isspace(*p))
> > p++;
> > if (strncmp(p, "port", strlen("port")) != 0)
> > continue;
> > p += strlen("port");
> > while (isspace(*p))
> > p++;
> > if (*p != '=')
> > continue;
> > p++;
> > while (isspace(*p))
> > p++;
> > StrNCpy(portstr, p, Min(strcspn(p, "#"WHITESPACE) + 1,
> > sizeof(portstr)));
> > /* keep looking, maybe there is another */
> > }
> > }
> > }
> >
> > /* environment */
> > if (!*portstr && getenv("PGPORT") != NULL)
> > StrNCpy(portstr, getenv("PGPORT"), sizeof(portstr));
> >
> > /* default */
> > if (!*portstr)
> > snprintf(portstr, sizeof(portstr), "%d", DEF_PGPORT);
> >
> > for (i = 0; i < wait_seconds; i++)
> > {
> > if ((conn = PQsetdbLogin(NULL, portstr, NULL, NULL,
> "template1", NULL,
> NULL)) != NULL)
> > {
> > PQfinish(conn);
> > success = true;
> > break;
> > }
> > }
> >
> > return success;
> > }
> >
> >
> >
> > static void
> > do_start(void)
> > {
> > long pid;
> > long old_pid = 0;
> > char    *optline = NULL;
> >
> > if (ctl_command != RESTART_COMMAND)
> > {
> > old_pid = get_pgpid();
> > if (old_pid != 0)
> > fprintf(stderr,
> > _("%s: Another postmaster may be running. "
> > "Trying to start postmaster anyway.\n"),
> > progname);
> > }
> >
> > if (post_opts == NULL)
> > {
> > char   **optlines;
> > int len;
> >
> > optlines = readfile(ctl_command == RESTART_COMMAND ?
> > postopts_file : def_postopts_file);
> > if (optlines == NULL)
> > {
> > if (ctl_command == START_COMMAND)
> > post_opts = "";
> > else
> > {
> > fprintf(stderr, _("%s: cannot read %s\n"), progname, postopts_file);
> > exit(1);
> > }
> > }
> > else if (optlines[0] == NULL || optlines[1] != NULL)
> > {
> > fprintf(stderr, _("%s: option file %s must have exactly 1 line\n"),
> > progname, ctl_command == RESTART_COMMAND ?
> > postopts_file : def_postopts_file);
> > exit(1);
> > }
> > else
> > {
> > optline = optlines[0];
> > len = strcspn(optline, "\r\n");
> > optline[len] = '\0';
> >
> > if (ctl_command == RESTART_COMMAND)
> > {
> > char    *arg1;
> >
> > arg1 = strchr(optline, '\'');
> > if (arg1 == NULL || arg1 == optline)
> > post_opts = "";
> > else
> > {
> > *(arg1 - 1) = '\0'; /* this should be a space */
> > post_opts = arg1;
> > }
> > if (postgres_path != NULL)
> > postgres_path = optline;
> > }
> > else
> > post_opts = optline;
> > }
> > }
> >
> > if (postgres_path == NULL)
> > {
> > char    *postmaster_path;
> > int ret;
> >
> > postmaster_path = xmalloc(MAXPGPATH);
> >
> > if ((ret = find_other_exec(argv0, "postmaster", PM_VERSIONSTR,
> >    postmaster_path)) < 0)
> > {
> > if (ret == -1)
> > fprintf(stderr,
> > _("The program \"postmaster\" is needed by %s "
> >    "but was not found in the same directory as \"%s\".\n"
> >   "Check your installation.\n"),
> > progname, progname);
> > else
> > fprintf(stderr,
> > _("The program \"postmaster\" was found by %s "
> >   "but was not the same version as \"%s\".\n"
> >   "Check your installation.\n"),
> > progname, progname);
> > exit(1);
> > }
> > postgres_path = postmaster_path;
> > }
> >
> > if (start_postmaster() != 0)
> > {
> > fprintf(stderr, _("Unable to run the postmaster binary\n"));
> > exit(1);
> > }
> >
> > if (old_pid != 0)
> > {
> > pg_usleep(1000000);
> > pid = get_pgpid();
> > if (pid == old_pid)
> > {
> > fprintf(stderr,
> > _("%s: cannot start postmaster\n"
> > "Examine the log output\n"),
> > progname);
> > exit(1);
> > }
> > }
> >
> > if (do_wait)
> > {
> > if (!silence_echo)
> > {
> > printf(_("waiting for postmaster to start..."));
> > fflush(stdout);
> > }
> >
> > if (test_postmaster_connection() == false)
> > printf(_("could not start postmaster\n"));
> > else if (!silence_echo)
> > printf(_("done\npostmaster started\n"));
> > }
> > else if (!silence_echo)
> > printf(_("postmaster starting\n"));
> > }
> >
> >
> >
> > static void
> > do_stop(void)
> > {
> > int cnt;
> > long pid;
> >
> > pid = get_pgpid();
> >
> > if (pid == 0) /* no pid file */
> > {
> > fprintf(stderr, _("%s: could not find %s\n"), progname, pid_file);
> > fprintf(stderr, _("Is postmaster running?\n"));
> > exit(1);
> > }
> > else if (pid < 0) /* standalone backend, not postmaster */
> > {
> > pid = -pid;
> > fprintf(stderr,
> > _("%s: cannot stop postmaster; "
> > "postgres is running (PID: %ld)\n"),
> > progname, pid);
> > exit(1);
> > }
> >
> > if (kill((pid_t) pid, sig) != 0)
> > {
> > fprintf(stderr, _("stop signal failed\n"));
> > exit(1);
> > }
> >
> > if (!do_wait)
> > {
> > if (!silence_echo)
> > printf(_("postmaster shutting down\n"));
> > return;
> > }
> > else
> > {
> > if (!silence_echo)
> > {
> > printf(_("waiting for postmaster to shut down..."));
> > fflush(stdout);
> > }
> >
> > for (cnt = 0; cnt < wait_seconds; cnt++)
> > {
> > if ((pid = get_pgpid()) != 0)
> > {
> > if (!silence_echo)
> > {
> > printf(".");
> > fflush(stdout);
> > }
> > pg_usleep(1000000); /* 1 sec */
> > }
> > else
> > break;
> > }
> >
> > if (pid != 0) /* pid file still exists */
> > {
> > if (!silence_echo)
> > printf(_(" failed\n"));
> >
> > fprintf(stderr, _("%s: postmaster does not shut down\n"), progname);
> > exit(1);
> > }
> > printf(_("done\npostmaster stopped\n"));
> > }
> > }
> >
> >
> > /*
> >  * restart/reload routines
> >  */
> >
> > static void
> > do_restart(void)
> > {
> > int cnt;
> > long pid;
> >
> > pid = get_pgpid();
> >
> > if (pid == 0) /* no pid file */
> > {
> > fprintf(stderr, _("%s: could not find %s\n"), progname, pid_file);
> > fprintf(stderr, _("Is postmaster running?\nstarting postmaster
> anyway\n"));
> > do_start();
> > return;
> > }
> > else if (pid < 0) /* standalone backend, not postmaster */
> > {
> > pid = -pid;
> > fprintf(stderr,
> > _("%s: cannot restart postmaster; "
> > "postgres is running (PID: %ld)\n"),
> > progname, pid);
> > fprintf(stderr, _("Please terminate postgres and try again.\n"));
> > exit(1);
> > }
> >
> > if (kill((pid_t) pid, sig) != 0)
> > {
> > fprintf(stderr, _("stop signal failed\n"));
> > exit(1);
> > }
> >
> > if (!silence_echo)
> > {
> > printf(_("waiting for postmaster to shut down..."));
> > fflush(stdout);
> > }
> >
> > /* always wait for restart */
> >
> > for (cnt = 0; cnt < wait_seconds; cnt++)
> > {
> > if ((pid = get_pgpid()) != 0)
> > {
> > if (!silence_echo)
> > {
> > printf(".");
> > fflush(stdout);
> > }
> > pg_usleep(1000000); /* 1 sec */
> > }
> > else
> > break;
> > }
> >
> > if (pid != 0) /* pid file still exists */
> > {
> > if (!silence_echo)
> > printf(_(" failed\n"));
> >
> > fprintf(stderr, _("%s: postmaster does not shut down\n"), progname);
> > exit(1);
> > }
> >
> > printf(_("done\npostmaster stopped\n"));
> > do_start();
> > }
> >
> >
> > static void
> > do_reload(void)
> > {
> > long pid;
> >
> > pid = get_pgpid();
> > if (pid == 0) /* no pid file */
> > {
> > fprintf(stderr, _("%s: could not find %s\n"), progname, pid_file);
> > fprintf(stderr, _("Is postmaster running?\n"));
> > exit(1);
> > }
> > else if (pid < 0) /* standalone backend, not postmaster */
> > {
> > pid = -pid;
> > fprintf(stderr,
> > _("%s: cannot reload postmaster; "
> > "postgres is running (PID: %ld)\n"),
> > progname, pid);
> > fprintf(stderr, _("Please terminate postgres and try again.\n"));
> > exit(1);
> > }
> >
> > if (kill((pid_t) pid, sig) != 0)
> > {
> > fprintf(stderr, _("reload signal failed\n"));
> > exit(1);
> > }
> >
> > if (!silence_echo)
> > fprintf(stdout, _("postmaster signaled\n"));
> > }
> >
> > /*
> >  * utility routines
> >  */
> >
> > static void
> > do_status(void)
> > {
> > long pid;
> >
> > pid = get_pgpid();
> > if (pid == 0) /* no pid file */
> > {
> > fprintf(stderr, _("%s: postmaster or postgres not
> running\n"), progname);
> > exit(1);
> > }
> > else if (pid < 0) /* standalone backend */
> > {
> > pid = -pid;
> > fprintf(stdout, _("%s: a standalone backend \"postgres\" is
> running (PID:
> %ld)\n"), progname, pid);
> > }
> > else /* postmaster */
> > {
> > char   **optlines;
> >
> > fprintf(stdout, _("%s: postmaster is running (PID:
> %ld)\n"), progname,
> pid);
> >
> > optlines = readfile(postopts_file);
> > if (optlines != NULL)
> > for (; *optlines != NULL; optlines++)
> > fputs(*optlines, stdout);
> > }
> > }
> >
> >
> >
> > static void
> > do_kill(void)
> > {
> > if (kill(killproc, sig) != 0)
> > {
> > fprintf(stderr, _("signal %d failed\n"), sig);
> > exit(1);
> > }
> > }
> >
> >
> >
> > static void
> > do_advice(void)
> > {
> > fprintf(stderr, _("\nTry \"%s --help\" for more information.\n"),
> progname);
> > }
> >
> >
> >
> > static void
> > do_help(void)
> > {
> > printf(_("%s is a utility to start, stop, restart, reload
> configuration
> files,\n"), progname);
> > printf(_("report the status of a PostgreSQL server, or kill
> a PostgreSQL
> process\n\n"));
> > printf(_("Usage:\n"));
> > printf(_("  %s start   [-w] [-D DATADIR] [-s] [-l FILENAME] [-o
> \"OPTIONS\"]\n"), progname);
> > printf(_("  %s stop    [-W] [-D DATADIR] [-s] [-m
> SHUTDOWN-MODE]\n"),
> progname);
> > printf(_("  %s restart [-w] [-D DATADIR] [-s] [-m SHUTDOWN-MODE] [-o
> \"OPTIONS\"]\n"), progname);
> > printf(_("  %s reload  [-D DATADIR] [-s]\n"), progname);
> > printf(_("  %s status  [-D DATADIR]\n"), progname);
> > printf(_("  %s kill    SIGNALNAME PROCESSID\n"), progname);
> > printf(_("Common options:\n"));
> > printf(_("  -D, --pgdata DATADIR   location of the database storage
> area\n"));
> > printf(_("  -s, --silent only print errors, no informational
> messages\n"));
> > printf(_("  -w           wait until operation completes\n"));
> > printf(_("  -W           do not wait until operation completes\n"));
> > printf(_("  --help       show this help, then exit\n"));
> > printf(_("  --version    output version information, then exit\n"));
> > printf(_("(The default is to wait for shutdown, but not for start or
> restart.)\n\n"));
> > printf(_("If the -D option is omitted, the environment
> variable PGDATA is
> used.\n\n"));
> > printf(_("Options for start or restart:\n"));
> > printf(_("  -l, --log FILENAME      write (or append) server log to
> FILENAME.  The\n"));
> > printf(_("                          use of this option is highly
> recommended.\n"));
> > printf(_("  -o OPTIONS              command line options to
> pass to the
> postmaster\n"));
> > printf(_("                          (PostgreSQL server
> executable)\n"));
> > printf(_("  -p PATH-TO-POSTMASTER   normally not necessary\n\n"));
> > printf(_("Options for stop or restart:\n"));
> > printf(_("  -m SHUTDOWN-MODE   may be 'smart', 'fast', or
> 'immediate'\n\n"));
> > printf(_("Allowed signal names for kill:\n"));
> > printf(_("  -HUP -INT -QUIT -ABRT -TERM -USR1 -USR2\n\n"));
> > printf(_("Shutdown modes are:\n"));
> > printf(_("  smart       quit after all clients have
> disconnected\n"));
> > printf(_("  fast        quit directly, with proper shutdown\n"));
> > printf(_("  immediate   quit without complete shutdown; will lead to
> recovery on restart\n\n"));
> > printf(_("Report bugs to <pgsql-bugs@postgresql.org>.\n"));
> > }
> >
> >
> >
> > static void
> > set_mode(char *modeopt)
> > {
> > if (strcmp(modeopt, "s") == 0 || strcmp(modeopt, "smart") == 0)
> > {
> > shutdown_mode = SMART_MODE;
> > sig = SIGTERM;
> > }
> > else if (strcmp(modeopt, "f") == 0 || strcmp(modeopt, "fast") == 0)
> > {
> > shutdown_mode = FAST_MODE;
> > sig = SIGINT;
> > }
> > else if (strcmp(modeopt, "i") == 0 || strcmp(modeopt,
> "immediate") == 0)
> > {
> > shutdown_mode = IMMEDIATE_MODE;
> > sig = SIGQUIT;
> > }
> > else
> > {
> > fprintf(stderr, _("%s: invalid shutdown mode %s\n"),
> progname, modeopt);
> > do_advice();
> > exit(1);
> > }
> > }
> >
> >
> >
> > static void
> > set_sig(char *signame)
> > {
> > if (!strcmp(signame, "-HUP"))
> > sig = SIGHUP;
> > else if (!strcmp(signame, "-INT"))
> > sig = SIGINT;
> > else if (!strcmp(signame, "-QUIT"))
> > sig = SIGQUIT;
> > else if (!strcmp(signame, "-ABRT"))
> > sig = SIGABRT;
> >
> > /*
> > * probably should NOT provide SIGKILL
> > *
> > * else if (!strcmp(signame,"-KILL")) sig = SIGKILL;
> > */
> > else if (!strcmp(signame, "-TERM"))
> > sig = SIGTERM;
> > else if (!strcmp(signame, "-USR1"))
> > sig = SIGUSR1;
> > else if (!strcmp(signame, "-USR2"))
> > sig = SIGUSR2;
> > else
> > {
> > fprintf(stderr, _("%s: invalid signal \"%s\"\n"), progname,
> signame);
> > do_advice();
> > exit(1);
> > }
> >
> > }
> >
> >
> >
> > int
> > main(int argc, char **argv)
> > {
> > static struct option long_options[] = {
> > {"help", no_argument, NULL, '?'},
> > {"version", no_argument, NULL, 'V'},
> > {"log", required_argument, NULL, 'l'},
> > {"mode", required_argument, NULL, 'm'},
> > {"pgdata", required_argument, NULL, 'D'},
> > {"silent", no_argument, NULL, 's'},
> > {0, 0, 0, 0}
> > };
> >
> > int option_index;
> > int c;
> >
> > #ifdef WIN32
> > setvbuf(stderr, NULL, _IONBF, 0);
> > #endif
> >
> > progname = get_progname(argv[0]);
> >
> > /*
> > * save argv[0] so do_start() can look for the postmaster if
> > * necessary. we don't look for postmaster here because in many cases
> > * we won't need it.
> > */
> > argv0 = argv[0];
> >
> > umask(077);
> >
> >     if (argc > 1)
> >     {
> > if (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0 ||
> > strcmp(argv[1], "-?") == 0)
> > {
> > do_help();
> > exit(0);
> > }
> > else if (strcmp(argv[1], "-V") == 0 || strcmp(argv[1],
> "--version") == 0)
> > {
> > printf("%s (PostgreSQL) %s\n", progname, PG_VERSION);
> > exit(0);
> > }
> > }
> >
> > /* process command-line options */
> >
> > while ((c = getopt_long(argc, argv, "D:l:m:o:p:swW", long_options,
> &option_index)) != -1)
> > {
> > switch (c)
> > {
> > case 'D':
> > {
> > int len = strlen(optarg) + 4;
> > char    *env_var;
> >
> > pg_data_opts = xmalloc(len);
> > snprintf(pg_data_opts, len, "-D %s", optarg);
> > env_var = xmalloc(len + sizeof("PGDATA="));
> > snprintf(env_var, len + sizeof("PGDATA="), "PGDATA=%s", optarg);
> > putenv(env_var);
> > break;
> > }
> > case 'l':
> > log_file = xstrdup(optarg);
> > break;
> > case 'm':
> > set_mode(optarg);
> > break;
> > case 'o':
> > post_opts = xstrdup(optarg);
> > break;
> > case 'p':
> > postgres_path = xstrdup(optarg);
> > break;
> > case 's':
> > silence_echo = true;
> > break;
> > case 'w':
> > do_wait = true;
> > wait_set = true;
> > break;
> > case 'W':
> > do_wait = false;
> > wait_set = true;
> > break;
> > default:
> > fprintf(stderr, _("%s: invalid option %s\n"), progname, optarg);
> > do_advice();
> > exit(1);
> > }
> > }
> >
> > for (; optind < argc; optind++)
> > {
> > if (ctl_command != NO_COMMAND)
> > {
> > fprintf(stderr, _("%s: extra operation mode %s\n"), progname,
> argv[optind]);
> > do_advice();
> > exit(1);
> > }
> >
> > if (strcmp(argv[optind], "start") == 0)
> > ctl_command = START_COMMAND;
> > else if (strcmp(argv[optind], "stop") == 0)
> > ctl_command = STOP_COMMAND;
> > else if (strcmp(argv[optind], "restart") == 0)
> > ctl_command = RESTART_COMMAND;
> > else if (strcmp(argv[optind], "reload") == 0)
> > ctl_command = RELOAD_COMMAND;
> > else if (strcmp(argv[optind], "status") == 0)
> > ctl_command = STATUS_COMMAND;
> > else if (strcmp(argv[optind], "kill") == 0)
> > {
> > if (argc - optind < 3)
> > {
> > fprintf(stderr, _("%s: invalid kill syntax\n"), progname);
> > do_advice();
> > exit(1);
> > }
> > ctl_command = KILL_COMMAND;
> > set_sig(argv[optind + 1]);
> > killproc = atol(argv[optind + 2]);
> > }
> > else
> > {
> > fprintf(stderr, _("%s: invalid operation mode %s\n"), progname,
> argv[optind]);
> > do_advice();
> > exit(1);
> > }
> > }
> >
> > if (ctl_command == NO_COMMAND)
> > {
> > fprintf(stderr, _("%s: no operation specified\n"), progname);
> > do_advice();
> > exit(1);
> > }
> >
> > pg_data = getenv("PGDATA");
> > canonicalize_path(pg_data);
> >
> > if (pg_data == NULL && ctl_command != KILL_COMMAND)
> > {
> > fprintf(stderr,
> > _("%s: no database directory specified "
> > "and environment variable PGDATA unset\n"),
> > progname);
> > do_advice();
> > exit(1);
> > }
> >
> > if (!wait_set)
> > {
> > switch (ctl_command)
> > {
> > case RESTART_COMMAND:
> > case START_COMMAND:
> > do_wait = false;
> > break;
> > case STOP_COMMAND:
> > do_wait = true;
> > break;
> > default:
> > break;
> > }
> > }
> >
> > if (ctl_command == RELOAD_COMMAND)
> > {
> > sig = SIGHUP;
> > do_wait = false;
> > }
> >
> > snprintf(def_postopts_file, MAXPGPATH, "%s/postmaster.opts.default",
> pg_data);
> > snprintf(postopts_file, MAXPGPATH, "%s/postmaster.opts", pg_data);
> > snprintf(pid_file, MAXPGPATH, "%s/postmaster.pid", pg_data);
> > snprintf(conf_file, MAXPGPATH, "%s/postgresql.conf", pg_data);
> >
> > switch (ctl_command)
> > {
> > case STATUS_COMMAND:
> > do_status();
> > break;
> > case START_COMMAND:
> > do_start();
> > break;
> > case STOP_COMMAND:
> > do_stop();
> > break;
> > case RESTART_COMMAND:
> > do_restart();
> > break;
> > case RELOAD_COMMAND:
> > do_reload();
> > break;
> > case KILL_COMMAND:
> > do_kill();
> > break;
> > default:
> > break;
> > }
> >
> > exit(0);
> > }
> >
>
>
> --------------------------------------------------------------
> --------------
> ----
>
>
> >
> #-------------------------------------------------------------
> ------------
> > #
> > # Makefile for src/bin/pg_ctl
> > #
> > # Portions Copyright (c) 1996-2003, PostgreSQL Global
> Development Group
> > # Portions Copyright (c) 1994, Regents of the University of
> California
> > #
> > # $PostgreSQL: pgsql-server/src/bin/pg_ctl/Makefile,v 1.41
> 2004/05/24
> 01:01:37 momjian Exp $
> > #
> >
> #-------------------------------------------------------------
> ------------
> >
> > subdir = src/bin/pg_ctl
> > top_builddir = ../../..
> > include $(top_builddir)/src/Makefile.global
> >
> > override CPPFLAGS
> := -DFRONTEND -DDEF_PGPORT=$(DEF_PGPORT) -I$(libpq_srcdir) $(CPPFLAGS)
> >
> > OBJS= pg_ctl.o exec.o
> >
> > all: submake-libpq submake-libpgport pg_ctl
> >
> > pg_ctl: $(OBJS) $(libpq_builddir)/libpq.a
> > $(CC) $(CFLAGS) $(OBJS) $(libpq) $(LDFLAGS) $(LIBS) -o $@$(X)
> >
> > exec.c: % : $(top_srcdir)/src/port/%
> > rm -f $@ && $(LN_S) $< .
> >
> > install: all installdirs
> > $(INSTALL_PROGRAM) pg_ctl$(X) $(DESTDIR)$(bindir)/pg_ctl$(X)
> >
> > installdirs:
> > $(mkinstalldirs) $(DESTDIR)$(bindir)
> >
> > uninstall:
> > rm -f $(DESTDIR)$(bindir)/pg_ctl$(X)
> >
> > clean distclean maintainer-clean:
> > rm -f pg_ctl$(X) $(OBJS) exec.c
> >
> >
> > # ensure that changes in DEF_PGPORT propagate into object file
> > pg_ctl.o: pg_ctl.c $(top_builddir)/src/Makefile.global
> >
>
>
> --------------------------------------------------------------
> --------------
> ----
>
>
> >
> > ---------------------------(end of
> broadcast)---------------------------
> > TIP 1: subscribe and unsubscribe commands go to
> majordomo@postgresql.org
> >
>
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 8: explain analyze is your friend
>
>

pgsql-patches by date:

Previous
From: "Thomas Hallgren"
Date:
Subject: Re: pg_ctl.c
Next
From: "Magnus Hagander"
Date:
Subject: Re: Relocatable locale