introduce-linux-ia64-port-20010806
[openafs.git] / src / afs / afs_call.c
index 1bf7858..d17dd8a 100644 (file)
@@ -7,7 +7,11 @@
  * directory or online at http://www.openafs.org/dl/license10.html
  */
 
-#include "../afs/param.h"      /* Should be always first */
+#include <afsconfig.h>
+#include "../afs/param.h"
+
+RCSID("$Header$");
+
 #include "../afs/sysincludes.h"        /* Standard vendor system headers */
 #include "../afs/afsincludes.h"        /* Afs-based standard headers */
 #include "../afs/afs_stats.h"
@@ -42,7 +46,8 @@ char afs_rootVolumeName[64]="";
 struct afs_icl_set *afs_iclSetp = (struct afs_icl_set*)0;
 struct afs_icl_set *afs_iclLongTermSetp = (struct afs_icl_set*)0;
 
-#if    defined(AFS_GLOBAL_SUNLOCK) && !defined(AFS_HPUX_ENV) && !defined(AFS_AIX41_ENV) && !defined(AFS_OSF_ENV) && !defined(AFS_LINUX22_ENV)
+#if    defined(AFS_GLOBAL_SUNLOCK) && !defined(AFS_HPUX_ENV) && !defined(AFS_AIX41_ENV) && !defined(AFS_OSF_ENV) && !defined(AFS_LINUX22_ENV) && !defined(AFS_DARWIN_ENV) && !defined(AFS_FBSD_ENV)
+
 kmutex_t afs_global_lock;
 kmutex_t afs_rxglobal_lock;
 
@@ -53,6 +58,12 @@ long afs_global_owner;
 
 #if defined(AFS_OSF_ENV)
 simple_lock_data_t afs_global_lock;
+#elif defined(AFS_DARWIN_ENV)
+struct lock__bsd__ afs_global_lock;
+#elif defined(AFS_FBSD_ENV)
+struct simplelock afs_global_lock;
+#endif
+#if defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
 thread_t afs_global_owner;
 #endif /* AFS_OSF_ENV */
 
@@ -127,7 +138,7 @@ long parm, parm2, parm3, parm4, parm5, parm6;
     if (!afs_suser() && (parm != AFSOP_GETMTU)
        && (parm != AFSOP_GETMASK)) {
       /* only root can run this code */
-#if !defined(AFS_SGI_ENV) && !defined(AFS_OSF_ENV) && !defined(AFS_LINUX20_ENV)
+#if !defined(AFS_SGI_ENV) && !defined(AFS_OSF_ENV) && !defined(AFS_LINUX20_ENV) && !defined(AFS_DARWIN_ENV) && !defined(AFS_FBSD_ENV)
        setuerror(EACCES);
        return(EACCES);
 #else
@@ -197,7 +208,7 @@ long parm, parm2, parm3, parm4, parm5, parm6;
        while (afs_initState < AFSOP_START_AFS) 
            afs_osi_Sleep(&afs_initState);
 
-#if defined(AFS_SUN_ENV) || defined(AFS_SGI_ENV) || defined(AFS_HPUX_ENV) || defined(AFS_LINUX20_ENV)
+#if defined(AFS_SUN_ENV) || defined(AFS_SGI_ENV) || defined(AFS_HPUX_ENV) || defined(AFS_LINUX20_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
        temp = AFS_MINBUFFERS;  /* Should fix this soon */
 #else
        temp = ((afs_bufferpages * NBPG)>>11);  /* number of 2k buffers we could get from all of the buffer space */
@@ -279,14 +290,14 @@ long parm, parm2, parm3, parm4, parm5, parm6;
                AFS_COPYIN((char *)parm3, tcell.cellName, parm4, code);
                if (!code) 
                    afs_NewCell(tcell.cellName, tcell.hosts, parm5,
-                               (char *)0, (u_short)0, (u_short)0);
+                               (char *)0, (u_short)0, (u_short)0, (int)0);
            }
        }
     } else if (parm == AFSOP_ADDCELL2) {
        struct afsop_cell tcell;
        char *tbuffer = osi_AllocSmallSpace(AFS_SMALLOCSIZ), *lcnamep = 0;
        char *tbuffer1 = osi_AllocSmallSpace(AFS_SMALLOCSIZ), *cnamep = 0;
-#if defined(AFS_SGI61_ENV) || defined(AFS_SUN57_ENV)
+#if defined(AFS_SGI61_ENV) || defined(AFS_SUN57_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
        size_t bufferSize;      
 #else /* AFS_SGI61_ENV */
        u_int bufferSize;       
@@ -309,7 +320,7 @@ long parm, parm2, parm3, parm4, parm5, parm6;
                }
                if (!code)
                    afs_NewCell(tbuffer1, tcell.hosts, cflags, 
-                               lcnamep, (u_short)0, (u_short)0);
+                               lcnamep, (u_short)0, (u_short)0, (int)0);
            }
        }
        osi_FreeSmallSpace(tbuffer);
@@ -324,7 +335,7 @@ long parm, parm2, parm3, parm4, parm5, parm6;
        while (afs_initState < AFSOP_START_BKG) afs_osi_Sleep(&afs_initState);
        AFS_COPYIN((char *)parm2, (caddr_t) &cparms, sizeof(cparms), code);
        if (code) {
-#if    defined(AFS_SUN5_ENV) || defined(AFS_OSF_ENV) || defined (AFS_SGI64_ENV) || defined(AFS_LINUX20_ENV)
+#if    defined(AFS_SUN5_ENV) || defined(AFS_OSF_ENV) || defined (AFS_SGI64_ENV) || defined(AFS_LINUX20_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
            goto out;
 #else
            setuerror(code);
@@ -370,7 +381,7 @@ long parm, parm2, parm3, parm4, parm5, parm6;
        code = afs_InitCacheFile((char *) 0, ainode);
     }
     else if (parm == AFSOP_ROOTVOLUME) {
-#if defined(AFS_SGI61_ENV) || defined(AFS_SUN57_ENV)
+#if defined(AFS_SGI61_ENV) || defined(AFS_SUN57_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
        size_t bufferSize;
 #else /* AFS_SGI61_ENV */
        u_int bufferSize;
@@ -388,7 +399,7 @@ long parm, parm2, parm3, parm4, parm5, parm6;
     else if (parm == AFSOP_CACHEFILE || parm == AFSOP_CACHEINFO ||
              parm == AFSOP_VOLUMEINFO || parm == AFSOP_AFSLOG) {
        char *tbuffer = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
-#if defined(AFS_SGI61_ENV) || defined(AFS_SUN57_ENV)
+#if defined(AFS_SGI61_ENV) || defined(AFS_SUN57_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
        size_t bufferSize;
 #else /* AFS_SGI61_ENV */
        u_int bufferSize;
@@ -496,7 +507,7 @@ long parm, parm2, parm3, parm4, parm5, parm6;
 #endif /* AFS_SGI62_ENV && !AFS_SGI65_ENV */
 #endif /* AFS_SGI53_ENV */
     else if (parm == AFSOP_SHUTDOWN) {
-#if    defined(AFS_OSF_ENV)
+#if    defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
        extern struct mount *afs_globalVFS;
 #else  /* AFS_OSF_ENV */
        extern struct vfs *afs_globalVFS;
@@ -519,7 +530,7 @@ long parm, parm2, parm3, parm4, parm5, parm6;
       afs_vfs_mount(parm2, parm3, parm4, parm5);
 #endif /* AFS_HPUX100_ENV */
 #else /* defined(AFS_HPUX_ENV) */
-#if defined(AFS_SGI_ENV) || defined(AFS_SUN5_ENV) || defined(AFS_OSF_ENV) || defined(AFS_LINUX20_ENV)
+#if defined(AFS_SGI_ENV) || defined(AFS_SUN5_ENV) || defined(AFS_OSF_ENV) || defined(AFS_LINUX20_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
       code = EINVAL;
 #else
       setuerror(EINVAL);
@@ -590,7 +601,22 @@ long parm, parm2, parm3, parm4, parm5, parm6;
 #endif /* !AFS_SUN5_ENV */
       if (!code) 
         AFS_COPYOUT ((caddr_t)&mask, (caddr_t)parm3, sizeof(afs_int32), code);
-  } else
+    }
+#ifdef AFS_AFSDB_ENV
+    else if (parm == AFSOP_AFSDB_HANDLER) {
+       int sizeArg = (int)parm4;
+       int kmsgLen = sizeArg & 0xffff;
+       int cellLen = (sizeArg & 0xffff0000) >> 16;
+       afs_int32 *kmsg = afs_osi_Alloc(kmsgLen);
+       char *cellname = afs_osi_Alloc(cellLen);
+       AFS_COPYIN((afs_int32 *)parm3, kmsg, kmsgLen, code);
+       if (!code) code = afs_AfsdbHandler(cellname, cellLen, kmsg);
+       if (!code) AFS_COPYOUT(cellname, (char *)parm2, cellLen, code);
+       afs_osi_Free(kmsg, kmsgLen);
+       afs_osi_Free(cellname, cellLen);
+    }
+#endif
+    else
       code = EINVAL;
 
 out:
@@ -816,10 +842,12 @@ copyin_iparam(caddr_t cmarg, struct iparam *dst)
        }
 #endif /* AFS_SUN57_64BIT_ENV */
 
-#if defined(AFS_LINUX_64BIT_KERNEL) && !defined(AFS_ALPHA_LINUX20_ENV)
+#if defined(AFS_LINUX_64BIT_KERNEL) && !defined(AFS_ALPHA_LINUX20_ENV) && !defined(AFS_IA64_LINUX20_ENV)
        struct iparam32 dst32;
 
-#ifdef AFS_SPARC64_LINUX20_ENV
+#ifdef AFS_SPARC64_LINUX24_ENV
+       if (current->thread.flags & SPARC_FLAG_32BIT) 
+#elif AFS_SPARC64_LINUX20_ENV
        if (current->tss.flags & SPARC_FLAG_32BIT) 
 #else
 #error Not done for this linux version
@@ -873,7 +901,7 @@ Afs_syscall (uap, rvp)
 {
     int *retval = &rvp->r_val1;
 #else /* AFS_SUN5_ENV */
-#if    defined(AFS_OSF_ENV)
+#if    defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
 afs3_syscall(p, args, retval)
        struct proc *p;
        void *args;
@@ -1011,7 +1039,7 @@ Afs_syscall ()
        mutex_exit(&procp->p_crlock);
 #else
        AFS_GLOCK();
-#if    defined(AFS_OSF_ENV)
+#if    defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
        code = afs_setpag(p, args, retval);
 #else  /* AFS_OSF_ENV */
        code = afs_setpag();
@@ -1023,15 +1051,19 @@ Afs_syscall ()
 #ifdef AFS_SUN5_ENV
         code = afs_syscall_pioctl(uap->parm1, uap->parm2, uap->parm3, uap->parm4, rvp, CRED());
 #else
+#if defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
+        code = afs_syscall_pioctl(uap->parm1, uap->parm2, uap->parm3, uap->parm4, p->p_cred->pc_ucred);
+#else
        code = afs_syscall_pioctl(uap->parm1, uap->parm2, uap->parm3, uap->parm4);
 #endif
+#endif
        AFS_GUNLOCK();
     } else if (uap->syscall == AFSCALL_ICREATE) {
        struct iparam iparams;
 
        code = copyin_iparam((char *)uap->parm3, &iparams);
        if (code) {
-#if !defined(AFS_SUN5_ENV) && !defined(AFS_OSF_ENV) && !defined(AFS_LINUX20_ENV)
+#if !defined(AFS_SUN5_ENV) && !defined(AFS_OSF_ENV) && !defined(AFS_LINUX20_ENV) && !defined(AFS_DARWIN_ENV) && !defined(AFS_FBSD_ENV)
            setuerror(code);
 #endif
        } else
@@ -1040,7 +1072,7 @@ Afs_syscall ()
                                   iparams.param3, iparams.param4, rvp, CRED());
 #else
        code =  afs_syscall_icreate(uap->parm1, uap->parm2, iparams.param1, iparams.param2,
-#ifdef AFS_OSF_ENV
+#if defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
                                   iparams.param3, iparams.param4, retval);
 #else
                                   iparams.param3, iparams.param4);
@@ -1050,7 +1082,7 @@ Afs_syscall ()
 #ifdef AFS_SUN5_ENV
        code = afs_syscall_iopen(uap->parm1, uap->parm2, uap->parm3, rvp, CRED());
 #else
-#ifdef AFS_OSF_ENV
+#if defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
        code = afs_syscall_iopen(uap->parm1, uap->parm2, uap->parm3, retval);
 #else
        code = afs_syscall_iopen(uap->parm1, uap->parm2, uap->parm3);
@@ -1079,13 +1111,13 @@ Afs_syscall ()
        }
 #else
         if (code) {
-#if !defined(AFS_SUN5_ENV) && !defined(AFS_OSF_ENV)
+#if !defined(AFS_SUN5_ENV) && !defined(AFS_OSF_ENV) && !defined(AFS_DARWIN_ENV) && !defined(AFS_FBSD_ENV)
            setuerror(code);
 #endif
         }
 #endif /* !AFS_LINUX20_ENV */
     } else {
-#if defined(AFS_SUN5_ENV) || defined(AFS_OSF_ENV) || defined(AFS_LINUX20_ENV)
+#if defined(AFS_SUN5_ENV) || defined(AFS_OSF_ENV) || defined(AFS_LINUX20_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
        code = EINVAL;
 #else
         setuerror(EINVAL);
@@ -1277,7 +1309,7 @@ Afscall_icl(long opcode, long p1, long p2, long p3, long p4, long *retval)
     register afs_int32 code;
     struct afs_icl_log *logp;
     struct afs_icl_set *setp;
-#if defined(AFS_SGI61_ENV) || defined(AFS_SUN57_ENV)
+#if defined(AFS_SGI61_ENV) || defined(AFS_SUN57_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
     size_t temp;
 #else /* AFS_SGI61_ENV */
     afs_uint32 temp;
@@ -1293,7 +1325,7 @@ Afscall_icl(long opcode, long p1, long p2, long p3, long p4, long *retval)
     }
 #else
     if (!afs_suser()) {        /* only root can run this code */
-#if !defined(AFS_SGI_ENV) && !defined(AFS_OSF_ENV) && !defined(AFS_LINUX20_ENV)
+#if !defined(AFS_SGI_ENV) && !defined(AFS_OSF_ENV) && !defined(AFS_LINUX20_ENV) && !defined(AFS_DARWIN_ENV) && !defined(AFS_FBSD_ENV)
        setuerror(EACCES);
        return EACCES;
 #else