macos104-not-yet-20050511
[openafs.git] / src / afs / DARWIN / osi_misc.c
index 701b091..c776154 100644 (file)
@@ -17,6 +17,29 @@ RCSID
 #include "afsincludes.h"
 #include <sys/namei.h>
 
+#ifdef AFS_DARWIN80_ENV
+int
+osi_lookupname(char *aname, enum uio_seg seg, int followlink,
+              struct vnode **vpp) {
+  vfs_context_t ctx;
+  char tname[PATHBUFLEN];
+  int len, code, flags;
+
+  if (seg == AFS_UIOUSER) { /* XXX 64bit */
+     AFS_COPYINSTR(aname, tname, PATHBUFLEN, code);
+     if (code)
+       return code;
+     aname=tname;
+  }
+  flags = 0
+  if (!followlink)
+       flag |= VNODE_LOOKUP_NOFOLLOW;
+  ctx=vfs_context_create(NULL);
+  code = vnode_lookup(aname, flags, vpp, ctx);
+  vfs_context_rele(ctx);
+  return code;
+}
+#else
 int
 osi_lookupname(char *aname, enum uio_seg seg, int followlink,
               struct vnode **vpp)
@@ -37,20 +60,50 @@ osi_lookupname(char *aname, enum uio_seg seg, int followlink,
     VOP_UNLOCK(n.ni_vp, 0, current_proc());
     return 0;
 }
+#endif
 
 /*
  * afs_suser() returns true if the caller is superuser, false otherwise.
  *
  * Note that it must NOT set errno.
  */
-
+int
 afs_suser(void *credp)
 {
     int error;
     struct proc *p = current_proc();
 
+#if AFS_DARWIN80_ENV
+    return proc_suser(p);
+#else
     if ((error = suser(p->p_ucred, &p->p_acflag)) == 0) {
        return (1);
     }
     return (0);
+#endif
+}
+
+#ifdef AFS_DARWIN80_ENV
+uio_t afsio_darwin_partialcopy(uio_t auio, int size) {
+   uio_t res;
+   int index;
+   user_addr_t iovaddr;
+   user_size_r iovsize;
+
+   /* XXX 64 bit userspaace? */
+   res = uio_create(uio_iovcnt(auio), uio_offset(auio),
+                    uio_isuserspace(auio) ? UIO_USERSPACE32 : UIO_SYSSPACE32,
+                    uio_rw(auio));
+
+   for (i = 0;i < uio_iovcnt(auio) && size > 0;i++) {
+       if (uio_getiov(auio, index, &iovaddr, &iovsize))
+           break;
+       if (iovsize > size)
+          iovsize = size;
+       if (uio_addiov(res, iovaddr, iovsize))
+          break;
+       size -= iovsize;
+   }
+   return res;
 }
+#endif