home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 4 / hacker04 / 04_HACK04.ISO / darwin / darwinx86.iso / usr / include / isofs / cd9660 / iso.h < prev   
Encoding:
C/C++ Source or Header  |  2001-09-30  |  12.9 KB  |  400 lines

  1. /*
  2.  * Copyright (c) 2000-2001 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. /*    $NetBSD: iso.h,v 1.9 1995/01/18 09:23:19 mycroft Exp $    */
  23.  
  24. /*-
  25.  * Copyright (c) 1994
  26.  *    The Regents of the University of California.  All rights reserved.
  27.  *
  28.  * This code is derived from software contributed to Berkeley
  29.  * by Pace Willisson (pace@blitz.com).  The Rock Ridge Extension
  30.  * Support code is derived from software contributed to Berkeley
  31.  * by Atsushi Murai (amurai@spec.co.jp).
  32.  *
  33.  * Redistribution and use in source and binary forms, with or without
  34.  * modification, are permitted provided that the following conditions
  35.  * are met:
  36.  * 1. Redistributions of source code must retain the above copyright
  37.  *    notice, this list of conditions and the following disclaimer.
  38.  * 2. Redistributions in binary form must reproduce the above copyright
  39.  *    notice, this list of conditions and the following disclaimer in the
  40.  *    documentation and/or other materials provided with the distribution.
  41.  * 3. All advertising materials mentioning features or use of this software
  42.  *    must display the following acknowledgement:
  43.  *    This product includes software developed by the University of
  44.  *    California, Berkeley and its contributors.
  45.  * 4. Neither the name of the University nor the names of its contributors
  46.  *    may be used to endorse or promote products derived from this software
  47.  *    without specific prior written permission.
  48.  *
  49.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  50.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  51.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  52.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  53.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  54.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  55.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  56.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  57.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  58.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  59.  * SUCH DAMAGE.
  60.  *
  61.  *    @(#)iso.h    8.4 (Berkeley) 12/5/94
  62.  */
  63. #ifndef _ISO_H_
  64. #define _ISO_H_
  65.  
  66. #define ISODCL(from, to) (to - from + 1)
  67.  
  68. struct iso_volume_descriptor {
  69.     char type            [ISODCL(1,1)]; /* 711 */
  70.     char volume_desc_id  [ISODCL(2,6)];
  71.     char version         [ISODCL(7,7)];
  72.     char data            [ISODCL(8,2048)];
  73. };
  74.  
  75. /* volume descriptor types */
  76. #define ISO_VD_BOOT            0
  77. #define ISO_VD_PRIMARY         1
  78. #define ISO_VD_SUPPLEMENTARY   2
  79. #define ISO_VD_PARTITION       3
  80. #define ISO_VD_END           255
  81.  
  82. #define ISO_STANDARD_ID "CD001"
  83. #define ISO_ECMA_ID     "CDW01"
  84. #define ISO_XA_ID        "CD-XA001"     /* XA style disk signature */
  85. #define ISO9660SIGNATURE 0x4147        /* for getattrlist ATTR_VOL_SIGNATURE */
  86.  
  87. /* Universal Character Set implementation levels (for Joliet) */
  88. #define ISO_UCS2_Level_1    "%/@"    /* No combining chars */
  89. #define ISO_UCS2_Level_2    "%/C"    /* Combining chars allowed with restrictions */
  90. #define ISO_UCS2_Level_3    "%/E"    /* Combining chars allowed, no restrictions */
  91.  
  92. #define UCS_SEPARATOR1    0x002e
  93. #define UCS_SEPARATOR2    0x003b
  94.  
  95. #define ISO_DFLT_VOLUME_ID "ISO_9660_CD"
  96.  
  97. /* pathconf filename lengths */
  98. #define ISO_NAMEMAX        (31+1)
  99. #define ISO_JOLIET_NAMEMAX    (64*3)
  100. #define ISO_RRIP_NAMEMAX    255
  101.  
  102. /* Finder flags, from Technical Note 40 */
  103. #define        fLockedBit        0x8000
  104. #define        fInvisibleBit    0x4000
  105. #define        fHasBundleBit    0x2000
  106. #define        fSystemBit        0x1000
  107. #define        fNoCopyBit        0x0800
  108. #define        fBusyBit        0x0400
  109. #define        fChangedBit        0x0200
  110. #define        fInitedBit        0x0100
  111. #define        fCachedBit        0x0080
  112. #define        fSharedBit        0x0040
  113. #define        fAlwaysBit        0x0020        /* always switch-launch */
  114. #define        fNeverBit        0x0010        /* never switch-launch */
  115. #define        fOwnApplBit        0x0002
  116. #define        fOnDesktopBit    0x0001
  117.  
  118. #define        EXTFNDRINFOSIZE        16
  119.  
  120. struct finder_info {
  121.     unsigned long        fdType;
  122.     unsigned long        fdCreator;
  123.     unsigned short        fdFlags;
  124.     struct {
  125.         short    v;        /* file's location */
  126.         short    h;
  127.     } fdLocation;
  128.     unsigned short        fdReserved;
  129. };
  130.  
  131. struct iso_primary_descriptor {
  132.     char type            [ISODCL (  1,   1)]; /* 711 */
  133.     char volume_desc_id        [ISODCL (  2,   6)];
  134.     char version            [ISODCL (  7,   7)]; /* 711 */
  135.     char flags            [ISODCL (  8,   8)]; /* SVD only */
  136.     char system_id            [ISODCL (  9,  40)]; /* achars */
  137.     char volume_id            [ISODCL ( 41,  72)]; /* dchars */
  138.     char unused2            [ISODCL ( 73,  80)];
  139.     char volume_space_size        [ISODCL ( 81,  88)]; /* 733 */
  140.     char escape_seq            [ISODCL ( 89, 120)]; /* SVD only */
  141.     char volume_set_size        [ISODCL (121, 124)]; /* 723 */
  142.     char volume_sequence_number    [ISODCL (125, 128)]; /* 723 */
  143.     char logical_block_size        [ISODCL (129, 132)]; /* 723 */
  144.     char path_table_size        [ISODCL (133, 140)]; /* 733 */
  145.     char type_l_path_table        [ISODCL (141, 144)]; /* 731 */
  146.     char opt_type_l_path_table    [ISODCL (145, 148)]; /* 731 */
  147.     char type_m_path_table        [ISODCL (149, 152)]; /* 732 */
  148.     char opt_type_m_path_table    [ISODCL (153, 156)]; /* 732 */
  149.     char root_directory_record    [ISODCL (157, 190)]; /* 9.1 */
  150.     char volume_set_id        [ISODCL (191, 318)]; /* dchars */
  151.     char publisher_id        [ISODCL (319, 446)]; /* achars */
  152.     char preparer_id        [ISODCL (447, 574)]; /* achars */
  153.     char application_id        [ISODCL (575, 702)]; /* achars */
  154.     char copyright_file_id        [ISODCL (703, 739)]; /* 7.5 dchars */
  155.     char abstract_file_id        [ISODCL (740, 776)]; /* 7.5 dchars */
  156.     char bibliographic_file_id    [ISODCL (777, 813)]; /* 7.5 dchars */
  157.     char creation_date        [ISODCL (814, 830)]; /* 8.4.26.1 */
  158.     char modification_date        [ISODCL (831, 847)]; /* 8.4.26.1 */
  159.     char expiration_date        [ISODCL (848, 864)]; /* 8.4.26.1 */
  160.     char effective_date        [ISODCL (865, 881)]; /* 8.4.26.1 */
  161.     char file_structure_version    [ISODCL (882, 882)]; /* 711 */
  162.     char unused4            [ISODCL (883, 883)];
  163.     char application_data1        [ISODCL (884, 1024)];
  164.     char CDXASignature            [ISODCL (1025, 1032)];
  165.     char CDXAResv                [ISODCL (1033, 1050)];
  166.     char application_data2        [ISODCL (1051, 1395)];
  167. };
  168. #define ISO_DEFAULT_BLOCK_SIZE        2048
  169.  
  170. /* from HighSierra.h in MacOS land */
  171. typedef struct 
  172. {
  173.     char     signature        [ISODCL (1, 2)];     /* x42 x41 - 'BA' signature */
  174.     u_char     systemUseID        [ISODCL (3, 3)];     /* 02 = no icon, 03 = icon, 04 = icon + bundle */
  175.     u_char     fileType        [ISODCL (4, 7)];     /* such as 'TEXT' or 'STAK' */
  176.     u_char     fileCreator        [ISODCL (8, 11)];     /* such as 'hscd' or 'WILD' */
  177.     u_char     finderFlags        [ISODCL (12, 13)];     /* optional for type 06 */
  178. } AppleExtension;
  179.  
  180. typedef struct 
  181. {
  182.     char     signature        [ISODCL (1, 2)];     /* x41 x41 - 'AA' signature */
  183.     u_char     OSULength        [ISODCL (3, 3)];     /* optional SystemUse length (size of this struct) */
  184.     u_char     systemUseID        [ISODCL (4, 4)];     /* 1 = ProDOS 2 = HFS */
  185.     u_char     fileType        [ISODCL (5, 8)];     /* such as 'TEXT' or 'STAK' */
  186.     u_char     fileCreator        [ISODCL (9, 12)];     /* such as 'hscd' or 'WILD' */
  187.     u_char     finderFlags        [ISODCL (13, 14)];     /* only certain bits of this are used */
  188. } NewAppleExtension;
  189.  
  190. struct iso_directory_record {
  191.     char length            [ISODCL (1, 1)]; /* 711 */
  192.     char ext_attr_length        [ISODCL (2, 2)]; /* 711 */
  193.     u_char extent            [ISODCL (3, 10)]; /* 733 */
  194.     u_char size            [ISODCL (11, 18)]; /* 733 */
  195.     char date            [ISODCL (19, 25)]; /* 7 by 711 */
  196.     char flags            [ISODCL (26, 26)];
  197.     char file_unit_size        [ISODCL (27, 27)]; /* 711 */
  198.     char interleave            [ISODCL (28, 28)]; /* 711 */
  199.     char volume_sequence_number    [ISODCL (29, 32)]; /* 723 */
  200.     char name_len            [ISODCL (33, 33)]; /* 711 */
  201.     char name            [1];            /* XXX */
  202. };
  203. /*
  204.  *  cannot take sizeof(iso_directory_record), because of 
  205.  *    possible alignment
  206.  *    of the last entry (34 instead of 33)
  207.  */
  208. #define ISO_DIRECTORY_RECORD_SIZE    33
  209.  
  210. /*
  211.  * iso_directory_record.flags for Directory Records (except CD-I discs)
  212.  */
  213. #define existenceBit    0x01    /* Invisible */
  214. #define directoryBit    0x02
  215. #define associatedBit    0x04
  216. #define recordBit        0x08
  217. #define protectionBit    0x10
  218. #define multiextentBit    0x80
  219.  
  220. struct iso_extended_attributes {
  221.     u_char owner            [ISODCL (1, 4)]; /* 723 */
  222.     u_char group            [ISODCL (5, 8)]; /* 723 */
  223.     u_char perm            [ISODCL (9, 10)]; /* 9.5.3 */
  224.     char ctime            [ISODCL (11, 27)]; /* 8.4.26.1 */
  225.     char mtime            [ISODCL (28, 44)]; /* 8.4.26.1 */
  226.     char xtime            [ISODCL (45, 61)]; /* 8.4.26.1 */
  227.     char ftime            [ISODCL (62, 78)]; /* 8.4.26.1 */
  228.     char recfmt            [ISODCL (79, 79)]; /* 711 */
  229.     char recattr            [ISODCL (80, 80)]; /* 711 */
  230.     u_char reclen            [ISODCL (81, 84)]; /* 723 */
  231.     char system_id            [ISODCL (85, 116)]; /* achars */
  232.     char system_use            [ISODCL (117, 180)];
  233.     char version            [ISODCL (181, 181)]; /* 711 */
  234.     char len_esc            [ISODCL (182, 182)]; /* 711 */
  235.     char reserved            [ISODCL (183, 246)];
  236.     u_char len_au            [ISODCL (247, 250)]; /* 723 */
  237. };
  238.  
  239. /* CD-ROM Format type */
  240. enum ISO_FTYPE  { ISO_FTYPE_DEFAULT, ISO_FTYPE_9660, ISO_FTYPE_RRIP,
  241.           ISO_FTYPE_JOLIET, ISO_FTYPE_ECMA };
  242.  
  243. #ifndef    ISOFSMNT_ROOT
  244. #define    ISOFSMNT_ROOT    0
  245. #endif
  246.  
  247. struct iso_mnt {
  248.     int im_flags;        /* mount flags */
  249.     int im_flags2;        /* misc flags */    
  250.  
  251.     struct mount *im_mountp;
  252.     dev_t im_dev;
  253.     struct vnode *im_devvp;
  254.  
  255.     int logical_block_size;
  256.     int im_bshift;
  257.     int im_bmask;
  258.     
  259.     int volume_space_size;
  260.     struct netexport im_export;
  261.     
  262.     char root[ISODCL (157, 190)];
  263.     int root_extent;
  264.     int root_size;
  265.     enum ISO_FTYPE  iso_ftype;
  266.     
  267.     int rr_skip;
  268.     int rr_skip0;
  269.  
  270.     struct timespec creation_date;                /* needed for getattrlist */
  271.     struct timespec modification_date;            /* needed for getattrlist */
  272.     u_char volume_id[32];                        /* name of volume */
  273. };
  274.  
  275. /* bit settings for iso_mnt.im_flags2 */
  276.  
  277. /*
  278.  *  CD is in XA format. Need this to find where apple extensions 
  279.  *    are in the iso_directory_record
  280.  */
  281. #define    IMF2_IS_CDXA    0x00000001
  282.  
  283. #define VFSTOISOFS(mp)    ((struct iso_mnt *)((mp)->mnt_data))
  284.  
  285. #define blkoff(imp, loc)    ((loc) & (imp)->im_bmask)
  286. #define lblktosize(imp, blk)    ((blk) << (imp)->im_bshift)
  287. #define lblkno(imp, loc)    ((loc) >> (imp)->im_bshift)
  288. #define blksize(imp, ip, lbn)    ((imp)->logical_block_size)
  289.  
  290. int cd9660_mount __P((struct mount *,
  291.         char *, caddr_t, struct nameidata *, struct proc *));
  292. int cd9660_start __P((struct mount *, int, struct proc *));
  293. int cd9660_unmount __P((struct mount *, int, struct proc *));
  294. int cd9660_root __P((struct mount *, struct vnode **));
  295. int cd9660_quotactl __P((struct mount *, int, uid_t, caddr_t, struct proc *));
  296. int cd9660_statfs __P((struct mount *, struct statfs *, struct proc *));
  297. int cd9660_sync __P((struct mount *, int, struct ucred *, struct proc *));
  298. int cd9660_vget __P((struct mount *, void *, struct vnode **));
  299. int cd9660_fhtovp __P((struct mount *, struct fid *, struct mbuf *,
  300.         struct vnode **, int *, struct ucred **));
  301. int cd9660_vptofh __P((struct vnode *, struct fid *));
  302. int cd9660_init __P(());
  303.  
  304. int cd9660_mountroot __P((void)); 
  305.  
  306. int cd9660_sysctl __P((int *, u_int, void *, size_t *, void *, size_t, struct proc *));
  307.  
  308. extern int (**cd9660_vnodeop_p)(void *);
  309. extern int (**cd9660_specop_p)(void *);
  310. #if FIFO
  311. extern int (**cd9660_fifoop_p)(void *);
  312. #endif
  313.  
  314. static __inline int
  315. isonum_711(p)
  316.     u_char *p;
  317. {
  318.     return *p;
  319. }
  320.  
  321. static __inline int
  322. isonum_712(p)
  323.     char *p;
  324. {
  325.     return *p;
  326. }
  327.  
  328. #ifndef UNALIGNED_ACCESS
  329.  
  330. static __inline int
  331. isonum_723(p)
  332.     u_char *p;
  333. {
  334.     return *p|(p[1] << 8);
  335. }
  336.  
  337. static __inline int
  338. isonum_733(p)
  339.     u_char *p;
  340. {
  341.     return *p|(p[1] << 8)|(p[2] << 16)|(p[3] << 24);
  342. }
  343.  
  344. #else /* UNALIGNED_ACCESS */
  345.  
  346. #if BYTE_ORDER == LITTLE_ENDIAN
  347.  
  348. static __inline int
  349. isonum_723(p)
  350.     u_char *p
  351. {
  352.     return *(u_int16t *)p;
  353. }
  354.  
  355. static __inline int
  356. isonum_733(p)
  357.     u_char *p;
  358. {
  359.     return *(u_int32t *)p;
  360. }
  361.  
  362. #endif
  363.  
  364. #if BYTE_ORDER == BIG_ENDIAN
  365.  
  366. static __inline int
  367. isonum_723(p)
  368.     u_char *p
  369. {
  370.     return *(u_int16t *)(p + 2);
  371. }
  372.  
  373. static __inline int
  374. isonum_733(p)
  375.     u_char *p;
  376. {
  377.     return *(u_int32t *)(p + 4);
  378. }
  379.  
  380. #endif
  381.  
  382. #endif /* UNALIGNED_ACCESS */
  383.  
  384. int isofncmp __P((u_char *, int, u_char *, int));
  385. int ucsfncmp __P((u_int16_t *, int, u_int16_t *, int));
  386. void isofntrans __P((u_char *, int, u_char *, u_short *, int));
  387. void ucsfntrans __P((u_int16_t *, int, u_char *, u_short *, int));
  388. ino_t isodirino __P((struct iso_directory_record *, struct iso_mnt *));
  389. int attrcalcsize __P((struct attrlist *attrlist));
  390. void packattrblk __P((struct attrlist *alist, struct vnode *vp,
  391.                       void **attrbufptrptr, void **varbufptrptr));
  392.  
  393.  
  394. /*
  395.  * Associated files have a leading '='.
  396.  */
  397. #define    ASSOCCHAR    '='
  398.  
  399. #endif /* ! _ISO_H_ */
  400.