From 1d75298176705edda237af75e24e0a87cfb9f6ad Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter_e@gmx.net>
Date: Sat, 11 Mar 2000 13:56:24 +0000
Subject: [PATCH] Karel Zakr's revised patch to fix psql prompt for local host
 connections.

---
 doc/src/sgml/ref/psql-ref.sgml |  6 +--
 src/bin/psql/prompt.c          | 82 +++++++++++++++++++++++++++-------
 2 files changed, 68 insertions(+), 20 deletions(-)

diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml
index a265bff87b3..9c252d1d853 100644
--- a/doc/src/sgml/ref/psql-ref.sgml
+++ b/doc/src/sgml/ref/psql-ref.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.27 2000/03/01 21:09:56 petere Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.28 2000/03/11 13:56:23 petere Exp $
 Postgres documentation
 -->
 
@@ -1966,8 +1966,8 @@ testdb=> <userinput>\set content `sed -e "s/'/\\\\\\'/g" < my_file.txt`</userinp
     <variablelist>
       <varlistentry>
         <term><literal>%M</literal></term>
-	<listitem><para>The hostname of the database server (or <quote>.</quote>
-         if Unix domain socket).</para></listitem>
+	<listitem><para>The full hostname (with domainname) of the database server (or
+         <quote>localhost</quote> if hostname information is not available).</para></listitem>
       </varlistentry>
 
       <varlistentry>
diff --git a/src/bin/psql/prompt.c b/src/bin/psql/prompt.c
index efb2b1a3f6b..b8b59eb15c5 100644
--- a/src/bin/psql/prompt.c
+++ b/src/bin/psql/prompt.c
@@ -3,8 +3,8 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/prompt.c,v 1.10 2000/03/08 01:38:59 momjian Exp $
- */
+ * $Header: /cvsroot/pgsql/src/bin/psql/prompt.c,v 1.11 2000/03/11 13:56:24 petere Exp $
+ */ 
 #include "postgres.h"
 #include "prompt.h"
 
@@ -19,7 +19,10 @@
 #include <win32.h>
 #endif
 
-#include <sys/utsname.h>
+#if !defined(WIN32) && !defined(__CYGWIN32__) && !defined(__QNX__)
+#include <unistd.h>
+#include <netdb.h>
+#endif
 
 /*--------------------------
  * get_prompt
@@ -29,9 +32,10 @@
  * (might not be completely multibyte safe)
  *
  * Defined interpolations are:
- * %M - database server hostname (or "." if not TCP/IP)
- * %m - like %M but hostname truncated after first dot
- * %> - database server port number (or "." if not TCP/IP)
+ * %M - database server "hostname.domainname" (or "localhost" if this 
+ *	information is not available)
+ * %m - like %M, but hostname only (before first dot) 
+ * %> - database server port number
  * %n - database user name
  * %/ - current database
  * %~ - like %/ but "~" when database name equals user name
@@ -56,6 +60,51 @@
  * will be empty (not NULL!).
  *--------------------------
  */
+
+/*
+ * We need hostname information, only if connection is via UNIX socket 
+ */
+#if !defined(WIN32) && !defined(__CYGWIN32__) && !defined(__QNX__)
+
+#define DOMAINNAME	1
+#define HOSTNAME	2
+
+/* 
+ * Return full hostname for localhost. 
+ *	- informations are init only in firts time - not queries DNS or NIS
+ *	  for every localhost() call 	
+ */
+static char *
+localhost(int type, char *buf, int siz)	
+{	
+	static struct hostent	*hp = NULL;
+	static int err = 0;
+	
+	if (hp==NULL && err==0)
+	{	
+		char hname[256];		
+		
+		if (gethostname(hname, 256) == 0)
+		{
+			if (!(hp = gethostbyname(hname)))
+				err = 1; 
+		}
+		else
+			err = 1;		
+	}
+	
+	if (hp==NULL) 
+		return strncpy(buf, "localhost", siz);
+	
+	strncpy(buf, hp->h_name, siz);		/* full aaa.bbb.ccc */
+	
+	if (type==HOSTNAME)
+		buf[strcspn(buf, ".")] = '\0';
+	
+	return buf;	
+}
+#endif
+
 char *
 get_prompt(promptStatus_t status)
 {
@@ -115,23 +164,22 @@ get_prompt(promptStatus_t status)
 				case 'm':
 					if (pset.db)
 					{
+						/* INET socket */
 						if (PQhost(pset.db))
 						{
 							strncpy(buf, PQhost(pset.db), MAX_PROMPT_SIZE);
 							if (*p == 'm')
 								buf[strcspn(buf, ".")] = '\0';
 						}
-						else if (*p == 'M') 
-							buf[0] = '.';
-						else 
-						{
-							struct utsname ubuf;
-						
-							if (uname(&ubuf) < 0)
-								buf[0] = '.';
-							else 
-								strncpy(buf, ubuf.nodename, MAX_PROMPT_SIZE);	
-						}	
+						/* UNIX socket */
+#if !defined(WIN32) && !defined(__CYGWIN32__) && !defined(__QNX__)						
+						else {
+							if (*p == 'm')	
+								localhost(HOSTNAME, buf, MAX_PROMPT_SIZE);
+							else
+								localhost(DOMAINNAME, buf, MAX_PROMPT_SIZE);
+						}
+#endif					
 					}
 					break;
 					/* DB server port number */
-- 
GitLab