LINUX_KERNEL_HLIST_UNHASHED
LINUX_KEY_TYPE_H_EXISTS
LINUX_EXPORTS_KEY_TYPE_KEYRING
+ LINUX_KEYS_HAVE_SESSION_TO_PARENT
LINUX_NEED_RHCONFIG
LINUX_RECALC_SIGPENDING_ARG_TYPE
LINUX_SCHED_STRUCT_TASK_STRUCT_HAS_PARENT
#endif /* defined(UKERNEL) */
+#if defined(LINUX_KEYRING_SUPPORT) && defined(HAVE_SESSION_TO_PARENT)
+#include <sys/syscall.h>
+#define KEYCTL_SESSION_TO_PARENT 18
+#endif
+
/* For malloc() */
#include <stdlib.h>
#include "ktc.h"
}
#else /* NO_AFS_CLIENT */
code = PIOCTL(0, VIOCSETTOK, &iob, 0);
+#if defined(LINUX_KEYRING_SUPPORT) && defined(HAVE_SESSION_TO_PARENT)
+ /*
+ * If we're using keyring based PAGs and the SESSION_TO_PARENT keyctl
+ * is available, use it to copy the session keyring to the parent process
+ */
+ if (flags & AFS_SETTOK_SETPAG)
+ syscall(SYS_keyctl, KEYCTL_SESSION_TO_PARENT);
+#endif
#endif /* NO_AFS_CLIENT */
if (code)
return KTC_PIOCTLFAIL;
AC_DEFINE([EXPORTED_KEY_TYPE_KEYRING], 1, [define if key_type_keyring is exported])
fi])
+AC_DEFUN([LINUX_KEYS_HAVE_SESSION_TO_PARENT], [
+ AC_MSG_CHECKING([for KEYCTL_SESSION_TO_PARENT])
+ AC_CACHE_VAL([ac_cv_linux_have_session_to_parent], [
+ AC_TRY_KBUILD(
+[ #include <linux/keyctl.h>],
+[ int i = KEYCTL_SESSION_TO_PARENT;],
+ ac_cv_linux_have_session_to_parent=yes,
+ ac_cv_linux_have_session_to_parent=no)])
+ AC_MSG_RESULT($ac_cv_linux_have_session_to_parent)
+ if test "x$ac_cv_linux_have_session_to_parent" = "xyes"; then
+ AC_DEFINE([HAVE_SESSION_TO_PARENT], 1, [define if keyctl has the KEYCTL_SESSION_TO_PARENT function])
+ fi])