summaryrefslogtreecommitdiff
path: root/kerberosIV/kafs
diff options
context:
space:
mode:
authorArtur Grabowski <art@cvs.openbsd.org>1998-09-18 00:58:27 +0000
committerArtur Grabowski <art@cvs.openbsd.org>1998-09-18 00:58:27 +0000
commit19bfd1a38ad5615ab78dc0cffbd66ef30a2ad6f6 (patch)
tree95568ca0da80aa312e514fe5a0511703ee3a1253 /kerberosIV/kafs
parent79d559dab5b932e64d9ac6e116285ddbad5c633f (diff)
use xfspioctl (nicer, cleaner, better)
Diffstat (limited to 'kerberosIV/kafs')
-rw-r--r--kerberosIV/kafs/afssys.c152
1 files changed, 9 insertions, 143 deletions
diff --git a/kerberosIV/kafs/afssys.c b/kerberosIV/kafs/afssys.c
index e34e65584c3..a4ad5c9e754 100644
--- a/kerberosIV/kafs/afssys.c
+++ b/kerberosIV/kafs/afssys.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: afssys.c,v 1.5 1998/08/12 23:49:02 art Exp $ */
+/* $OpenBSD: afssys.c,v 1.6 1998/09/18 00:58:26 art Exp $ */
/* $KTH: afssys.c,v 1.57 1998/05/09 17:19:03 joda Exp $ */
/*
@@ -43,53 +43,26 @@
int _kafs_debug;
-#define NO_ENTRY_POINT 0
-#define SINGLE_ENTRY_POINT 1
-#define MULTIPLE_ENTRY_POINT 2
-#define SINGLE_ENTRY_POINT2 3
-#define SINGLE_ENTRY_POINT3 4
-#define AIX_ENTRY_POINTS 5
-#define UNKNOWN_ENTRY_POINT 6
-static int afs_entry_point = UNKNOWN_ENTRY_POINT;
-static int afs_syscalls[2];
-
-
int
k_pioctl(char *a_path,
int o_opcode,
struct ViceIoctl *a_paramsP,
int a_followSymlinks)
{
-#ifndef NO_AFS
- switch(afs_entry_point){
-#if defined(AFS_SYSCALL) || defined(AFS_SYSCALL2) || defined(AFS_SYSCALL3)
- case SINGLE_ENTRY_POINT:
- case SINGLE_ENTRY_POINT2:
- case SINGLE_ENTRY_POINT3:
- return syscall(afs_syscalls[0], AFSCALL_PIOCTL,
- a_path, o_opcode, a_paramsP, a_followSymlinks);
-#endif
-#if defined(AFS_PIOCTL)
- case MULTIPLE_ENTRY_POINT:
- return syscall(afs_syscalls[0],
- a_path, o_opcode, a_paramsP, a_followSymlinks);
-#endif
- }
-
- errno = ENOSYS;
- kill(getpid(), SIGSYS); /* You loose! */
-#endif /* NO_AFS */
- return -1;
+ return xfspioctl(AFSCALL_PIOCTL, a_path, o_opcode, a_paramsP,
+ a_followSymlinks);
}
int
k_afs_cell_of_file(const char *path, char *cell, int len)
{
struct ViceIoctl parms;
+
parms.in = NULL;
parms.in_size = 0;
parms.out = cell;
parms.out_size = len;
+
return k_pioctl((char*)path, VIOC_FILE_CELL_NAME, &parms, 1);
}
@@ -97,127 +70,20 @@ int
k_unlog(void)
{
struct ViceIoctl parms;
+
memset(&parms, 0, sizeof(parms));
+
return k_pioctl(0, VIOCUNLOG, &parms, 0);
}
int
k_setpag(void)
{
-#ifndef NO_AFS
- switch(afs_entry_point){
-#if defined(AFS_SYSCALL) || defined(AFS_SYSCALL2) || defined(AFS_SYSCALL3)
- case SINGLE_ENTRY_POINT:
- case SINGLE_ENTRY_POINT2:
- case SINGLE_ENTRY_POINT3:
- return syscall(afs_syscalls[0], AFSCALL_SETPAG);
-#endif
-#if defined(AFS_PIOCTL)
- case MULTIPLE_ENTRY_POINT:
- return syscall(afs_syscalls[1]);
-#endif
- }
-
- errno = ENOSYS;
- kill(getpid(), SIGSYS); /* You loose! */
-#endif /* NO_AFS */
- return -1;
-}
-
-static jmp_buf catch_SIGSYS;
-
-void
-SIGSYS_handler(int sig)
-{
- errno = 0;
- longjmp(catch_SIGSYS, 1);
+ return xfspioctl(AFSCALL_SETPAG, NULL, 0, NULL, 0);
}
int
k_hasafs(void)
{
- int saved_errno;
- void (*saved_func)();
- struct ViceIoctl parms;
-
- /*
- * Already checked presence of AFS syscalls?
- */
- if (afs_entry_point != UNKNOWN_ENTRY_POINT)
- return afs_entry_point != NO_ENTRY_POINT;
-
- /*
- * Probe kernel for AFS specific syscalls,
- * they (currently) come in two flavors.
- * If the syscall is absent we recive a SIGSYS.
- */
- afs_entry_point = NO_ENTRY_POINT;
- memset(&parms, 0, sizeof(parms));
-
- saved_errno = errno;
-#ifndef NO_AFS
- saved_func = signal(SIGSYS, SIGSYS_handler);
-
-#ifdef AFS_SYSCALL
- if (setjmp(catch_SIGSYS) == 0)
- {
- syscall(AFS_SYSCALL, AFSCALL_PIOCTL,
- 0, VIOCSETTOK, &parms, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
- if (errno == EINVAL)
- {
- afs_entry_point = SINGLE_ENTRY_POINT;
- afs_syscalls[0] = AFS_SYSCALL;
- goto done;
- }
- }
-#endif /* AFS_SYSCALL */
-
-#ifdef AFS_PIOCTL
- if (setjmp(catch_SIGSYS) == 0)
- {
- syscall(AFS_PIOCTL,
- 0, VIOCSETTOK, &parms, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
- if (errno == EINVAL)
- {
- afs_entry_point = MULTIPLE_ENTRY_POINT;
- afs_syscalls[0] = AFS_PIOCTL;
- afs_syscalls[1] = AFS_SETPAG;
- goto done;
- }
- }
-#endif /* AFS_PIOCTL */
-
-#ifdef AFS_SYSCALL2
- if (setjmp(catch_SIGSYS) == 0)
- {
- syscall(AFS_SYSCALL2, AFSCALL_PIOCTL,
- 0, VIOCSETTOK, &parms, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
- if (errno == EINVAL)
- {
- afs_entry_point = SINGLE_ENTRY_POINT2;
- afs_syscalls[0] = AFS_SYSCALL2;
- goto done;
- }
- }
-#endif /* AFS_SYSCALL */
-
-#ifdef AFS_SYSCALL3
- if (setjmp(catch_SIGSYS) == 0)
- {
- syscall(AFS_SYSCALL3, AFSCALL_PIOCTL,
- 0, VIOCSETTOK, &parms, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
- if (errno == EINVAL)
- {
- afs_entry_point = SINGLE_ENTRY_POINT3;
- afs_syscalls[0] = AFS_SYSCALL3;
- goto done;
- }
- }
-#endif /* AFS_SYSCALL */
-
-done:
- signal(SIGSYS, saved_func);
-#endif /* NO_AFS */
- errno = saved_errno;
- return afs_entry_point != NO_ENTRY_POINT;
+ return xfspioctl(AFSCALL_PROBE, NULL, 0, NULL, 0) == 1;
}