aboutsummaryrefslogtreecommitdiff
path: root/sys/fs/cd9660
diff options
context:
space:
mode:
authorJoerg Wunsch <joerg@FreeBSD.org>1995-01-16 17:03:29 +0000
committerJoerg Wunsch <joerg@FreeBSD.org>1995-01-16 17:03:29 +0000
commit988fa8efe3a07ad5a45a012eadf67cadcfb58ba7 (patch)
treedef197b76a0dbb2e02ce9cadbaf5ba6564e42704 /sys/fs/cd9660
parent87cf6d44c77fa183b88e353c360171a9a1129098 (diff)
downloadsrc-988fa8efe3a07ad5a45a012eadf67cadcfb58ba7.tar.gz
src-988fa8efe3a07ad5a45a012eadf67cadcfb58ba7.zip
Roll in my changes to make the cd9660 code understand the older
(original "High Sierra") CD format. I've already implemented this for 1.1.5.1 (and posted to -hackers), but didn't get any response to it. Perhaps i'm the only one who has such an old CD lying around... Everything is done empirically, but i had three of them around (from different vendors), so there's a high probability that i've got it right. :)
Notes
Notes: svn path=/head/; revision=5651
Diffstat (limited to 'sys/fs/cd9660')
-rw-r--r--sys/fs/cd9660/TODO4
-rw-r--r--sys/fs/cd9660/cd9660_lookup.c9
-rw-r--r--sys/fs/cd9660/cd9660_node.c46
-rw-r--r--sys/fs/cd9660/cd9660_node.h10
-rw-r--r--sys/fs/cd9660/cd9660_rrip.c23
-rw-r--r--sys/fs/cd9660/cd9660_rrip.h54
-rw-r--r--sys/fs/cd9660/cd9660_vfsops.c69
-rw-r--r--sys/fs/cd9660/cd9660_vnops.c19
-rw-r--r--sys/fs/cd9660/iso.h62
9 files changed, 191 insertions, 105 deletions
diff --git a/sys/fs/cd9660/TODO b/sys/fs/cd9660/TODO
index 555d26ad7d11..de414974103b 100644
--- a/sys/fs/cd9660/TODO
+++ b/sys/fs/cd9660/TODO
@@ -1,8 +1,10 @@
-# $Id: TODO,v 1.4 1993/09/07 15:40:51 ws Exp $
+# $Id: TODO,v 1.1.1.1 1994/05/24 10:04:12 rgrimes Exp $
1) should understand "older", original High Sierra ("CDROM001") type
Not yet. ( I don't have this technical information, yet. )
+ Done. (16-Jan-95, Joerg Wunsch joerg@freebsd.org)
+
2) should understand Rock Ridge
diff --git a/sys/fs/cd9660/cd9660_lookup.c b/sys/fs/cd9660/cd9660_lookup.c
index 800a9da8be3e..9ae15f60e472 100644
--- a/sys/fs/cd9660/cd9660_lookup.c
+++ b/sys/fs/cd9660/cd9660_lookup.c
@@ -38,7 +38,7 @@
* from: @(#)ufs_lookup.c 7.33 (Berkeley) 5/19/91
*
* @(#)cd9660_lookup.c 8.2 (Berkeley) 1/23/94
- * $Id: cd9660_lookup.c,v 1.4 1994/09/15 19:45:58 bde Exp $
+ * $Id: cd9660_lookup.c,v 1.5 1994/09/26 00:32:54 gpalmer Exp $
*/
#include <sys/param.h>
@@ -116,6 +116,7 @@ cd9660_lookup(ap)
ino_t ino = 0;
int reclen;
u_short namelen;
+ int isoflags;
char altname[NAME_MAX];
int res;
int assoc, len;
@@ -276,6 +277,8 @@ searchloop:
* Check for a name match.
*/
namelen = isonum_711(ep->name_len);
+ isoflags = isonum_711(imp->iso_ftype == ISO_FTYPE_HIGH_SIERRA?
+ &ep->date[6]: ep->flags);
if (reclen < ISO_DIRECTORY_RECORD_SIZE + namelen)
/* illegal entry, stop */
@@ -283,7 +286,7 @@ searchloop:
switch (imp->iso_ftype) {
default:
- if ((!(isonum_711(ep->flags)&4)) == !assoc) {
+ if (!(isoflags & 4) == !assoc) {
if ((len == 1
&& *name == '.')
|| (flags & ISDOTDOT)) {
@@ -302,7 +305,7 @@ searchloop:
goto notfound;
} else if (!(res = isofncmp(name,len,
ep->name,namelen))) {
- if (isonum_711(ep->flags)&2)
+ if (isoflags & 2)
isodirino(&ino,ep,imp);
else
ino = dbtob(bp->b_blkno)
diff --git a/sys/fs/cd9660/cd9660_node.c b/sys/fs/cd9660/cd9660_node.c
index 9fc8bff5ce99..137c091a05b9 100644
--- a/sys/fs/cd9660/cd9660_node.c
+++ b/sys/fs/cd9660/cd9660_node.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)cd9660_node.c 8.2 (Berkeley) 1/23/94
- * $Id: cd9660_node.c,v 1.6 1994/09/26 00:32:56 gpalmer Exp $
+ * $Id: cd9660_node.c,v 1.7 1994/10/06 21:06:17 davidg Exp $
*/
#include <sys/param.h>
@@ -266,13 +266,13 @@ loop:
*/
vp->v_type = VNON;
switch (imp->iso_ftype) {
- default: /* ISO_FTYPE_9660 */
+ default: /* ISO_FTYPE_9660 || ISO_FTYPE_HIGH_SIERRA */
if ((imp->im_flags&ISOFSMNT_EXTATT)
&& isonum_711(isodir->ext_attr_length))
iso_blkatoff(ip,-isonum_711(isodir->ext_attr_length),
&bp2);
- cd9660_defattr(isodir,ip,bp2 );
- cd9660_deftstamp(isodir,ip,bp2 );
+ cd9660_defattr(isodir,ip,bp2,imp->iso_ftype );
+ cd9660_deftstamp(isodir,ip,bp2,imp->iso_ftype );
break;
case ISO_FTYPE_RRIP:
result = cd9660_rrip_analyze(isodir,ip,imp);
@@ -453,17 +453,20 @@ iso_iunlock(ip)
* File attributes
*/
void
-cd9660_defattr(isodir,inop,bp)
+cd9660_defattr(isodir,inop,bp,ftype)
struct iso_directory_record *isodir;
struct iso_node *inop;
struct buf *bp;
+ enum ISO_FTYPE ftype;
{
struct buf *bp2 = NULL;
struct iso_mnt *imp;
struct iso_extended_attributes *ap = NULL;
int off;
- if (isonum_711(isodir->flags)&2) {
+ /* high sierra does not have timezone data, flag is one byte ahead */
+ if (isonum_711(ftype == ISO_FTYPE_HIGH_SIERRA?
+ &isodir->date[6]: isodir->flags)&2) {
inop->inode.iso_mode = S_IFDIR;
/*
* If we return 2, fts() will assume there are no subdirectories
@@ -514,10 +517,11 @@ cd9660_defattr(isodir,inop,bp)
* Time stamps
*/
void
-cd9660_deftstamp(isodir,inop,bp)
+cd9660_deftstamp(isodir,inop,bp,ftype)
struct iso_directory_record *isodir;
struct iso_node *inop;
struct buf *bp;
+ enum ISO_FTYPE ftype;
{
struct buf *bp2 = NULL;
struct iso_mnt *imp;
@@ -533,7 +537,8 @@ cd9660_deftstamp(isodir,inop,bp)
if (bp) {
ap = (struct iso_extended_attributes *)bp->b_un.b_addr;
- if (isonum_711(ap->version) == 1) {
+ if (ftype != ISO_FTYPE_HIGH_SIERRA
+ && isonum_711(ap->version) == 1) {
if (!cd9660_tstamp_conv17(ap->ftime,&inop->inode.iso_atime))
cd9660_tstamp_conv17(ap->ctime,&inop->inode.iso_atime);
if (!cd9660_tstamp_conv17(ap->ctime,&inop->inode.iso_ctime))
@@ -544,7 +549,7 @@ cd9660_deftstamp(isodir,inop,bp)
ap = NULL;
}
if (!ap) {
- cd9660_tstamp_conv7(isodir->date,&inop->inode.iso_ctime);
+ cd9660_tstamp_conv7(isodir->date,&inop->inode.iso_ctime,ftype);
inop->inode.iso_atime = inop->inode.iso_ctime;
inop->inode.iso_mtime = inop->inode.iso_ctime;
}
@@ -553,9 +558,10 @@ cd9660_deftstamp(isodir,inop,bp)
}
int
-cd9660_tstamp_conv7(pi,pu)
+cd9660_tstamp_conv7(pi,pu,ftype)
char *pi;
struct timespec *pu;
+enum ISO_FTYPE ftype;
{
int crtime, days;
int y, m, d, hour, minute, second, tz;
@@ -566,7 +572,11 @@ struct timespec *pu;
hour = pi[3];
minute = pi[4];
second = pi[5];
- tz = pi[6];
+ if(ftype != ISO_FTYPE_HIGH_SIERRA)
+ tz = pi[6];
+ else
+ /* original high sierra misses timezone data */
+ tz = 0;
if (y < 1970) {
pu->ts_sec = 0;
@@ -616,28 +626,28 @@ cd9660_tstamp_conv17(pi,pu)
{
unsigned char buf[7];
- /* year:"0001"-"9999" -> -1900 */
+ /* year:"0001"-"9999" -> -1900 */
buf[0] = cd9660_chars2ui(pi,4) - 1900;
- /* month: " 1"-"12" -> 1 - 12 */
+ /* month: " 1"-"12" -> 1 - 12 */
buf[1] = cd9660_chars2ui(pi + 4,2);
- /* day: " 1"-"31" -> 1 - 31 */
+ /* day: " 1"-"31" -> 1 - 31 */
buf[2] = cd9660_chars2ui(pi + 6,2);
- /* hour: " 0"-"23" -> 0 - 23 */
+ /* hour: " 0"-"23" -> 0 - 23 */
buf[3] = cd9660_chars2ui(pi + 8,2);
- /* minute:" 0"-"59" -> 0 - 59 */
+ /* minute:" 0"-"59" -> 0 - 59 */
buf[4] = cd9660_chars2ui(pi + 10,2);
- /* second:" 0"-"59" -> 0 - 59 */
+ /* second:" 0"-"59" -> 0 - 59 */
buf[5] = cd9660_chars2ui(pi + 12,2);
/* difference of GMT */
buf[6] = pi[16];
- return cd9660_tstamp_conv7(buf,pu);
+ return cd9660_tstamp_conv7(buf, pu, ISO_FTYPE_DEFAULT);
}
void
diff --git a/sys/fs/cd9660/cd9660_node.h b/sys/fs/cd9660/cd9660_node.h
index d1839ef42932..ca7627ed6e6b 100644
--- a/sys/fs/cd9660/cd9660_node.h
+++ b/sys/fs/cd9660/cd9660_node.h
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)cd9660_node.h 8.2 (Berkeley) 1/23/94
- * $Id: cd9660_node.h,v 1.2 1994/08/02 07:41:22 davidg Exp $
+ * $Id: cd9660_node.h,v 1.3 1994/09/15 19:46:00 bde Exp $
*/
/*
@@ -94,7 +94,7 @@ struct iso_node {
long i_size;
long iso_start; /* actual start of data of file (may be different */
/* from iso_extent, if file has extended attributes) */
- ISO_RRIP_INODE inode;
+ ISO_RRIP_INODE inode;
};
#define i_forw i_chain[0]
@@ -135,10 +135,10 @@ int cd9660_strategy __P((struct vop_strategy_args *));
int cd9660_print __P((struct vop_print_args *));
int cd9660_islocked __P((struct vop_islocked_args *));
void cd9660_defattr __P((struct iso_directory_record *,
- struct iso_node *, struct buf *));
+ struct iso_node *, struct buf *, enum ISO_FTYPE));
void cd9660_deftstamp __P((struct iso_directory_record *,
- struct iso_node *, struct buf *));
-int cd9660_tstamp_conv7 __P((char *pi, struct timespec *pu));
+ struct iso_node *, struct buf *, enum ISO_FTYPE));
+int cd9660_tstamp_conv7 __P((char *pi, struct timespec *pu, enum ISO_FTYPE));
int cd9660_tstamp_conv17 __P((unsigned char *pi, struct timespec *pu));
void isodirino __P((ino_t *inump, struct iso_directory_record *isodir,
struct iso_mnt *imp));
diff --git a/sys/fs/cd9660/cd9660_rrip.c b/sys/fs/cd9660/cd9660_rrip.c
index 2659b0dc8dee..87767ea2d1c2 100644
--- a/sys/fs/cd9660/cd9660_rrip.c
+++ b/sys/fs/cd9660/cd9660_rrip.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)cd9660_rrip.c 8.2 (Berkeley) 1/23/94
- * $Id: cd9660_rrip.c,v 1.4 1994/09/15 19:46:01 bde Exp $
+ * $Id: cd9660_rrip.c,v 1.5 1994/09/26 00:32:57 gpalmer Exp $
*/
#include <sys/param.h>
@@ -80,7 +80,7 @@ cd9660_rrip_defattr(isodir,ana)
{
/* But this is a required field! */
printf("RRIP without PX field?\n");
- cd9660_defattr(isodir,ana->inop,NULL);
+ cd9660_defattr(isodir,ana->inop,NULL,ISO_FTYPE_RRIP);
}
/*
@@ -88,7 +88,7 @@ cd9660_rrip_defattr(isodir,ana)
*/
static int
cd9660_rrip_slink(p,ana)
- ISO_RRIP_SLINK *p;
+ ISO_RRIP_SLINK *p;
ISO_RRIP_ANALYZE *ana;
{
register ISO_RRIP_SLINK_COMPONENT *pcomp;
@@ -286,7 +286,7 @@ cd9660_rrip_defname(isodir,ana)
*/
static int
cd9660_rrip_pclink(p,ana)
- ISO_RRIP_CLINK *p;
+ ISO_RRIP_CLINK *p;
ISO_RRIP_ANALYZE *ana;
{
*ana->inump = isonum_733(p->dir_loc) << ana->imp->im_bshift;
@@ -299,7 +299,7 @@ cd9660_rrip_pclink(p,ana)
*/
static int
cd9660_rrip_reldir(p,ana)
- ISO_RRIP_RELDIR *p;
+ ISO_RRIP_RELDIR *p;
ISO_RRIP_ANALYZE *ana;
{
/* special hack to make caller aware of RE field */
@@ -323,19 +323,22 @@ cd9660_rrip_tstamp(p,ana)
ptime += 7;
if (*p->flags&ISO_SUSP_TSTAMP_MODIFY) {
- cd9660_tstamp_conv7(ptime,&ana->inop->inode.iso_mtime);
+ cd9660_tstamp_conv7(ptime,&ana->inop->inode.iso_mtime,
+ ISO_FTYPE_RRIP);
ptime += 7;
} else
bzero(&ana->inop->inode.iso_mtime,sizeof(struct timespec));
if (*p->flags&ISO_SUSP_TSTAMP_ACCESS) {
- cd9660_tstamp_conv7(ptime,&ana->inop->inode.iso_atime);
+ cd9660_tstamp_conv7(ptime,&ana->inop->inode.iso_atime,
+ ISO_FTYPE_RRIP);
ptime += 7;
} else
ana->inop->inode.iso_atime = ana->inop->inode.iso_mtime;
if (*p->flags&ISO_SUSP_TSTAMP_ATTR)
- cd9660_tstamp_conv7(ptime,&ana->inop->inode.iso_ctime);
+ cd9660_tstamp_conv7(ptime,&ana->inop->inode.iso_ctime,
+ ISO_FTYPE_RRIP);
else
ana->inop->inode.iso_ctime = ana->inop->inode.iso_mtime;
@@ -370,7 +373,7 @@ cd9660_rrip_deftstamp(isodir,ana)
struct iso_directory_record *isodir;
ISO_RRIP_ANALYZE *ana;
{
- cd9660_deftstamp(isodir,ana->inop,NULL);
+ cd9660_deftstamp(isodir,ana->inop,NULL,ISO_FTYPE_RRIP);
}
/*
@@ -476,7 +479,7 @@ cd9660_rrip_loop(isodir,ana,table)
/*
* Note: If name length is odd,
- * it will be padding 1 byte after the name
+ * it will be padding 1 byte after the name
*/
pwhead = isodir->name + isonum_711(isodir->name_len);
if (!(isonum_711(isodir->name_len)&1))
diff --git a/sys/fs/cd9660/cd9660_rrip.h b/sys/fs/cd9660/cd9660_rrip.h
index 8a140febb39b..bc9429cbc5ee 100644
--- a/sys/fs/cd9660/cd9660_rrip.h
+++ b/sys/fs/cd9660/cd9660_rrip.h
@@ -36,33 +36,33 @@
* SUCH DAMAGE.
*
* @(#)cd9660_rrip.h 8.1 (Berkeley) 1/21/94
- * $Id$
+ * $Id: cd9660_rrip.h,v 1.2 1994/08/02 07:41:30 davidg Exp $
*/
typedef struct {
- char type [ISODCL ( 0, 1)];
- unsigned char length [ISODCL ( 2, 2)]; /* 711 */
- unsigned char version [ISODCL ( 3, 3)];
+ char type [ISODCL ( 0, 1)];
+ unsigned char length [ISODCL ( 2, 2)]; /* 711 */
+ unsigned char version [ISODCL ( 3, 3)];
} ISO_SUSP_HEADER;
typedef struct {
ISO_SUSP_HEADER h;
- char mode_l [ISODCL ( 4, 7)]; /* 731 */
- char mode_m [ISODCL ( 8, 11)]; /* 732 */
- char links_l [ISODCL ( 12, 15)]; /* 731 */
- char links_m [ISODCL ( 16, 19)]; /* 732 */
- char uid_l [ISODCL ( 20, 23)]; /* 731 */
- char uid_m [ISODCL ( 24, 27)]; /* 732 */
- char gid_l [ISODCL ( 28, 31)]; /* 731 */
- char gid_m [ISODCL ( 32, 35)]; /* 732 */
+ char mode_l [ISODCL ( 4, 7)]; /* 731 */
+ char mode_m [ISODCL ( 8, 11)]; /* 732 */
+ char links_l [ISODCL ( 12, 15)]; /* 731 */
+ char links_m [ISODCL ( 16, 19)]; /* 732 */
+ char uid_l [ISODCL ( 20, 23)]; /* 731 */
+ char uid_m [ISODCL ( 24, 27)]; /* 732 */
+ char gid_l [ISODCL ( 28, 31)]; /* 731 */
+ char gid_m [ISODCL ( 32, 35)]; /* 732 */
} ISO_RRIP_ATTR;
typedef struct {
ISO_SUSP_HEADER h;
- char dev_t_high_l [ISODCL ( 4, 7)]; /* 731 */
- char dev_t_high_m [ISODCL ( 8, 11)]; /* 732 */
- char dev_t_low_l [ISODCL ( 12, 15)]; /* 731 */
- char dev_t_low_m [ISODCL ( 16, 19)]; /* 732 */
+ char dev_t_high_l [ISODCL ( 4, 7)]; /* 731 */
+ char dev_t_high_m [ISODCL ( 8, 11)]; /* 732 */
+ char dev_t_low_l [ISODCL ( 12, 15)]; /* 731 */
+ char dev_t_low_m [ISODCL ( 16, 19)]; /* 732 */
} ISO_RRIP_DEVICE;
#define ISO_SUSP_CFLAG_CONTINUE 0x01
@@ -73,31 +73,31 @@ typedef struct {
#define ISO_SUSP_CFLAG_HOST 0x20
typedef struct {
- u_char cflag [ISODCL ( 1, 1)];
- u_char clen [ISODCL ( 2, 2)];
+ u_char cflag [ISODCL ( 1, 1)];
+ u_char clen [ISODCL ( 2, 2)];
u_char name [0];
} ISO_RRIP_SLINK_COMPONENT;
#define ISO_RRIP_SLSIZ 2
typedef struct {
ISO_SUSP_HEADER h;
- u_char flags [ISODCL ( 4, 4)];
- u_char component [ISODCL ( 5, 5)];
+ u_char flags [ISODCL ( 4, 4)];
+ u_char component [ISODCL ( 5, 5)];
} ISO_RRIP_SLINK;
typedef struct {
ISO_SUSP_HEADER h;
- char flags [ISODCL ( 4, 4)];
+ char flags [ISODCL ( 4, 4)];
} ISO_RRIP_ALTNAME;
typedef struct {
ISO_SUSP_HEADER h;
- char dir_loc [ISODCL ( 4, 11)]; /* 733 */
+ char dir_loc [ISODCL ( 4, 11)]; /* 733 */
} ISO_RRIP_CLINK;
typedef struct {
ISO_SUSP_HEADER h;
- char dir_loc [ISODCL ( 4, 11)]; /* 733 */
+ char dir_loc [ISODCL ( 4, 11)]; /* 733 */
} ISO_RRIP_PLINK;
typedef struct {
@@ -116,18 +116,18 @@ typedef struct {
typedef struct {
ISO_SUSP_HEADER h;
- unsigned char flags [ISODCL ( 4, 4)];
- unsigned char time [ISODCL ( 5, 5)];
+ unsigned char flags [ISODCL ( 4, 4)];
+ unsigned char time [ISODCL ( 5, 5)];
} ISO_RRIP_TSTAMP;
typedef struct {
ISO_SUSP_HEADER h;
- unsigned char flags [ISODCL ( 4, 4)];
+ unsigned char flags [ISODCL ( 4, 4)];
} ISO_RRIP_IDFLAG;
typedef struct {
ISO_SUSP_HEADER h;
- char len_id [ISODCL ( 4, 4)];
+ char len_id [ISODCL ( 4, 4)];
char len_des [ISODCL ( 5, 5)];
char len_src [ISODCL ( 6, 6)];
char version [ISODCL ( 7, 7)];
diff --git a/sys/fs/cd9660/cd9660_vfsops.c b/sys/fs/cd9660/cd9660_vfsops.c
index b1302b121522..7fd09f2d8269 100644
--- a/sys/fs/cd9660/cd9660_vfsops.c
+++ b/sys/fs/cd9660/cd9660_vfsops.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)cd9660_vfsops.c 8.3 (Berkeley) 1/31/94
- * $Id: cd9660_vfsops.c,v 1.8 1994/09/26 00:32:58 gpalmer Exp $
+ * $Id: cd9660_vfsops.c,v 1.9 1994/11/14 07:01:58 bde Exp $
*/
#include <sys/param.h>
@@ -224,11 +224,13 @@ iso_mountfs(devvp, mp, p, argp)
dev_t dev = devvp->v_rdev;
int error = EINVAL;
int needclose = 0;
+ int high_sierra = 0;
int ronly = (mp->mnt_flag & MNT_RDONLY) != 0;
int iso_bsize;
int iso_blknum;
struct iso_volume_descriptor *vdp;
struct iso_primary_descriptor *pri;
+ struct iso_sierra_primary_descriptor *pri_sierra;
struct iso_directory_record *rootp;
int logical_block_size;
@@ -265,28 +267,36 @@ iso_mountfs(devvp, mp, p, argp)
vdp = (struct iso_volume_descriptor *)bp->b_un.b_addr;
if (bcmp (vdp->id, ISO_STANDARD_ID, sizeof vdp->id) != 0) {
- error = EINVAL;
- goto out;
+ if (bcmp (vdp->id_sierra, ISO_SIERRA_ID,
+ sizeof vdp->id) != 0) {
+ error = EINVAL;
+ goto out;
+ } else
+ high_sierra = 1;
}
- if (isonum_711 (vdp->type) == ISO_VD_END) {
+ if (isonum_711 (high_sierra? vdp->type_sierra: vdp->type) == ISO_VD_END) {
error = EINVAL;
goto out;
}
- if (isonum_711 (vdp->type) == ISO_VD_PRIMARY)
+ if (isonum_711 (high_sierra? vdp->type_sierra: vdp->type) == ISO_VD_PRIMARY)
break;
brelse(bp);
}
- if (isonum_711 (vdp->type) != ISO_VD_PRIMARY) {
+ if (isonum_711 (high_sierra? vdp->type_sierra: vdp->type) != ISO_VD_PRIMARY) {
error = EINVAL;
goto out;
}
pri = (struct iso_primary_descriptor *)vdp;
+ pri_sierra = (struct iso_sierra_primary_descriptor *)vdp;
- logical_block_size = isonum_723 (pri->logical_block_size);
+ logical_block_size =
+ isonum_723 (high_sierra?
+ pri_sierra->logical_block_size:
+ pri->logical_block_size);
if (logical_block_size < DEV_BSIZE || logical_block_size > MAXBSIZE
|| (logical_block_size & (logical_block_size - 1)) != 0) {
@@ -294,12 +304,18 @@ iso_mountfs(devvp, mp, p, argp)
goto out;
}
- rootp = (struct iso_directory_record *)pri->root_directory_record;
+ rootp = (struct iso_directory_record *)
+ (high_sierra?
+ pri_sierra->root_directory_record:
+ pri->root_directory_record);
isomp = malloc(sizeof *isomp, M_ISOFSMNT, M_WAITOK);
bzero((caddr_t)isomp, sizeof *isomp);
isomp->logical_block_size = logical_block_size;
- isomp->volume_space_size = isonum_733 (pri->volume_space_size);
+ isomp->volume_space_size =
+ isonum_733 (high_sierra?
+ pri_sierra->volume_space_size:
+ pri->volume_space_size);
bcopy (rootp, isomp->root, sizeof isomp->root);
isomp->root_extent = isonum_733 (rootp->extent);
isomp->root_size = isonum_733 (rootp->size);
@@ -335,9 +351,9 @@ iso_mountfs(devvp, mp, p, argp)
rootp = (struct iso_directory_record *)bp->b_un.b_addr;
if ((isomp->rr_skip = cd9660_rrip_offset(rootp,isomp)) < 0) {
- argp->flags |= ISOFSMNT_NORRIP;
+ argp->flags |= ISOFSMNT_NORRIP;
} else {
- argp->flags &= ~ISOFSMNT_GENS;
+ argp->flags &= ~ISOFSMNT_GENS;
}
/*
@@ -349,17 +365,22 @@ iso_mountfs(devvp, mp, p, argp)
bp = NULL;
}
isomp->im_flags = argp->flags&(ISOFSMNT_NORRIP|ISOFSMNT_GENS|ISOFSMNT_EXTATT);
- switch (isomp->im_flags&(ISOFSMNT_NORRIP|ISOFSMNT_GENS)) {
- default:
- isomp->iso_ftype = ISO_FTYPE_DEFAULT;
- break;
- case ISOFSMNT_GENS|ISOFSMNT_NORRIP:
- isomp->iso_ftype = ISO_FTYPE_9660;
- break;
- case 0:
- isomp->iso_ftype = ISO_FTYPE_RRIP;
- break;
- }
+
+ if(high_sierra)
+ /* this effectively ignores all the mount flags */
+ isomp->iso_ftype = ISO_FTYPE_HIGH_SIERRA;
+ else
+ switch (isomp->im_flags&(ISOFSMNT_NORRIP|ISOFSMNT_GENS)) {
+ default:
+ isomp->iso_ftype = ISO_FTYPE_DEFAULT;
+ break;
+ case ISOFSMNT_GENS|ISOFSMNT_NORRIP:
+ isomp->iso_ftype = ISO_FTYPE_9660;
+ break;
+ case 0:
+ isomp->iso_ftype = ISO_FTYPE_RRIP;
+ break;
+ }
return 0;
out:
@@ -501,7 +522,7 @@ cd9660_statfs(mp, sbp, p)
sbp->f_blocks = isomp->volume_space_size;
sbp->f_bfree = 0; /* total free blocks */
sbp->f_bavail = 0; /* blocks free for non superuser */
- sbp->f_files = 0; /* total files */
+ sbp->f_files = 0; /* total files */
sbp->f_ffree = 0; /* free file nodes */
if (sbp != &mp->mnt_stat) {
bcopy((caddr_t)mp->mnt_stat.f_mntonname,
@@ -574,7 +595,7 @@ cd9660_fhtovp(mp, fhp, nam, vpp, exflagsp, credanonp)
struct iso_mnt *imp;
struct buf *bp;
struct iso_directory_record *dirp;
- struct iso_node tip, *ip, *nip;
+ struct iso_node tip, *ip, *nip;
struct netcred *np;
imp = VFSTOISOFS (mp);
diff --git a/sys/fs/cd9660/cd9660_vnops.c b/sys/fs/cd9660/cd9660_vnops.c
index 280f5f55b6c2..f26af46d2be8 100644
--- a/sys/fs/cd9660/cd9660_vnops.c
+++ b/sys/fs/cd9660/cd9660_vnops.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)cd9660_vnops.c 8.3 (Berkeley) 1/23/94
- * $Id: cd9660_vnops.c,v 1.9 1994/09/26 00:32:59 gpalmer Exp $
+ * $Id: cd9660_vnops.c,v 1.10 1994/09/28 16:44:59 dfr Exp $
*/
#include <sys/param.h>
@@ -290,7 +290,7 @@ cd9660_ioctl(ap)
struct vop_ioctl_args /* {
struct vnode *a_vp;
int a_command;
- caddr_t a_data;
+ caddr_t a_data;
int a_fflag;
struct ucred *a_cred;
struct proc *a_p;
@@ -476,6 +476,7 @@ cd9660_readdir(ap)
struct iso_directory_record *ep;
u_short elen;
int reclen;
+ int isoflags;
struct iso_mnt *imp;
struct iso_node *ip;
struct buf *bp = NULL;
@@ -535,6 +536,8 @@ cd9660_readdir(ap)
(bp->b_un.b_addr + entryoffsetinblock);
reclen = isonum_711 (ep->length);
+ isoflags = isonum_711(imp->iso_ftype == ISO_FTYPE_HIGH_SIERRA?
+ &ep->date[6]: ep->flags);
if (reclen == 0) {
/* skip to next block, if any */
idp->curroff = roundup (idp->curroff,
@@ -555,7 +558,7 @@ cd9660_readdir(ap)
}
idp->current.d_namlen = isonum_711 (ep->name_len);
- if (isonum_711(ep->flags)&2)
+ if (isoflags & 2)
isodirino(&idp->current.d_fileno,ep,imp);
else
idp->current.d_fileno = dbtob(bp->b_blkno) +
@@ -580,7 +583,7 @@ cd9660_readdir(ap)
if (idp->current.d_namlen)
error = iso_uiodir(idp,&idp->current,idp->curroff);
break;
- default: /* ISO_FTYPE_DEFAULT || ISO_FTYPE_9660 */
+ default: /* ISO_FTYPE_DEFAULT || ISO_FTYPE_9660 || ISO_FTYPE_HIGH_SIERRA*/
strcpy(idp->current.d_name,"..");
switch (ep->name[0]) {
case 0:
@@ -595,7 +598,7 @@ cd9660_readdir(ap)
isofntrans(ep->name,idp->current.d_namlen,
idp->current.d_name, &elen,
imp->iso_ftype == ISO_FTYPE_9660,
- isonum_711(ep->flags)&4);
+ isoflags & 4);
idp->current.d_namlen = (u_char)elen;
if (imp->iso_ftype == ISO_FTYPE_DEFAULT)
error = iso_shipdir(idp);
@@ -648,8 +651,8 @@ cd9660_readdir(ap)
* But otherwise the block read here is in the block buffer two times.
*/
typedef struct iso_directory_record ISODIR;
-typedef struct iso_node ISONODE;
-typedef struct iso_mnt ISOMNT;
+typedef struct iso_node ISONODE;
+typedef struct iso_mnt ISOMNT;
int
cd9660_readlink(ap)
struct vop_readlink_args /* {
@@ -659,7 +662,7 @@ cd9660_readlink(ap)
} */ *ap;
{
ISONODE *ip;
- ISODIR *dirp;
+ ISODIR *dirp;
ISOMNT *imp;
struct buf *bp;
u_short symlen;
diff --git a/sys/fs/cd9660/iso.h b/sys/fs/cd9660/iso.h
index 04b9accd1705..858dbb3b7578 100644
--- a/sys/fs/cd9660/iso.h
+++ b/sys/fs/cd9660/iso.h
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)iso.h 8.2 (Berkeley) 1/23/94
- * $Id: iso.h,v 1.2 1994/08/02 07:41:38 davidg Exp $
+ * $Id: iso.h,v 1.3 1994/09/09 11:11:01 dfr Exp $
*/
#define ISODCL(from, to) (to - from + 1)
@@ -45,7 +45,11 @@ struct iso_volume_descriptor {
char type[ISODCL(1,1)]; /* 711 */
char id[ISODCL(2,6)];
char version[ISODCL(7,7)];
- char data[ISODCL(8,2048)];
+ char unused[ISODCL(8,8)];
+ char type_sierra[ISODCL(9,9)]; /* 711 */
+ char id_sierra[ISODCL(10,14)];
+ char version_sierra[ISODCL(15,15)];
+ char data[ISODCL(16,2048)];
};
/* volume descriptor types */
@@ -53,13 +57,15 @@ struct iso_volume_descriptor {
#define ISO_VD_END 255
#define ISO_STANDARD_ID "CD001"
-#define ISO_ECMA_ID "CDW01"
+#define ISO_ECMA_ID "CDW01"
+
+#define ISO_SIERRA_ID "CDROM"
struct iso_primary_descriptor {
- char type [ISODCL ( 1, 1)]; /* 711 */
- char id [ISODCL ( 2, 6)];
- char version [ISODCL ( 7, 7)]; /* 711 */
- char unused1 [ISODCL ( 8, 8)];
+ char type [ISODCL ( 1, 1)]; /* 711 */
+ char id [ISODCL ( 2, 6)];
+ char version [ISODCL ( 7, 7)]; /* 711 */
+ char unused1 [ISODCL ( 8, 8)];
char system_id [ISODCL ( 9, 40)]; /* achars */
char volume_id [ISODCL ( 41, 72)]; /* dchars */
char unused2 [ISODCL ( 73, 80)];
@@ -92,6 +98,43 @@ struct iso_primary_descriptor {
};
#define ISO_DEFAULT_BLOCK_SIZE 2048
+struct iso_sierra_primary_descriptor {
+ char unknown1 [ISODCL ( 1, 8)]; /* 733 */
+ char type [ISODCL ( 9, 9)]; /* 711 */
+ char id [ISODCL ( 10, 14)];
+ char version [ISODCL ( 15, 15)]; /* 711 */
+ char unused1 [ISODCL ( 16, 16)];
+ char system_id [ISODCL ( 17, 48)]; /* achars */
+ char volume_id [ISODCL ( 49, 80)]; /* dchars */
+ char unused2 [ISODCL ( 81, 88)];
+ char volume_space_size [ISODCL ( 89, 96)]; /* 733 */
+ char unused3 [ISODCL ( 97, 128)];
+ char volume_set_size [ISODCL (129, 132)]; /* 723 */
+ char volume_sequence_number [ISODCL (133, 136)]; /* 723 */
+ char logical_block_size [ISODCL (137, 140)]; /* 723 */
+ char path_table_size [ISODCL (141, 148)]; /* 733 */
+ char type_l_path_table [ISODCL (149, 152)]; /* 731 */
+ char opt_type_l_path_table [ISODCL (153, 156)]; /* 731 */
+ char unknown2 [ISODCL (157, 160)]; /* 731 */
+ char unknown3 [ISODCL (161, 164)]; /* 731 */
+ char type_m_path_table [ISODCL (165, 168)]; /* 732 */
+ char opt_type_m_path_table [ISODCL (169, 172)]; /* 732 */
+ char unknown4 [ISODCL (173, 176)]; /* 732 */
+ char unknown5 [ISODCL (177, 180)]; /* 732 */
+ char root_directory_record [ISODCL (181, 214)]; /* 9.1 */
+ char volume_set_id [ISODCL (215, 342)]; /* dchars */
+ char publisher_id [ISODCL (343, 470)]; /* achars */
+ char preparer_id [ISODCL (471, 598)]; /* achars */
+ char application_id [ISODCL (599, 726)]; /* achars */
+ char copyright_id [ISODCL (727, 790)]; /* achars */
+ char creation_date [ISODCL (791, 806)]; /* ? */
+ char modification_date [ISODCL (807, 822)]; /* ? */
+ char expiration_date [ISODCL (823, 838)]; /* ? */
+ char effective_date [ISODCL (839, 854)]; /* ? */
+ char file_structure_version [ISODCL (855, 855)]; /* 711 */
+ char unused4 [ISODCL (856, 2048)];
+};
+
struct iso_directory_record {
char length [ISODCL (1, 1)]; /* 711 */
char ext_attr_length [ISODCL (2, 2)]; /* 711 */
@@ -129,7 +172,8 @@ struct iso_extended_attributes {
};
/* CD-ROM Format type */
-enum ISO_FTYPE { ISO_FTYPE_DEFAULT, ISO_FTYPE_9660, ISO_FTYPE_RRIP, ISO_FTYPE_ECMA };
+enum ISO_FTYPE { ISO_FTYPE_DEFAULT, ISO_FTYPE_9660, ISO_FTYPE_RRIP,
+ ISO_FTYPE_ECMA, ISO_FTYPE_HIGH_SIERRA };
#ifndef ISOFSMNT_ROOT
#define ISOFSMNT_ROOT 0
@@ -153,7 +197,7 @@ struct iso_mnt {
char root[ISODCL (157, 190)];
int root_extent;
int root_size;
- enum ISO_FTYPE iso_ftype;
+ enum ISO_FTYPE iso_ftype;
int rr_skip;
int rr_skip0;