]> granicus.if.org Git - postgresql/commitdiff
Add PGUSER environment variable for client to specify Postgres username.
authorBryan Henderson <bryanh@giraffe.netgate.net>
Thu, 10 Oct 1996 08:20:11 +0000 (08:20 +0000)
committerBryan Henderson <bryanh@giraffe.netgate.net>
Thu, 10 Oct 1996 08:20:11 +0000 (08:20 +0000)
src/interfaces/libpq/fe-connect.c
src/interfaces/libpq/libpq-fe.h

index 0fa63d8fd8d377e59f515caf4d322e277cc8a5af..72946d840673e271d5648fe95b587ad517f079fe 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.8 1996/08/19 13:38:42 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.9 1996/10/10 08:20:09 bryanh Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -21,8 +21,9 @@
 #include <string.h>
 #include <netdb.h>
 #include <errno.h>
-#include "libpq/pqcomm.h" /* for decls of MsgType, PacketBuf, StartupInfo */
-#include "fe-auth.h"
+#include <signal.h>
+#include <libpq/pqcomm.h> /* for decls of MsgType, PacketBuf, StartupInfo */
+#include <fe-auth.h>
 #include "libpq-fe.h"
 
 #if defined(PORTNAME_ultrix4) || defined(PORTNAME_next)
@@ -56,19 +57,45 @@ static void closePGconn(PGconn *conn);
 /* ----------------
  *     PQsetdb
  * 
- * establishes a connectin to a postgres backend through the postmaster
+ * establishes a connection to a postgres backend through the postmaster
  * at the specified host and port.
  *
  * returns a PGconn* which is needed for all subsequent libpq calls
  * if the status field of the connection returned is CONNECTION_BAD,
  * then some fields may be null'ed out instead of having valid values 
+ *
+ *  Uses these environment variables:
+ *
+ *    PGHOST       identifies host to which to connect if <pghost> argument
+ *                 is NULL or a null string.
+ *
+ *    PGPORT       identifies TCP port to which to connect if <pgport> argument
+ *                 is NULL or a null string.
+ *
+ *    PGTTY        identifies tty to which to send messages if <pgtty> argument
+ *                 is NULL or a null string.
+ *
+ *    PGOPTIONS    identifies connection options if <pgoptions> argument is
+ *                 NULL or a null string.
+ *
+ *    PGUSER       Postgres username to associate with the connection.
+ *
+ *    PGDATABASE   name of database to which to connect if <pgdatabase> 
+ *                 argument is NULL or a null string
+ *
+ *    None of the above need be defined.  There are defaults for all of them.
+ *
  * ----------------
  */
 PGconn* 
 PQsetdb(const char *pghost, const char* pgport, const char* pgoptions, const char* pgtty, const char* dbName)
 {
   PGconn *conn;
-  const char *tmp;
+  char *tmp;
+  char errorMessage[ERROR_MSG_LENGTH];
+    /* An error message from some service we call. */
+  bool error;   
+    /* We encountered an error that prevents successful completion */
 
   conn = (PGconn*)malloc(sizeof(PGconn));
 
@@ -113,33 +140,45 @@ PQsetdb(const char *pghost, const char* pgport, const char* pgoptions, const cha
       conn->pgoptions = strdup(tmp);
     } else
       conn->pgoptions = strdup(pgoptions);
-    if (((tmp = dbName) && (dbName[0] != '\0')) ||
-        ((tmp = getenv("PGDATABASE")))) {
-      conn->dbName = strdup(tmp);
+
+    if (tmp = getenv("PGUSER")) {
+      error = FALSE;
+      conn->pguser = strdup(tmp);
     } else {
-      char errorMessage[ERROR_MSG_LENGTH];
-      if ((tmp = fe_getauthname(errorMessage)) != 0) {
-        conn->dbName = strdup(tmp);
-        free((char*)tmp);
-      } else {
+      tmp = fe_getauthname(errorMessage);
+      if (tmp == 0) {
+        error = TRUE;
         sprintf(conn->errorMessage,
-                "FATAL: PQsetdb: Unable to determine a database name!\n");
-        conn->dbName = NULL;
-        return conn;
+                "FATAL: PQsetdb: Unable to determine a Postgres username!\n");
+      } else {
+        error = FALSE;
+        conn->pguser = tmp;
       }
     }
-    conn->status = connectDB(conn);
-    if (conn->status == CONNECTION_OK) {
-      PGresult *res;
-      /* Send a blank query to make sure everything works; in particular, that
-         the database exists.
-         */
-      res = PQexec(conn," ");
-      if (res == NULL || res->resultStatus != PGRES_EMPTY_QUERY) {
-        /* PQexec has put error message in conn->errorMessage */
-        closePGconn(conn);
+
+    if (!error) {
+      if (((tmp = (char *)dbName) && (dbName[0] != '\0')) ||
+          ((tmp = getenv("PGDATABASE")))) {
+        conn->dbName = strdup(tmp);
+      } else conn->dbName = conn->pguser;
+    } else conn->dbName = NULL;
+
+    if (error) conn->status = CONNECTION_BAD;
+    else {
+      conn->status = connectDB(conn);  
+        /* Puts message in conn->errorMessage */
+      if (conn->status == CONNECTION_OK) {
+        PGresult *res;
+        /* Send a blank query to make sure everything works; 
+           in particular, that the database exists.
+           */
+        res = PQexec(conn," ");
+        if (res == NULL || res->resultStatus != PGRES_EMPTY_QUERY) {
+          /* PQexec has put error message in conn->errorMessage */
+          closePGconn(conn);
+        }
+        PQclear(res);
       }
-      PQclear(res);
     }
   }        
   return conn;
@@ -165,7 +204,6 @@ connectDB(PGconn *conn)
     Port        *port = conn->port;
     int         portno;
 
-    char        *user;
     /*
     //
     // Initialize the startup packet. 
@@ -175,11 +213,7 @@ connectDB(PGconn *conn)
     //
     //
     */
-    user = fe_getauthname(conn->errorMessage);
-    if (!user)
-       goto connect_errReturn;
-    strncpy(startup.user,user,sizeof(startup.user));
-    free(user);
+    strncpy(startup.user,conn->pguser,sizeof(startup.user));
     strncpy(startup.database,conn->dbName,sizeof(startup.database));
     strncpy(startup.tty,conn->pgtty,sizeof(startup.tty));
     if (conn->pgoptions) {
@@ -292,6 +326,7 @@ freePGconn(PGconn *conn)
   if (conn->pgoptions) free(conn->pgoptions);
   if (conn->pgport) free(conn->pgport);
   if (conn->dbName) free(conn->dbName);
+  if (conn->pguser) free(conn->pguser);
   if (conn->notifyList) DLFreeList(conn->notifyList);
   free(conn);
 }
@@ -303,8 +338,16 @@ freePGconn(PGconn *conn)
 static void
 closePGconn(PGconn *conn)
 {
+    const struct sigaction ignore_action = {SIG_IGN, 0, 0, NULL};
+    struct sigaction oldaction;
+
+    /* If connection is already gone, that's cool.  No reason for kernel
+       to kill us when we try to write to it.  So ignore SIGPIPE signals.
+       */
+    sigaction(SIGPIPE, (struct sigaction *) &ignore_action, &oldaction);
     fputs("X\0", conn->Pfout);
     fflush(conn->Pfout);
+    sigaction(SIGPIPE, &oldaction, NULL);
     if (conn->Pfout) fclose(conn->Pfout);
     if (conn->Pfin)  fclose(conn->Pfin);
     if (conn->Pfdebug) fclose(conn->Pfdebug);
index 78bd330414c7d664c8034bd5d1232b3c2745c2ac..598e2c8cd2f6f54408ffdec024dc8e68f913c02c 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: libpq-fe.h,v 1.7 1996/08/13 01:34:29 scrappy Exp $
+ * $Id: libpq-fe.h,v 1.8 1996/10/10 08:20:11 bryanh Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -112,6 +112,7 @@ typedef struct pg_conn{
   void *port; /* really a Port* */
   int asyncNotifyWaiting;
   Dllist* notifyList;
+  char *pguser;  /* Postgres username of user who is connected */
 } PGconn;
 
 #define CMDSTATUS_LEN 40