diff -durpN postgresql/src/interfaces/libpq/exports.txt postgresql.1/src/interfaces/libpq/exports.txt
--- postgresql/src/interfaces/libpq/exports.txt	2012-08-03 09:39:30.118266598 +0200
+++ postgresql.1/src/interfaces/libpq/exports.txt	2012-10-03 17:17:06.344766325 +0200
@@ -161,3 +161,4 @@ PQping                    158
 PQpingParams              159
 PQlibVersion              160
 PQsetSingleRowMode        161
+PQconninfo                162
diff -durpN postgresql/src/interfaces/libpq/fe-connect.c postgresql.1/src/interfaces/libpq/fe-connect.c
--- postgresql/src/interfaces/libpq/fe-connect.c	2012-09-09 08:11:09.470401480 +0200
+++ postgresql.1/src/interfaces/libpq/fe-connect.c	2012-10-03 15:46:44.357491440 +0200
@@ -318,6 +318,8 @@ static char *conninfo_uri_decode(const c
 static bool get_hexdigit(char digit, int *value);
 static const char *conninfo_getval(PQconninfoOption *connOptions,
 				const char *keyword);
+static void conninfo_setval(PQconninfoOption *connOptions,
+				const char *keyword, const char *val);
 static PQconninfoOption *conninfo_storeval(PQconninfoOption *connOptions,
 				  const char *keyword, const char *value,
 			  PQExpBuffer errorMessage, bool ignoreMissing, bool uri_decode);
@@ -4985,6 +4987,24 @@ conninfo_getval(PQconninfoOption *connOp
 }
 
 /*
+ * Set an option value corresponding to the keyword in the connOptions array.
+ */
+static void
+conninfo_setval(PQconninfoOption *connOptions, const char *keyword,
+						const char *val)
+{
+	PQconninfoOption *option;
+
+	option = conninfo_find(connOptions, keyword);
+	if (option)
+	{
+		if (option->val)
+			free(option->val);
+		option->val = val ? strdup(val) : NULL;
+	}
+}
+
+/*
  * Store a (new) value for an option corresponding to the keyword in
  * connOptions array.
  *
@@ -5066,6 +5086,69 @@ conninfo_find(PQconninfoOption *connOpti
 }
 
 
+/*
+ * Return the connection options used for the connections
+ */
+PQconninfoOption *
+PQconninfo(PGconn *conn)
+{
+	PQExpBufferData errorBuf;
+	PQconninfoOption *connOptions;
+
+	if (conn == NULL)
+		return NULL;
+
+	/* We don't actually report any errors here, but callees want a buffer */
+	initPQExpBuffer(&errorBuf);  
+	if (PQExpBufferDataBroken(errorBuf))
+		return NULL;		/* out of memory already :-( */
+
+	connOptions = conninfo_init(&errorBuf);
+
+	termPQExpBuffer(&errorBuf);
+
+	/*
+	 * Move conn values into option structure
+	 */
+	conninfo_setval(connOptions, "hostaddr", conn->pghostaddr);
+	conninfo_setval(connOptions, "host", conn->pghost);
+	conninfo_setval(connOptions, "port", conn->pgport);	
+	conninfo_setval(connOptions, "tty", conn->pgtty);
+	conninfo_setval(connOptions, "options", conn->pgoptions);
+	conninfo_setval(connOptions, "application_name", conn->appname);
+	conninfo_setval(connOptions, "fallback_application_name", conn->fbappname);
+	conninfo_setval(connOptions, "dbname", conn->dbName);
+	conninfo_setval(connOptions, "user", conn->pguser);
+	conninfo_setval(connOptions, "password", conn->pgpass);
+	conninfo_setval(connOptions, "connect_timeout", conn->connect_timeout);
+	conninfo_setval(connOptions, "client_encoding", conn->client_encoding_initial);
+	conninfo_setval(connOptions, "keepalives", conn->keepalives);
+	conninfo_setval(connOptions, "keepalives_idle", conn->keepalives_idle);
+	conninfo_setval(connOptions, "keepalives_interval", conn->keepalives_interval);
+	conninfo_setval(connOptions, "keepalives_count", conn->keepalives_count);
+	conninfo_setval(connOptions, "sslmode", conn->sslmode);
+	conninfo_setval(connOptions, "sslcompression", conn->sslcompression);
+	conninfo_setval(connOptions, "sslkey", conn->sslkey);
+	conninfo_setval(connOptions, "sslcert", conn->sslcert);
+	conninfo_setval(connOptions, "sslrootcert", conn->sslrootcert);
+	conninfo_setval(connOptions, "sslcrl", conn->sslcrl);
+#ifdef USE_SSL
+	conninfo_setval(connOptions, "requiressl",
+		(conn->sslmode && strcmp(conn->sslmode, "require") == 0 ? "1" : "0"));
+#endif
+	conninfo_setval(connOptions, "requirepeer", conn->requirepeer);
+#if defined(KRB5) || defined(ENABLE_GSS) || defined(ENABLE_SSPI)
+	conninfo_setval(connOptions, "krbsrvname", conn->krbsrvname);
+#endif
+#if defined(ENABLE_GSS) && defined(ENABLE_SSPI)
+	conninfo_setval(connOptions, "gsslib", conn->gsslib);
+#endif
+	conninfo_setval(connOptions, "replication", conn->replication);
+
+	return connOptions;
+}
+
+
 void
 PQconninfoFree(PQconninfoOption *connOptions)
 {
diff -durpN postgresql/src/interfaces/libpq/libpq-fe.h postgresql.1/src/interfaces/libpq/libpq-fe.h
--- postgresql/src/interfaces/libpq/libpq-fe.h	2012-08-03 09:39:30.122266626 +0200
+++ postgresql.1/src/interfaces/libpq/libpq-fe.h	2012-10-03 15:00:45.458355068 +0200
@@ -262,6 +262,9 @@ extern PQconninfoOption *PQconndefaults(
 /* parse connection options in same way as PQconnectdb */
 extern PQconninfoOption *PQconninfoParse(const char *conninfo, char **errmsg);
 
+/* return the connection options used by a live connection */
+extern PQconninfoOption *PQconninfo(PGconn *conn);
+
 /* free the data structure returned by PQconndefaults() or PQconninfoParse() */
 extern void PQconninfoFree(PQconninfoOption *connOptions);
 
