Karel Zakr's revised patch to fix psql prompt for local host connections.
authorPeter Eisentraut
Sat, 11 Mar 2000 13:56:24 +0000 (13:56 +0000)
committerPeter Eisentraut
Sat, 11 Mar 2000 13:56:24 +0000 (13:56 +0000)
doc/src/sgml/ref/psql-ref.sgml
src/bin/psql/prompt.c

index a265bff87b3f43d53067a06eb08ef8529ebe3696..9c252d1d85389a85bc70fe0d02fa39fa75702d0c 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -1966,8 +1966,8 @@ testdb=> \set content `sed -e "s/'/\\\\\\'/g" < my_file.txt`
     
       
         %M
-   The hostname of the database server (or .
-         if Unix domain socket).
+   The full hostname (with domainname) of the database server (or
+         localhost if hostname information is not available).
       
 
       
index efb2b1a3f6b891979f8c28a0075d109116a6fb39..b8b59eb15c530549e310ad982e0a0c406edc6a3e 100644 (file)
@@ -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"
 
 #include 
 #endif
 
-#include 
+#if !defined(WIN32) && !defined(__CYGWIN32__) && !defined(__QNX__)
+#include 
+#include 
+#endif
 
 /*--------------------------
  * get_prompt
  * (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
  * 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 */