#include <afs/param.h>
#endif
-RCSID
- ("$Header$");
#if defined(UKERNEL)
#include "afs/sysincludes.h"
#include "afs/venus.h"
#include "afs/pthread_glock.h"
#include "afs/dirpath.h"
+#include <ctype.h>
#if !defined(min)
#define min(a,b) ((a)<(b)?(a):(b))
#endif
#endif
#endif
+#ifdef AFS_DARWIN100_ENV
+#include <crt_externs.h>
+#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
-#include "auth.h"
+#include <afs/auth.h>
#include <afs/venus.h>
#include <afs/afsutil.h>
#include <afs/sys_prototypes.h>
#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"
#ifdef AFS_KERBEROS_ENV
#include <fcntl.h>
#include <sys/file.h>
-#include "cellconfig.h"
+#include <afs/cellconfig.h>
static char lcell[MAXCELLCHARS];
#define TKT_ROOT "/tmp/tkt"
}
#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;
return rc;
}
+afs_uint32
+ktc_curpag(void)
+{
+ int code;
+ struct ViceIoctl iob;
+ afs_uint32 pag;
+
+ /* now setup for the pioctl */
+ iob.in = NULL;
+ iob.in_size = 0;
+ iob.out = (caddr_t) &pag;
+ iob.out_size = sizeof(afs_uint32);
+
+ code = PIOCTL(0, VIOC_GETPAG, &iob, 0);
+ if (code < 0) {
+#if defined(AFS_AIX52_ENV)
+ code = getpagvalue("afs");
+ if (code < 0 && errno == EINVAL)
+ code = 0;
+ return code;
+#elif defined(AFS_AIX51_ENV)
+ return -1;
+#else
+ gid_t groups[NGROUPS_MAX];
+ afs_uint32 g0, g1;
+ afs_uint32 h, l, ret;
+ int ngroups;
+ int i;
+
+ ngroups = getgroups(sizeof groups / sizeof groups[0], groups);
+
+#ifdef AFS_LINUX26_ENV
+ /* check for AFS_LINUX26_ONEGROUP_ENV PAGs */
+ for (i = 0; i < ngroups; i++) {
+ if (((groups[i] >> 24) & 0xff) == 'A') {
+ return groups[i];
+ }
+ }
+#endif
+
+ if (ngroups < 2)
+ return 0;
+
+ g0 = groups[0] & 0xffff;
+ g1 = groups[1] & 0xffff;
+ g0 -= 0x3f00;
+ g1 -= 0x3f00;
+ if (g0 < 0xc000 && g1 < 0xc000) {
+ l = ((g0 & 0x3fff) << 14) | (g1 & 0x3fff);
+ h = (g0 >> 14);
+ h = (g1 >> 14) + h + h + h;
+ ret = ((h << 28) | l);
+ /* Additional testing */
+ if (((ret >> 24) & 0xff) == 'A')
+ return ret;
+ else
+ return -1;
+ }
+ return -1;
+#endif
+ }
+ return pag;
+}
+
#ifdef AFS_KERBEROS_ENV
/*
return 0;
}
-afs_uint32
-ktc_curpag(void)
-{
- int code;
- struct ViceIoctl iob;
- afs_int32 pag;
-
- /* now setup for the pioctl */
- iob.in = NULL;
- iob.in_size = 0;
- iob.out = &pag;
- iob.out_size = sizeof(afs_int32);
-
- code = PIOCTL(0, VIOC_GETPAG, &iob, 0);
- if (code < 0) {
-#if defined(AFS_AIX52_ENV)
- code = getpagvalue("afs");
- if (code < 0 && errno == EINVAL)
- code = 0;
- return code;
-#elif defined(AFS_AIX51_ENV)
- return -1;
-#else
- gid_t groups[NGROUPS_MAX];
- afs_uint32 g0, g1;
- afs_uint32 h, l, ret;
-
- if (getgroups(sizeof groups / sizeof groups[0], groups) < 2)
- return 0;
-
- g0 = groups[0] & 0xffff;
- g1 = groups[1] & 0xffff;
- g0 -= 0x3f00;
- g1 -= 0x3f00;
- if (g0 < 0xc000 && g1 < 0xc000) {
- l = ((g0 & 0x3fff) << 14) | (g1 & 0x3fff);
- h = (g0 >> 14);
- h = (g1 >> 14) + h + h + h;
- ret = ((h << 28) | l);
- /* Additional testing */
- if (((ret >> 24) & 0xff) == 'A')
- return ret;
- else
- return -1;
- }
- return -1;
-#endif
- }
- return pag;
-}
-
int
ktc_newpag(void)
{
- extern char **environ;
+#ifdef AFS_DARWIN100_ENV
+#define environ (*_NSGetEnviron())
+#else
+extern char **environ;
+#endif
afs_uint32 pag;
struct stat sbuf;
sprintf(fname, "%s%d", prefix, getuid());
sprintf(fname5, "%s%d", prefix5, getuid());
} else {
- sprintf(fname, "%sp%lu", prefix, afs_cast_uint32(pag));
- sprintf(fname5, "%sp%lud", prefix5, (long unsigned int) pag);
+ sprintf(fname, "%sp%lu", prefix, afs_printable_uint32_lu(pag));
+ sprintf(fname5, "%sp%lud", prefix5, afs_printable_uint32_lu(pag));
}
ktc_set_tkt_string(fname);