summaryrefslogtreecommitdiff
path: root/plugin/auth_socket
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/auth_socket')
-rw-r--r--plugin/auth_socket/CMakeLists.txt54
-rw-r--r--plugin/auth_socket/auth_socket.c26
2 files changed, 63 insertions, 17 deletions
diff --git a/plugin/auth_socket/CMakeLists.txt b/plugin/auth_socket/CMakeLists.txt
index 2c5a9c89fcb..5630cac33ce 100644
--- a/plugin/auth_socket/CMakeLists.txt
+++ b/plugin/auth_socket/CMakeLists.txt
@@ -22,21 +22,47 @@ int main() {
getsockopt(0, SOL_SOCKET, SO_PEERCRED, &cred, 0);
}" HAVE_PEERCRED)
-IF (NOT HAVE_PEERCRED)
- # Hi, OpenBSD!
- CHECK_CXX_SOURCE_COMPILES(
- "#include <sys/types.h>
- #include <sys/socket.h>
- int main() {
- struct sockpeercred cred;
- getsockopt(0, SOL_SOCKET, SO_PEERCRED, &cred, 0);
- }" HAVE_SOCKPEERCRED)
- ADD_DEFINITIONS(-Ducred=sockpeercred)
-ENDIF()
+IF (HAVE_PEERCRED)
+ ADD_DEFINITIONS(-DHAVE_PEERCRED)
+ SET(ok 1)
+ELSE()
+
+# Hi, OpenBSD!
+CHECK_CXX_SOURCE_COMPILES(
+"#include <sys/types.h>
+#include <sys/socket.h>
+int main() {
+ struct sockpeercred cred;
+ getsockopt(0, SOL_SOCKET, SO_PEERCRED, &cred, 0);
+ }" HAVE_SOCKPEERCRED)
-IF(HAVE_PEERCRED OR HAVE_SOCKPEERCRED)
- SET(AUTH_SOCKET_OK 1)
+IF (HAVE_SOCKPEERCRED)
+ ADD_DEFINITIONS(-DHAVE_SOCKPEERCRED)
+ SET(ok 1)
+ELSE()
+
+# FreeBSD, is that you?
+CHECK_CXX_SOURCE_COMPILES(
+"#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <sys/ucred.h>
+int main() {
+ struct xucred cred;
+ getsockopt(0, 0, LOCAL_PEERCRED, &cred, 0);
+ }" HAVE_XUCRED)
+
+IF (HAVE_XUCRED)
+ ADD_DEFINITIONS(-DHAVE_XUCRED)
+ SET(ok 1)
+ELSE()
+
+# Who else? Anyone?
+# C'mon, show your creativity, be different! ifdef's are fun, aren't they?
+
+ENDIF()
+ENDIF()
ENDIF()
-MYSQL_ADD_PLUGIN(auth_socket auth_socket.c ONLY_IF AUTH_SOCKET_OK MODULE_ONLY)
+MYSQL_ADD_PLUGIN(auth_socket auth_socket.c ONLY_IF ok MODULE_ONLY)
diff --git a/plugin/auth_socket/auth_socket.c b/plugin/auth_socket/auth_socket.c
index 779998395b0..601b76b6b5c 100644
--- a/plugin/auth_socket/auth_socket.c
+++ b/plugin/auth_socket/auth_socket.c
@@ -27,9 +27,29 @@
#define _GNU_SOURCE 1 /* for struct ucred */
#include <mysql/plugin_auth.h>
-#include <sys/socket.h>
-#include <pwd.h>
#include <string.h>
+#include <pwd.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+
+#ifdef HAVE_PEERCRED
+#define level SOL_SOCKET
+
+#elif defined HAVE_SOCKPEERCRED
+#define level SOL_SOCKET
+#define ucred sockpeercred
+
+#elif defined HAVE_XUCRED
+#include <sys/un.h>
+#include <sys/ucred.h>
+#define level 0
+#define SO_PEERCRED LOCAL_PEERCRED
+#define uid cr_uid
+#define ucred xucred
+
+#else
+#error impossible
+#endif
/**
perform the unix socket based authentication
@@ -63,7 +83,7 @@ static int socket_auth(MYSQL_PLUGIN_VIO *vio, MYSQL_SERVER_AUTH_INFO *info)
return CR_ERROR;
/* get the UID of the client process */
- if (getsockopt(vio_info.socket, SOL_SOCKET, SO_PEERCRED, &cred, &cred_len))
+ if (getsockopt(vio_info.socket, level, SO_PEERCRED, &cred, &cred_len))
return CR_ERROR;
if (cred_len != sizeof(cred))