]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Karel Zakr's revised patch to fix psql prompt for local host connections.
authorPeter Eisentraut <peter_e@gmx.net>
Sat, 11 Mar 2000 13:56:24 +0000 (13:56 +0000)
committerPeter Eisentraut <peter_e@gmx.net>
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 @@
 <!--
-$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>
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 <win32.h>
 #endif
 
-#include <sys/utsname.h>
+#if !defined(WIN32) && !defined(__CYGWIN32__) && !defined(__QNX__)
+#include <unistd.h>
+#include <netdb.h>
+#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 */