macos104-not-yet-20050511
[openafs.git] / src / afs / DARWIN / osi_misc.c
index 5036090..c776154 100644 (file)
  * directory or online at http://www.openafs.org/dl/license10.html
  */
 
-#include "../afs/param.h"
 #include <afsconfig.h>
+#include "afs/param.h"
 
-RCSID("$Header$");
+RCSID
+    ("$Header$");
 
-#include "../afs/sysincludes.h"
-#include "../afs/afsincludes.h"
+#include "afs/sysincludes.h"
+#include "afsincludes.h"
 #include <sys/namei.h>
 
-int osi_lookupname(char *aname, enum uio_seg seg, int followlink,
-                         struct vnode **dirvpp, struct vnode **vpp)
+#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)
 {
-   struct nameidata n;
-   int flags,error;
-   flags=0;
-   flags=LOCKLEAF;
-   if (followlink)
-     flags|=FOLLOW;
-   else 
-     flags|=NOFOLLOW;
-/*   if (dirvpp) flags|=WANTPARENT;*/ /* XXX LOCKPARENT? */
-   NDINIT(&n, LOOKUP, flags, seg, aname, current_proc());
-   if (error=namei(&n))
-      return error;
-   *vpp=n.ni_vp;
-/*
-   if (dirvpp)
-      *dirvpp = n.ni_dvp;
-#/
+    struct nameidata n;
+    int flags, error;
+    flags = 0;
+    flags = LOCKLEAF;
+    if (followlink)
+       flags |= FOLLOW;
+    else
+       flags |= NOFOLLOW;
+    NDINIT(&n, LOOKUP, flags, seg, aname, current_proc());
+    if (error = namei(&n))
+       return error;
+    *vpp = n.ni_vp;
    /* should we do this? */
-   VOP_UNLOCK(n.ni_vp, 0, current_proc());
-   return 0;
+    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.
  */
-
-afs_suser() {
+int
+afs_suser(void *credp)
+{
     int error;
-    struct proc *p=current_proc();
+    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 (1);
     }
-    return(0);
+    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