21
21
#include <ctype.h>
22
22
#include <time.h>
23
23
#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
30
24
31
25
#include "libpq-fe.h"
32
26
#include "libpq-int.h"
@@ -1859,89 +1853,33 @@ PQconnectPoll(PGconn *conn)
1859
1853
char * startpacket ;
1860
1854
int packetlen ;
1861
1855
1856
+ #ifdef HAVE_UNIX_SOCKETS
1862
1857
/*
1863
1858
* Implement requirepeer check, if requested and it's a
1864
1859
* Unix-domain socket.
1865
1860
*/
1866
1861
if (conn -> requirepeer && conn -> requirepeer [0 ] &&
1867
1862
IS_AF_UNIX (conn -> raddr .addr .ss_family ))
1868
1863
{
1869
- #if defined(HAVE_GETPEEREID ) || defined(SO_PEERCRED ) || defined(LOCAL_PEERCRED ) || defined(HAVE_GETPEERUCRED )
1870
1864
char pwdbuf [BUFSIZ ];
1871
1865
struct passwd pass_buf ;
1872
1866
struct passwd * pass ;
1873
1867
uid_t uid ;
1874
-
1875
- #if defined(HAVE_GETPEEREID )
1876
- /* Most BSDen, including OS X: use getpeereid() */
1877
1868
gid_t gid ;
1878
1869
1879
1870
errno = 0 ;
1880
1871
if (getpeereid (conn -> sock , & uid , & gid ) != 0 )
1881
1872
{
1882
- appendPQExpBuffer (& conn -> errorMessage ,
1883
- libpq_gettext ("could not get peer credentials: %s\n" ),
1884
- pqStrerror (errno , sebuf , sizeof (sebuf )));
1885
- goto error_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
- goto error_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
- goto error_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
- goto error_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 )));
1939
1881
goto error_return ;
1940
1882
}
1941
- ucred_free (ucred );
1942
- #else
1943
- #error missing implementation method for requirepeer
1944
- #endif
1945
1883
1946
1884
pqGetpwuid (uid , & pass_buf , pwdbuf , sizeof (pwdbuf ), & pass );
1947
1885
@@ -1960,12 +1898,8 @@ PQconnectPoll(PGconn *conn)
1960
1898
conn -> requirepeer , pass -> pw_name );
1961
1899
goto error_return ;
1962
1900
}
1963
- #else /* can't support requirepeer */
1964
- appendPQExpBuffer (& conn -> errorMessage ,
1965
- libpq_gettext ("requirepeer parameter is not supported on this platform\n" ));
1966
- goto error_return ;
1967
- #endif
1968
1901
}
1902
+ #endif /* HAVE_UNIX_SOCKETS */
1969
1903
1970
1904
#ifdef USE_SSL
1971
1905
0 commit comments