2121#include <ctype.h>
2222#include <time.h>
2323#include <unistd.h>
24- #ifdef HAVE_UCRED_H
25- #include <ucred.h>
26- #endif
27- #ifdef HAVE_SYS_UCRED_H
28- #include <sys/ucred.h>
29- #endif
3024
3125#include "libpq-fe.h"
3226#include "libpq-int.h"
@@ -1859,89 +1853,33 @@ PQconnectPoll(PGconn *conn)
18591853char * startpacket ;
18601854int packetlen ;
18611855
1856+ #ifdef HAVE_UNIX_SOCKETS
18621857/*
18631858 * Implement requirepeer check, if requested and it's a
18641859 * Unix-domain socket.
18651860 */
18661861if (conn -> requirepeer && conn -> requirepeer [0 ]&&
18671862IS_AF_UNIX (conn -> raddr .addr .ss_family ))
18681863{
1869- #if defined(HAVE_GETPEEREID )|| defined(SO_PEERCRED )|| defined(LOCAL_PEERCRED )|| defined(HAVE_GETPEERUCRED )
18701864char pwdbuf [BUFSIZ ];
18711865struct passwd pass_buf ;
18721866struct passwd * pass ;
18731867uid_t uid ;
1874-
1875- #if defined(HAVE_GETPEEREID )
1876- /* Most BSDen, including OS X: use getpeereid() */
18771868gid_t gid ;
18781869
18791870errno = 0 ;
18801871if (getpeereid (conn -> sock ,& uid ,& gid )!= 0 )
18811872{
1882- appendPQExpBuffer (& conn -> errorMessage ,
1883- libpq_gettext ("could not get peer credentials: %s\n" ),
1884- pqStrerror (errno ,sebuf ,sizeof (sebuf )));
1885- gotoerror_return ;
1886- }
1887- #elif defined(SO_PEERCRED )
1888- /* Linux: use getsockopt(SO_PEERCRED) */
1889- struct ucred peercred ;
1890- ACCEPT_TYPE_ARG3 so_len = sizeof (peercred );
1891-
1892- errno = 0 ;
1893- if (getsockopt (conn -> sock ,SOL_SOCKET ,SO_PEERCRED ,
1894- & peercred ,& so_len )!= 0 ||
1895- so_len != sizeof (peercred ))
1896- {
1897- appendPQExpBuffer (& conn -> errorMessage ,
1898- libpq_gettext ("could not get peer credentials: %s\n" ),
1899- pqStrerror (errno ,sebuf ,sizeof (sebuf )));
1900- gotoerror_return ;
1901- }
1902- uid = peercred .uid ;
1903- #elif defined(LOCAL_PEERCRED )
1904- /* Debian with FreeBSD kernel: use LOCAL_PEERCRED */
1905- struct xucred peercred ;
1906- ACCEPT_TYPE_ARG3 so_len = sizeof (peercred );
1907-
1908- errno = 0 ;
1909- if (getsockopt (conn -> sock ,0 ,LOCAL_PEERCRED ,
1910- & peercred ,& so_len )!= 0 ||
1911- so_len != sizeof (peercred )||
1912- peercred .cr_version != XUCRED_VERSION )
1913- {
1914- appendPQExpBuffer (& conn -> errorMessage ,
1915- libpq_gettext ("could not get peer credentials: %s\n" ),
1916- pqStrerror (errno ,sebuf ,sizeof (sebuf )));
1917- gotoerror_return ;
1918- }
1919- uid = peercred .cr_uid ;
1920- #elif defined(HAVE_GETPEERUCRED )
1921- /* Solaris: use getpeerucred() */
1922- ucred_t * ucred ;
1923-
1924- ucred = NULL ;/* must be initialized to NULL */
1925- if (getpeerucred (conn -> sock ,& ucred )== -1 )
1926- {
1927- appendPQExpBuffer (& conn -> errorMessage ,
1928- libpq_gettext ("could not get peer credentials: %s\n" ),
1929- pqStrerror (errno ,sebuf ,sizeof (sebuf )));
1930- gotoerror_return ;
1931- }
1932-
1933- if ((uid = ucred_geteuid (ucred ))== -1 )
1934- {
1935- appendPQExpBuffer (& conn -> errorMessage ,
1936- libpq_gettext ("could not get effective UID from peer credentials: %s\n" ),
1937- pqStrerror (errno ,sebuf ,sizeof (sebuf )));
1938- ucred_free (ucred );
1873+ /* Provide special error message if getpeereid is a stub */
1874+ if (errno == ENOSYS )
1875+ appendPQExpBuffer (& conn -> errorMessage ,
1876+ libpq_gettext ("requirepeer parameter is not supported on this platform\n" ));
1877+ else
1878+ appendPQExpBuffer (& conn -> errorMessage ,
1879+ libpq_gettext ("could not get peer credentials: %s\n" ),
1880+ pqStrerror (errno ,sebuf ,sizeof (sebuf )));
19391881gotoerror_return ;
19401882}
1941- ucred_free (ucred );
1942- #else
1943- #error missing implementation method for requirepeer
1944- #endif
19451883
19461884pqGetpwuid (uid ,& pass_buf ,pwdbuf ,sizeof (pwdbuf ),& pass );
19471885
@@ -1960,12 +1898,8 @@ PQconnectPoll(PGconn *conn)
19601898conn -> requirepeer ,pass -> pw_name );
19611899gotoerror_return ;
19621900}
1963- #else /* can't support requirepeer */
1964- appendPQExpBuffer (& conn -> errorMessage ,
1965- libpq_gettext ("requirepeer parameter is not supported on this platform\n" ));
1966- gotoerror_return ;
1967- #endif
19681901}
1902+ #endif /* HAVE_UNIX_SOCKETS */
19691903
19701904#ifdef USE_SSL
19711905