obsd44-pass1-20090123
[openafs.git] / src / afs / OBSD / osi_misc.c
index 138f8e0..4449ca4 100644 (file)
@@ -51,6 +51,8 @@ RCSID
 
 #include "afs/sysincludes.h"   /* Standard vendor system headers */
 #include "afs/afsincludes.h"   /* Afs-based standard headers */
+#include <sys/types.h>
+#include <sys/malloc.h>
 
 /*
  * afs_suser() returns true if the caller is superuser, false otherwise.
@@ -67,23 +69,101 @@ RCSID
 int
 afs_osi_suser(void *credp)
 {
+#ifdef AFS_OBSD35_ENV
+    return (suser_ucred((struct ucred *)credp) ? 0 : 1);
+#else
     return (suser((struct ucred *)credp, &curproc->p_acflag) ? 0 : 1);
+#endif
 }
 
+/*
+ * reworked for netbsd and openbsd at 4.0/4.4
+ */
+
+#if defined(AFS_OBSD42_ENV)
+/* ripped out MALLOC/FREE */
+
 void *
-afs_nbsd_Alloc(size_t asize)
+osi_obsd_Alloc(size_t asize, int cansleep)
 {
-    void *p;
+  void *p;
+  int glocked;
+
+  if (cansleep) {
+    glocked = ISAFS_GLOCK();
+    if (glocked)
+      AFS_GUNLOCK();
+    p = malloc(asize, M_AFSGENERIC, M_WAITOK);
+    if (glocked)
+      AFS_GLOCK();
+  } else {
+    p = malloc(asize, M_AFSGENERIC, M_NOWAIT);
+  }
+
+  return (p);
+}
 
+void
+osi_obsd_Free(void *p, size_t asize)
+{
+  free(p, M_AFSGENERIC);
+}
+
+#else
+void *
+osi_obsd_Alloc(size_t asize, int cansleep)
+{
+  void *p;
+  int glocked;
+
+  if (cansleep) {
+    glocked = ISAFS_GLOCK();
+    if (glocked)
+      AFS_GUNLOCK();
     MALLOC(p, void *, asize, M_AFSGENERIC, M_WAITOK);
-    return p;
+    if (glocked)
+      AFS_GLOCK();
+  } else {
+    MALLOC(p, void *, asize, M_AFSGENERIC, M_NOWAIT);
+  }
+
+  return (p);
 }
 
 void
-afs_nbsd_Free(void *p, size_t asize)
+osi_obsd_Free(void *p, size_t asize)
+{
+  FREE(p, M_AFSGENERIC);
+}
+#endif
+
+#if 0 /* XXX */
+/* I speculate this usage may be more correct than definitions
+ * in afs_osi_alloc.c, which I discarded successfully for FreeBSD 7+,
+ * and am trying to discard for NetBSD 4.x, but until tested, I'm
+ * not rocking the boat.  Matt.
+ */
+   
+void
+osi_FreeLargeSpace(void *p)
+{
+  osi_obsd_Free(p, 0);
+}
+
+void
+osi_FreeSmallSpace(void *p)
+{
+  osi_obsd_Free(p, 0);
+}
+
+void *
+osi_AllocLargeSpace(size_t size)
 {
-    FREE(p, M_AFSGENERIC);
+  AFS_ASSERT_GLOCK();
+  AFS_STATCNT(osi_AllocLargeSpace);
+  return (osi_obsd_Alloc(size, 1));
 }
+#endif
 
 int
 afs_syscall_icreate(dev, near_inode, param1, param2, param3, param4, retval)