]> git.sur5r.net Git - openldap/commitdiff
Support Solaris 10's getpeerucred(3) (*** blind commit ***)
authorKurt Zeilenga <kurt@openldap.org>
Wed, 23 Nov 2005 18:55:31 +0000 (18:55 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Wed, 23 Nov 2005 18:55:31 +0000 (18:55 +0000)
configure
configure.in
include/portable.hin
libraries/libldap/os-local.c
libraries/liblutil/getpeereid.c

index 49abe542c9a7af8871d095ea8dcbed89df2a371d..d997035721a2d49531a83cf405b9830730352c0d 100755 (executable)
--- a/configure
+++ b/configure
@@ -43408,8 +43408,112 @@ done
 if test "$ac_cv_func_getopt" != yes; then
        LIBSRCS="$LIBSRCS getopt.c"
 fi
+
 if test "$ac_cv_func_getpeereid" != yes; then
-       echo "$as_me:$LINENO: checking for struct msghdr.msg_accrightslen" >&5
+
+for ac_func in getpeerucred
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+       if test "$ac_cv_func_getpeerucred" != yes ; then
+               echo "$as_me:$LINENO: checking for struct msghdr.msg_accrightslen" >&5
 echo $ECHO_N "checking for struct msghdr.msg_accrightslen... $ECHO_C" >&6
 if test "${ac_cv_member_struct_msghdr_msg_accrightslen+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -43527,8 +43631,8 @@ _ACEOF
 
 fi
 
-       if test "$ac_cv_member_struct_msghdr_msg_accrightslen" != yes; then
-               echo "$as_me:$LINENO: checking for struct msghdr.msg_control" >&5
+               if test "$ac_cv_member_struct_msghdr_msg_accrightslen" != yes; then
+                       echo "$as_me:$LINENO: checking for struct msghdr.msg_control" >&5
 echo $ECHO_N "checking for struct msghdr.msg_control... $ECHO_C" >&6
 if test "${ac_cv_member_struct_msghdr_msg_control+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -43646,9 +43750,11 @@ _ACEOF
 
 fi
 
+               fi
        fi
        LIBSRCS="$LIBSRCS getpeereid.c"
 fi
+
 if test "$ac_cv_func_snprintf" != yes ||
    test "$ac_cv_func_vsnprintf" != yes; then
        if test "$ac_cv_func_snprintf" != yes; then
index 47415c0a00f8593c4c921d02a9e1aadde1708bea..3e0c90949cef060c0919c552cab11d781a832391 100644 (file)
@@ -2585,21 +2585,26 @@ AC_REPLACE_FUNCS(getopt getpeereid)
 if test "$ac_cv_func_getopt" != yes; then
        LIBSRCS="$LIBSRCS getopt.c"
 fi
+
 if test "$ac_cv_func_getpeereid" != yes; then
-       AC_CHECK_MEMBERS([struct msghdr.msg_accrightslen],,,
-               [$ac_includes_default
+       AC_CHECK_FUNCS( getpeerucred )
+       if test "$ac_cv_func_getpeerucred" != yes ; then
+               AC_CHECK_MEMBERS([struct msghdr.msg_accrightslen],,,
+                       [$ac_includes_default
 #ifdef HAVE_SYS_SOCKET_H
 #include <sys/socket.h>
 #endif])
-       if test "$ac_cv_member_struct_msghdr_msg_accrightslen" != yes; then
-               AC_CHECK_MEMBERS([struct msghdr.msg_control],,,
-                       [$ac_includes_default
+               if test "$ac_cv_member_struct_msghdr_msg_accrightslen" != yes; then
+                       AC_CHECK_MEMBERS([struct msghdr.msg_control],,,
+                               [$ac_includes_default
 #ifdef HAVE_SYS_SOCKET_H
 #include <sys/socket.h>
 #endif])
+               fi
        fi
        LIBSRCS="$LIBSRCS getpeereid.c"
 fi
+
 if test "$ac_cv_func_snprintf" != yes ||
    test "$ac_cv_func_vsnprintf" != yes; then
        if test "$ac_cv_func_snprintf" != yes; then
index 5c8455ed8eadfb6300d86d75b9c3a0892592e934..7a66d3a100d1da3baab44c98100157872d36c8cc 100644 (file)
 /* Define to 1 if you have the `getpeereid' function. */
 #undef HAVE_GETPEEREID
 
+/* Define to 1 if you have the `getpeerucred' function. */
+#undef HAVE_GETPEERUCRED
+
 /* Define to 1 if you have the `getpwnam' function. */
 #undef HAVE_GETPWNAM
 
index 20c167c74ca4007ec88bc63f2747be5e22656324..bf4f6890c8a72a77518000d6e37f9db9e39cbdb2 100644 (file)
@@ -155,6 +155,7 @@ ldap_pvt_is_socket_ready(LDAP *ld, int s)
 #undef TRACE
 
 #if !defined(HAVE_GETPEEREID) && \
+       !defined(HAVE_GETPEERUCRED) && \
        !defined(SO_PEERCRED) && !defined(LOCAL_PEERCRED) && \
        defined(HAVE_SENDMSG) && (defined(HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTSLEN) || \
                defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL))
index c4b84a646d180d99aaa823b5d9d0bec6c3195d67..1b2f6523cfd146507711b07de54e0ae267a6ff55 100644 (file)
 #include <ac/socket.h>
 #include <ac/errno.h>
 
-#if HAVE_SYS_UCRED_H
-#if HAVE_GRP_H
+#ifdef HAVE_GETPEERUCRED
+#include <ucred.h>
+#endif
+
+#ifdef HAVE_SYS_UCRED_H
+#ifdef HAVE_GRP_H
 #include <grp.h>       /* for NGROUPS on Tru64 5.1 */
 #endif
 #include <sys/ucred.h>
 int getpeereid( int s, uid_t *euid, gid_t *egid )
 {
 #ifdef LDAP_PF_LOCAL
-#if defined( SO_PEERCRED )
+#if defined ( HAVE_GETPEERUCRED )
+       ucred_t *uc = NULL;
+       if( getpeerucred( s, &uc ) == 0 )  {
+               *euid = ucred_geteuid( uc );
+               *egid = ucred_getegid( uc );
+               ucred_free( uc );
+       }
+
+#elif defined( SO_PEERCRED )
        struct ucred peercred;
        socklen_t peercredlen = sizeof peercred;