diff options
author | Artur Grabowski <art@cvs.openbsd.org> | 1998-09-18 00:58:27 +0000 |
---|---|---|
committer | Artur Grabowski <art@cvs.openbsd.org> | 1998-09-18 00:58:27 +0000 |
commit | 19bfd1a38ad5615ab78dc0cffbd66ef30a2ad6f6 (patch) | |
tree | 95568ca0da80aa312e514fe5a0511703ee3a1253 /kerberosIV/kafs | |
parent | 79d559dab5b932e64d9ac6e116285ddbad5c633f (diff) |
use xfspioctl (nicer, cleaner, better)
Diffstat (limited to 'kerberosIV/kafs')
-rw-r--r-- | kerberosIV/kafs/afssys.c | 152 |
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; } |