home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 4 / hacker04 / 04_HACK04.ISO / darwin / darwinx86.iso / usr / include / miscfs / union / union.h
Encoding:
C/C++ Source or Header  |  2001-09-30  |  6.2 KB  |  152 lines

  1. /*
  2.  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
  3.  *
  4.  * @APPLE_LICENSE_HEADER_START@
  5.  * 
  6.  * The contents of this file constitute Original Code as defined in and
  7.  * are subject to the Apple Public Source License Version 1.1 (the
  8.  * "License").  You may not use this file except in compliance with the
  9.  * License.  Please obtain a copy of the License at
  10.  * http://www.apple.com/publicsource and read it before using this file.
  11.  * 
  12.  * This Original Code and all software distributed under the License are
  13.  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  14.  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  15.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
  16.  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
  17.  * License for the specific language governing rights and limitations
  18.  * under the License.
  19.  * 
  20.  * @APPLE_LICENSE_HEADER_END@
  21.  */
  22. /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
  23. /*
  24.  * Copyright (c) 1994 The Regents of the University of California.
  25.  * Copyright (c) 1994 Jan-Simon Pendry.
  26.  * All rights reserved.
  27.  *
  28.  * This code is derived from software donated to Berkeley by
  29.  * Jan-Simon Pendry.
  30.  *
  31.  * Redistribution and use in source and binary forms, with or without
  32.  * modification, are permitted provided that the following conditions
  33.  * are met:
  34.  * 1. Redistributions of source code must retain the above copyright
  35.  *    notice, this list of conditions and the following disclaimer.
  36.  * 2. Redistributions in binary form must reproduce the above copyright
  37.  *    notice, this list of conditions and the following disclaimer in the
  38.  *    documentation and/or other materials provided with the distribution.
  39.  * 3. All advertising materials mentioning features or use of this software
  40.  *    must display the following acknowledgement:
  41.  *    This product includes software developed by the University of
  42.  *    California, Berkeley and its contributors.
  43.  * 4. Neither the name of the University nor the names of its contributors
  44.  *    may be used to endorse or promote products derived from this software
  45.  *    without specific prior written permission.
  46.  *
  47.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  48.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  49.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  50.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  51.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  52.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  53.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  54.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  55.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  56.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  57.  * SUCH DAMAGE.
  58.  *
  59.  *    @(#)union.h    8.9 (Berkeley) 12/10/94
  60.  */
  61.  
  62. struct union_args {
  63.     char        *target;    /* Target of loopback  */
  64.     int        mntflags;    /* Options on the mount */
  65. };
  66.  
  67. #define UNMNT_ABOVE    0x0001        /* Target appears below mount point */
  68. #define UNMNT_BELOW    0x0002        /* Target appears below mount point */
  69. #define UNMNT_REPLACE    0x0003        /* Target replaces mount point */
  70. #define UNMNT_OPMASK    0x0003
  71.  
  72. struct union_mount {
  73.     struct vnode    *um_uppervp;
  74.     struct vnode    *um_lowervp;
  75.     struct ucred    *um_cred;    /* Credentials of user calling mount */
  76.     int        um_cmode;    /* cmask from mount process */
  77.     int        um_op;        /* Operation mode */
  78. };
  79.  
  80. #ifdef KERNEL
  81.  
  82. /*
  83.  * DEFDIRMODE is the mode bits used to create a shadow directory.
  84.  */
  85. #define VRWXMODE (VREAD|VWRITE|VEXEC)
  86. #define VRWMODE (VREAD|VWRITE)
  87. #define UN_DIRMODE ((VRWXMODE)|(VRWXMODE>>3)|(VRWXMODE>>6))
  88. #define UN_FILEMODE ((VRWMODE)|(VRWMODE>>3)|(VRWMODE>>6))
  89.  
  90. /*
  91.  * A cache of vnode references
  92.  */
  93. struct union_node {
  94.     LIST_ENTRY(union_node)    un_cache;    /* Hash chain */
  95.     struct vnode        *un_vnode;    /* Back pointer */
  96.     struct vnode            *un_uppervp;    /* overlaying object */
  97.     struct vnode            *un_lowervp;    /* underlying object */
  98.     struct vnode        *un_dirvp;    /* Parent dir of uppervp */
  99.     struct vnode        *un_pvp;    /* Parent vnode */
  100.     char            *un_path;    /* saved component name */
  101.     int            un_hash;    /* saved un_path hash value */
  102.     int            un_openl;    /* # of opens on lowervp */
  103.     unsigned int        un_flags;
  104.     struct vnode        **un_dircache;    /* cached union stack */
  105.     off_t            un_uppersz;    /* size of upper object */
  106.     off_t            un_lowersz;    /* size of lower object */
  107. #if DIAGNOSTIC
  108.     pid_t            un_pid;
  109. #endif
  110. };
  111.  
  112. #define UN_WANT        0x01
  113. #define UN_LOCKED    0x02
  114. #define UN_ULOCK    0x04        /* Upper node is locked */
  115. #define UN_KLOCK    0x08        /* Keep upper node locked on vput */
  116. #define UN_CACHED    0x10        /* In union cache */
  117.  
  118. extern int union_allocvp __P((struct vnode **, struct mount *,
  119.                 struct vnode *, struct vnode *,
  120.                 struct componentname *, struct vnode *,
  121.                 struct vnode *, int));
  122. extern int union_copyfile __P((struct vnode *, struct vnode *,
  123.                     struct ucred *, struct proc *));
  124. extern int union_copyup __P((struct union_node *, int, struct ucred *,
  125.                 struct proc *));
  126. extern int union_dowhiteout __P((struct union_node *, struct ucred *,
  127.                     struct proc *));
  128. extern int union_mkshadow __P((struct union_mount *, struct vnode *,
  129.                 struct componentname *, struct vnode **));
  130. extern int union_mkwhiteout __P((struct union_mount *, struct vnode *,
  131.                 struct componentname *, char *));
  132. extern int union_vn_create __P((struct vnode **, struct union_node *,
  133.                 struct proc *));
  134. extern int union_cn_close __P((struct vnode *, int, struct ucred *,
  135.                 struct proc *));
  136. extern void union_removed_upper __P((struct union_node *un));
  137. extern struct vnode *union_lowervp __P((struct vnode *));
  138. extern void union_newlower __P((struct union_node *, struct vnode *));
  139. extern void union_newupper __P((struct union_node *, struct vnode *));
  140. extern void union_newsize __P((struct vnode *, off_t, off_t));
  141.  
  142. #define    MOUNTTOUNIONMOUNT(mp) ((struct union_mount *)((mp)->mnt_data))
  143. #define    VTOUNION(vp) ((struct union_node *)(vp)->v_data)
  144. #define    UNIONTOV(un) ((un)->un_vnode)
  145. #define    LOWERVP(vp) (VTOUNION(vp)->un_lowervp)
  146. #define    UPPERVP(vp) (VTOUNION(vp)->un_uppervp)
  147. #define OTHERVP(vp) (UPPERVP(vp) ? UPPERVP(vp) : LOWERVP(vp))
  148.  
  149. extern int (**union_vnodeop_p)(void *);
  150. extern struct vfsops union_vfsops;
  151. #endif /* KERNEL */
  152.