UUNET is looking into offering PostgreSQL as a part of a managed web
authorBruce Momjian
Mon, 13 Nov 2000 15:18:15 +0000 (15:18 +0000)
committerBruce Momjian
Mon, 13 Nov 2000 15:18:15 +0000 (15:18 +0000)
hosting product, on both shared and dedicated machines.  We currently
offer Oracle and MySQL, and it would be a nice middle-ground.
However, as shipped, PostgreSQL lacks the following features we need
that MySQL has:

1. The ability to listen only on a particular IP address.  Each
   hosting customer has their own IP address, on which all of their
   servers (http, ftp, real media, etc.) run.
2. The ability to place the Unix-domain socket in a mode 700 directory.
   This allows us to automatically create an empty database, with an
   empty DBA password, for new or upgrading customers without having
   to interactively set a DBA password and communicate it to (or from)
   the customer.  This in turn cuts down our install and upgrade times.
3. The ability to connect to the Unix-domain socket from within a
   change-rooted environment.  We run CGI programs chrooted to the
   user's home directory, which is another reason why we need to be
   able to specify where the Unix-domain socket is, instead of /tmp.
4. The ability to, if run as root, open a pid file in /var/run as
   root, and then setuid to the desired user.  (mysqld -u can almost
   do this; I had to patch it, too).

The patch below fixes problem 1-3.  I plan to address #4, also, but
haven't done so yet.  These diffs are big enough that they should give
the PG development team something to think about in the meantime :-)
Also, I'm about to leave for 2 weeks' vacation, so I thought I'd get
out what I have, which works (for the problems it tackles), now.

With these changes, we can set up and run PostgreSQL with scripts the
same way we can with apache or proftpd or mysql.

In summary, this patch makes the following enhancements:

1. Adds an environment variable PGUNIXSOCKET, analogous to MYSQL_UNIX_PORT,
   and command line options -k --unix-socket to the relevant programs.
2. Adds a -h option to postmaster to set the hostname or IP address to
   listen on instead of the default INADDR_ANY.
3. Extends some library interfaces to support the above.
4. Fixes a few memory leaks in PQconnectdb().

The default behavior is unchanged from stock 7.0.2; if you don't use
any of these new features, they don't change the operation.

David J. MacKenzie

42 files changed:
doc/src/sgml/environ.sgml
doc/src/sgml/libpq++.sgml
doc/src/sgml/libpq.sgml
doc/src/sgml/ref/createdb.sgml
doc/src/sgml/ref/createlang.sgml
doc/src/sgml/ref/createuser.sgml
doc/src/sgml/ref/dropdb.sgml
doc/src/sgml/ref/droplang.sgml
doc/src/sgml/ref/dropuser.sgml
doc/src/sgml/ref/pg_dump.sgml
doc/src/sgml/ref/pg_dumpall.sgml
doc/src/sgml/ref/postmaster.sgml
doc/src/sgml/ref/psql-ref.sgml
doc/src/sgml/ref/vacuumdb.sgml
doc/src/sgml/start.sgml
src/backend/libpq/pqcomm.c
src/backend/postmaster/postmaster.c
src/backend/utils/misc/guc.c
src/bin/pg_dump/pg_backup.h
src/bin/pg_dump/pg_backup_archiver.c
src/bin/pg_dump/pg_backup_archiver.h
src/bin/pg_dump/pg_backup_db.c
src/bin/pg_dump/pg_dump.c
src/bin/pg_dump/pg_restore.c
src/bin/psql/command.c
src/bin/psql/common.c
src/bin/psql/help.c
src/bin/psql/prompt.c
src/bin/psql/startup.c
src/bin/scripts/createdb
src/bin/scripts/createlang.sh
src/bin/scripts/createuser
src/bin/scripts/dropdb
src/bin/scripts/droplang
src/bin/scripts/dropuser
src/bin/scripts/vacuumdb
src/include/libpq/libpq.h
src/include/libpq/pqcomm.h
src/interfaces/libpq/fe-connect.c
src/interfaces/libpq/libpq-fe.h
src/interfaces/libpq/libpq-int.h
src/interfaces/libpq/libpqdll.def

index dc5741a95d8003bb95fb4ef032d8cbc72044583d..830502a696db11af2e53f6c9e900d3c87ef37212 100644 (file)
@@ -47,16 +47,17 @@ $ export PATH
 
 
 
-If your site administrator has not set things up in the
-default  way,  you may have some more work to do.  For example, if the database
- server machine is a remote machine, you
-will need to set the PGHOST environment variable to the name
-of the database server machine.   The  environment  variable
-PGPORT may also have to be set.  The bottom line is this: if
-you try to start an application  program  and  it  complains
-that it cannot connect to the postmaster,
- you should immediately consult your site administrator to make sure that your
-environment is properly set up.
-
+
+If your site administrator has not set things up in the default  way, 
+you may have some more work to do.  For example, if the database server
+machine is a remote machine, you will need to set the
+PGHOST environment variable to the name of the
+database server machine.   The  environment  variable
+PGPORT or PGUNIXSOCKET may also have
+to be set.  The bottom line is this: if you try to start an application 
+program  and  it  complains that it cannot connect to the
+postmaster, you should immediately consult
+your site administrator to make sure that your environment is properly
+set up. 
 
 
index 44f7f97dcd6f9c397c0996c0842a0cc4482c5941..a3b045e219ca91752a77db4ae6fc2667a5b8507c 100644 (file)
@@ -1,5 +1,5 @@
 
 
  
@@ -91,6 +91,13 @@ $Header: /cvsroot/pgsql/doc/src/sgml/Attic/libpq++.sgml,v 1.17 2000/09/29 20:21:
    backend.
        
       
+      
+       
+   PGUNIXSOCKET  sets the full Unix domain socket
+   file name for communicating with the Postgres
+   backend.
+       
+      
       
        
    PGDATABASE  sets the default 
index a23ef89546a7e65a9ed26156308f2d034e80491c..d9b96b862007aba592bacd52f4b71fd084e52235 100644 (file)
@@ -1,5 +1,5 @@
 
 
  
@@ -133,6 +133,15 @@ PGconn *PQconnectdb(const char *conninfo)
      
     
 
+    
+     unixsocket
+     
+     
+      Full path to Unix-domain socket file to connect to at the server host.
+     
+     
+    
+
     
      dbname
      
@@ -554,6 +563,16 @@ char *PQport(const PGconn *conn)
 
 
 
+
+
+PQunixsocket
+         Returns the name of the Unix-domain socket of the connection.
+
+char *PQunixsocket(const PGconn *conn)
+
+
+
+
 
 
 PQtty
@@ -1832,6 +1851,13 @@ backend.
 
 
 
+PGPORT  sets the default port or local Unix domain socket
+file extension for communicating with the Postgres
+backend.
+
+
+
+
 PGDATABASE  sets the default 
 Postgres database name.
 
index 3d1aca17bbe6268bcdacd483f175b33e578aadfe..d5199e307aa99b5b327907667674c9fdbe41daa1 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -56,6 +56,18 @@ Postgres documentation
       
      
 
+    
+      -k, --unixsocket path
+      
+      
+      Specifies the Unix-domain socket on which the
+      postmaster is running.
+      Without this option, the socket is created in /tmp
+      based on the port number.
+      
+      
+    
+
      
       -U, --username username
       
index f7c0540eac2222b80108103d1476bc5256217792..0258646ad7a75d2c7b8e96a25956d6e22cf8784b 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -101,6 +101,18 @@ Postgres documentation
       
      
 
+    
+      -k, --unixsocket path
+      
+      
+      Specifies the Unix-domain socket on which the
+      postmaster is running.
+      Without this option, the socket is created in /tmp
+      based on the port number.
+      
+      
+    
+
      
       -U, --username username
       
index 5f3db58159701a2d1e5eff19620632dc62df5205..9845fcba1e52fa292e08e9aa3bd2198f9ed4d770 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -55,6 +55,18 @@ Postgres documentation
       
      
 
+    
+      -k, --unixsocket path
+      
+      
+      Specifies the Unix-domain socket on which the
+      postmaster is running.
+      Without this option, the socket is created in /tmp
+      based on the port number.
+      
+      
+    
+
      
       -e, --echo
       
index 5e28c4d528d9d7929acac0220f80a5e349f062c9..c265c016e963d07a8159cb99abc9551603f7cc44 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -55,6 +55,18 @@ Postgres documentation
       
      
 
+    
+      -k, --unixsocket path
+      
+      
+      Specifies the Unix-domain socket on which the
+      postmaster is running.
+      Without this option, the socket is created in /tmp
+      based on the port number.
+      
+      
+    
+
      
       -U, --username username
       
index 48645d78a5d046cca403f7b92e3460877a01575e..5d75a89fdeff8f5e9ecb46f8dc1ae68f3a37dd77 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -101,6 +101,18 @@ Postgres documentation
       
      
 
+    
+      -k, --unixsocket path
+      
+      
+      Specifies the Unix-domain socket on which the
+      postmaster is running.
+      Without this option, the socket is created in /tmp
+      based on the port number.
+      
+      
+    
+
      
       -U, --username username
       
index b72c5d865fc436fb3138c4d4e97169eca7f6de55..a2b1e537e513bdfc42263152117e3c3dcc9e4682 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -55,6 +55,18 @@ Postgres documentation
       
      
 
+    
+      -k, --unixsocket path
+      
+      
+      Specifies the Unix-domain socket on which the
+      postmaster is running.
+      Without this option, the socket is created in /tmp
+      based on the port number.
+      
+      
+    
+
      
       -e, --echo
       
index f0d1facfca247a0074cc5e14d072fa6fdeb67197..b0ad3e49cfe9a3b99f8d2e623411247b91ec3a38 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -24,7 +24,9 @@ Postgres documentation
   
   
 pg_dump [ dbname ]
-pg_dump [ -h host ] [ -p port ]
+pg_dump [ -h host ]
+    [ -k path ]
+    [ -p port ]
     [ -t table ]
     [ -a ] [ -c ] [ -d ] [ -D ] [ -i ] [ -n ] [ -N ]
     [ -o ] [ -s ] [ -u ] [ -v ] [ -x ]
@@ -204,6 +206,21 @@ pg_dump [ -h host ] [ -p 
       
      
 
+     
+      -k path
+      
+       
+   Specifies the local Unix domain socket file path
+   on which the postmaster
+   is listening for connections.
+        Without this option, the socket path name defaults to
+        the value of the PGUNIXSOCKET environment
+   variable (if set), otherwise it is constructed
+        from the port number.
+       
+      
+     
+
      
       -p port
       
index a4d5c8d45a27ab68bec8c6d81dfcc6dcdb83652a..1d78b9008c00ea71fea2b58827185c33fdc6b0f0 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -23,7 +23,7 @@ Postgres documentation
    1999-07-20
   
   
-pg_dumpall [ -h host ] [ -p port ] [ -a ] [ -d ] [ -D ] [ -O ] [ -s ] [ -u ] [ -v ] [ -x ] [ --accounts-only ]
+pg_dumpall [ -h host ] [ -path ] [ -port ] [ -a ] [ -d ] [ -D ] [ -O ] [ -s ] [ -u ] [ -v ] [ -x ] [ --accounts-only ]
   
 
   
@@ -149,6 +149,21 @@ pg_dumpall [ -h host ] [ -p 
       
      
 
+     
+      -k path
+      
+       
+   Specifies the local Unix domain socket file path
+   on which the postmaster
+   is listening for connections.
+        Without this option, the socket path name defaults to
+        the value of the PGUNIXSOCKET environment
+   variable (if set), otherwise it is constructed
+        from the port number.
+       
+      
+     
+
      
       -p port
       
index eba01b30d4d3695af02fc1529c750036cc426145..e8e34c739ff011af29272886d0b9bb7c42b61616 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -24,7 +24,9 @@ Postgres documentation
   
   
 postmaster [ -B nBuffers ] [ -D DataDir ] [ -N maxBackends ] [ -S ]
-    [ -d DebugLevel ] [ -i ] [ -l ]
+    [ -d DebugLevel ]
+    [ -h hostname ] [ -i ]
+    [ -k path ] [ -l ]
     [ -o BackendOptions ] [ -p port ] [ -n | -s ]
   
 
@@ -123,6 +125,36 @@ postmaster [ -B nBuffers ] [ -D 
       
      
 
+     
+      -h hostName
+      
+       
+   Specifies the TCP/IP hostname or address
+   on which the postmaster
+   is to listen for connections from frontend applications.  Defaults to
+   the value of the 
+   PGHOST 
+   environment variable, or if PGHOST
+   is not set, then defaults to "all", meaning listen on all configured addresses
+   (including localhost).
+       
+       
+   If you use a hostname or address other than "all", do not try to run
+   multiple instances of postmaster on the
+   same IP address but different ports.  Doing so will result in them
+   attempting (incorrectly) to use the same shared memory segments.
+   Also, if you use a hostname other than "all", all of the host's IP addresses
+   on which postmaster instances are
+   listening must be distinct in the two last octets.
+       
+       
+   If you do use "all" (the default), then each instance must listen on a
+   different port (via -p or PGPORT).  And, of course, do
+   not try to use both approaches on one host.
+       
+      
+     
+
      
       -i
       
@@ -134,6 +166,35 @@ postmaster [ -B nBuffers ] [ -D 
       
      
 
+     
+      -k path
+      
+       
+   Specifies the local Unix domain socket path name
+   on which the postmaster
+   is to listen for connections from frontend applications.  Defaults to
+   the value of the 
+   PGUNIXSOCKET 
+   environment variable, or if PGUNIXSOCKET
+   is not set, then defaults to a file in /tmp
+   constructed from the port number.
+       
+       
+        You can use this option to put the Unix-domain socket in a
+        directory that is private to one or more users using Unix
+   directory permissions.  This is necessary for securely
+   creating databases automatically on shared machines.
+        In that situation, also disallow all TCP/IP connections
+   initially in pg_hba.conf.
+   If you specify a socket path other than the
+   default then all frontend applications (including
+   psql) must specify the same
+   socket path using either command-line options or
+   PGUNIXSOCKET.
+       
+      
+     
+
      
       -l
       
index 446449d95e251b42c911887465501357d93ebf4b..ca8d14f6de8d75d1592f1f11a565f051e086a2cf 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -1329,6 +1329,19 @@ Access permissions for database "test"
     
 
 
+    
+      -k, --unixsocket path
+      
+      
+      Specifies the Unix-domain socket on which the
+      postmaster is running.
+      Without this option, the socket is created in /tmp
+      based on the port number.
+      
+      
+    
+
+
     
       -H, --html
       
index 1417ac55f9f06a41897822f8f92536e81fc5df17..7a701f216d507544313d79a47739ad38acbe8ea4 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -136,6 +136,18 @@ Postgres documentation
       
      
 
+    
+      -k, --unixsocket path
+      
+      
+      Specifies the Unix-domain socket on which the
+      postmaster is running.
+      Without this option, the socket is created in /tmp
+      based on the port number.
+      
+      
+    
+
      
       -U username
       --username username
index b5093ffed16d20feb74bc66b124e4d7fd4fcdc1d..3b484f50f95e94aab31988a562810f0074247a9b 100644 (file)
@@ -1,5 +1,5 @@
 
 
  
@@ -110,8 +110,8 @@ $Header: /cvsroot/pgsql/doc/src/sgml/start.sgml,v 1.13 2000/09/29 20:21:34 peter
     will need to set the PGHOST environment
     variable to the name
     of the database server machine.   The  environment  variable
-    PGPORT may also have to be set.  The bottom
-    line is this: if
+    PGPORT or PGUNIXSOCKET may also have to be set.
+    The bottom line is this: if
     you try to start an application  program  and  it  complains
     that it cannot connect to the postmaster,
     you should immediately consult your site administrator to make
index 355144937a5fcc88bace9808e9855e7455994f30..2434d6ff16a26f2761b889d0b7f4003afe246c48 100644 (file)
@@ -29,7 +29,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pqcomm.c,v 1.109 2000/11/01 21:14:01 petere Exp $
+ * $Id: pqcomm.c,v 1.110 2000/11/13 15:18:09 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -169,13 +169,14 @@ StreamDoUnlink(void)
 /*
  * StreamServerPort -- open a sock stream "listening" port.
  *
- * This initializes the Postmaster's connection-accepting port.
+ * This initializes the Postmaster's connection-accepting port fdP.
  *
  * RETURNS: STATUS_OK or STATUS_ERROR
  */
 
 int
-StreamServerPort(int family, unsigned short portName, int *fdP)
+StreamServerPort(int family, char *hostName, unsigned short portName,
+                char *unixSocketName, int *fdP)
 {
    SockAddr    saddr;
    int         fd,
@@ -218,7 +219,8 @@ StreamServerPort(int family, unsigned short portName, int *fdP)
 #ifdef HAVE_UNIX_SOCKETS
    if (family == AF_UNIX)
    {
-       len = UNIXSOCK_PATH(saddr.un, portName);
+       UNIXSOCK_PATH(saddr.un, portName, unixSocketName);
+       len = UNIXSOCK_LEN(saddr.un);
        strcpy(sock_path, saddr.un.sun_path);
        /*
         * If the socket exists but nobody has an advisory lock on it we
@@ -242,7 +244,27 @@ StreamServerPort(int family, unsigned short portName, int *fdP)
 
     if (family == AF_INET) 
     {
-       saddr.in.sin_addr.s_addr = htonl(INADDR_ANY);
+       /* TCP/IP socket */
+       if (hostName[0] == '\0')
+           saddr.in.sin_addr.s_addr = htonl(INADDR_ANY);
+       else
+       {
+           struct hostent *hp;
+   
+           hp = gethostbyname(hostName);
+           if ((hp == NULL) || (hp->h_addrtype != AF_INET))
+           {
+               snprintf(PQerrormsg, PQERRORMSG_LENGTH,
+                      "FATAL: StreamServerPort: gethostbyname(%s) failed: %s\n",
+                      hostName, hstrerror(h_errno));
+                      fputs(PQerrormsg, stderr);
+                      pqdebug("%s", PQerrormsg);
+               return STATUS_ERROR;
+           }
+           memmove((char *) &(saddr.in.sin_addr), (char *) hp->h_addr,
+                   hp->h_length);
+       }
+   
        saddr.in.sin_port = htons(portName);
        len = sizeof(struct sockaddr_in);
    }
index e50c0ee4d0eb1703c47d4c400188f1cdc1aac895..c6b645b15ba2bcd006e06941d6c218193ff48be4 100644 (file)
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.182 2000/11/12 20:51:51 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.183 2000/11/13 15:18:11 momjian Exp $
  *
  * NOTES
  *
@@ -114,6 +114,8 @@ static Dllist *PortList;
 
 /* The socket number we are listening for connections on */
 int PostPortName;
+char * UnixSocketName;
+char * HostName;
 
 /*
  * This is a sequence number that indicates how many times we've had to
@@ -224,7 +226,7 @@ extern void SetThisStartUpID(void);
 static void pmdaemonize(int argc, char *argv[]);
 static Port *ConnCreate(int serverFd);
 static void ConnFree(Port *port);
-static void reset_shared(int port);
+static void reset_shared(unsigned short port);
 static void SIGHUP_handler(SIGNAL_ARGS);
 static void pmdie(SIGNAL_ARGS);
 static void reaper(SIGNAL_ARGS);
@@ -366,7 +368,7 @@ PostmasterMain(int argc, char *argv[])
     * will occur.
     */
    opterr = 1;
-   while ((opt = getopt(argc, argv, "A:a:B:b:c:D:d:Film:MN:no:p:SsV-:?")) != EOF)
+   while ((opt = getopt(argc, argv, "A:a:B:b:c:D:d:Fh:ik:lm:MN:no:p:SsV-:?")) != EOF)
    {
        switch(opt)
        {
@@ -422,7 +424,7 @@ PostmasterMain(int argc, char *argv[])
 #ifdef HAVE_INT_OPTRESET
    optreset = 1;
 #endif
-   while ((opt = getopt(argc, argv, "A:a:B:b:c:D:d:Film:MN:no:p:SsV-:?")) != EOF)
+   while ((opt = getopt(argc, argv, "A:a:B:b:c:D:d:Fh:ik:lm:MN:no:p:SsV-:?")) != EOF)
    {
        switch (opt)
        {
@@ -456,9 +458,16 @@ PostmasterMain(int argc, char *argv[])
            case 'F':
                enableFsync = false;
                break;
+           case 'h':
+               HostName = optarg;
+               break;
            case 'i':
                NetServer = true;
                break;
+           case 'k':
+               /* Set PGUNIXSOCKET by hand. */
+               UnixSocketName = optarg;
+               break;
 #ifdef USE_SSL
            case 'l':
                    EnableSSL = true;
@@ -606,8 +615,9 @@ PostmasterMain(int argc, char *argv[])
 
    if (NetServer)
    {
-       status = StreamServerPort(AF_INET, (unsigned short) PostPortName,
-                                 &ServerSock_INET);
+       status = StreamServerPort(AF_INET, HostName,
+                       (unsigned short) PostPortName, UnixSocketName,
+                       &ServerSock_INET);
        if (status != STATUS_OK)
        {
            fprintf(stderr, "%s: cannot create INET stream port\n",
@@ -617,8 +627,9 @@ PostmasterMain(int argc, char *argv[])
    }
 
 #ifdef HAVE_UNIX_SOCKETS
-   status = StreamServerPort(AF_UNIX, (unsigned short) PostPortName,
-                             &ServerSock_UNIX);
+   status = StreamServerPort(AF_UNIX, HostName,
+                       (unsigned short) PostPortName, UnixSocketName, 
+                       &ServerSock_UNIX);
    if (status != STATUS_OK)
    {
        fprintf(stderr, "%s: cannot create UNIX stream port\n",
@@ -789,7 +800,9 @@ usage(const char *progname)
    printf("  -d 1-5          debugging level\n");
    printf("  -D   database directory\n");
    printf("  -F              turn fsync off\n");
+   printf("  -h hostname     specify hostname or IP address\n");
    printf("  -i              enable TCP/IP connections\n");
+   printf("  -k path         specify Unix-domain socket name\n");
 #ifdef USE_SSL
    printf("  -l              enable SSL connections\n");
 #endif
@@ -1302,12 +1315,76 @@ ConnFree(Port *conn)
    free(conn);
 }
 
+/*
+ * get_host_port -- return a pseudo port number (16 bits)
+ * derived from the primary IP address of HostName.
+ */
+static unsigned short
+get_host_port(void)
+{
+   static unsigned short hostPort = 0;
+
+   if (hostPort == 0)
+   {
+       SockAddr    saddr;
+       struct hostent *hp;
+
+       hp = gethostbyname(HostName);
+       if ((hp == NULL) || (hp->h_addrtype != AF_INET))
+       {
+           char msg[1024];
+           snprintf(msg, sizeof(msg),
+                "FATAL: get_host_port: gethostbyname(%s) failed: %s\n",
+                HostName, hstrerror(h_errno));
+           fputs(msg, stderr);
+           pqdebug("%s", msg);
+           exit(1);
+       }
+       memmove((char *) &(saddr.in.sin_addr),
+           (char *) hp->h_addr,
+           hp->h_length);
+       hostPort = ntohl(saddr.in.sin_addr.s_addr) & 0xFFFF;
+   }
+
+   return hostPort;
+}
+
 /*
  * reset_shared -- reset shared memory and semaphores
  */
 static void
-reset_shared(int port)
+reset_shared(unsigned short port)
 {
+   /*
+    * A typical ipc_key is 5432001, which is port 5432, sequence
+    * number 0, and 01 as the index in IPCKeyGetBufferMemoryKey().
+    * The 32-bit INT_MAX is 2147483 6 47.
+    *
+    * The default algorithm for calculating the IPC keys assumes that all
+    * instances of postmaster on a given host are listening on different
+    * ports.  In order to work (prevent shared memory collisions) if you
+    * run multiple PostgreSQL instances on the same port and different IP
+    * addresses on a host, we change the algorithm if you give postmaster
+    * the -h option, or set PGHOST, to a value other than the internal
+    * default.
+    *
+    * If HostName is set, then we generate the IPC keys using the
+    * last two octets of the IP address instead of the port number.
+    * This algorithm assumes that no one will run multiple PostgreSQL
+    * instances on one host using two IP addresses that have the same two
+    * last octets in different class C networks.  If anyone does, it
+    * would be rare.
+    *
+    * So, if you use -h or PGHOST, don't try to run two instances of
+    * PostgreSQL on the same IP address but different ports.  If you
+    * don't use them, then you must use different ports (via -p or
+    * PGPORT).  And, of course, don't try to use both approaches on one
+    * host.
+    */
+
+   if (HostName[0] != '\0')
+       port = get_host_port();
+
    ipc_key = port * 1000 + shmem_seq * 100;
    CreateSharedMemoryAndSemaphores(ipc_key, MaxBackends);
    shmem_seq += 1;
index 8fe7bd36fa309ac2ea9cbbbcdfd8bebb6eee3ce2..ecdc1d1a7570f403e4df15794f9df2f772096efd 100644 (file)
@@ -4,7 +4,7 @@
  * Support for grand unified configuration scheme, including SET
  * command, configuration file, and command line options.
  *
- * $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.16 2000/11/09 11:25:59 vadim Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.17 2000/11/13 15:18:12 momjian Exp $
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  * Written by Peter Eisentraut .
@@ -304,6 +304,12 @@ ConfigureNamesString[] =
    {"unix_socket_group",         PGC_POSTMASTER,       &Unix_socket_group,
     "", NULL},
 
+   {"unixsocket",                PGC_POSTMASTER,       &UnixSocketName,
+    "", NULL},
+
+   {"hostname",                  PGC_POSTMASTER,       &HostName,
+    "", NULL},
+
    {NULL, 0, NULL, NULL, NULL}
 };
 
index 8fceb26c8e24645bd2c010947e508f1d19b86157..ffe071a6655f7147ee2f059521b8abbb906e3b7b 100644 (file)
@@ -99,8 +99,9 @@ typedef struct _restoreOptions {
 
    int         useDB;
    char        *dbname;
-   char        *pgport;
    char        *pghost;
+   char        *pgport;
+   char        *pgunixsocket;
    int         ignoreVersion;
    int         requirePassword;
 
@@ -122,6 +123,7 @@ PGconn* ConnectDatabase(Archive *AH,
        const char*     dbname,
        const char* pghost,
        const char* pgport,
+       const char* pgunixsocket,
        const int   reqPwd,
        const int   ignoreVersion);
 
index d8a969b41e0279623081d0869737c869be389845..085a2eb3297189f6596757cff9f9beb1f4d6d1e8 100644 (file)
@@ -131,8 +131,9 @@ void RestoreArchive(Archive* AHX, RestoreOptions *ropt)
        if (AH->version < K_VERS_1_3)
            die_horribly(AH, "Direct database connections are not supported in pre-1.3 archives");
 
-       ConnectDatabase(AHX, ropt->dbname, ropt->pghost, ropt->pgport, 
-                           ropt->requirePassword, ropt->ignoreVersion);
+       ConnectDatabase(AHX, ropt->dbname, ropt->pghost, ropt->pgport,
+                           ropt->pgunixsocket, ropt->requirePassword,
+                           ropt->ignoreVersion);
 
        /*
         * If no superuser was specified then see if the current user will do...
index 2c7291e6c6917f678c6711c2ecac34c532546412..a938f5e3395bb15b6ef1c6a467904477fe21a743 100644 (file)
@@ -187,6 +187,7 @@ typedef struct _archiveHandle {
    char                *archdbname;        /* DB name *read* from archive */
    char                *pghost;
    char                *pgport;
+   char                *pgunixsocket;
    PGconn              *connection;
    PGconn              *blobConnection;    /* Connection for BLOB xref */
    int                 txActive;           /* Flag set if TX active on connection */
index 4b8873c3a2360e420ff520128148d2481b84c490..082edd582417ccf190223934becede5cc8f0df87 100644 (file)
@@ -1,7 +1,7 @@
 /*-------------------------------------------------------------------------
  *
  *
-*-------------------------------------------------------------------------
+ *-------------------------------------------------------------------------
  */
 
 #include                 /* for getopt() */
@@ -273,6 +273,7 @@ PGconn* ConnectDatabase(Archive *AHX,
        const char*     dbname,
        const char*     pghost,
        const char*     pgport,
+       const char*     pgunixsocket,
        const int       reqPwd,
        const int       ignoreVersion)
 {
@@ -307,6 +308,15 @@ PGconn* ConnectDatabase(Archive *AHX,
    else
        AH->pgport = NULL;
 
+   if (pgunixsocket != NULL)
+   {
+       AH->pgport = strdup(pgunixsocket);
+       sprintf(tmp_string, "unixsocket=%s ", AH->pgunixsocket);
+       strcat(connect_string, tmp_string);
+   }
+   else
+       AH->pgunixsocket = NULL;
+
    sprintf(tmp_string, "dbname=%s ", AH->dbname);
    strcat(connect_string, tmp_string);
 
index 4b765f528806ad1c216b60ed65ba70888766a79d..738425a3ebea56bd83def06607b54c428996c2a7 100644 (file)
@@ -22,7 +22,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.177 2000/10/31 14:20:30 pjw Exp $
+ *   $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.178 2000/11/13 15:18:13 momjian Exp $
  *
  * Modifications - 6/10/96 - [email protected] - version 1.13.dhb
  *
@@ -200,6 +200,7 @@ help(const char *progname)
        "  -F, --format {c|f|p}     output file format (custom, files, plain text)\n"
        "  -h, --host     server host name\n"
        "  -i, --ignore-version     proceed when database version != pg_dump version\n"
+       "  -k, --unixsocket   server Unix-domain socket name\n"
        "  -n, --no-quotes          suppress most quotes around identifiers\n"
        "  -N, --quotes             enable most quotes around identifiers\n"
        "  -o, --oids               dump object ids (oids)\n"
@@ -226,6 +227,7 @@ help(const char *progname)
        "  -F {c|f|p}               output file format (custom, files, plain text)\n"
        "  -h             server host name\n"
        "  -i                       proceed when database version != pg_dump version\n"
+       "  -k                 server Unix-domain socket name\n"
        "  -n                       suppress most quotes around identifiers\n"
        "  -N                       enable most quotes around identifiers\n"
        "  -o                       dump object ids (oids)\n"
@@ -629,6 +631,7 @@ main(int argc, char **argv)
    const char *dbname = NULL;
    const char *pghost = NULL;
    const char *pgport = NULL;
+   const char *pgunixsocket = NULL;
    char       *tablename = NULL;
    bool        oids = false;
    TableInfo  *tblinfo;
@@ -658,6 +661,7 @@ main(int argc, char **argv)
        {"attribute-inserts", no_argument, NULL, 'D'},
        {"host", required_argument, NULL, 'h'},
        {"ignore-version", no_argument, NULL, 'i'},
+       {"unixsocket", required_argument, NULL, 'k'},
        {"no-reconnect", no_argument, NULL, 'R'},
        {"no-quotes", no_argument, NULL, 'n'},
        {"quotes", no_argument, NULL, 'N'},
@@ -752,6 +756,10 @@ main(int argc, char **argv)
                ignore_version = true;
                break;
 
+           case 'k':           /* server Unix-domain socket */
+               pgunixsocket = optarg;
+               break;
+
            case 'n':           /* Do not force double-quotes on
                                 * identifiers */
                force_quotes = false;
@@ -948,7 +956,8 @@ main(int argc, char **argv)
    dbname = argv[optind];
 
    /* Open the database using the Archiver, so it knows about it. Errors mean death */
-   g_conn = ConnectDatabase(g_fout, dbname, pghost, pgport, use_password, ignore_version);
+   g_conn = ConnectDatabase(g_fout, dbname, pghost, pgport, pgunixsocket,
+                            use_password, ignore_version);
 
    /*
     * Start serializable transaction to dump consistent data
index 458482ed5112d2ed093c7a6a44b1cb4afda685e2..cafb7e9df602a5e8b1d6c86a15942c1f57a538ca 100644 (file)
@@ -101,6 +101,7 @@ struct option cmdopts[] = {
                { "ignore-version", 0, NULL, 'i'},
                { "index", 2, NULL, 'I'},
                { "list", 0, NULL, 'l'},
+               { "unixsocket", 1, NULL, 'k' },
                { "no-acl", 0, NULL, 'x' },
                { "no-owner", 0, NULL, 'O'},
                { "no-reconnect", 0, NULL, 'R' },
@@ -132,9 +133,9 @@ int main(int argc, char **argv)
    progname = *argv;
 
 #ifdef HAVE_GETOPT_LONG
-   while ((c = getopt_long(argc, argv, "acCd:f:F:h:i:lNoOp:P:rRsS:t:T:uU:vx", cmdopts, NULL)) != EOF)
+   while ((c = getopt_long(argc, argv, "acCd:f:F:h:i:k:lNoOp:P:rRsS:t:T:uU:vx", cmdopts, NULL)) != EOF)
 #else
-   while ((c = getopt(argc, argv, "acCd:f:F:h:i:lNoOp:P:rRsS:t:T:uU:vx")) != -1)
+   while ((c = getopt(argc, argv, "acCd:f:F:h:i:k:lNoOp:P:rRsS:t:T:uU:vx")) != -1)
 #endif
    {
        switch (c)
@@ -170,6 +171,10 @@ int main(int argc, char **argv)
            case 'i':
                opts->ignoreVersion = 1;
                break;
+           case 'k':
+               if (strlen(optarg) != 0)
+                   opts->pgunixsocket = strdup(optarg);
+               break;
            case 'N':
                opts->origOrder = 1;
                break;
index d563070ae68e2098bdfbb4eb3fc5f4fd3e7c61a9..65c05a4ac912cef0a5ac52d3031262ba7807a132 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/command.c,v 1.36 2000/09/17 20:33:45 petere Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/command.c,v 1.37 2000/11/13 15:18:14 momjian Exp $
  */
 #include "postgres.h"
 #include "command.h"
@@ -1202,6 +1202,7 @@ do_connect(const char *new_dbname, const char *new_user)
    SetVariable(pset.vars, "USER", NULL);
    SetVariable(pset.vars, "HOST", NULL);
    SetVariable(pset.vars, "PORT", NULL);
+   SetVariable(pset.vars, "UNIXSOCKET", NULL);
    SetVariable(pset.vars, "ENCODING", NULL);
 
    /* If dbname is "" then use old name, else new one (even if NULL) */
@@ -1231,6 +1232,7 @@ do_connect(const char *new_dbname, const char *new_user)
    do
    {
        need_pass = false;
+       /* FIXME use PQconnectdb to support passing the Unix socket */
        pset.db = PQsetdbLogin(PQhost(oldconn), PQport(oldconn),
                               NULL, NULL, dbparam, userparam, pwparam);
 
@@ -1307,6 +1309,7 @@ do_connect(const char *new_dbname, const char *new_user)
    SetVariable(pset.vars, "USER", PQuser(pset.db));
    SetVariable(pset.vars, "HOST", PQhost(pset.db));
    SetVariable(pset.vars, "PORT", PQport(pset.db));
+   SetVariable(pset.vars, "UNIXSOCKET", PQunixsocket(pset.db));
    SetVariable(pset.vars, "ENCODING", pg_encoding_to_char(pset.encoding));
 
    pset.issuper = test_superuser(PQuser(pset.db));
index ddc2be3c4f4f7ffe588c2e65ee2ebac5beb75499..da0542df5937afa147c7390d9ef67c1bafc80532 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/common.c,v 1.23 2000/08/29 09:36:48 petere Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/common.c,v 1.24 2000/11/13 15:18:14 momjian Exp $
  */
 #include "postgres.h"
 #include "common.h"
@@ -329,6 +329,7 @@ PSQLexec(const char *query)
            SetVariable(pset.vars, "DBNAME", NULL);
            SetVariable(pset.vars, "HOST", NULL);
            SetVariable(pset.vars, "PORT", NULL);
+           SetVariable(pset.vars, "UNIXSOCKET", NULL);
            SetVariable(pset.vars, "USER", NULL);
            SetVariable(pset.vars, "ENCODING", NULL);
            return NULL;
@@ -508,6 +509,7 @@ SendQuery(const char *query)
                SetVariable(pset.vars, "DBNAME", NULL);
                SetVariable(pset.vars, "HOST", NULL);
                SetVariable(pset.vars, "PORT", NULL);
+               SetVariable(pset.vars, "UNIXSOCKET", NULL);
                SetVariable(pset.vars, "USER", NULL);
                SetVariable(pset.vars, "ENCODING", NULL);
                return false;
index 3dfd7d8e8dd44d51be7125f6dfe2f402c931c540..b9ee9caa67aa3fc1a156de9acc8fa1956b75be77 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/help.c,v 1.32 2000/09/22 23:02:00 petere Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/help.c,v 1.33 2000/11/13 15:18:14 momjian Exp $
  */
 #include "postgres.h"
 #include "help.h"
@@ -103,6 +103,16 @@ usage(void)
    puts(")");
 
    puts("  -H              HTML table output mode (-P format=html)");
+
+   /* Display default Unix-domain socket */
+   env = getenv("PGUNIXSOCKET");
+   printf("  -k        Specify Unix domain socket name (default: ");
+   if (env)
+       fputs(env, stdout);
+   else
+       fputs("computed from the port", stdout);
+   puts(")");
+
    puts("  -l              List available databases, then exit");
    puts("  -n              Disable readline");
    puts("  -o    Send query output to filename (or |pipe)");
index 1177c6f3f331bf0661df0830606dac296e5a3465..d29bc12ddb97e2d8662db53639aa1210c3938149 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/prompt.c,v 1.13 2000/08/20 10:55:34 petere Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/prompt.c,v 1.14 2000/11/13 15:18:14 momjian Exp $
  */
 #include "postgres.h"
 #include "prompt.h"
@@ -190,6 +190,11 @@ get_prompt(promptStatus_t status)
                    if (pset.db && PQport(pset.db))
                        strncpy(buf, PQport(pset.db), MAX_PROMPT_SIZE);
                    break;
+                   /* DB server Unix-domain socket */
+               case '<':
+                   if (pset.db && PQunixsocket(pset.db))
+                       strncpy(buf, PQunixsocket(pset.db), MAX_PROMPT_SIZE);
+                   break;
                    /* DB server user name */
                case 'n':
                    if (pset.db)
index f96cc7980ba7aa92b3947133692e8e345b16206b..9b0e60f0a3503f02aef614a3d8a36deac4a6ee9e 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/startup.c,v 1.37 2000/09/17 20:33:45 petere Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/startup.c,v 1.38 2000/11/13 15:18:14 momjian Exp $
  */
 #include "postgres.h"
 
@@ -65,6 +65,7 @@ struct adhoc_opts
    char       *dbname;
    char       *host;
    char       *port;
+   char       *unixsocket;
    char       *username;
    enum _actions action;
    char       *action_string;
@@ -161,6 +162,7 @@ main(int argc, char *argv[])
    do
    {
        need_pass = false;
+       /* FIXME use PQconnectdb to allow setting the unix socket */
        pset.db = PQsetdbLogin(options.host, options.port, NULL, NULL,
            options.action == ACT_LIST_DB ? "template1" : options.dbname,
                               username, password);
@@ -206,6 +208,7 @@ main(int argc, char *argv[])
    SetVariable(pset.vars, "USER", PQuser(pset.db));
    SetVariable(pset.vars, "HOST", PQhost(pset.db));
    SetVariable(pset.vars, "PORT", PQport(pset.db));
+   SetVariable(pset.vars, "UNIXSOCKET", PQunixsocket(pset.db));
    SetVariable(pset.vars, "ENCODING", pg_encoding_to_char(pset.encoding));
 
 #ifndef WIN32
@@ -320,6 +323,7 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts * options)
        {"field-separator", required_argument, NULL, 'F'},
        {"host", required_argument, NULL, 'h'},
        {"html", no_argument, NULL, 'H'},
+       {"unixsocket", required_argument, NULL, 'k'},
        {"list", no_argument, NULL, 'l'},
        {"no-readline", no_argument, NULL, 'n'},
        {"output", required_argument, NULL, 'o'},
@@ -353,14 +357,14 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts * options)
    memset(options, 0, sizeof *options);
 
 #ifdef HAVE_GETOPT_LONG
-   while ((c = getopt_long(argc, argv, "aAc:d:eEf:F:lh:Hno:p:P:qRsStT:uU:v:VWxX?", long_options, &optindex)) != -1)
+   while ((c = getopt_long(argc, argv, "aAc:d:eEf:F:lh:Hk:no:p:P:qRsStT:uU:v:VWxX?", long_options, &optindex)) != -1)
 #else                          /* not HAVE_GETOPT_LONG */
 
    /*
     * Be sure to leave the '-' in here, so we can catch accidental long
     * options.
     */
-   while ((c = getopt(argc, argv, "aAc:d:eEf:F:lh:Hno:p:P:qRsStT:uU:v:VWxX?-")) != -1)
+   while ((c = getopt(argc, argv, "aAc:d:eEf:F:lh:Hk:no:p:P:qRsStT:uU:v:VWxX?-")) != -1)
 #endif  /* not HAVE_GETOPT_LONG */
    {
        switch (c)
@@ -406,6 +410,9 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts * options)
            case 'l':
                options->action = ACT_LIST_DB;
                break;
+           case 'k':
+               options->unixsocket = optarg;
+               break;
            case 'n':
                options->no_readline = true;
                break;
index 3601811b24910b956a9037938fa5a33c97237d0c..213913ba890bb60024e6246b9adb274307b27570 100644 (file)
@@ -11,7 +11,7 @@
 #
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/bin/scripts/Attic/createdb,v 1.9 2000/11/11 22:59:48 petere Exp $
+#    $Header: /cvsroot/pgsql/src/bin/scripts/Attic/createdb,v 1.10 2000/11/13 15:18:14 momjian Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -50,6 +50,15 @@ do
         --port=*)
                 PSQLOPT="$PSQLOPT -p "`echo $1 | sed 's/^--port=//'`
                 ;;
+   --unixsocket|-k)
+       PSQLOPT="$PSQLOPT -k $2"
+       shift;;
+        -k*)
+                PSQLOPT="$PSQLOPT $1"
+                ;;
+        --unixsocket=*)
+                PSQLOPT="$PSQLOPT -k "`echo $1 | sed 's/^--unixsocket=//'`
+                ;;
    --username|-U)
        PSQLOPT="$PSQLOPT -U $2"
        shift;;
@@ -114,6 +123,7 @@ if [ "$usage" ]; then
    echo "  -E, --encoding=ENCODING         Multibyte encoding for the database"
    echo "  -h, --host=HOSTNAME             Database server host"
    echo "  -p, --port=PORT                 Database server port"
+   echo "  -k, --unixsocket=PATH           Database server Unix-domain socket name"
    echo "  -U, --username=USERNAME         Username to connect as"
    echo "  -W, --password                  Prompt for password"
    echo "  -e, --echo                      Show the query being sent to the backend"
index 4275dc6e93ffc2dccf08c618b2c4aae7b6a98367..c22dcba652f0a5f76451da25d55b1bc423338622 100644 (file)
@@ -8,7 +8,7 @@
 #
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/bin/scripts/Attic/createlang.sh,v 1.17 2000/11/11 22:59:48 petere Exp $
+#    $Header: /cvsroot/pgsql/src/bin/scripts/Attic/createlang.sh,v 1.18 2000/11/13 15:18:14 momjian Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -65,6 +65,15 @@ do
         --port=*)
                 PSQLOPT="$PSQLOPT -p "`echo $1 | sed 's/^--port=//'`
                 ;;
+   --unixsocket|-k)
+       PSQLOPT="$PSQLOPT -k $2"
+       shift;;
+        -k*)
+                PSQLOPT="$PSQLOPT $1"
+                ;;
+        --unixsocket=*)
+                PSQLOPT="$PSQLOPT -k "`echo $1 | sed 's/^--unixsocket=//'`
+                ;;
    --username|-U)
        PSQLOPT="$PSQLOPT -U $2"
        shift;;
@@ -126,6 +135,7 @@ if [ "$usage" ]; then
    echo "Options:"
    echo "  -h, --host=HOSTNAME             Database server host"
    echo "  -p, --port=PORT                 Database server port"
+   echo "  -k, --unixsocket=PATH           Database server Unix-domain socket name"
    echo "  -U, --username=USERNAME         Username to connect as"
    echo "  -W, --password                  Prompt for password"
    echo "  -d, --dbname=DBNAME             Database to install language in"
index 62c674d99e61b28719a78402cbcca416de28b996..198e4b81cfa252d9edc2d4082b24a9c7ecc6d14b 100644 (file)
@@ -8,7 +8,7 @@
 #
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/bin/scripts/Attic/createuser,v 1.12 2000/11/11 22:59:48 petere Exp $
+#    $Header: /cvsroot/pgsql/src/bin/scripts/Attic/createuser,v 1.13 2000/11/13 15:18:14 momjian Exp $
 #
 # Note - this should NOT be setuid.
 #
@@ -63,6 +63,15 @@ do
         --port=*)
                 PSQLOPT="$PSQLOPT -p "`echo $1 | sed 's/^--port=//'`
                 ;;
+   --unixsocket|-k)
+       PSQLOPT="$PSQLOPT -k $2"
+       shift;;
+        -k*)
+                PSQLOPT="$PSQLOPT $1"
+                ;;
+        --unixsocket=*)
+                PSQLOPT="$PSQLOPT -k "`echo $1 | sed 's/^--unixsocket=//'`
+                ;;
 # Note: These two specify the user to connect as (like in psql),
 #       not the user you're creating.
    --username|-U)
@@ -135,6 +144,7 @@ if [ "$usage" ]; then
    echo "  -P, --pwprompt                  Assign a password to new user"
    echo "  -h, --host=HOSTNAME             Database server host"
    echo "  -p, --port=PORT                 Database server port"
+   echo "  -k, --unixsocket=PATH           Database server Unix-domain socket name"
    echo "  -U, --username=USERNAME         Username to connect as (not the one to create)"
    echo "  -W, --password                  Prompt for password to connect"
    echo "  -e, --echo                      Show the query being sent to the backend"
index 1bb6f10f253f603d77f1176242197c34f02f231b..586b62ac7f79bfd4e02f57b7795ec3ad134e5418 100644 (file)
@@ -10,7 +10,7 @@
 #
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/bin/scripts/Attic/dropdb,v 1.7 2000/11/11 22:59:48 petere Exp $
+#    $Header: /cvsroot/pgsql/src/bin/scripts/Attic/dropdb,v 1.8 2000/11/13 15:18:14 momjian Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -59,6 +59,15 @@ do
         --port=*)
                 PSQLOPT="$PSQLOPT -p "`echo $1 | sed 's/^--port=//'`
                 ;;
+   --unixsocket|-k)
+       PSQLOPT="$PSQLOPT -k $2"
+       shift;;
+        -k*)
+                PSQLOPT="$PSQLOPT $1"
+                ;;
+        --unixsocket=*)
+                PSQLOPT="$PSQLOPT -k "`echo $1 | sed 's/^--unixsocket=//'`
+                ;;
    --username|-U)
        PSQLOPT="$PSQLOPT -U $2"
        shift;;
@@ -103,6 +112,7 @@ if [ "$usage" ]; then
    echo "Options:"
    echo "  -h, --host=HOSTNAME             Database server host"
    echo "  -p, --port=PORT                 Database server port"
+   echo "  -k, --unixsocket=PATH           Database server Unix-domain socket name"
    echo "  -U, --username=USERNAME         Username to connect as"
    echo "  -W, --password                  Prompt for password"
    echo "  -i, --interactive               Prompt before deleting anything"
index 3205ad35772c475757281f3ba67bef5b19cc5b28..46856e4241da3e23cd5d3ca40e32af050ea0c039 100644 (file)
@@ -8,7 +8,7 @@
 #
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/bin/scripts/Attic/droplang,v 1.8 2000/11/11 22:59:48 petere Exp $
+#    $Header: /cvsroot/pgsql/src/bin/scripts/Attic/droplang,v 1.9 2000/11/13 15:18:14 momjian Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -65,6 +65,15 @@ do
         --port=*)
                 PSQLOPT="$PSQLOPT -p "`echo $1 | sed 's/^--port=//'`
                 ;;
+   --unixsocket|-k)
+       PSQLOPT="$PSQLOPT -k $2"
+       shift;;
+        -k*)
+                PSQLOPT="$PSQLOPT $1"
+                ;;
+        --unixsocket=*)
+                PSQLOPT="$PSQLOPT -k "`echo $1 | sed 's/^--unixsocket=//'`
+                ;;
    --username|-U)
        PSQLOPT="$PSQLOPT -U $2"
        shift;;
@@ -113,6 +122,7 @@ if [ "$usage" ]; then
    echo "Options:"
    echo "  -h, --host=HOSTNAME             Database server host"
    echo "  -p, --port=PORT                 Database server port"
+   echo "  -k, --unixsocket=PATH           Database server Unix-domain socket name"
    echo "  -U, --username=USERNAME         Username to connect as"
    echo "  -W, --password                  Prompt for password"
    echo "  -d, --dbname=DBNAME             Database to remove language from"
index 81a00f9c1c896af3b42eb44b3ccef52bfbd0e26b..4aa858124b29969bdeca1ab749a65e15ae619fbc 100644 (file)
@@ -8,7 +8,7 @@
 #
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/bin/scripts/Attic/dropuser,v 1.7 2000/11/11 22:59:48 petere Exp $
+#    $Header: /cvsroot/pgsql/src/bin/scripts/Attic/dropuser,v 1.8 2000/11/13 15:18:14 momjian Exp $
 #
 # Note - this should NOT be setuid.
 #
@@ -59,6 +59,15 @@ do
         --port=*)
                 PSQLOPT="$PSQLOPT -p "`echo $1 | sed 's/^--port=//'`
                 ;;
+   --unixsocket|-k)
+       PSQLOPT="$PSQLOPT -k $2"
+       shift;;
+        -k*)
+                PSQLOPT="$PSQLOPT $1"
+                ;;
+        --unixsocket=*)
+                PSQLOPT="$PSQLOPT -k "`echo $1 | sed 's/^--unixsocket=//'`
+                ;;
 # Note: These two specify the user to connect as (like in psql),
 #       not the user you're dropping.
    --username|-U)
@@ -105,6 +114,7 @@ if [ "$usage" ]; then
    echo "Options:"
    echo "  -h, --host=HOSTNAME             Database server host"
    echo "  -p, --port=PORT                 Database server port"
+   echo "  -k, --unixsocket=PATH           Database server Unix-domain socket name"
    echo "  -U, --username=USERNAME         Username to connect as (not the one to drop)"
    echo "  -W, --password                  Prompt for password to connect"
    echo "  -i, --interactive               Prompt before deleting anything"
index af038add8a73d163511e030933634c687f7f98f4..fb1db8bfe67c0be3870e102119810047441c0261 100644 (file)
@@ -11,7 +11,7 @@
 #
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/bin/scripts/Attic/vacuumdb,v 1.10 2000/11/11 22:59:48 petere Exp $
+#    $Header: /cvsroot/pgsql/src/bin/scripts/Attic/vacuumdb,v 1.11 2000/11/13 15:18:14 momjian Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -52,6 +52,15 @@ do
         --port=*)
                 PSQLOPT="$PSQLOPT -p "`echo $1 | sed 's/^--port=//'`
                 ;;
+   --unixsocket|-k)
+       PSQLOPT="$PSQLOPT -k $2"
+       shift;;
+        -k*)
+                PSQLOPT="$PSQLOPT $1"
+                ;;
+        --unixsocket=*)
+                PSQLOPT="$PSQLOPT -k "`echo $1 | sed 's/^--unixsocket=//'`
+                ;;
    --username|-U)
        PSQLOPT="$PSQLOPT -U $2"
        shift;;
@@ -121,6 +130,7 @@ if [ "$usage" ]; then
         echo "Options:"
    echo "  -h, --host=HOSTNAME             Database server host"
    echo "  -p, --port=PORT                 Database server port"
+   echo "  -k, --unixsocket=PATH           Database server Unix-domain socket name"
    echo "  -U, --username=USERNAME         Username to connect as"
    echo "  -W, --password                  Prompt for password"
    echo "  -d, --dbname=DBNAME             Database to vacuum"
index 3632012f671c984317b58bdb16c98b72f51ce5ae..21cae47d97af5a990e5f47458430a6f8e1a188a4 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: libpq.h,v 1.39 2000/07/08 03:04:30 tgl Exp $
+ * $Id: libpq.h,v 1.40 2000/11/13 15:18:14 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -55,7 +55,8 @@ extern char PQerrormsg[PQERRORMSG_LENGTH];        /* in libpq/util.c */
 /*
  * prototypes for functions in pqcomm.c
  */
-extern int StreamServerPort(int family, unsigned short portName, int *fdP);
+extern int StreamServerPort(int family, char *hostName,
+           unsigned short portName, char *unixSocketName, int *fdP);
 extern int StreamConnection(int server_fd, Port *port);
 extern void StreamClose(int sock);
 extern void pq_init(void);
index bb64862922b141935c47e44ed803da77f455964f..10a798d6a6c050fdfa34a418323a8d48b8f0ae45 100644 (file)
@@ -9,7 +9,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pqcomm.h,v 1.43 2000/11/01 21:14:03 petere Exp $
+ * $Id: pqcomm.h,v 1.44 2000/11/13 15:18:14 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -51,12 +51,15 @@ typedef union SockAddr
 /* Configure the UNIX socket address for the well known port. */
 
 #if defined(SUN_LEN)
-#define UNIXSOCK_PATH(sun,port) \
-   (sprintf((sun).sun_path, "/tmp/.s.PGSQL.%d", (port)), SUN_LEN(&(sun)))
+#define UNIXSOCK_PATH(sun,port,defpath) \
+        ((defpath && defpath[0] != '\0') ? (strncpy((sun).sun_path, defpath, sizeof((sun).sun_path)), (sun).sun_path[sizeof((sun).sun_path)-1] = '\0') : sprintf((sun).sun_path, "/tmp/.s.PGSQL.%d", (port)))
+#define UNIXSOCK_LEN(sun) \
+        (SUN_LEN(&(sun)))
 #else
-#define UNIXSOCK_PATH(sun,port) \
-   (sprintf((sun).sun_path, "/tmp/.s.PGSQL.%d", (port)), \
-    strlen((sun).sun_path)+ offsetof(struct sockaddr_un, sun_path))
+#define UNIXSOCK_PATH(sun,port,defpath) \
+        ((defpath && defpath[0] != '\0') ? (strncpy((sun).sun_path, defpath, sizeof((sun).sun_path)), (sun).sun_path[sizeof((sun).sun_path)-1] = '\0') : sprintf((sun).sun_path, "/tmp/.s.PGSQL.%d", (port)))
+#define UNIXSOCK_LEN(sun) \
+        (strlen((sun).sun_path)+ offsetof(struct sockaddr_un, sun_path))
 #endif
 
 /*
@@ -176,5 +179,7 @@ typedef struct CancelRequestPacket
 extern int Unix_socket_permissions;
 
 extern char * Unix_socket_group;
+extern char * UnixSocketName;
+extern char * HostName;
 
 #endif  /* PQCOMM_H */
index 4d37a8c6112133fd61061ccf99a2b6bfedc15267..b0447285d48b115744e2b181f769cde88e13723e 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.144 2000/11/04 02:27:56 ishii Exp $
+ *   $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.145 2000/11/13 15:18:15 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -130,6 +130,9 @@ static const PQconninfoOption PQconninfoOptions[] = {
    {"port", "PGPORT", DEF_PGPORT_STR, NULL,
    "Database-Port", "", 6},
 
+   {"unixsocket", "PGUNIXSOCKET", NULL, NULL,
+   "Unix-Socket", "", 80},
+
    {"tty", "PGTTY", DefaultTty, NULL,
    "Backend-Debug-TTY", "D", 40},
 
@@ -305,6 +308,8 @@ PQconnectStart(const char *conninfo)
    conn->pghost = tmp ? strdup(tmp) : NULL;
    tmp = conninfo_getval(connOptions, "port");
    conn->pgport = tmp ? strdup(tmp) : NULL;
+   tmp = conninfo_getval(connOptions, "unixsocket");
+   conn->pgunixsocket = tmp ? strdup(tmp) : NULL;
    tmp = conninfo_getval(connOptions, "tty");
    conn->pgtty = tmp ? strdup(tmp) : NULL;
    tmp = conninfo_getval(connOptions, "options");
@@ -385,6 +390,9 @@ PQconndefaults(void)
  *   PGPORT       identifies TCP port to which to connect if  argument
  *                is NULL or a null string.
  *
+ *   PGUNIXSOCKET     identifies Unix-domain socket to which to connect; default
+ *                is computed from the TCP port.
+ *
  *   PGTTY        identifies tty to which to send messages if  argument
  *                is NULL or a null string.
  *
@@ -435,6 +443,14 @@ PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions,
    else
        conn->pgport = strdup(pgport);
 
+#if FIX_ME
+   /* we need to modify the function to accept a unix socket path */
+   if (pgunixsocket)
+       conn->pgunixsocket = strdup(pgunixsocket);
+   else if ((tmp = getenv("PGUNIXSOCKET")) != NULL)
+       conn->pgunixsocket = strdup(tmp);
+#endif
+
    if (pgtty == NULL)
    {
        if ((tmp = getenv("PGTTY")) == NULL)
@@ -510,13 +526,13 @@ PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions,
 
 /*
  * update_db_info -
- * get all additional infos out of dbName
+ * get all additional info out of dbName
  *
  */
 static int
 update_db_info(PGconn *conn)
 {
-   char       *tmp,
+   char       *tmp, *tmp2,
               *old = conn->dbName;
 
    if (strchr(conn->dbName, '@') != NULL)
@@ -525,6 +541,8 @@ update_db_info(PGconn *conn)
        tmp = strrchr(conn->dbName, ':');
        if (tmp != NULL)        /* port number given */
        {
+           if (conn->pgport)
+               free(conn->pgport);
            conn->pgport = strdup(tmp + 1);
            *tmp = '\0';
        }
@@ -532,6 +550,8 @@ update_db_info(PGconn *conn)
        tmp = strrchr(conn->dbName, '@');
        if (tmp != NULL)        /* host name given */
        {
+           if (conn->pghost)
+               free(conn->pghost);
            conn->pghost = strdup(tmp + 1);
            *tmp = '\0';
        }
@@ -558,13 +578,15 @@ update_db_info(PGconn *conn)
 
            /*
             * new style:
-            * :postgresql://server[:port][/dbname][?options]
+            * :postgresql://server[:port|:/unixsocket/path:][/dbname][?options]
             */
            offset += strlen("postgresql://");
 
            tmp = strrchr(conn->dbName + offset, '?');
            if (tmp != NULL)    /* options given */
            {
+               if (conn->pgoptions)
+                   free(conn->pgoptions);
                conn->pgoptions = strdup(tmp + 1);
                *tmp = '\0';
            }
@@ -572,26 +594,62 @@ update_db_info(PGconn *conn)
            tmp = strrchr(conn->dbName + offset, '/');
            if (tmp != NULL)    /* database name given */
            {
+               if (conn->dbName)
+                   free(conn->dbName);
                conn->dbName = strdup(tmp + 1);
                *tmp = '\0';
            }
            else
            {
+               /* Why do we default only this value from the environment again?  */
                if ((tmp = getenv("PGDATABASE")) != NULL)
+               {
+                   if (conn->dbName)
+                       free(conn->dbName);
                    conn->dbName = strdup(tmp);
+               }
                else if (conn->pguser)
+               {
+                   if (conn->dbName)
+                       free(conn->dbName);
                    conn->dbName = strdup(conn->pguser);
+               }
            }
 
            tmp = strrchr(old + offset, ':');
-           if (tmp != NULL)    /* port number given */
+           if (tmp != NULL)    /* port number or Unix socket path given */
            {
-               conn->pgport = strdup(tmp + 1);
                *tmp = '\0';
+               if ((tmp2 = strchr(tmp + 1, ':')) != NULL)
+               {
+                   if (strncmp(old, "unix:", 5) != 0)
+                   {
+                       printfPQExpBuffer(&conn->errorMessage,
+                                 "connectDBStart() -- "
+                                 "socket name can only be specified with "
+                                 "non-TCP\n");
+                       return 1; 
+                   }
+                   *tmp2 = '\0';
+                   if (conn->pgunixsocket)
+                       free(conn->pgunixsocket);
+                   conn->pgunixsocket = strdup(tmp + 1);
+               }
+               else
+               {
+                   if (conn->pgport)
+                       free(conn->pgport);
+                   conn->pgport = strdup(tmp + 1);
+                   if (conn->pgunixsocket)
+                       free(conn->pgunixsocket);
+                   conn->pgunixsocket = NULL;
+               }
            }
 
            if (strncmp(old, "unix:", 5) == 0)
            {
+               if (conn->pghost)
+                   free(conn->pghost);
                conn->pghost = NULL;
                if (strcmp(old + offset, "localhost") != 0)
                {
@@ -603,8 +661,11 @@ update_db_info(PGconn *conn)
                }
            }
            else
+           {
+               if (conn->pghost)
+                   free(conn->pghost);
                conn->pghost = strdup(old + offset);
-
+           }
            free(old);
        }
    }
@@ -763,7 +824,10 @@ connectDBStart(PGconn *conn)
    }
 #ifdef HAVE_UNIX_SOCKETS
    else
-       conn->raddr_len = UNIXSOCK_PATH(conn->raddr.un, portno);
+   {
+       UNIXSOCK_PATH(conn->raddr.un, portno, conn->pgunixsocket);
+       conn->raddr_len = UNIXSOCK_LEN(conn->raddr.un);
+   }
 #endif
 
 
@@ -842,7 +906,8 @@ connectDBStart(PGconn *conn)
                              conn->pghost ? conn->pghost : "localhost",
                              (family == AF_INET) ?
                              "TCP/IP port" : "Unix socket",
-                             conn->pgport);
+                             (family == AF_UNIX && conn->pgunixsocket) ?
+                             conn->pgunixsocket : conn->pgport);
            goto connect_errReturn;
        }
    }
@@ -1143,7 +1208,8 @@ keep_going:                       /* We will come back to here until there
                               conn->pghost ? conn->pghost : "localhost",
                                  (conn->raddr.sa.sa_family == AF_INET) ?
                                      "TCP/IP port" : "Unix socket",
-                                     conn->pgport);
+                             (conn->raddr.sa.sa_family == AF_UNIX && conn->pgunixsocket) ?
+                                     conn->pgunixsocket : conn->pgport);
                    goto error_return;
                }
 
@@ -1819,6 +1885,8 @@ freePGconn(PGconn *conn)
        free(conn->pghostaddr);
    if (conn->pgport)
        free(conn->pgport);
+   if (conn->pgunixsocket)
+       free(conn->pgunixsocket);
    if (conn->pgtty)
        free(conn->pgtty);
    if (conn->pgoptions)
@@ -2528,6 +2596,14 @@ PQport(const PGconn *conn)
    return conn->pgport;
 }
 
+char *
+PQunixsocket(const PGconn *conn)
+{
+   if (!conn)
+       return (char *) NULL;
+   return conn->pgunixsocket;
+}
+
 char *
 PQtty(const PGconn *conn)
 {
index cfca1984604d838f963f3a930a1f173a187edba7..0d064e1a67ae2848c26787b5db3ea8d0272439b0 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: libpq-fe.h,v 1.67 2000/08/30 14:54:23 momjian Exp $
+ * $Id: libpq-fe.h,v 1.68 2000/11/13 15:18:15 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -217,6 +217,7 @@ extern      "C"
    extern char *PQpass(const PGconn *conn);
    extern char *PQhost(const PGconn *conn);
    extern char *PQport(const PGconn *conn);
+   extern char *PQunixsocket(const PGconn *conn);
    extern char *PQtty(const PGconn *conn);
    extern char *PQoptions(const PGconn *conn);
    extern ConnStatusType PQstatus(const PGconn *conn);
index c640b6df9f2c1090e186ec6fea8529f7051800ae..a7c6acb9524b154dd79da67462ae9c3a21029dae 100644 (file)
@@ -12,7 +12,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: libpq-int.h,v 1.27 2000/08/30 14:54:24 momjian Exp $
+ * $Id: libpq-int.h,v 1.28 2000/11/13 15:18:15 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -203,6 +203,8 @@ struct pg_conn
                                 * numbers-and-dots notation. Takes
                                 * precedence over above. */
    char       *pgport;         /* the server's communication port */
+   char       *pgunixsocket;       /* the Unix-domain socket that the server is listening on;
+                        * if NULL, uses a default constructed from pgport */
    char       *pgtty;          /* tty on which the backend messages is
                                 * displayed (NOT ACTUALLY USED???) */
    char       *pgoptions;      /* options to start the backend with */
index 32b0fa6ec3a770a3ace315263a7a056612ed7ca0..7cf3bbc0a45e1c04e16f9fd7e33bc9f00b35f19c 100644 (file)
@@ -79,3 +79,4 @@ EXPORTS
    destroyPQExpBuffer  @ 76
    createPQExpBuffer   @ 77
    PQconninfoFree      @ 78
+   PQunixsocket        @ 79