diff -r 2d87758e836b src/bin/pg_ctl/pg_ctl.c
--- a/src/bin/pg_ctl/pg_ctl.c	Sun Nov 22 22:06:30 2009 +0000
+++ b/src/bin/pg_ctl/pg_ctl.c	Fri Dec 04 22:13:28 2009 +0100
@@ -57,6 +57,7 @@
 typedef enum
 {
 	NO_COMMAND = 0,
+	INIT_COMMAND,
 	START_COMMAND,
 	STOP_COMMAND,
 	RESTART_COMMAND,
@@ -100,6 +101,7 @@
 static void do_help(void);
 static void set_mode(char *modeopt);
 static void set_sig(char *signame);
+static void do_init(void);
 static void do_start(void);
 static void do_stop(void);
 static void do_restart(void);
@@ -615,6 +617,38 @@
 }
 
 static void
+do_init(void)
+{
+	char pg_initdb[MAXPGPATH];
+	char cmd[MAXPGPATH];
+	int ret;
+
+	if ((ret = find_other_exec(argv0, "initdb", "initdb (PostgreSQL) " PG_VERSION "\n",
+							   pg_initdb)) < 0)
+	{
+		write_stderr(_("%s: could not find initdb\n"),
+					 progname);
+		exit(1);
+	}
+
+	if (post_opts == NULL)
+		post_opts = "";
+
+	if (!silent_mode)
+		snprintf(cmd, MAXPGPATH, SYSTEMQUOTE "\"%s\" %s%s" SYSTEMQUOTE,
+				 pg_initdb, pgdata_opt, post_opts);
+	else
+		snprintf(cmd, MAXPGPATH, SYSTEMQUOTE "\"%s\" %s%s > \"%s\"" SYSTEMQUOTE,
+				 pg_initdb, pgdata_opt, post_opts, DEVNULL);
+	
+	if ( system(cmd) != 0 )
+	{
+		write_stderr(_("%s: database initialization failed.\n"), progname);
+		exit(1);
+	}
+}
+
+static void
 do_start(void)
 {
 	pgpid_t		pid;
@@ -1536,6 +1570,7 @@
 	printf(_("%s is a utility to start, stop, restart, reload configuration files,\n"
 			 "report the status of a PostgreSQL server, or signal a PostgreSQL process.\n\n"), progname);
 	printf(_("Usage:\n"));
+	printf(_("  %s init[db]   [-D DATADIR] [-s] [-o \"OPTIONS\"]\n"), progname);
 	printf(_("  %s start   [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o \"OPTIONS\"]\n"), progname);
 	printf(_("  %s stop    [-W] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]\n"), progname);
 	printf(_("  %s restart [-w] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]\n"
@@ -1568,7 +1603,7 @@
 #endif
 	printf(_("  -l, --log FILENAME     write (or append) server log to FILENAME\n"));
 	printf(_("  -o OPTIONS             command line options to pass to postgres\n"
-			 "                         (PostgreSQL server executable)\n"));
+			 "                         (PostgreSQL server executable) or initdb\n"));
 	printf(_("  -p PATH-TO-POSTGRES    normally not necessary\n"));
 	printf(_("\nOptions for stop or restart:\n"));
 	printf(_("  -m SHUTDOWN-MODE   can be \"smart\", \"fast\", or \"immediate\"\n"));
@@ -1825,7 +1860,11 @@
 				exit(1);
 			}
 
-			if (strcmp(argv[optind], "start") == 0)
+			if (strcmp(argv[optind], "init") == 0)
+				ctl_command = INIT_COMMAND;
+			else if (strcmp(argv[optind], "initdb") == 0)
+				ctl_command = INIT_COMMAND;
+			else if (strcmp(argv[optind], "start") == 0)
 				ctl_command = START_COMMAND;
 			else if (strcmp(argv[optind], "stop") == 0)
 				ctl_command = STOP_COMMAND;
@@ -1922,6 +1961,9 @@
 
 	switch (ctl_command)
 	{
+		case INIT_COMMAND:
+			do_init();
+			break;
 		case STATUS_COMMAND:
 			do_status();
 			break;
