*/
int
+#ifdef AFS_DARWIN100_ENV
+copyin_afs_ioctl(user_addr_t cmarg, struct afs_ioctl *dst)
+#else
copyin_afs_ioctl(caddr_t cmarg, struct afs_ioctl *dst)
+#endif
{
int code;
#if defined(AFS_DARWIN100_ENV)
#else /* AFS_SGI_ENV */
struct iparam {
- long param1;
- long param2;
- long param3;
- long param4;
+ iparmtype param1;
+ iparmtype param2;
+ iparmtype param3;
+ iparmtype param4;
};
struct iparam32 {
/*
* If you need to change copyin_iparam(), you may also need to change
* copyin_afs_ioctl().
+ *
+ * This function is needed only for icreate, meaning, only on platforms
+ * providing the inode fileserver.
*/
static int
{
int code;
-#if defined(AFS_DARWIN100_ENV)
- struct iparam32 dst32;
-
- if (!proc_is64bit(current_proc())) {
- AFS_COPYIN(cmarg, (caddr_t) & dst32, sizeof dst32, code);
- if (!code)
- iparam32_to_iparam(&dst32, dst);
- return code;
- }
-#endif
#if defined(AFS_HPUX_64BIT_ENV)
struct iparam32 dst32;
{
int *retval = &rvp->r_val1;
#else /* AFS_SUN5_ENV */
-#if defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
+#ifdef AFS_DARWIN100_ENV
+struct afssysa {
+ afs_int32 syscall;
+ afs_int32 parm1;
+ afs_int32 parm2;
+ afs_int32 parm3;
+ afs_int32 parm4;
+ afs_int32 parm5;
+ afs_int32 parm6;
+};
+struct afssysa64 {
+ afs_int64 parm1;
+ afs_int64 parm2;
+ afs_int64 parm3;
+ afs_int64 parm4;
+ afs_int64 parm5;
+ afs_int64 parm6;
+ afs_int32 syscall;
+};
+int
+afs3_syscall(struct proc *p, void *args, unsigned int *retval)
+{
+ struct afssysa64 *uap64 = NULL;
+ struct afssysa *uap = NULL;
+#elif defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
int
afs3_syscall(p, args, retval)
#ifdef AFS_FBSD50_ENV
#if defined(AFS_DARWIN80_ENV)
get_vfs_context();
osi_Assert(*retval == 0);
+#ifdef AFS_DARWIN100_ENV
+ if (proc_is64bit(p)) {
+ uap64 = (struct afssysa64 *)args;
+ if (uap64->syscall == AFSCALL_CALL) {
+ code =
+ afs_syscall64_call(uap64->parm1, uap64->parm2, uap64->parm3,
+ uap64->parm4, uap64->parm5, uap64->parm6);
+ } else if (uap64->syscall == AFSCALL_SETPAG) {
+ AFS_GLOCK();
+ code = afs_setpag(p, args, retval);
+ AFS_GUNLOCK();
+ } else if (uap64->syscall == AFSCALL_PIOCTL) {
+ AFS_GLOCK();
+ code =
+ afs_syscall64_pioctl(uap64->parm1, (unsigned int)uap64->parm2,
+ uap64->parm3, (int)uap64->parm4,
+ kauth_cred_get());
+ AFS_GUNLOCK();
+ } else if (uap64->syscall == AFSCALL_ICL) {
+ AFS_GLOCK();
+ code =
+ Afscall64_icl(uap64->parm1, uap64->parm2, uap64->parm3,
+ uap64->parm4, uap64->parm5, retval);
+ AFS_GUNLOCK();
+ } else
+ code = EINVAL;
+ if (uap64->syscall != AFSCALL_CALL)
+ put_vfs_context();
+ } else { /* and the default case for 32 bit procs */
+#endif
+ uap = (struct afssysa *)args;
#endif
#if defined(AFS_HPUX_ENV)
/*
* duplication to handle the case of a dynamically loaded kernel
* module?
*/
- osi_InitGlock();
+ osi_InitGlock();
#endif
- if (uap->syscall == AFSCALL_CALL) {
- code =
- afs_syscall_call(uap->parm1, uap->parm2, uap->parm3, uap->parm4,
- uap->parm5, uap->parm6);
- } else if (uap->syscall == AFSCALL_SETPAG) {
+ if (uap->syscall == AFSCALL_CALL) {
+ code =
+ afs_syscall_call(uap->parm1, uap->parm2, uap->parm3,
+ uap->parm4, uap->parm5, uap->parm6);
+ } else if (uap->syscall == AFSCALL_SETPAG) {
#ifdef AFS_SUN5_ENV
- register proc_t *procp;
+ register proc_t *procp;
- procp = ttoproc(curthread);
- AFS_GLOCK();
- code = afs_setpag(&procp->p_cred);
- AFS_GUNLOCK();
+ procp = ttoproc(curthread);
+ AFS_GLOCK();
+ code = afs_setpag(&procp->p_cred);
+ AFS_GUNLOCK();
#else
- AFS_GLOCK();
+ AFS_GLOCK();
#if defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
- code = afs_setpag(p, args, retval);
+ code = afs_setpag(p, args, retval);
#else /* AFS_OSF_ENV */
- code = afs_setpag();
+ code = afs_setpag();
#endif
- AFS_GUNLOCK();
+ AFS_GUNLOCK();
#endif
- } else if (uap->syscall == AFSCALL_PIOCTL) {
- AFS_GLOCK();
+ } else if (uap->syscall == AFSCALL_PIOCTL) {
+ AFS_GLOCK();
#if defined(AFS_SUN5_ENV)
- code =
- afs_syscall_pioctl(uap->parm1, uap->parm2, uap->parm3, uap->parm4,
- rvp, CRED());
+ code =
+ afs_syscall_pioctl(uap->parm1, uap->parm2, uap->parm3,
+ uap->parm4, rvp, CRED());
#elif defined(AFS_FBSD50_ENV)
- code =
- afs_syscall_pioctl(uap->parm1, uap->parm2, uap->parm3, uap->parm4,
- p->td_ucred);
+ code =
+ afs_syscall_pioctl(uap->parm1, uap->parm2, uap->parm3,
+ uap->parm4, p->td_ucred);
#elif defined(AFS_DARWIN80_ENV)
- code =
- afs_syscall_pioctl(uap->parm1, uap->parm2, uap->parm3, uap->parm4,
- kauth_cred_get());
+ code =
+ afs_syscall_pioctl(uap->parm1, uap->parm2, uap->parm3,
+ uap->parm4, kauth_cred_get());
#elif defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
- code =
- afs_syscall_pioctl(uap->parm1, uap->parm2, uap->parm3, uap->parm4,
- p->p_cred->pc_ucred);
+ code =
+ afs_syscall_pioctl(uap->parm1, uap->parm2, uap->parm3,
+ uap->parm4, p->p_cred->pc_ucred);
#else
- code =
- afs_syscall_pioctl((char *)uap->parm1, (unsigned int)uap->parm2, (caddr_t)uap->parm3,
- (int) uap->parm4);
+ code =
+ afs_syscall_pioctl((char *)uap->parm1,
+ (unsigned int)uap->parm2,
+ (caddr_t)uap->parm3,
+ (int) uap->parm4);
#endif
- AFS_GUNLOCK();
- } else if (uap->syscall == AFSCALL_ICREATE) {
- struct iparam iparams;
+ AFS_GUNLOCK();
+ } else if (uap->syscall == AFSCALL_ICREATE) {
+ struct iparam iparams;
- code = copyin_iparam((char *)uap->parm3, &iparams);
- if (code) {
+ code = copyin_iparam((char *)uap->parm3, &iparams);
+ if (code) {
#if defined(KERNEL_HAVE_UERROR)
- setuerror(code);
+ setuerror(code);
#endif
- } else
+ } else {
#ifdef AFS_SUN5_ENV
- code =
- afs_syscall_icreate(uap->parm1, uap->parm2, iparams.param1,
- iparams.param2, iparams.param3,
- iparams.param4, rvp, CRED());
+ code =
+ afs_syscall_icreate(uap->parm1, uap->parm2, iparams.param1,
+ iparams.param2, iparams.param3,
+ iparams.param4, rvp, CRED());
#else
- code =
- afs_syscall_icreate(uap->parm1, uap->parm2, iparams.param1,
- iparams.param2,
+ code =
+ afs_syscall_icreate(uap->parm1, uap->parm2, iparams.param1,
+ iparams.param2, iparams.param3,
+ iparams.param4
#if defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
- iparams.param3, iparams.param4, retval);
-#else
- iparams.param3, iparams.param4);
+ , retval
#endif
+ );
#endif /* AFS_SUN5_ENV */
- } else if (uap->syscall == AFSCALL_IOPEN) {
+ }
+ } else if (uap->syscall == AFSCALL_IOPEN) {
#ifdef AFS_SUN5_ENV
- code =
- afs_syscall_iopen(uap->parm1, uap->parm2, uap->parm3, rvp,
- CRED());
+ code =
+ afs_syscall_iopen(uap->parm1, uap->parm2, uap->parm3, rvp,
+ CRED());
#else
+ code = afs_syscall_iopen(uap->parm1, uap->parm2, uap->parm3
#if defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
- code = afs_syscall_iopen(uap->parm1, uap->parm2, uap->parm3, retval);
-#else
- code = afs_syscall_iopen(uap->parm1, uap->parm2, uap->parm3);
+ , retval
#endif
+ );
#endif /* AFS_SUN5_ENV */
- } else if (uap->syscall == AFSCALL_IDEC) {
+ } else if (uap->syscall == AFSCALL_IDEC) {
+ code =
+ afs_syscall_iincdec(uap->parm1, uap->parm2, uap->parm3, -1
#ifdef AFS_SUN5_ENV
- code =
- afs_syscall_iincdec(uap->parm1, uap->parm2, uap->parm3, -1, rvp,
- CRED());
-#else
- code = afs_syscall_iincdec(uap->parm1, uap->parm2, uap->parm3, -1);
-#endif /* AFS_SUN5_ENV */
- } else if (uap->syscall == AFSCALL_IINC) {
+ , rvp, CRED()
+#endif
+ );
+ } else if (uap->syscall == AFSCALL_IINC) {
+ code =
+ afs_syscall_iincdec(uap->parm1, uap->parm2, uap->parm3, 1
#ifdef AFS_SUN5_ENV
- code =
- afs_syscall_iincdec(uap->parm1, uap->parm2, uap->parm3, 1, rvp,
- CRED());
-#else
- code = afs_syscall_iincdec(uap->parm1, uap->parm2, uap->parm3, 1);
-#endif /* AFS_SUN5_ENV */
- } else if (uap->syscall == AFSCALL_ICL) {
- AFS_GLOCK();
- code =
- Afscall_icl(uap->parm1, uap->parm2, uap->parm3, uap->parm4,
- uap->parm5, retval);
- AFS_GUNLOCK();
+ , rvp, CRED()
+#endif
+ );
+ } else if (uap->syscall == AFSCALL_ICL) {
+ AFS_GLOCK();
+ code =
+ Afscall_icl(uap->parm1, uap->parm2, uap->parm3, uap->parm4,
+ uap->parm5, retval);
+ AFS_GUNLOCK();
#ifdef AFS_LINUX20_ENV
- if (!code) {
- /* ICL commands can return values. */
- code = -linux_ret; /* Gets negated again at exit below */
- }
+ if (!code) {
+ /* ICL commands can return values. */
+ code = -linux_ret; /* Gets negated again at exit below */
+ }
#else
- if (code) {
+ if (code) {
#if defined(KERNEL_HAVE_UERROR)
- setuerror(code);
+ setuerror(code);
#endif
- }
+ }
#endif /* !AFS_LINUX20_ENV */
- } else {
+ } else {
#if defined(KERNEL_HAVE_UERROR)
- setuerror(EINVAL);
+ setuerror(EINVAL);
#else
- code = EINVAL;
+ code = EINVAL;
#endif
- }
-
+ }
#if defined(AFS_DARWIN80_ENV)
- if (uap->syscall != AFSCALL_CALL)
- put_vfs_context();
+ if (uap->syscall != AFSCALL_CALL)
+ put_vfs_context();
+#ifdef AFS_DARWIN100_ENV
+ } /* 32 bit procs */
+#endif
#endif
#ifdef AFS_LINUX20_ENV
code = -code;
return code;
}
#endif /* AFS_SGI_ENV */
-#endif /* !AFS_AIX32_ENV */
+#endif /* !AFS_AIX32_ENV */