Use find_library to find libpam.0
authorJakub Hrozek <jakub.hrozek@posteo.se>
Thu, 15 Oct 2015 10:14:28 +0000 (12:14 +0200)
committerAndreas Schneider <asn@samba.org>
Thu, 10 Dec 2015 12:31:19 +0000 (13:31 +0100)
ConfigureChecks.cmake
config.h.cmake
src/pam_wrapper.c

index f9a2f5482b086399df168df4971c92b20a4f2520..e26494f0ffb6e198b4c373fbdb46101cd55fbde8 100644 (file)
@@ -44,6 +44,10 @@ check_function_exists(strncpy HAVE_STRNCPY)
 check_function_exists(vsnprintf HAVE_VSNPRINTF)
 check_function_exists(snprintf HAVE_SNPRINTF)
 
+# FUNCTIONS
+find_library(PAM_LIBRARY NAMES libpam.so.0 pam)
+set(PAM_LIBRARY ${PAM_LIBRARY})
+
 # OPTIONS
 
 if (LINUX)
index 462347e9b5ba06885490058418fd689586f36235..921fbbefaf655d45dab7eb19242700e8fbc4bb4c 100644 (file)
@@ -24,6 +24,7 @@
 #cmakedefine HAVE_SETEUID 1
 
 /*************************** LIBRARIES ***************************/
+#cmakedefine PAM_LIBRARY "${PAM_LIBRARY}"
 
 /**************************** OPTIONS ****************************/
 
index 9a5595b60b9fc744d9e025e5be0ab731ab9541c7..1ec4d54200ad60452dd48283d1002b17afa25b2a 100644 (file)
@@ -31,6 +31,7 @@
 #include <fcntl.h>
 #include <unistd.h>
 #include <dlfcn.h>
+#include <libgen.h>
 
 #include <ftw.h>
 
@@ -143,7 +144,7 @@ static void pwrap_log(enum pwrap_dbglvl_e dbglvl,
  * LIBC
  *****************/
 
-#define LIBPAM_NAME "libpam.so"
+#define LIBPAM_NAME "libpam.so.0"
 
 typedef int (*__libpam_pam_start)(const char *service_name,
                                  const char *user,
@@ -276,8 +277,8 @@ static void *pwrap_load_lib_handle(enum pwrap_lib lib)
 
                        snprintf(libpam_path,
                                 sizeof(libpam_path),
-                                "%s/libpam.so",
-                                pwrap.config_dir);
+                                "%s/%s",
+                                pwrap.config_dir, LIBPAM_NAME);
 
                        handle = dlopen(libpam_path, flags);
                        if (handle != NULL) {
@@ -652,7 +653,6 @@ static void pwrap_init(void)
        const char *env;
        uint32_t i;
        int rc;
-       const char *suffix = "";
        char pam_library[128] = { 0 };
        char pam_path[1024] = { 0 };
        ssize_t ret;
@@ -725,16 +725,8 @@ static void pwrap_init(void)
                exit(1);
        }
 
-       /* copy libpam.so */
-       if (sizeof(void *) == 8) {
-               suffix = "64";
-       }
-
-       snprintf(pam_path,
-                sizeof(pam_path),
-                "/usr/lib%s/%s",
-                suffix,
-                LIBPAM_NAME);
+       /* copy libpam.so.0 */
+       snprintf(pam_path, sizeof(pam_path), "%s", PAM_LIBRARY);
        PWRAP_LOG(PWRAP_LOG_TRACE,
                  "PAM path: %s",
                  pam_path);
@@ -754,12 +746,25 @@ static void pwrap_init(void)
                         "%s",
                         pam_library);
        } else {
+               char pam_path_cp[sizeof(pam_path)];
+               char *dname;
+
+               strncpy(pam_path_cp, pam_path, sizeof(pam_path_cp));
+
+               dname = dirname(pam_path_cp);
+               if (dname == NULL) {
+                       PWRAP_LOG(PWRAP_LOG_ERROR,
+                                 "No directory component in %s", pam_path);
+                       exit(1);
+               }
+
                snprintf(pam_path,
                         sizeof(pam_path),
-                        "/usr/lib%s/%s",
-                        suffix,
+                        "%s/%s",
+                        dname,
                         pam_library);
        }
+       PWRAP_LOG(PWRAP_LOG_TRACE, "Reconstructed PAM path: %s", pam_path);
 
        PWRAP_LOG(PWRAP_LOG_DEBUG, "Copy %s to %s", pam_path, pwrap.pam_library);
        rc = p_copy(pam_path, pwrap.pam_library, pwrap.config_dir, 0644);