Commit 9e23ab9b authored by Tom Lane's avatar Tom Lane

Add configure test to make sure fcntl(SETLK) is available,

and make backend/libpq/pqcomm.c only try to lock the socket file when
the call exists.  Also, change open-RDONLY to open-WRONLY; at least
on my platform, you can't get a write lock on a file you didn't open
for writing.
parent 16c6545d
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/libpq/pqcomm.c,v 1.54 1998/09/10 04:07:59 vadim Exp $ * $Header: /cvsroot/pgsql/src/backend/libpq/pqcomm.c,v 1.55 1998/10/06 02:31:39 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -560,7 +560,8 @@ StreamServerPort(char *hostName, short portName, int *fdP) ...@@ -560,7 +560,8 @@ StreamServerPort(char *hostName, short portName, int *fdP)
* If the socket exists but nobody has an advisory lock on it we * If the socket exists but nobody has an advisory lock on it we
* can safely delete the file. * can safely delete the file.
*/ */
if ((lock_fd = open(sock_path, O_RDONLY | O_NONBLOCK, 0666)) >= 0) #ifdef HAVE_FCNTL_SETLK
if ((lock_fd = open(sock_path, O_WRONLY | O_NONBLOCK, 0666)) >= 0)
{ {
struct flock lck; struct flock lck;
...@@ -575,6 +576,7 @@ StreamServerPort(char *hostName, short portName, int *fdP) ...@@ -575,6 +576,7 @@ StreamServerPort(char *hostName, short portName, int *fdP)
TPRINTF(TRACE_VERBOSE, "flock failed for %s", sock_path); TPRINTF(TRACE_VERBOSE, "flock failed for %s", sock_path);
close(lock_fd); close(lock_fd);
} }
#endif /* HAVE_FCNTL_SETLK */
} }
else else
{ {
...@@ -609,7 +611,8 @@ StreamServerPort(char *hostName, short portName, int *fdP) ...@@ -609,7 +611,8 @@ StreamServerPort(char *hostName, short portName, int *fdP)
* Open the socket file and get an advisory lock on it. The * Open the socket file and get an advisory lock on it. The
* lock_fd is left open to keep the lock. * lock_fd is left open to keep the lock.
*/ */
if ((lock_fd = open(sock_path, O_RDONLY | O_NONBLOCK, 0666)) >= 0) #ifdef HAVE_FCNTL_SETLK
if ((lock_fd = open(sock_path, O_WRONLY | O_NONBLOCK, 0666)) >= 0)
{ {
struct flock lck; struct flock lck;
...@@ -618,6 +621,7 @@ StreamServerPort(char *hostName, short portName, int *fdP) ...@@ -618,6 +621,7 @@ StreamServerPort(char *hostName, short portName, int *fdP)
if (fcntl(lock_fd, F_SETLK, &lck) != 0) if (fcntl(lock_fd, F_SETLK, &lck) != 0)
TPRINTF(TRACE_VERBOSE, "flock error for %s", sock_path); TPRINTF(TRACE_VERBOSE, "flock error for %s", sock_path);
} }
#endif /* HAVE_FCNTL_SETLK */
} }
listen(fd, SOMAXCONN); listen(fd, SOMAXCONN);
......
...@@ -526,6 +526,15 @@ AC_TRY_LINK([#include <sys/types.h> ...@@ -526,6 +526,15 @@ AC_TRY_LINK([#include <sys/types.h>
[AC_DEFINE(HAVE_UNION_SEMUN) AC_MSG_RESULT(yes)], [AC_DEFINE(HAVE_UNION_SEMUN) AC_MSG_RESULT(yes)],
AC_MSG_RESULT(no)) AC_MSG_RESULT(no))
AC_MSG_CHECKING(for fcntl(F_SETLK))
AC_TRY_LINK([#include <fcntl.h>],
[struct flock lck;
lck.l_whence = SEEK_SET; lck.l_start = lck.l_len = 0;
lck.l_type = F_WRLCK;
fcntl(0, F_SETLK, &lck);],
[AC_DEFINE(HAVE_FCNTL_SETLK) AC_MSG_RESULT(yes)],
AC_MSG_RESULT(no))
AC_MSG_CHECKING(for good DBL_MIN) AC_MSG_CHECKING(for good DBL_MIN)
AC_TRY_RUN([#include <stdlib.h> AC_TRY_RUN([#include <stdlib.h>
#include <math.h> #include <math.h>
......
...@@ -207,6 +207,9 @@ extern void srandom(int seed); ...@@ -207,6 +207,9 @@ extern void srandom(int seed);
/* Set to 1 if you have union semun */ /* Set to 1 if you have union semun */
#undef HAVE_UNION_SEMUN #undef HAVE_UNION_SEMUN
/* Set to 1 if you have F_SETLK option for fcntl() */
#undef HAVE_FCNTL_SETLK
/* Set to 1 if you want to USE_LOCALE */ /* Set to 1 if you want to USE_LOCALE */
#undef USE_LOCALE #undef USE_LOCALE
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment