Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 14 Nov 1997 22:40:04 -0800 (PST)
From:      Keith Jang <keith@keith.private>
To:        freebsd-bugs
Subject:   Re: kern/5038
Message-ID:  <199711150640.WAA03769@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/5038; it has been noted by GNATS.

From: Keith Jang <keith@keith.private>
To: freebsd-gnats-submit@freebsd.org
Cc:  Subject: Re: kern/5038
Date: Sat, 15 Nov 1997 14:32:48 +0800 (CST)

 The following are three files with a patch for reading joliet.
 
 /sys/isofs/cd9660/cd9660_joliet.h:
 
 begin 644 cd9660_joliet.h.gz
 M'XL("`E9;#0``V-D.38V,%]J;VQI970N:`!U4FUKVS`8_.Y?<3`86_'RNI:$
 M?NIB=Z1X-#0A7\8HBOPX%E,L(\EMPMA_WR,EA<(2,+*MTYWN3NI?);C"#R6M
 M<:;R>#!:D4>^]SUX@_GR<7IS,\`L@VM)JDI)X95IF-1/DGXDGRB=(X=EU[::
 M=M1X80]8&]WM"!DY:57KC85P$`V$]F0;%GHAWB1H+*S:G67TL*H)"^%KK,1&
 M$S[BR1B/3%F2C!_P1-+8,HB8"LMUAHWAQ:U1C0\)!$I55639$@JS9?\:W[21
 MO^%KMK)89RE>:R7KH*!-L^4=ND9)4Q(JI:D1.\YER:F2>F=BEU2IAE=L#IYX
 M5Z="/9B\F>'`]UIL78K)],MP-`@3N9.BC6*8GWH;1[X+K!,:<U?*.D[Q:K#K
 M^&-#&.Q'U^R07]6I.M6XSG*/M7+@1[P9FV5'#09L>;1GJ>4@W(3C68*F%])I
 MT!CLOP[2,([C>(V*SRK"&*88I>!Y9O(-"&>F#\<B_*$EC@_G;2<]_B2`K(5%
 M%0(#^,FW)YL5^`1,4O['Y/.OV^1ON%3/#X_%/%\]WQ=WWV^3BTH4NWBO-)FR
 M$O?XGU*^G-TM<M;Z<#R1]]@\&\;BSF.CV.8YK,C7>3&,[5R$1[&VB_`X]IDD
 *_P"42;O1:`,``-;Z
 `
 end
 
 /sys/isofs/cd9660/cd9660_joliet.c:
 
 begin 644 cd9660_joliet.c.gz
 M'XL("`E9;#0``V-D.38V,%]J;VQI970N8P"-4LMNFT`47<-77"52`O@)D5(U
 M)%[5E1Q9RJ)5-Y&%"(QC$IA!\W!B6?[W7@8H8!RK"WN8,^?<Q[GW,J%1JF("
 M]V(G)GG(PVR\F9F7'1A_\@3\HM9]<$M93/IPQA25??B=<$K2`F\])(*MQ22*
 MO]_>3B=XZ<HZK^41]'.>8KVQ-"'R#`\O+9*94`D=:?!*)`TS8@G)522AX,<)
 M)Y%D?!?@R7@,#J((#DW#,`"B3<C!84JB64-0@=@P+C60$FJ;>Q-J$+\`BNA!
 M$G_"`TR'&LG"ST"CR$?4PNA49<$WU[6M,M-H5K_;OHF:*G@10M^QV"C?674-
 M%^/Q14E,UF!93CL(/*#(AJNK=A[+4D'9AMU+6`A<V]:5-GE='P&2"O)%"O=,
 MBGY37R3QZB0:GSCPDW&@[`/>E,#1O%+&"5"5IGH&820)%^!,-'N-5*OMM=\X
 M?]^QO'D8#&S8:W7E7+M0^[FFK4H/32-B5"94$;_2-'Z<$5[[URA]X21\[^CV
 MIE'.[[DR8%7MPJE`OFE8]88-!G6<@UG^X\&)5)S67OKFX=2NIV1+TO:F"Y7G
 M*<D(E2%N>TQ$Q),<-Q\<L8W+5=;M67@=S?`YS+&JJ>YK\>LI>'Q:+N:_@\4/
 M/?ZJJB.VVV=[=NV[^$ADM#F6>*MF+E&(7K74R_F?^=*]^]>QZP-TS#TI\!J!
 I]U^"FT9P<RR(R3I4J;PKOBO.",MH<8K!')I-;M-P,G\!MVX89J$%```I
 `
 end
 
 /sys/isofs/cd9660/iso_joliet.h:
 
 begin 644 iso_joliet.h.gz
 M'XL("`E9;#0``VES;U]J;VQI970N:`!UD,U.PS`0A,_Q4ZS$!:**AOY)54]`
 M`DI)Z:'`U0KVFAJE=F1OJO+VV#WUX/IB:;X9SZ['.8,<-EHXZZTB6-M.(T%U
 MHGL@"_5NNUPL"G@NP?<HM-*B)6U-"(T9NY&HM,'HXNMM4U<?O"X?H#A-YFDV
 MB4RE6%-]54V,SHJK.*9GTZMX&O$\.=7+^^9Q]Q:X"B?I**NGSU?&M"$0,J[,
 M?\\_P7^03'O`6T]N$`3:6RZU0T'6_?%P6R<A#VH01RS+,@"Q;QWD=J#O08U@
 MX'YO'9V%#LW=*M'1X1&[RP8_]'V'!S34AA:)7CC=AT;(_5&&)_X!ZD!VR;8!
 "``!O
 `
 end
 
 patch for /sys:
 
 diff -c -r sys/conf/files sys.keith/conf/files
 *** sys/conf/files	Thu Nov 13 03:25:21 1997
 --- sys.keith/conf/files	Fri Nov 14 22:03:23 1997
 ***************
 *** 61,66 ****
 --- 61,67 ----
   isofs/cd9660/cd9660_util.c	optional cd9660
   isofs/cd9660/cd9660_vfsops.c	optional cd9660
   isofs/cd9660/cd9660_vnops.c	optional cd9660
 + isofs/cd9660/cd9660_joliet.c	optional cd9660
   kern/imgact_aout.c	standard
   kern/imgact_elf.c	standard
   kern/imgact_gzip.c	optional gzip
 diff -c -r sys/conf/files.newconf sys.keith/conf/files.newconf
 *** sys/conf/files.newconf	Thu Nov 13 03:25:21 1997
 --- sys.keith/conf/files.newconf	Fri Nov 14 22:03:23 1997
 ***************
 *** 39,44 ****
 --- 39,45 ----
   file	isofs/cd9660/cd9660_util.c	cd9660
   file	isofs/cd9660/cd9660_vfsops.c	cd9660
   file	isofs/cd9660/cd9660_vnops.c	cd9660
 + file	isofs/cd9660/cd9660_joliet.c	cd9660
   file	kern/init_main.c
   file	kern/init_sysent.c
   file	kern/kern_acct.c
 Only in sys.keith/isofs/cd9660: cd9660_joliet.c
 Only in sys.keith/isofs/cd9660: cd9660_joliet.h
 diff -c -r sys/isofs/cd9660/cd9660_lookup.c sys.keith/isofs/cd9660/cd9660_lookup.c
 *** sys/isofs/cd9660/cd9660_lookup.c	Thu Nov 13 03:26:37 1997
 --- sys.keith/isofs/cd9660/cd9660_lookup.c	Fri Nov 14 22:03:43 1997
 ***************
 *** 50,56 ****
 --- 50,58 ----
   
   #include <isofs/cd9660/iso.h>
   #include <isofs/cd9660/cd9660_node.h>
 + #include <isofs/cd9660/cd9660_joliet.h>
   #include <isofs/cd9660/iso_rrip.h>
 + #include <isofs/cd9660/iso_joliet.h>
   
   /*
    * Convert a component of a pathname into a pointer to a locked inode.
 ***************
 *** 267,272 ****
 --- 269,287 ----
   				goto found;
   			ino = 0;
   			break;
 + 		case ISO_FTYPE_JOLIET:
 + 		  if (isonum_711(ep->flags)&2)
 + 		    ino = isodirino(ep, imp);
 + 		  else
 + 		    ino = dbtob(bp->b_blkno) + entryoffsetinblock;
 + 
 + 		  dp->i_ino = ino;
 + 		  cd9660_joliet_getname(ep,altname,&namelen);
 + 		  if (namelen == cnp->cn_namelen
 + 		      && !bcmp(name, altname, namelen))
 + 		    goto found;
 + 		  ino = 0;
 + 		  break;
   		}
   		dp->i_offset += reclen;
   		entryoffsetinblock += reclen;
 diff -c -r sys/isofs/cd9660/cd9660_mount.h sys.keith/isofs/cd9660/cd9660_mount.h
 *** sys/isofs/cd9660/cd9660_mount.h	Thu Nov 13 03:26:37 1997
 --- sys.keith/isofs/cd9660/cd9660_mount.h	Fri Nov 14 22:03:43 1997
 ***************
 *** 47,52 ****
   	int	flags;			/* mounting flags, see below */
   	int	ssector;		/* starting sector, 0 for 1st session */
   };
 ! #define	ISOFSMNT_NORRIP	0x00000001	/* disable Rock Ridge Ext.*/
 ! #define	ISOFSMNT_GENS	0x00000002	/* enable generation numbers */
 ! #define	ISOFSMNT_EXTATT	0x00000004	/* enable extended attributes */
 --- 47,53 ----
   	int	flags;			/* mounting flags, see below */
   	int	ssector;		/* starting sector, 0 for 1st session */
   };
 ! #define	ISOFSMNT_NORRIP   0x00000001	/* disable Rock Ridge Ext.*/
 ! #define	ISOFSMNT_GENS     0x00000002	/* enable generation numbers */
 ! #define	ISOFSMNT_EXTATT   0x00000004	/* enable extended attributes */
 ! #define ISOFSMNT_NOJOLIET 0x00000008    /* disable Microsoft Joliet Ext.*/
 diff -c -r sys/isofs/cd9660/cd9660_vfsops.c sys.keith/isofs/cd9660/cd9660_vfsops.c
 *** sys/isofs/cd9660/cd9660_vfsops.c	Thu Nov 13 03:26:37 1997
 --- sys.keith/isofs/cd9660/cd9660_vfsops.c	Fri Nov 14 22:03:43 1997
 ***************
 *** 55,61 ****
 --- 55,63 ----
   #include <sys/stat.h>
   
   #include <isofs/cd9660/iso.h>
 + #include <isofs/cd9660/iso_joliet.h>
   #include <isofs/cd9660/iso_rrip.h>
 + #include <isofs/cd9660/cd9660_joliet.h>
   #include <isofs/cd9660/cd9660_node.h>
   #include <isofs/cd9660/cd9660_mount.h>
   
 ***************
 *** 261,267 ****
   	struct iso_args *argp;
   {
   	register struct iso_mnt *isomp = (struct iso_mnt *)0;
 ! 	struct buf *bp = NULL;
   	dev_t dev = devvp->v_rdev;
   	int error = EINVAL;
   	int needclose = 0;
 --- 263,269 ----
   	struct iso_args *argp;
   {
   	register struct iso_mnt *isomp = (struct iso_mnt *)0;
 ! 	struct buf *bp = NULL, *joliet_bp = NULL;
   	dev_t dev = devvp->v_rdev;
   	int error = EINVAL;
   	int needclose = 0;
 ***************
 *** 271,279 ****
 --- 273,283 ----
   	int iso_blknum;
   	struct iso_volume_descriptor *vdp = 0;
   	struct iso_primary_descriptor *pri;
 + 	struct iso_supplementary_descriptor *sup = NULL;
   	struct iso_sierra_primary_descriptor *pri_sierra;
   	struct iso_directory_record *rootp;
   	int logical_block_size;
 + 	int joliet_level = -1;
   
   	if (!ronly)
   		return EROFS;
 ***************
 *** 316,321 ****
 --- 320,344 ----
   				goto out;
   			} else
   				high_sierra = 1;
 + 		} else {
 + 		  /*
 + 		   * We know it's ISO9660 fs, now get Supplementary Volume
 + 		   * Descriptor to check if it's Microsoft Joliet format.
 + 		   */
 + 		  if (error = bread(devvp, (1 + iso_blknum) * btodb(iso_bsize),
 + 				    iso_bsize, NOCRED, &joliet_bp))
 + 		    goto out;
 + 
 + 		  sup = (struct iso_supplementary_descriptor *)joliet_bp->b_data;
 + 		  joliet_level = cd9660_joliet_level(sup);
 + 
 + 		  if (joliet_level < 0) {
 + 		    argp->flags |= ISOFSMNT_NOJOLIET;
 + 		  } else {
 + 		    argp->flags |= ISOFSMNT_NORRIP;
 + 		    argp->flags &= ~ISOFSMNT_GENS;
 + 		  }
 + 		  break;
   		}
   
   		if (isonum_711 (high_sierra? vdp->type_sierra: vdp->type) == ISO_VD_END) {
 ***************
 *** 328,340 ****
   		brelse(bp);
   	}
   
 ! 	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 (high_sierra?
 --- 351,363 ----
   		brelse(bp);
   	}
   
 ! 	if ((isonum_711 (high_sierra? vdp->type_sierra: vdp->type) != ISO_VD_PRIMARY) && (isonum_711 (high_sierra? vdp->type_sierra: vdp->type) != ISO_VD_SUPPLEMENTARY)) {
   		error = EINVAL;
   		goto out;
   	}
   
   	pri_sierra = (struct iso_sierra_primary_descriptor *)vdp;
 + 	pri = (struct iso_primary_descriptor *)vdp;
   
   	logical_block_size =
   		isonum_723 (high_sierra?
 ***************
 *** 350,356 ****
   	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);
 --- 373,381 ----
   	rootp = (struct iso_directory_record *)
   		(high_sierra?
   		 pri_sierra->root_directory_record:
 ! 		 ((joliet_level < 0)?
 ! 		  pri->root_directory_record:
 ! 		  sup->root_directory_record));
   
   	isomp = malloc(sizeof *isomp, M_ISOFSMNT, M_WAITOK);
   	bzero((caddr_t)isomp, sizeof *isomp);
 ***************
 *** 380,385 ****
 --- 405,412 ----
   	bp->b_flags |= B_AGE;
   	brelse(bp);
   	bp = NULL;
 + 	brelse(joliet_bp);
 + 	joliet_bp = NULL;
   
   	mp->mnt_data = (qaddr_t)isomp;
   	mp->mnt_stat.f_fsid.val[0] = (long)dev;
 ***************
 *** 416,439 ****
   		brelse(bp);
   		bp = NULL;
   	}
 ! 	isomp->im_flags = argp->flags&(ISOFSMNT_NORRIP|ISOFSMNT_GENS|ISOFSMNT_EXTATT);
   
   	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:
   	if (bp)
 --- 443,469 ----
   		brelse(bp);
   		bp = NULL;
   	}
 ! 	isomp->im_flags = argp->flags&(ISOFSMNT_NORRIP|ISOFSMNT_GENS|ISOFSMNT_EXTATT|ISOFSMNT_NOJOLIET);
   
   	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|
 ! 					 ISOFSMNT_NOJOLIET)) {
   		  default:
   			  isomp->iso_ftype = ISO_FTYPE_DEFAULT;
   			  break;
 ! 		  case ISOFSMNT_GENS|ISOFSMNT_NORRIP|ISOFSMNT_NOJOLIET:
   			  isomp->iso_ftype = ISO_FTYPE_9660;
   			  break;
 ! 		  case ISOFSMNT_NOJOLIET:
   			  isomp->iso_ftype = ISO_FTYPE_RRIP;
   			  break;
 + 		  case ISOFSMNT_NORRIP:
 + 		          isomp->iso_ftype = ISO_FTYPE_JOLIET;
 + 			  break;
   		}
   	return 0;
   out:
   	if (bp)
 ***************
 *** 507,513 ****
   	struct iso_directory_record *dp =
   	    (struct iso_directory_record *)imp->root;
   	ino_t ino = isodirino(dp, imp);
 ! 	
   	/*
   	 * With RRIP we must use the `.' entry of the root directory.
   	 * Simply tell vget, that it's a relocated directory.
 --- 537,543 ----
   	struct iso_directory_record *dp =
   	    (struct iso_directory_record *)imp->root;
   	ino_t ino = isodirino(dp, imp);
 ! 
   	/*
   	 * With RRIP we must use the `.' entry of the root directory.
   	 * Simply tell vget, that it's a relocated directory.
 diff -c -r sys/isofs/cd9660/cd9660_vnops.c sys.keith/isofs/cd9660/cd9660_vnops.c
 *** sys/isofs/cd9660/cd9660_vnops.c	Thu Nov 13 03:26:37 1997
 --- sys.keith/isofs/cd9660/cd9660_vnops.c	Fri Nov 14 22:03:43 1997
 ***************
 *** 56,61 ****
 --- 56,62 ----
   #include <isofs/cd9660/iso.h>
   #include <isofs/cd9660/cd9660_node.h>
   #include <isofs/cd9660/iso_rrip.h>
 + #include <isofs/cd9660/iso_joliet.h>
   
   static int cd9660_setattr __P((struct vop_setattr_args *));
   static int cd9660_access __P((struct vop_access_args *));
 ***************
 *** 540,545 ****
 --- 541,552 ----
   			if (idp->current.d_namlen)
   				error = iso_uiodir(idp,&idp->current,idp->curroff);
   			break;
 + 		case ISO_FTYPE_JOLIET:
 + 		  cd9660_joliet_getname(ep,idp->current.d_name, &namelen);
 + 		  idp->current.d_namlen = (u_char)namelen;
 + 		  if (idp->current.d_namlen)
 + 		    error = iso_uiodir(idp,&idp->current,idp->curroff);
 + 		  break;
   		default: /* ISO_FTYPE_DEFAULT || ISO_FTYPE_9660 || ISO_FTYPE_HIGH_SIERRA*/
   			strcpy(idp->current.d_name,"..");
   			switch (ep->name[0]) {
 diff -c -r sys/isofs/cd9660/iso.h sys.keith/isofs/cd9660/iso.h
 *** sys/isofs/cd9660/iso.h	Thu Nov 13 03:26:37 1997
 --- sys.keith/isofs/cd9660/iso.h	Fri Nov 14 22:03:43 1997
 ***************
 *** 54,59 ****
 --- 54,60 ----
   
   /* volume descriptor types */
   #define ISO_VD_PRIMARY 1
 + #define ISO_VD_SUPPLEMENTARY 2
   #define ISO_VD_END 255
   
   #define ISO_STANDARD_ID "CD001"
 ***************
 *** 98,103 ****
 --- 99,145 ----
   };
   #define ISO_DEFAULT_BLOCK_SIZE		2048
   
 + /*
 +  * Used by Microsoft Joliet extension to ISO9660. Almost the same
 +  * as PVD, but byte position 8 is a flag, and 89-120 is for escape.
 +  */
 + 
 + struct iso_supplementary_descriptor {
 + 	char type			[ISODCL (  1,	1)]; /* 711 */
 + 	char id				[ISODCL (  2,	6)];
 + 	char version			[ISODCL (  7,	7)]; /* 711 */
 + 	char flags			[ISODCL (  8,	8)];
 + 	char system_id			[ISODCL (  9,  40)]; /* achars */
 + 	char volume_id			[ISODCL ( 41,  72)]; /* dchars */
 + 	char unused2			[ISODCL ( 73,  80)];
 + 	char volume_space_size		[ISODCL ( 81,  88)]; /* 733 */
 + 	char escape			[ISODCL ( 89, 120)];
 + 	char volume_set_size		[ISODCL (121, 124)]; /* 723 */
 + 	char volume_sequence_number	[ISODCL (125, 128)]; /* 723 */
 + 	char logical_block_size		[ISODCL (129, 132)]; /* 723 */
 + 	char path_table_size		[ISODCL (133, 140)]; /* 733 */
 + 	char type_l_path_table		[ISODCL (141, 144)]; /* 731 */
 + 	char opt_type_l_path_table	[ISODCL (145, 148)]; /* 731 */
 + 	char type_m_path_table		[ISODCL (149, 152)]; /* 732 */
 + 	char opt_type_m_path_table	[ISODCL (153, 156)]; /* 732 */
 + 	char root_directory_record	[ISODCL (157, 190)]; /* 9.1 */
 + 	char volume_set_id		[ISODCL (191, 318)]; /* dchars */
 + 	char publisher_id		[ISODCL (319, 446)]; /* achars */
 + 	char preparer_id		[ISODCL (447, 574)]; /* achars */
 + 	char application_id		[ISODCL (575, 702)]; /* achars */
 + 	char copyright_file_id		[ISODCL (703, 739)]; /* 7.5 dchars */
 + 	char abstract_file_id		[ISODCL (740, 776)]; /* 7.5 dchars */
 + 	char bibliographic_file_id	[ISODCL (777, 813)]; /* 7.5 dchars */
 + 	char creation_date		[ISODCL (814, 830)]; /* 8.4.26.1 */
 + 	char modification_date		[ISODCL (831, 847)]; /* 8.4.26.1 */
 + 	char expiration_date		[ISODCL (848, 864)]; /* 8.4.26.1 */
 + 	char effective_date		[ISODCL (865, 881)]; /* 8.4.26.1 */
 + 	char file_structure_version	[ISODCL (882, 882)]; /* 711 */
 + 	char unused4			[ISODCL (883, 883)];
 + 	char application_data		[ISODCL (884, 1395)];
 + 	char unused5			[ISODCL (1396, 2048)];
 + };
 + 
   struct iso_sierra_primary_descriptor {
   	char unknown1			[ISODCL (  1,	8)]; /* 733 */
   	char type			[ISODCL (  9,	9)]; /* 711 */
 ***************
 *** 175,181 ****
   
   /* CD-ROM Format type */
   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
 --- 217,223 ----
   
   /* CD-ROM Format type */
   enum ISO_FTYPE	{ ISO_FTYPE_DEFAULT, ISO_FTYPE_9660, ISO_FTYPE_RRIP,
 ! 		  ISO_FTYPE_JOLIET, ISO_FTYPE_ECMA, ISO_FTYPE_HIGH_SIERRA };
   
   #ifndef	ISOFSMNT_ROOT
   #define	ISOFSMNT_ROOT	0
 Only in sys.keith/isofs/cd9660: iso_joliet.h



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199711150640.WAA03769>