Not sure what to do with this patch. It appears most of it was already
applied.
>
> On Thu, 9 Mar 2000, Bruce Momjian wrote:
>
> > Karel, can you submit a new patch to clean up these new items, rather
> > than just an entire new patch.
>
> Here is a new patch (this patch remove my old code from psql.)
> Bruce, will better if Peter check this patch first. He is really
> pedantic :-) But I merit punishment...
>
> > > 1) updates the documentation and the comment on top of the function
>
> Yes.
>
> > >
> > > 2) keeps the correct semantics of %m vs %M
>
> Yes. My code in this patch is corrent for %m (hello) %M (hello.domain.xx).
> But your code is not correct. See TCP/IP connection:
>
> $ ./psql abil -h bootes -U zakkr
>
> abil=# \set PROMPT1 %M:%/%#%32 <-- without a domainname
> bootes:abil# \set PROMPT1 %m:%/%#%32
> bootes:abil#
>
> You use for prompt PQhost(), but in PGconn struct is (probably) save
> hostname from psql's argv[]. But it is not always real and full hostname
> (with domainname) - it can be a name from /etc/hosts. A solution is use
> gethostbyaddr( conn->raddr ) instead simple PQhost().
>
> But it is really cosmetic option. We have propably more interesting a work
> (pg_acl ?) :-)
>
> > > 3) is portable to Windows (you can ifdef it out, since there are no domain
> > > sockets on Windows)
>
> Sorry. It correct now.
>
> > > 4) Uses gethostname. That's more portable.
>
> I used gethostname() and gethostbyname() (for full domain name (%M)).
>
> Well, Peter is all in this patch correct?
>
> Karel
Content-Description:
[ application/x-gzip is not supported, skipping... ]
--
Bruce Momjian | http://www.op.net/~candle
pgman@candle.pha.pa.us | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026
diff -r -B -C 2 pgsql.ORIG/doc/src/sgml/ref/psql-ref.sgml pgsql.NEW/doc/src/sgml/ref/psql-ref.sgml
*** pgsql.ORIG/doc/src/sgml/ref/psql-ref.sgml Wed Mar 1 22:09:56 2000
--- pgsql.NEW/doc/src/sgml/ref/psql-ref.sgml Fri Mar 10 15:55:12 2000
***************
*** 1967,1972 ****
<varlistentry>
<term><literal>%M</literal></term>
! <listitem><para>The hostname of the database server (or <quote>.</quote>
! if Unix domain socket).</para></listitem>
</varlistentry>
--- 1967,1972 ----
<varlistentry>
<term><literal>%M</literal></term>
! <listitem><para>The full hostname (with domainname) of the database server (or
! <quote>localhost</quote> if hostname information is not available).</para></listitem>
</varlistentry>
diff -r -B -C 2 pgsql.ORIG/src/bin/psql/prompt.c pgsql.NEW/src/bin/psql/prompt.c
*** pgsql.ORIG/src/bin/psql/prompt.c Fri Mar 10 15:44:43 2000
--- pgsql.NEW/src/bin/psql/prompt.c Fri Mar 10 15:40:02 2000
***************
*** 4,9 ****
* Copyright 2000 by PostgreSQL Global Development Group
*
! * $Header: /usr/local/cvsroot/pgsql/src/bin/psql/prompt.c,v 1.10 2000/03/08 01:38:59 momjian Exp $
! */
#include "postgres.h"
#include "prompt.h"
--- 4,9 ----
* Copyright 2000 by PostgreSQL Global Development Group
*
! * $Header: /usr/local/cvsroot/pgsql/src/bin/psql/prompt.c,v 1.9 2000/02/16 13:15:26 momjian Exp $
! */
#include "postgres.h"
#include "prompt.h"
***************
*** 20,24 ****
#endif
! #include <sys/utsname.h>
/*--------------------------
--- 20,27 ----
#endif
! #if !defined(__CYGWIN32__) && !defined(__QNX__)
! #include <unistd.h>
! #include <netdb.h>
! #endif
/*--------------------------
***************
*** 30,35 ****
*
* 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)
* %n - database user name
--- 33,39 ----
*
* Defined interpolations are:
! * %M - database server "hostname.domainname" (or "localhost" if this
! * information is not available)
! * %m - like %M, but hostname only (before firts dot)
* %> - database server port number (or "." if not TCP/IP)
* %n - database user name
***************
*** 57,60 ****
--- 61,106 ----
*--------------------------
*/
+
+ /*
+ * We need hostname information, only if connection is via UNIX socket
+ */
+ #if !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)
***************
*** 116,119 ****
--- 162,166 ----
if (pset.db)
{
+ /* INET socket */
if (PQhost(pset.db))
{
***************
*** 122,136 ****
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);
! }
}
break;
--- 169,181 ----
buf[strcspn(buf, ".")] = '\0';
}
! /* UNIX socket */
! #if !defined(__CYGWIN32__) && !defined(__QNX__)
! else {
! if (*p == 'm')
! localhost(HOSTNAME, buf, MAX_PROMPT_SIZE);
! else
! localhost(DOMAINNAME, buf, MAX_PROMPT_SIZE);
! }
! #endif
}
break;