diff --git a/doc/src/sgml/ref/ecpg-ref.sgml b/doc/src/sgml/ref/ecpg-ref.sgml
index 2840d38c733a5889f7b1f6a16a5361e678f1c412..83128c23648b7978a61a4bb311b5e6d698194da6 100644
--- a/doc/src/sgml/ref/ecpg-ref.sgml
+++ b/doc/src/sgml/ref/ecpg-ref.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/ecpg-ref.sgml,v 1.8 2001/07/11 03:43:52 momjian Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/ecpg-ref.sgml,v 1.9 2001/08/24 22:37:36 petere Exp $
 Postgres documentation
 -->
 
@@ -116,7 +116,7 @@ ecpg [ -v ] [ -t ] [ -I include-path ] [ -o outfile ]  file1 [ file2 ] [ ... ]
       <term><replaceable>return value</replaceable></term>
       <listitem>
        <para>
-	<application>ecpg</application> returns 0 to the shell on successful completion, -1
+	<application>ecpg</application> returns 0 to the shell on successful completion, non-zero
 	for errors.
        </para>
       </listitem>
diff --git a/src/interfaces/ecpg/preproc/ecpg.c b/src/interfaces/ecpg/preproc/ecpg.c
index e2eccf41fd71ca3e02177438098e0cef56ba9d47..bf0dd18d68055e236f4a4c1588c0a2e96d717246 100644
--- a/src/interfaces/ecpg/preproc/ecpg.c
+++ b/src/interfaces/ecpg/preproc/ecpg.c
@@ -1,6 +1,8 @@
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.47 2001/08/24 22:37:36 petere Exp $ */
+
 /* New main for ecpg, the PostgreSQL embedded SQL precompiler. */
 /* (C) Michael Meskes <meskes@postgresql.org> Feb 5th, 1998 */
-/* Placed under the same copyright as PostgresSQL */
+/* Placed under the same license as PostgresSQL */
 
 #include "postgres_fe.h"
 
@@ -10,9 +12,12 @@
 #include "getopt.h"
 #endif
 
+extern int	optind;
+extern char *optarg;
+
 #include "extern.h"
 
-int			ret_value = OK,
+int			ret_value = 0,
 			autocommit = 0;
 struct _include_path *include_paths = NULL;
 struct cursor *cur = NULL;
@@ -20,14 +25,29 @@ struct typedefs *types = NULL;
 struct _defines *defines = NULL;
 
 static void
-usage(char *progname)
+help(const char *progname)
 {
-	fprintf(stderr, "ecpg - the postgresql preprocessor, version: %d.%d.%d\n", MAJOR_VERSION, MINOR_VERSION, PATCHLEVEL);
-	fprintf(stderr, "Usage: %s: "
+	printf("%s is the PostgreSQL embedded SQL preprocessor for C programs.\n\n",
+		   progname);
+	printf("Usage:\n"
+		   "  %s %s[-I DIRECTORY] [-o OUTFILE] [-t] file1 [file2...]\n\n",
+		   progname,
+#ifdef YYDEBUG
+		   "[-d] "
+#else
+		   ""
+#endif
+		);
+	printf("Options:\n");
 #ifdef YYDEBUG
-			"[-d]"
+	printf("  -d                   generate parser debug output\n");
 #endif
-			" [-v] [-t] [-I include path] [ -o output file name] [-D define name] file1 [file2] ...\n", progname);
+	printf("  -I DIRECTORY         search DIRECTORY for include files\n");
+	printf("  -o OUTFILE           write result to OUTFILE\n");
+	printf("  -t                   turn on autocommit of transactions\n");
+	printf("\nIf no output file is specified, the name is formed by adding .c\n"
+		   "to the input file name, after stripping off .pgc if present.\n");
+	printf("\nReport bugs to <pgsql-bugs@postgresql.org>.\n");
 }
 
 static void
@@ -60,9 +80,27 @@ main(int argc, char *const argv[])
 				verbose = false,
 				out_option = 0;
 	struct _include_path *ip;
+	char	   *progname;
 
-	extern int	optind;
-	extern char *optarg;
+	if (!strrchr(argv[0], '/'))
+		progname = argv[0];
+	else
+		progname = strrchr(argv[0], '/') + 1;
+
+	if (argc > 1)
+	{
+		if (strcmp(argv[1], "--help")==0 || strcmp(argv[1], "-?")==0)
+		{
+			help(progname);
+			exit(0);
+		}
+		else if (strcmp(argv[1], "--version")==0)
+		{
+			printf("ecpg (PostgreSQL %s) %d.%d.%d\n", PG_VERSION,
+				   MAJOR_VERSION, MINOR_VERSION, PATCHLEVEL);
+			exit(0);
+		}
+	}
 
 	add_include_path("/usr/include");
 	add_include_path(INCLUDE_PATH);
@@ -90,32 +128,38 @@ main(int argc, char *const argv[])
 				verbose = true;
 				break;
 			case 'D':
+				/* XXX not documented */
 				add_preprocessor_define(optarg);
 				break;
-#ifdef YYDEBUG
 			case 'd':
+#ifdef YYDEBUG
 				yydebug = 1;
-				break;
+#else
+				fprintf(stderr, "%s: parser debug support (-d) not available\n",
+						progname);
 #endif
+				break;
 			default:
-				usage(argv[0]);
+				fprintf(stderr, "Try '%s --help' for more information.\n", argv[0]);
 				return ILLEGAL_OPTION;
 		}
 	}
 
 	if (verbose)
 	{
-		fprintf(stderr, "ecpg - the postgresql preprocessor, version: %d.%d.%d\n", MAJOR_VERSION, MINOR_VERSION, PATCHLEVEL);
+		fprintf(stderr, "%s, the PostgreSQL embedded C preprocessor, version %d.%d.%d\n",
+				progname, MAJOR_VERSION, MINOR_VERSION, PATCHLEVEL);
 		fprintf(stderr, "exec sql include ... search starts here:\n");
 		for (ip = include_paths; ip != NULL; ip = ip->next)
 			fprintf(stderr, " %s\n", ip->path);
-		fprintf(stderr, "End of search list.\n");
-		return OK;
+		fprintf(stderr, "end of search list\n");
+		return 0;
 	}
 
 	if (optind >= argc)			/* no files specified */
 	{
-		usage(argv[0]);
+		fprintf(stderr, "%s: no input files specified\n", progname);
+		fprintf(stderr, "Try '%s --help' for more information.\n", argv[0]);
 		return (ILLEGAL_OPTION);
 	}
 	else
diff --git a/src/interfaces/ecpg/preproc/extern.h b/src/interfaces/ecpg/preproc/extern.h
index a6813c23795804a8926edb37be0a360a62aa3743..43cfd086c5a5b38bd6914bc7b79ffb9f9dd1af82 100644
--- a/src/interfaces/ecpg/preproc/extern.h
+++ b/src/interfaces/ecpg/preproc/extern.h
@@ -80,10 +80,8 @@ extern ScanKeyword *ScanKeywordLookup(char *text);
 
 /* return codes */
 
-#define OK			 0
-#define PARSE_ERROR		-1
-#define ILLEGAL_OPTION		-2
-#define INDICATOR_NOT_ARRAY -3
-
-#define NO_INCLUDE_FILE		ENOENT
-#define OUT_OF_MEMORY		ENOMEM
+#define ILLEGAL_OPTION		1
+#define NO_INCLUDE_FILE		2
+#define PARSE_ERROR			3
+#define INDICATOR_NOT_ARRAY 4
+#define OUT_OF_MEMORY		5