Annotation of kernel/bsd/hfs/hfs.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.1 (the "License").  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License.
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: 
                     25: /*     @(#)hfs.h               3.0
                     26: *
                     27: *      (c) 1997-1999 Apple Computer, Inc.  All Rights Reserved
                     28: *      (c) 1990, 1992 NeXT Computer, Inc.  All Rights Reserved
                     29: *
                     30: *      hfs.h -- constants, structures, function declarations. etc.
                     31: *                      for Macintosh file system vfs.
                     32: *
                     33: *      HISTORY
                     34: * 13-Jan-1999  Don Brady       Add ATTR_CMN_SCRIPT to HFS_ATTR_CMN_LOOKUPMASK (radar #2296613).
                     35: * 20-Nov-1998  Don Brady       Remove UFSToHFSStr and HFSToUFSStr prototypes (obsolete).
                     36: *                                                      Move filename entry from FCB to hfsfilemeta, hfsdirentry
                     37: *                                                      names are now 255 byte long.
                     38: * 10-Nov-1998  Pat Dirks       Added MAXLOGBLOCKSIZE and MAXLOGBLOCKSIZEBLOCKS and RELEASE_BUFFER flag.
                     39: *                           Added hfsLogicalBlockTableEntry and h_logicalblocktable field in struct hfsnode.
                     40: *  4-Sep-1998  Pat Dirks       Added hfs_log_block_size to hfsmount struct [again] and BestBlockSizeFit routine.
                     41: * 31-aug-1998  Don Brady       Add UL to MAC_GMT_FACTOR constant.
                     42: * 04-jun-1998  Don Brady       Add hfsMoveRename prototype to replace hfsMove and hfsRename.
                     43: *                                                      Add VRELE and VPUT macros to catch bad ref counts.
                     44: * 28-May-1998  Pat Dirks       Move internal 'struct searchinfo' def'n here from attr.h
                     45: * 03-may-1998  Brent Knight    Add gTimeZone.
                     46: * 23-apr-1998  Don Brady       Add File type and creator for symbolic links.
                     47: * 22-apr-1998  Don Brady       Removed kMetaFile.
                     48: * 21-apr-1998  Don Brady       Add to_bsd_time and to_hfs_time prototypes.
                     49: * 20-apr-1998  Don Brady       Remove course-grained hfs metadata locking.
                     50: * 15-apr-1998  Don Brady       Add hasOverflowExtents and hfs_metafilelocking prototypes. Add kSysFile constant.
                     51: * 14-apr-1998  Deric Horn      Added searchinfo_t, definition of search criteria used by searchfs.
                     52: *  9-apr-1998  Don Brady       Added hfs_flushMDB and hfs_flushvolumeheader prototypes.
                     53: *  8-apr-1998  Don Brady       Add MAKE_VREFNUM macro.
                     54: * 26-mar-1998  Don Brady       Removed CloseBTreeFile and OpenBtreeFile prototypes.
                     55: *
                     56: * 12-nov-1997 scott
                     57: *              Added changes for HFSPlus
                     58: */
                     59: 
                     60: #ifndef __HFS__
                     61: #define __HFS__
                     62: 
                     63: #include <sys/types.h>
                     64: #include <sys/ucred.h>                         /* mount.h needs this */
                     65: #include <sys/mount.h>
                     66: #include <sys/malloc.h>
                     67: #include <mach/machine/vm_types.h>
                     68: #include <sys/vnode.h>
                     69: #include <sys/namei.h>
                     70: #include <sys/attr.h>
                     71: #include <sys/syslimits.h>
                     72: #include <mach/vm_param.h>             /* For PAGE_SIZE */
                     73: #include <sys/dir.h>                   /* For MAXNAMLEN */
                     74: 
                     75: #include <libkern/libkern.h>
                     76: #include <kern/queue.h>
                     77: #include <kern/kalloc.h>
                     78: #include <mach/machine/simple_lock.h>
                     79: #include <mach/mach_types.h>
                     80: 
                     81: #ifndef __FILEMGRINTERNAL__
                     82: #include "hfscommon/headers/FileMgrInternal.h"
                     83: #endif
                     84: 
                     85: #ifndef __BTREESINTERNAL__
                     86: #include "hfscommon/headers/BTreesInternal.h"
                     87: #endif
                     88: 
                     89: #if KERNEL_PRIVATE
                     90: #include <kern/thread.h>
                     91: #define GET_CURRENT_THREAD current_thread()
                     92: #else
                     93: extern thread_t current_thread_EXTERNAL();
                     94: #define GET_CURRENT_THREAD current_thread_EXTERNAL();
                     95: #endif
                     96: 
                     97: #if KERNEL_PRIVATE
                     98: #define CURRENT_PROC current_proc()
                     99: #else
                    100: extern struct proc * current_proc_EXTERNAL();
                    101: #define CURRENT_PROC current_proc_EXTERNAL()
                    102: #endif
                    103: 
                    104: struct uio;                            // This is more effective than #include <sys/uio.h> in case KERNEL is undefined...
                    105: struct hfslockf;               // For advisory locking
                    106: 
                    107: /*
                    108:  *     Just reported via MIG interface.
                    109:  */
                    110: #define        VERSION_STRING  "hfs-1 (1-nov-97)"
                    111: 
                    112: /*
                    113:  *     fork strings.
                    114:  */
                    115: #define        kDataForkNameStr        "data"
                    116: #define        kRsrcForkNameStr        "rsrc"
                    117: 
                    118: /*
                    119:  *     Set to force READ_ONLY.
                    120:  */
                    121: #define        FORCE_READONLY  0
                    122: 
                    123: enum { kMDBSize = 512 };                               /* Size of I/O transfer to read entire MDB */
                    124: 
                    125: enum { kMasterDirectoryBlock = 2 };                    /* MDB offset on disk in 512-byte blocks */
                    126: enum { kMDBOffset = kMasterDirectoryBlock * 512 };     /* MDB offset on disk in bytes */
                    127: 
                    128: enum {
                    129:     kUnknownID = 0,
                    130:     kRootParID = 1,
                    131:     kRootDirID = 2
                    132: };
                    133: 
                    134: enum {
                    135:     kDirCmplx = 1,
                    136:     kDataFork = 2,
                    137:     kRsrcFork = 3,
                    138:        kSysFile = 4
                    139: };
                    140: 
                    141: 
                    142: /*
                    143:  *     File type and creator for symbolic links
                    144:  */
                    145: enum {
                    146:        kSymLinkFileType        = 0x736C6E6B,   /* 'slnk' */
                    147:        kSymLinkCreator         = 0x72686170    /* 'rhap' */
                    148: };
                    149: 
                    150: 
                    151: #define MAXLOGBLOCKSIZE PAGE_SIZE
                    152: #define MAXLOGBLOCKSIZEBLOCKS (MAXLOGBLOCKSIZE/512)
                    153: /* NOTE: Special support will be needed for LOGBLOCKMAPENTRIES > kHFSPlusExtentDensity (=8) */
                    154: #define LOGBLOCKMAPENTRIES 8
                    155: 
                    156: #define BUFFERPTRLISTSIZE 25
                    157: 
                    158: extern Ptr gBufferAddress[BUFFERPTRLISTSIZE];
                    159: extern struct buf *gBufferHeaderPtr[BUFFERPTRLISTSIZE];
                    160: extern int gBufferListIndex;
                    161: extern  simple_lock_data_t gBufferPtrListLock;
                    162: 
                    163: extern struct timezone gTimeZone;
                    164: 
                    165: /* Flag values for bexpand: */
                    166: #define RELEASE_BUFFER 0x00000001
                    167: 
                    168: 
                    169: /*
                    170:  * NOTE: The code relies on being able to cast an ExtendedVCB* to a vfsVCB* in order
                    171:  *      to gain access to the mount point pointer from a pointer
                    172:  *      to an ExtendedVCB.  DO NOT INSERT OTHER FIELDS BEFORE THE vcb FIELD!!
                    173:  *
                    174:  * vcbFlags, vcbLsMod, vcbFilCnt, vcbDirCnt, vcbNxtCNID, etc
                    175:  * are locked by the hfs_lock simple lock.
                    176:  */
                    177: typedef struct vfsVCB {
                    178:     ExtendedVCB                        vcb_vcb;
                    179:     struct hfsmount            *vcb_hfsmp;                             /* Pointer to hfsmount structure */
                    180: } vfsVCB_t;
                    181: 
                    182: typedef struct hfsmount {
                    183:     u_char                             hfs_mountpoint[MAXPATHLEN+1];
                    184:     u_long                             hfs_mount_flags;
                    185:     Boolean                            hfs_fs_clean;                   /* Whether contents have been flushed in clean state */
                    186:     Boolean                            hfs_fs_ronly;                   /* Whether this was mounted as read-initially  */
                    187: 
                    188:     /* Physical Description */
                    189:     u_long                             hfs_phys_block_count;   /* Num of PHYSICAL blocks of volume */
                    190:     u_long                             hfs_phys_block_size;    /* Always a multiple of 512 */
                    191: 
                    192:     /* Access to VFS and devices */
                    193:     struct mount               *hfs_mp;                                /* filesystem vfs structure */
                    194:     struct vnode               *hfs_devvp;                             /* block device mounted vnode */
                    195:     dev_t                              hfs_raw_dev;                    /* device mounted */
                    196:     struct hfsnode             *hfs_rootDirectory;
                    197:     unsigned long              hfs_log_block_size;             /* Size of buffer cache buffer for I/O */
                    198:        
                    199:        /* Default values for HFS standard and non-init access */
                    200:     uid_t                              hfs_uid;                                /* uid to set as owner of the files */
                    201:     gid_t                              hfs_gid;                                /* gid to set as owner of the files */
                    202:     mode_t                             hfs_dir_mask;                   /* mask to and with directory protection bits */
                    203:     mode_t                             hfs_file_mask;                  /* mask to and with file protection bits */
                    204:        u_long                          hfs_encoding;                   /* Defualt encoding for non hfs+ volumes */     
                    205: 
                    206:    /* HFS Specific */
                    207:     struct vfsVCB              hfs_vcb;
                    208: } hfsmount_t;
                    209: 
                    210: 
                    211: /*****************************************************************************
                    212: *
                    213: *      hfsnode structure
                    214: *
                    215: *
                    216: *      m_closeable is an indication of whether the file can be closed at
                    217: *      any time.  This flag is implemented to help indicate whether
                    218: *      its OK to close a file which is being deleted or renamed onto
                    219: *      and also as a consistency check because we don't actually close the
                    220: *      file in hfs_close, but rather wait for hfs_inactive.  This flag
                    221: *      is set TRUE when the vnode is created, and only set FALSE by
                    222: *      hfs_open.
                    223: *
                    224: *      m_valid is used to indicate when a vnode no longer references a
                    225: *      file etc.  It is set to 0 when an active vnode is removed
                    226: *      or a file is renamed onto an active vnode.
                    227: *
                    228: *      To uniquely identify an entity for the HFS file system, we need
                    229: *      the volume descriptor, the parent directory id, and the name.
                    230: *
                    231: *****************************************************************************/
                    232: 
                    233: #define MAXHFSVNODELEN         31
                    234: typedef u_char FileNameStr[MAXHFSVNODELEN+1];
                    235: 
                    236: /*
                    237:  * NOTE: The code relies on being able to cast an FCB* to a vfsFCB* in order
                    238:  *      to gain access to the extended FCB and the vnode pointer from a pointer
                    239:  *      to an HFS FCB.  DO NOT INSERT OTHER FIELDS BEFORE THE fcb FIELD!!
                    240:  */
                    241: typedef struct vfsFCB {
                    242:     FCB                                        fcb_fcb;                                /* File Control Block */
                    243:     ExtendedFCB                        fcb_extFCB;
                    244:     struct vnode               *fcb_vp;                                /* pointer to start of container vnode */
                    245: } vfsFCB;
                    246: 
                    247: 
                    248: typedef struct hfsfilemeta {
                    249:     struct lock__bsd__ h_fmetalock;    /* file meta lock. */
                    250:     struct vnode               *h_fork;                        /* vnode for first fork. */
                    251:     u_int16_t                  h_usecount;                     /* Amount of users accessing this record XXX SER Should be deprecated*/
                    252:     u_int32_t                  h_logBlockSize;         /* Size of a block for reading/writing */
                    253:     u_int16_t                  h_physBlkPerLogBlk;     /* Amount of phys sectory per logical block */
                    254:     u_int16_t                  h_mode;                         /* IFMT, permissions; see below. */
                    255:     u_int32_t                  h_pflags;                       /* Permission flags (NODUMP, IMMUTABLE, APPEND etc.) */
                    256:     u_int32_t                  h_uid;                          /* File owner. */
                    257:     u_int32_t                  h_gid;                          /* File group. */
                    258:     dev_t                              h_rdev;                         /* Special device info for this node */
                    259:     u_int32_t                  h_nodeflags;            /* flags, see below */
                    260:     u_int32_t                  h_crtime;                       /* UNIX-format creation date in secs. */
                    261:     u_int32_t                  h_atime;                        /* UNIX-format access date in secs. */
                    262:     u_int32_t                  h_mtime;                        /* UNIX-format mod date in seconds */
                    263:     u_int32_t                  h_ctime;                        /* UNIX-format status change date */
                    264:     u_int32_t                  h_butime;                       /* UNIX-format last backup date in secs. */
                    265:     u_long                             h_hint;                         /* Catalog hint for use on Close */
                    266:     u_long                             h_dirID;                        /* Parent Directory ID */
                    267:        u_short                         h_namelen;                      /* Length of name string */
                    268:     char *                             h_namePtr;                      /* Points the name of the file */
                    269:     FileNameStr                h_fileName;                     /* CName of file */
                    270: } hfsfilemeta;
                    271: 
                    272: 
                    273: struct hfsLogicalBlockTableEntry {
                    274:     u_long             logicalBlockCount;
                    275:     off_t              extentLength;
                    276: };
                    277: 
                    278: 
                    279: typedef struct hfsnode {
                    280:     LIST_ENTRY(hfsnode)        h_hash;                         /* links on valid and free lists */
                    281:     struct lock__bsd__ h_lock;                         /* node lock. */
                    282:     struct hfslockf    *h_lockf;                       /* Head of byte-level lock list. */
                    283:     struct vnode               *h_vp;                          /* vnode associated with this inode. */
                    284:     struct vnode               *h_devvp;                       /* vnode for block I/O. */
                    285:     struct vnode               *h_relative;            /* vnode for complex parent, or to default fork */
                    286:     struct vnode               *h_sibling;                     /* vnode for sibling, if is a fork. */
                    287:     dev_t                              h_dev;                          /* Device associated with the inode. */
                    288:     u_long                             h_nodeID;                       /* specific id of this node */
                    289:     UInt8                              h_type;                         /* Type of info: dir, cmplx, data, rsrc */
                    290:        off_t                           h_size;                         /* Total physical size of object */
                    291:     struct hfsLogicalBlockTableEntry h_logicalblocktable[LOGBLOCKMAPENTRIES];
                    292:     off_t                              h_optimizedblocksizelimit;      /* End of range covered by h_logicalblocktable */
                    293:     daddr_t                            h_uniformblocksizestart;        /* First LBN in fixed-size log. block range */
                    294:     int32_t                            h_lastfsync;            /* Last time that this was fsynced (used for meta data) */
                    295:        vfsFCB                          *h_xfcb;                        /* Ptr to fcb data, if this is a fork */
                    296:     hfsfilemeta                        *h_meta;                        /* Ptr to complex (or file meta) data */
                    297:     u_int32_t                  h_valid;                        /* is the vnode reference valid */
                    298: } hfsnode_t;
                    299: typedef struct hfsnode *hfsnodeptr;
                    300: 
                    301: 
                    302: /*
                    303:  *     Macros for quick access to fields buried in the fcb inside an hfs node:
                    304:  */
                    305: #define H_FILEID(HP)   ((HP)->h_nodeID)
                    306: #define H_FORKTYPE(HP) ((HP)->h_type)
                    307: #define H_DIRID(HP)            ((HP)->h_meta->h_dirID)
                    308: #define H_NAME(HP)             ((HP)->h_meta->h_namePtr)
                    309: #define H_HINT(HP)             ((HP)->h_meta->h_hint)
                    310: 
                    311: /* These flags are kept in flags. */
                    312: #define        IN_ACCESS       0x0001          /* Access time update request. */
                    313: #define        IN_CHANGE       0x0002          /* Change time update request. */
                    314: #define        IN_UPDATE       0x0004          /* Modification time update request. */
                    315: #define        IN_MODIFIED     0x0008          /* Node has been modified. */
                    316: #define        IN_RENAME       0x0010          /* Node is being renamed. */
                    317: #define        IN_SHLOCK       0x0020          /* File has shared lock. */
                    318: #define        IN_EXLOCK       0x0040          /* File has exclusive lock. */
                    319: #define        IN_UNSETACCESS  0x0200          /* File has unset access. */
                    320: #define        IN_LONGNAME     0x0400          /* File has unset access. */
                    321: 
                    322: /* File permissions.stored in mode */
                    323: #define        IEXEC           0000100         /* Executable. */
                    324: #define        IWRITE          0000200         /* Writeable. */
                    325: #define        IREAD           0000400         /* Readable. */
                    326: #define        ISVTX           0001000         /* Sticky bit. */
                    327: #define        ISGID           0002000         /* Set-gid. */
                    328: #define        ISUID           0004000         /* Set-uid. */
                    329: 
                    330: /* File types. */
                    331: #define        IFMT            0170000         /* Mask of file type. */
                    332: #define        IFIFO           0010000         /* Named pipe (fifo). */
                    333: #define        IFCHR           0020000         /* Character device. */
                    334: #define        IFDIR           0040000         /* Directory file. */
                    335: #define        IFBLK           0060000         /* Block device. */
                    336: #define        IFREG           0100000         /* Regular file. */
                    337: #define        IFLNK           0120000         /* Symbolic link. */
                    338: #define        IFSOCK          0140000         /* UNIX domain socket. */
                    339: #define        IFWHT           0160000         /* Whiteout. */
                    340: 
                    341: /* Value to make sure vnode is real and defined */
                    342: #define        HFS_VNODE_MAGIC 0x4846532b      /* 'HFS+' */
                    343: 
                    344: 
                    345: /*
                    346:  *     Write check macro
                    347:  */
                    348: #define        WRITE_CK(VNODE, FUNC_NAME)      {                               \
                    349:     if ((VNODE)->v_mount->mnt_flag & MNT_RDONLY) {                     \
                    350:         DBG_ERR(("%s: ATTEMPT TO WRITE A READONLY VOLUME\n",   \
                    351:                  FUNC_NAME));  \
                    352:                      return(EROFS);                                                    \
                    353:     }                                                                  \
                    354: }
                    355: 
                    356: 
                    357: /*
                    358:  *     hfsmount locking and unlocking.
                    359:  *
                    360:  *     mvl_lock_flags
                    361:  */
                    362: #define MVL_LOCKED    0x00000001       /* debug only */
                    363: 
                    364: #if    DIAGNOSTIC
                    365: #define MVL_LOCK(mvip)    {                            \
                    366:     (simple_lock(&(mvip)->mvl_lock));                  \
                    367:         (mvip)->mvl_flags |= MVL_LOCKED;                       \
                    368: }
                    369: 
                    370: #define MVL_UNLOCK(mvip)    {                          \
                    371:     if(((mvip)->mvl_flags & MVL_LOCKED) == 0) {                \
                    372:         panic("MVL_UNLOCK - hfsnode not locked");      \
                    373:     }                                                  \
                    374:     (simple_unlock(&(mvip)->mvl_lock));                        \
                    375:         (mvip)->mvl_flags &= ~MVL_LOCKED;                      \
                    376: }
                    377: #else  /* DIAGNOSTIC */
                    378: #define MVL_LOCK(mvip)         (simple_lock(&(mvip)->mvl_lock))
                    379: #define MVL_UNLOCK(mvip)       (simple_unlock(&(mvip)->mvl_lock))
                    380: #endif /* DIAGNOSTIC */
                    381: 
                    382: 
                    383: /* structure to hold a directory entry, patterned after struct dirent */
                    384: typedef struct hfsdirentry {
                    385:     u_int32_t  fileno;                 /* unique file number */
                    386:     u_int16_t  reclen;                 /* length of this structure */
                    387:     u_int8_t   type;                   /* dirent file type */
                    388:     u_int8_t   namelen;                /* len of filename */
                    389:     char               name[NAME_MAX+1];               /* filename */
                    390: } hfsdirentry;
                    391: 
                    392: /* structure to hold a catalog record information */
                    393: /* Of everything you wanted to know about a catalog entry, file and directory */
                    394: typedef struct hfsCatalogInfo {
                    395:     CatalogNodeData    nodeData;
                    396:        FSSpec                          spec;                                   /* filename */
                    397:     UInt32                             hint;
                    398: } hfsCatalogInfo;
                    399: 
                    400: //     structure definition of the searchfs system trap for the search criterea.
                    401: struct directoryInfoSpec
                    402: {
                    403:        u_long                          numFiles;
                    404: };
                    405: 
                    406: struct fileInfoSpec
                    407: {
                    408:        off_t                           dataLogicalLength;
                    409:        off_t                           dataPhysicalLength;
                    410:        off_t                           resourceLogicalLength;
                    411:        off_t                           resourcePhysicalLength;
                    412: };
                    413: 
                    414: struct searchinfospec
                    415: {
                    416:        u_char                          name[512];
                    417:        u_long                          nameLength;
                    418:        char                            attributes;             // see IM:Files 2-100
                    419:        u_long                          parentDirID;
                    420:        struct timespec         creationDate;           
                    421:        struct timespec         modificationDate;               
                    422:        struct timespec         lastBackupDate; 
                    423:        u_long                          finderInfo[8];
                    424:     struct fileInfoSpec f;
                    425:        struct directoryInfoSpec d;
                    426: };
                    427: typedef struct searchinfospec searchinfospec_t;
                    428: 
                    429: #define        HFSTIMES(hp, t1, t2) {                                          \
                    430:     if ((hp)->h_meta->h_nodeflags & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) {     \
                    431:         (hp)->h_meta->h_nodeflags |= IN_MODIFIED;                              \
                    432:         if ((hp)->h_meta->h_nodeflags & IN_ACCESS) {                   \
                    433:             (hp)->h_meta->h_atime = (t1)->tv_sec;                      \
                    434:         };                                                                                     \
                    435:         if ((hp)->h_meta->h_nodeflags & IN_UPDATE) {                   \
                    436:             (hp)->h_meta->h_mtime = (t2)->tv_sec;                      \
                    437:         }                                                                                      \
                    438:         if ((hp)->h_meta->h_nodeflags & IN_CHANGE) {                   \
                    439:             (hp)->h_meta->h_ctime = time.tv_sec;                       \
                    440:         };                                                                                     \
                    441:         (hp)->h_meta->h_nodeflags &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE);     \
                    442:     }                                                          \
                    443: }
                    444: 
                    445: /*
                    446:  * Various ways to acquire a VNode pointer:
                    447:  */
                    448: #define HTOV(HP) ((HP)->h_vp)
                    449: #define FCBTOV(FCB) (((vfsFCB *)(FCB))->fcb_vp)
                    450: 
                    451: /*
                    452:  * Various ways to acquire an HFS Node pointer:
                    453:  */
                    454: #define VTOH(VP) ((struct hfsnode *)((VP)->v_data))
                    455: #define FCBTOH(FCB) ((struct hfsnode *)(((vfsFCB *)(FCB))->fcb_vp->v_data))
                    456: 
                    457: /*
                    458:  * Various ways to acquire an FCB pointer:
                    459:  */
                    460: #define VTOFCB(VP) (&(((struct hfsnode *)((VP)->v_data))->h_xfcb->fcb_fcb))
                    461: #define HTOFCB(HP) (&(HP)->h_xfcb->fcb_fcb)
                    462: 
                    463: /*
                    464:  * Various ways to acquire a VFS mount point pointer:
                    465:  */
                    466: #define VTOVFS(VP) ((VP)->v_mount)
                    467: #define        HTOVFS(HP) ((HP)->h_vp->v_mount)
                    468: #define FCBTOVFS(FCB) (((vfsFCB *)(FCB))->fcb_vp->v_mount)
                    469: #define HFSTOVFS(HFSMP) ((HFSMP)->hfs_mp)
                    470: #define VCBTOVFS(VCB) (((struct vfsVCB *)(VCB))->vcb_hfsmp->hfs_mp)
                    471: 
                    472: /*
                    473:  * Various ways to acquire an HFS mount point pointer:
                    474:  */
                    475: #define VTOHFS(VP) ((struct hfsmount *)((VP)->v_mount->mnt_data))
                    476: #define        HTOHFS(HP) ((struct hfsmount *)(HP)->h_vp->v_mount->mnt_data)
                    477: #define FCBTOHFS(FCB) ((struct hfsmount *)(((vfsFCB *)(FCB))->fcb_vp->v_mount->mnt_data))
                    478: #define        VFSTOHFS(MP) ((struct hfsmount *)(MP)->mnt_data)        
                    479: #define VCBTOHFS(VCB) (((struct vfsVCB *)(VCB))->vcb_hfsmp)
                    480: 
                    481: /*
                    482:  * Various ways to acquire a VCB pointer:
                    483:  */
                    484: #define VTOVCB(VP) (&(((struct hfsmount *)((VP)->v_mount->mnt_data))->hfs_vcb.vcb_vcb))
                    485: #define HTOVCB(HP) (&(((struct hfsmount *)((HP)->h_vp->v_mount->mnt_data))->hfs_vcb.vcb_vcb))
                    486: #define FCBTOVCB(FCB) (&(((struct hfsmount *)(((vfsFCB *)(FCB))->fcb_vp->v_mount->mnt_data))->hfs_vcb.vcb_vcb))
                    487: #define VFSTOVCB(MP) (&(((struct hfsmount *)(MP)->mnt_data)->hfs_vcb.vcb_vcb))
                    488: #define HFSTOVCB(HFSMP) (&(HFSMP)->hfs_vcb.vcb_vcb)
                    489: 
                    490: /*
                    491:  * Lock for HFS file metadata
                    492:  */
                    493: #define HFSFILEMETA_LOCK_EXCLUSIVE(HP, P) \
                    494:        lockmgr(&(HP)->h_meta->h_fmetalock, LK_EXCLUSIVE, (simple_lock_t) 0, P)
                    495: 
                    496: #define HFSFILEMETA_LOCK_SHARED(HP, P) \
                    497:        lockmgr(&(HP)->h_meta->h_fmetalock, LK_SHARED, (simple_lock_t) 0, P)
                    498: 
                    499: #define HFSFILEMETA_UNLOCK(HP, P) \
                    500:        lockmgr(&(HP)->h_meta->h_fmetalock, LK_RELEASE, (simple_lock_t) 0, P)
                    501: 
                    502: #define E_NONE 0
                    503: #define kHFSBlockSize 512
                    504: #define kHFSBlockShift 9       /* 2^9 = 512 */
                    505: 
                    506: #define IOBLKNOFORBLK(STARTINGBLOCK, BLOCKSIZEINBYTES) ((daddr_t)((STARTINGBLOCK) / ((BLOCKSIZEINBYTES) >> 9)))
                    507: #define IOBLKCNTFORBLK(STARTINGBLOCK, BYTESTOTRANSFER, BLOCKSIZEINBYTES) \
                    508:     ((int)(IOBLKNOFORBYTE(((STARTINGBLOCK) * 512) + (BYTESTOTRANSFER) - 1, (BLOCKSIZEINBYTES)) - \
                    509:            IOBLKNOFORBLK((STARTINGBLOCK), (BLOCKSIZEINBYTES)) + 1))
                    510: #define IOBYTECCNTFORBLK(STARTINGBLOCK, BYTESTOTRANSFER, BLOCKSIZEINBYTES) \
                    511:     (IOBLKCNTFORBLK((STARTINGBLOCK),(BYTESTOTRANSFER),(BLOCKSIZEINBYTES)) * (BLOCKSIZEINBYTES))
                    512: #define IOBYTEOFFSETFORBLK(STARTINGBLOCK, BLOCKSIZEINBYTES) \
                    513:     (((STARTINGBLOCK) * 512) - \
                    514:      (IOBLKNOFORBLK((STARTINGBLOCK), (BLOCKSIZEINBYTES)) * (BLOCKSIZEINBYTES)))
                    515: 
                    516: #define IOBLKNOFORBYTE(STARTINGBYTE, BLOCKSIZEINBYTES) ((daddr_t)((STARTINGBYTE) / (BLOCKSIZEINBYTES)))
                    517: #define IOBLKCNTFORBYTE(STARTINGBYTE, BYTESTOTRANSFER, BLOCKSIZEINBYTES) \
                    518: ((int)(IOBLKNOFORBYTE((STARTINGBYTE) + (BYTESTOTRANSFER) - 1, (BLOCKSIZEINBYTES)) - \
                    519:            IOBLKNOFORBYTE((STARTINGBYTE), (BLOCKSIZEINBYTES)) + 1))
                    520: #define IOBYTECNTFORBYTE(STARTINGBYTE, BYTESTOTRANSFER, BLOCKSIZEINBYTES) \
                    521:     (IOBLKCNTFORBYTE((STARTINGBYTE),(BYTESTOTRANSFER),(BLOCKSIZEINBYTES)) * (BLOCKSIZEINBYTES))
                    522: #define IOBYTEOFFSETFORBYTE(STARTINGBYTE, BLOCKSIZEINBYTES) ((STARTINGBYTE) - (IOBLKNOFORBYTE((STARTINGBYTE), (BLOCKSIZEINBYTES)) * (BLOCKSIZEINBYTES)))
                    523: 
                    524: #define MAKE_VREFNUM(x)        ((int32_t)((x) & 0xffff))
                    525: /*
                    526:  *     This is the straight GMT conversion constant:
                    527:  *     00:00:00 January 1, 1970 - 00:00:00 January 1, 1904
                    528:  *     (3600 * 24 * ((365 * (1970 - 1904)) + (((1970 - 1904) / 4) + 1)))
                    529:  */
                    530: #define MAC_GMT_FACTOR         2082844800UL
                    531: 
                    532: #define HFS_ATTR_CMN_LOOKUPMASK (ATTR_CMN_SCRIPT | ATTR_CMN_FNDRINFO | ATTR_CMN_NAMEDATTRCOUNT | ATTR_CMN_NAMEDATTRLIST)
                    533: #define HFS_ATTR_DIR_LOOKUPMASK (ATTR_DIR_LINKCOUNT | ATTR_DIR_ENTRYCOUNT)
                    534: #define HFS_ATTR_FILE_LOOKUPMASK (ATTR_FILE_LINKCOUNT | ATTR_FILE_TOTALSIZE | ATTR_FILE_ALLOCSIZE | \
                    535:                                                                        ATTR_FILE_DATALENGTH | ATTR_FILE_DATAALLOCSIZE | ATTR_FILE_DATAEXTENTS | \
                    536:                                                                        ATTR_FILE_RSRCLENGTH | ATTR_FILE_RSRCALLOCSIZE | ATTR_FILE_RSRCEXTENTS)
                    537: 
                    538: #define VPUT(vp)       if (((vp)->v_usecount > 0) && (*((volatile int *)(&(vp)->v_interlock))==0)) vput((vp));  else panic("hfs: vput bad ref cnt (%d)!",  (vp)->v_usecount)
                    539: #define VRELE(vp)      if (((vp)->v_usecount > 0) && (*((volatile int *)(&(vp)->v_interlock))==0)) vrele((vp)); else panic("hfs: vrele bad ref cnt (%d)!", (vp)->v_usecount)
                    540: 
                    541: u_int32_t to_bsd_time(u_int32_t hfs_time);
                    542: u_int32_t to_hfs_time(u_int32_t bsd_time);
                    543: 
                    544: struct vnode *hfs_vhashget(dev_t dev, UInt32 dirID, UInt8 forkType);
                    545: void hfs_vhashins(struct hfsnode *hp);
                    546: void hfs_vhashinslocked(struct hfsnode *hp);
                    547: void hfs_vhashrem(struct hfsnode *hp);
                    548: 
                    549: short hfs_flushfiles(struct mount *mp, unsigned short flags);
                    550: short hfs_flushMDB(struct hfsmount *hfsmp, int waitfor);
                    551: short hfs_flushvolumeheader(struct hfsmount *hfsmp, int waitfor);
                    552: 
                    553: short hfsLookup (ExtendedVCB *vcb, UInt32 dirID, char *name, short len, UInt32 hint, hfsCatalogInfo *catInfo);
                    554: short hfsMoveRename (ExtendedVCB *vcb, UInt32 oldDirID, char *oldName, UInt32 newDirID, char *newName, UInt32 *hint);
                    555: short hfsCreate (ExtendedVCB *vcb, UInt32 dirID, char *name, int mode);
                    556: short hfsCreateFileID (ExtendedVCB *vcb, UInt32 parentDirID, StringPtr name, UInt32 catalogHint, UInt32 *fileIDPtr);
                    557: short hfsGet (ExtendedVCB *vcb, hfsCatalogInfo *catInfo, UInt8 forkType, struct vnode *dvp, struct vnode **vpp);
                    558: short hfsDelete (ExtendedVCB *vcb, UInt32 parentDirID, StringPtr name, short isfile, UInt32 catalogHint);
                    559: short hfsUnmount(struct hfsmount *hfsmp, struct proc *p);
                    560: 
                    561: extern int hfs_metafilelocking(struct hfsmount *hfsmp, u_long fileID, u_int flags, struct proc *p);
                    562: extern int hasOverflowExtents(struct hfsnode *hp);
                    563: 
                    564: short MacToVFSError(OSErr err);
                    565: void MapFileOffset(struct hfsnode *hp, off_t filePosition, daddr_t *logBlockNumber, long *blockSize, long *blockOffset);
                    566: long LogicalBlockSize(struct hfsnode *hp, daddr_t logicalBlockNumber);
                    567: void UpdateBlockMappingTable(struct hfsnode *hp);
                    568: void CopyVNodeToCatalogNode (struct vnode *vp, struct CatalogNodeData *nodeData);
                    569: void CopyCatalogToHFSNode(struct hfsCatalogInfo *catalogInfo, struct hfsnode *hp);
                    570: int bexpand(struct buf *bp, int newsize, struct buf **nbpp, long flags);
                    571: 
                    572: short make_dir_entry(struct FCB **fileptr, char *name, UInt32 fileID);
                    573: 
                    574: int AttributeBlockSize(struct attrlist *attrlist);
                    575: void PackCommonAttributeBlock(struct attrlist *alist,
                    576:                                                          struct vnode *vp,
                    577:                                                          struct hfsCatalogInfo *catInfo,
                    578:                                                          void **attrbufptrptr,
                    579:                                                          void **varbufptrptr);
                    580: void PackVolAttributeBlock(struct attrlist *alist,
                    581:                                                   struct vnode *vp,
                    582:                                                   struct hfsCatalogInfo *catInfo,
                    583:                                                   void **attrbufptrptr,
                    584:                                                   void **varbufptrptr);
                    585: void PackFileDirAttributeBlock(struct attrlist *alist,
                    586:                                                           struct vnode *vp,
                    587:                                                           struct hfsCatalogInfo *catInfo,
                    588:                                                           void **attrbufptrptr,
                    589:                                                           void **varbufptrptr);
                    590: void PackForkAttributeBlock(struct attrlist *alist,
                    591:                                                        struct vnode *vp,
                    592:                                                        struct hfsCatalogInfo *catInfo,
                    593:                                                        void **attrbufptrptr,
                    594:                                                        void **varbufptrptr);
                    595: void PackAttributeBlock(struct attrlist *alist,
                    596:                                                struct vnode *vp,
                    597:                                                struct hfsCatalogInfo *catInfo,
                    598:                                                void **attrbufptrptr,
                    599:                                                void **varbufptrptr);
                    600: void PackCatalogInfoAttributeBlock (struct attrlist *alist,
                    601:                                                struct vnode * root_vp,
                    602:                                                struct hfsCatalogInfo *catInfo,
                    603:                                                void **attrbufptrptr,
                    604:                                                void **varbufptrptr);
                    605: void UnpackCommonAttributeBlock(struct attrlist *alist,
                    606:                                                          struct vnode *vp,
                    607:                                                          struct hfsCatalogInfo *catInfo,
                    608:                                                          void **attrbufptrptr,
                    609:                                                          void **varbufptrptr);
                    610: void UnpackAttributeBlock(struct attrlist *alist,
                    611:                                                struct vnode *vp,
                    612:                                                struct hfsCatalogInfo *catInfo,
                    613:                                                void **attrbufptrptr,
                    614:                                                void **varbufptrptr);
                    615: unsigned long BestBlockSizeFit(unsigned long allocationBlockSize,
                    616:                                unsigned long blockSizeLimit,
                    617:                                unsigned long baseMultiple);
                    618: 
                    619: OSErr  hfs_MountHFSVolume(struct hfsmount *hfsmp, HFSMasterDirectoryBlock *mdb, struct proc *p);
                    620: OSErr  hfs_MountHFSPlusVolume(struct hfsmount *hfsmp, HFSPlusVolumeHeader *vhp, u_long embBlkOffset, struct proc *p);
                    621: OSStatus  GetInitializedVNode(struct hfsmount *hfsmp, struct vnode **tmpvnode );
                    622: 
                    623: /* B-tree I/O callbacks (in hfs_btreio.c) */
                    624: extern OSStatus        GetBTreeBlock(FileReference fileRefNum, UInt32 blockNum, GetBlockOptions options, BlockDescriptor *block);
                    625: extern OSStatus        ReleaseBTreeBlock(FileReference fileRefNum, BlockDescPtr blockPtr, ReleaseBlockOptions options);
                    626: extern OSStatus        SetBTreeBlockSize(FileReference fileRefNum, ByteCount blockSize, ItemCount minBlockCount);
                    627: extern OSStatus ExtendBTreeFile(FileReference fileRefNum, FSSize minEOF, FSSize maxEOF);
                    628: 
                    629: #endif /* __HFS__ */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.