Skip to content
Snippets Groups Projects
Commit 1d752981 authored by Peter Eisentraut's avatar Peter Eisentraut
Browse files

Karel Zakr's revised patch to fix psql prompt for local host connections.

parent 73f5b084
No related branches found
No related tags found
No related merge requests found
<!-- <!--
$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 Postgres documentation
--> -->
...@@ -1966,8 +1966,8 @@ testdb=> <userinput>\set content `sed -e "s/'/\\\\\\'/g" < my_file.txt`</userinp ...@@ -1966,8 +1966,8 @@ testdb=> <userinput>\set content `sed -e "s/'/\\\\\\'/g" < my_file.txt`</userinp
<variablelist> <variablelist>
<varlistentry> <varlistentry>
<term><literal>%M</literal></term> <term><literal>%M</literal></term>
<listitem><para>The hostname of the database server (or <quote>.</quote> <listitem><para>The full hostname (with domainname) of the database server (or
if Unix domain socket).</para></listitem> <quote>localhost</quote> if hostname information is not available).</para></listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
... ...
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* Copyright 2000 by PostgreSQL Global Development Group * 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 "postgres.h"
#include "prompt.h" #include "prompt.h"
...@@ -19,7 +19,10 @@ ...@@ -19,7 +19,10 @@
#include <win32.h> #include <win32.h>
#endif #endif
#include <sys/utsname.h> #if !defined(WIN32) && !defined(__CYGWIN32__) && !defined(__QNX__)
#include <unistd.h>
#include <netdb.h>
#endif
/*-------------------------- /*--------------------------
* get_prompt * get_prompt
...@@ -29,9 +32,10 @@ ...@@ -29,9 +32,10 @@
* (might not be completely multibyte safe) * (might not be completely multibyte safe)
* *
* Defined interpolations are: * Defined interpolations are:
* %M - database server hostname (or "." if not TCP/IP) * %M - database server "hostname.domainname" (or "localhost" if this
* %m - like %M but hostname truncated after first dot * information is not available)
* %> - database server port number (or "." if not TCP/IP) * %m - like %M, but hostname only (before first dot)
* %> - database server port number
* %n - database user name * %n - database user name
* %/ - current database * %/ - current database
* %~ - like %/ but "~" when database name equals user name * %~ - like %/ but "~" when database name equals user name
...@@ -56,6 +60,51 @@ ...@@ -56,6 +60,51 @@
* will be empty (not NULL!). * 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 * char *
get_prompt(promptStatus_t status) get_prompt(promptStatus_t status)
{ {
...@@ -115,23 +164,22 @@ get_prompt(promptStatus_t status) ...@@ -115,23 +164,22 @@ get_prompt(promptStatus_t status)
case 'm': case 'm':
if (pset.db) if (pset.db)
{ {
/* INET socket */
if (PQhost(pset.db)) if (PQhost(pset.db))
{ {
strncpy(buf, PQhost(pset.db), MAX_PROMPT_SIZE); strncpy(buf, PQhost(pset.db), MAX_PROMPT_SIZE);
if (*p == 'm') if (*p == 'm')
buf[strcspn(buf, ".")] = '\0'; buf[strcspn(buf, ".")] = '\0';
} }
else if (*p == 'M') /* UNIX socket */
buf[0] = '.'; #if !defined(WIN32) && !defined(__CYGWIN32__) && !defined(__QNX__)
else else {
{ if (*p == 'm')
struct utsname ubuf; localhost(HOSTNAME, buf, MAX_PROMPT_SIZE);
if (uname(&ubuf) < 0)
buf[0] = '.';
else else
strncpy(buf, ubuf.nodename, MAX_PROMPT_SIZE); localhost(DOMAINNAME, buf, MAX_PROMPT_SIZE);
} }
#endif
} }
break; break;
/* DB server port number */ /* DB server port number */
... ...
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment