diff -crN git/src/backend/catalog/system_views.sql Git_code/postgresql/src/backend/catalog/system_views.sql
*** git/src/backend/catalog/system_views.sql	Fri Mar 14 14:06:38 2014
--- Git_code/postgresql/src/backend/catalog/system_views.sql	Fri Mar 14 12:11:26 2014
***************
*** 381,386 ****
--- 381,391 ----
  
  GRANT SELECT, UPDATE ON pg_settings TO PUBLIC;
  
+ CREATE VIEW pg_hba_settings AS
+     SELECT * FROM pg_show_all_hba_settings() AS A;
+ 
+ REVOKE ALL on pg_hba_settings FROM public;
+ 
  CREATE VIEW pg_timezone_abbrevs AS
      SELECT * FROM pg_timezone_abbrevs();
  
diff -crN git/src/backend/libpq/hba.c Git_code/postgresql/src/backend/libpq/hba.c
*** git/src/backend/libpq/hba.c	Fri Mar 14 14:06:39 2014
--- Git_code/postgresql/src/backend/libpq/hba.c	Fri Mar 14 14:01:37 2014
***************
*** 2243,2245 ****
--- 2243,2438 ----
  {
  	check_hba(port);
  }
+ int
+ GetNumHbaLines(void)
+ {
+     return (list_length(parsed_hba_lines));
+ }
+ /*
+  * Fetches the HbaLine corresponding to linenum variable.
+  * Fill the values required to build a tuple, of view pg_hba_settings, in values pointer.
+  */
+ void
+ GetHbaLineByNum(int linenum,const char **values)
+ {
+     HbaLine    *hba;
+     ListCell    *dbcell;
+     char        buffer[256];
+     int         len;
+     StringInfoData  str;
+     HbaToken   *tok;
+         
+     initStringInfo(&str);
+     hba = (HbaLine *) list_nth(parsed_hba_lines,linenum);
+ 
+     /* Retrieving connection type */
+     switch(hba->conntype)
+     {
+         case ctLocal:
+             values[0]=pstrdup("Local");
+             break;
+         case ctHost:
+             values[0]=pstrdup("Host");
+             break;
+         case ctHostSSL:
+             values[0]=pstrdup("HostSSL");
+             break;
+         case ctHostNoSSL:
+             values[0]=pstrdup("HostNoSSL");
+             break;
+         default:
+             values[0]=NULL;
+             break;
+ 
+     }   
+ 
+     appendStringInfoString(&str,"{");
+     foreach(dbcell,hba->databases)
+     {
+         tok = lfirst(dbcell);
+         appendStringInfoString(&str,tok->string);
+         appendStringInfoString(&str,",");
+     }
+     /* For any number of values inserted, seperator at the end needs to be replaced by string terminator */
+     if(str.len) 
+     {
+         str.data[str.len-1]='\0';
+         str.len-=1;
+     }
+     appendStringInfoString(&str, "}");
+     values[1] = str.data; 
+ 
+     /* Retrieving user roles */
+     initStringInfo(&str);     
+     appendStringInfoString(&str,"{");
+     foreach(dbcell,hba->roles)
+     {
+         tok = lfirst(dbcell);
+         appendStringInfoString(&str,tok->string);
+         appendStringInfoString(&str,",");
+     }
+     /* Replace last seperator by string terminator */
+     if(str.len)
+     {
+         str.data[str.len-1]='\0';
+         str.len-=1;
+     }
+     appendStringInfoString(&str, "}");
+     values[2] = str.data; 
+     
+     /* Retrieving Socket address */
+     switch(hba->addr.ss_family)
+     {
+         case AF_INET:
+             len = sizeof(struct sockaddr_in);
+             break;
+ #ifdef HAVE_IPV6
+         case AF_INET6:
+             len = sizeof(struct sockaddr_in6);
+             break;
+ #endif
+         default:
+             len = sizeof(struct sockaddr_storage);
+             break;
+ 
+     }
+     if(getnameinfo((const struct sockaddr *)&hba->addr,len,buffer,sizeof(buffer),NULL,0,NI_NUMERICHOST)==0)
+         values[3]=pstrdup(buffer);
+     else
+         values[3]=NULL;
+ 
+ 
+     /* Retrieving socket mask */
+     switch(hba->mask.ss_family)
+     {
+         case AF_INET:
+             len = sizeof(struct sockaddr_in);
+             break;
+ #ifdef HAVE_IPV6
+         case AF_INET6:
+             len = sizeof(struct sockaddr_in6);
+             break;
+ #endif
+         default:
+             len = sizeof(struct sockaddr_storage);
+             break;
+ 
+     }
+     if(getnameinfo((const struct sockaddr *)&hba->mask,len,buffer,sizeof(buffer),NULL,0,NI_NUMERICHOST)==0)
+         values[4]=pstrdup(buffer);
+     else
+         values[4]=NULL;
+         
+     /* Retrieving compare method */
+     switch(hba->ip_cmp_method)
+     {
+         case ipCmpMask:
+             values[5]=pstrdup("Mask");
+             break;
+         case ipCmpSameHost:
+             values[5]=pstrdup("SameHost");
+             break;
+         case ipCmpSameNet:
+             values[5]=pstrdup("SameNet");
+             break;
+         case ipCmpAll:
+             values[5]=pstrdup("All");
+             break;
+         default:
+             values[5]=NULL;
+             break;
+     }
+ 
+     /* Retrieving hostname */
+     values[6] = hba->hostname;
+     switch(hba->auth_method)
+     {
+         case uaReject:
+             values[7]=pstrdup("Reject");
+             break;
+         case uaImplicitReject:
+             values[7]=pstrdup("ImplicitReject");
+             break;
+         case uaTrust:
+             values[7]=pstrdup("Trust");
+             break;
+         case uaIdent:
+             values[7]=pstrdup("Ident");
+             break;
+         case uaPassword:
+             values[7]=pstrdup("Password");
+             break;
+         case uaMD5:
+             values[7]=pstrdup("MD5");
+             break;
+         case uaGSS:
+             values[7]=pstrdup("GSS");
+             break;
+         case uaSSPI:
+             values[7]=pstrdup("SSPI");
+             break;
+         case uaPAM:
+             values[7]=pstrdup("PAM");
+             break;
+         case uaLDAP:
+             values[7]=pstrdup("LDAP");
+             break;
+         case uaCert:
+             values[7]=pstrdup("Cert");
+             break;
+         case uaRADIUS:
+             values[7]=pstrdup("RADIUS");
+             break;
+         case uaPeer:
+             values[7]=pstrdup("Peer");
+             break;
+         default:
+             values[7]=NULL;
+             break;
+ 
+ 
+     }   
+     /* Retrieving linenumber */
+     snprintf(buffer,sizeof(buffer),"%d",hba->linenumber);
+     values[8] = pstrdup(buffer);
+ }
diff -crN git/src/backend/utils/misc/guc.c Git_code/postgresql/src/backend/utils/misc/guc.c
*** git/src/backend/utils/misc/guc.c	Fri Mar 14 14:06:51 2014
--- Git_code/postgresql/src/backend/utils/misc/guc.c	Tue Mar 11 10:03:24 2014
***************
*** 132,137 ****
--- 132,138 ----
  extern char *SSLECDHCurve;
  extern bool SSLPreferServerCiphers;
  
+ extern List *parsed_hba_lines;
  #ifdef TRACE_SORT
  extern bool trace_sort;
  #endif
***************
*** 7984,7990 ****
  		SRF_RETURN_DONE(funcctx);
  	}
  }
! 
  static char *
  _ShowOption(struct config_generic * record, bool use_units)
  {
--- 7985,8080 ----
  		SRF_RETURN_DONE(funcctx);
  	}
  }
! #define NUM_PG_HBA_SETTINGS_ATTS    9
! Datum
! show_all_hba_settings(PG_FUNCTION_ARGS)
! {
!     FuncCallContext *funcctx;
!     TupleDesc   tupdesc;
!     int         call_cntr;
!     int         max_calls;
!     AttInMetadata *attinmeta;
!     MemoryContext oldcontext;
! 
!     /* stuff done only on the first call of the function */
!     if (SRF_IS_FIRSTCALL())
!     {
!         /* create a function context for cross-call persistence */
!         funcctx = SRF_FIRSTCALL_INIT();
! 
!         /*
!         * switch to memory context appropriate for multiple function calls
!         */
!         oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
! 
!         /*
!         * need a tuple descriptor representing NUM_PG_HBA_SETTINGS_ATTS columns
!         * of the appropriate types
!         */
!         tupdesc = CreateTemplateTupleDesc(NUM_PG_HBA_SETTINGS_ATTS, false);
!         TupleDescInitEntry(tupdesc, (AttrNumber) 1, "connection_type",
!                             TEXTOID, -1, 0);
!         TupleDescInitEntry(tupdesc, (AttrNumber) 2, "databases",
!                             TEXTARRAYOID, -1, 0);
!         TupleDescInitEntry(tupdesc, (AttrNumber) 3, "roles",
!                             TEXTARRAYOID, -1, 0);
!         TupleDescInitEntry(tupdesc, (AttrNumber) 4, "socket_address",
!                             TEXTOID, -1, 0);
!         TupleDescInitEntry(tupdesc, (AttrNumber) 5, "socket_mask",
!                             TEXTOID, -1, 0);
!         TupleDescInitEntry(tupdesc, (AttrNumber) 6, "compare_method",
!                             TEXTOID, -1, 0);
!         TupleDescInitEntry(tupdesc, (AttrNumber) 7, "hostname",
!                             TEXTOID, -1, 0);
!         TupleDescInitEntry(tupdesc, (AttrNumber) 8, "authmethod",
!                             TEXTOID, -1, 0);
!         TupleDescInitEntry(tupdesc, (AttrNumber) 9, "linenumber",
!                             INT4OID, -1, 0);
! 
! 
!         /*
!         * Generate attribute metadata needed later to produce tuples from raw
!         * C strings
!         */
!         attinmeta = TupleDescGetAttInMetadata(tupdesc);
!         funcctx->attinmeta = attinmeta;
! 
!         /* total number of tuples to be returned */
!         funcctx->max_calls = GetNumHbaLines(); 
!         MemoryContextSwitchTo(oldcontext);
!     }
! 
!     /* stuff done on every call of the function */
!     funcctx = SRF_PERCALL_SETUP();
! 
!     call_cntr = funcctx->call_cntr;
!     max_calls = funcctx->max_calls;
!     attinmeta = funcctx->attinmeta;
! 
!     if (call_cntr < max_calls)  
!     {
!         char       *values[NUM_PG_HBA_SETTINGS_ATTS];
!         HeapTuple   tuple;
!         Datum       result;
! 
!         /*
!         * Get the next parsed hba line values
!         */
!         GetHbaLineByNum(call_cntr,(const char**)values);
!                     
!         /* build a tuple */
!         tuple = BuildTupleFromCStrings(attinmeta, values);
!         /* make the tuple into a datum */
!         result = HeapTupleGetDatum(tuple);
!         SRF_RETURN_NEXT(funcctx, result);
!     }
!     else
!     {
!         /* do when there is no more left */
!         SRF_RETURN_DONE(funcctx);
!     }
! }
!             
  static char *
  _ShowOption(struct config_generic * record, bool use_units)
  {
diff -crN git/src/include/catalog/pg_proc.h Git_code/postgresql/src/include/catalog/pg_proc.h
*** git/src/include/catalog/pg_proc.h	Fri Mar 14 14:06:43 2014
--- Git_code/postgresql/src/include/catalog/pg_proc.h	Fri Mar 14 15:28:16 2014
***************
*** 2924,2929 ****
--- 2924,2931 ----
  DESCR("SET X as a function");
  DATA(insert OID = 2084 (  pg_show_all_settings	PGNSP PGUID 12 1 1000 0 0 f f f f t t s 0 0 2249 "" "{25,25,25,25,25,25,25,25,25,25,25,1009,25,25,25,23}" "{o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{name,setting,unit,category,short_desc,extra_desc,context,vartype,source,min_val,max_val,enumvals,boot_val,reset_val,sourcefile,sourceline}" _null_ show_all_settings _null_ _null_ _null_ ));
  DESCR("SHOW ALL as a function");
+ DATA(insert OID = 3206 (  pg_show_all_hba_settings  PGNSP PGUID 12 1 1000 0 0 f f f f t t s 0 0 2249 "" "{25,1009,1009,25,25,25,25,25,23}" "{o,o,o,o,o,o,o,o,o}" "{connection_type,databases,roles,socket_address,socket_mask,compare_method,hostname,authmethod,linenumber}" _null_ show_all_hba_settings _null_ _null_ _null_ ));
+ DESCR("SHOW ALL HBA settings as a function");
  DATA(insert OID = 1371 (  pg_lock_status   PGNSP PGUID 12 1 1000 0 0 f f f f t t v 0 0 2249 "" "{25,26,26,23,21,25,28,26,26,21,25,23,25,16,16}" "{o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{locktype,database,relation,page,tuple,virtualxid,transactionid,classid,objid,objsubid,virtualtransaction,pid,mode,granted,fastpath}" _null_ pg_lock_status _null_ _null_ _null_ ));
  DESCR("view system lock information");
  DATA(insert OID = 1065 (  pg_prepared_xact PGNSP PGUID 12 1 1000 0 0 f f f f t t v 0 0 2249 "" "{28,25,1184,26,26}" "{o,o,o,o,o}" "{transaction,gid,prepared,ownerid,dbid}" _null_ pg_prepared_xact _null_ _null_ _null_ ));
diff -crN git/src/include/libpq/hba.h Git_code/postgresql/src/include/libpq/hba.h
*** git/src/include/libpq/hba.h	Fri Mar 14 14:06:43 2014
--- Git_code/postgresql/src/include/libpq/hba.h	Fri Mar 14 15:29:07 2014
***************
*** 104,108 ****
  			  const char *pg_role, const char *auth_user,
  			  bool case_sensitive);
  extern bool pg_isblank(const char c);
! 
  #endif   /* HBA_H */
--- 104,109 ----
  			  const char *pg_role, const char *auth_user,
  			  bool case_sensitive);
  extern bool pg_isblank(const char c);
! extern void GetHbaLineByNum(int linenum,const char **values);
! extern int GetNumHbaLines(void);
  #endif   /* HBA_H */
diff -crN git/doc/src/sgml/catalogs.sgml Git_code/postgresql/doc/src/sgml/catalogs.sgml
*** git/doc/src/sgml/catalogs.sgml	Fri Mar 14 14:08:03 2014
--- Git_code/postgresql/doc/src/sgml/catalogs.sgml	Fri Mar 14 15:30:19 2014
***************
*** 7202,7207 ****
--- 7202,7212 ----
        <entry>views</entry>
       </row>
  
+      <row>
+       <entry><link linkend="view-pg-hba-settings"><structname>pg_hba_settings</structname></link></entry>
+       <entry>client authentication settings</entry>
+      </row>
+ 
      </tbody>
     </tgroup>
    </table>
***************
*** 9394,9397 ****
--- 9399,9479 ----
  
   </sect1>
  
+  <sect1 id="view-pg-hba-settings">
+   <title><structname>pg_hba_settings</structname></title>
+ 
+   <indexterm zone="view-pg-hba-settings">
+    <primary>pg_hba_settings</primary>
+   </indexterm>
+ 
+   <para>
+    The view <structname>pg_hba_settings</structname> provides access to
+    useful information about authentication details of Postgresql cluster.
+    For security reasons, access to this view is limited only to superusers. No update, insert or delete operations are allowed in this view. 
+   </para>
+ 
+   <table>
+    <title><structname>pg_hba_settings</> Columns</title>
+ 
+    <tgroup cols="3">
+     <thead>
+      <row>
+       <entry>Name</entry>
+       <entry>Type</entry>
+       <entry>Description</entry>
+      </row>
+     </thead>
+     <tbody>
+      <row>
+       <entry><structfield>connection_type</structfield></entry>
+       <entry><type>text</type></entry>
+       <entry>Type of connection</entry>
+      </row>
+      <row>
+       <entry><structfield>databases</structfield></entry>
+       <entry><type>text[]</type></entry>
+       <entry>List of database names</entry>
+      </row>
+      <row>
+       <entry><structfield>roles</structfield></entry>
+       <entry><type>text[]</type></entry>
+       <entry>List of user names</entry>
+      </row>
+      <row>
+       <entry><structfield>socket_address</structfield></entry>
+       <entry><type>text</type></entry>
+       <entry>Client machine address</entry>
+      </row>
+      <row>
+       <entry><structfield>socket_mask</structfield></entry>
+       <entry><type>text</type></entry>
+       <entry>IP Mask</entry>
+      </row>
+      <row>
+       <entry><structfield>compare_method</structfield></entry>
+       <entry><type>text</type></entry>
+       <entry>IP address comparision method</entry>
+      </row>
+      <row>
+       <entry><structfield>hostname</structfield></entry>
+       <entry><type>text</type></entry>
+       <entry>Client host name</entry>
+      </row>
+      <row>
+       <entry><structfield>authmethod</structfield></entry>
+       <entry><type>text</type></entry>
+       <entry>Authentication method</entry>
+      </row>
+      <row>
+       <entry><structfield>linenumber</structfield></entry>
+       <entry><type>integer</type></entry>
+       <entry>
+        Line number within client authentication configuration file 
+        the current value was set at
+       </entry>
+      </row>
+     </tbody>
+    </tgroup>
+   </table>
+  </sect1>
  </chapter>
diff -crN git/doc/src/sgml/client-auth.sgml Git_code/postgresql/doc/src/sgml/client-auth.sgml
*** git/doc/src/sgml/client-auth.sgml	Fri Mar 14 14:08:03 2014
--- Git_code/postgresql/doc/src/sgml/client-auth.sgml	Tue Mar 11 10:00:23 2014
***************
*** 675,680 ****
--- 675,685 ----
  local   db1,db2,@demodbs  all                                   md5
  </programlisting>
     </example>
+ 
+    <para>
+     Details of this file can be accessed from pg_hba_settings view. 
+     See <xref linkend="view-pg-hba-settings"> for details.
+    </para>
   </sect1>
  
   <sect1 id="auth-username-maps">
