Hiding files on a CD
=====================

This document attempts to show how to hide files from being seen by an
operating system accessing a CD as an ISO9660/Rock Ridge, Joliet or HFS
CD. It also highlights some of the limitations ...

Note: this document is about the various -hide options - not be confused with
the -hidden options.

The -hidden options set the 'EXISTENCE' bit in the directory entry which
means the file or directory will be invisible - unless some special option
is used to mount or view the CD - Linux has the 'unhide' mount option to
make these files visible. i.e. the directory entry exists on the CD.

With hindsight, to avoid confusion with the -hidden option, it would have
been better to chose an option name like '-omit' instead of '-hide'...

The various -hide options actually exclude the relevant directory entry
from the directory tree. Therefore, it is not possible to access a file
or directory that has be hidden with the -hide option when the ISO9600/Rock
Ridge directory is mounted - because the directory entry does not exist on the
CD (but the file data does). You would probably be able to access this file
or directory when mounted as a Joliet or HFS CD (depending on other options
used). Similarly, a directory entry hidden with the -hide-joliet option
will not be accessible when mounted as an Joliet CD. Similarly for -hide-hfs
etc.

If you don't want a file or directory to appear on the CD at all, then use the
-exclude options, not the -hide options (mkisofs completely ignores any
file/directory excluded with the -exclude options).


Using the hide options
======================

There are 6 hide options:

-hide		   Hide a file/directory from the ISO9660/Rock Ridge directory
-hide-list	   As above, but read file names from a file
-hide-joliet	   Hide a file/directory from the Joliet directory
-hide-joliet-list  As above, but read file names from a file
-hide-hfs	   Hide a file/directory from the HFS directory
-hide-hfs-list	   As above, but read file names from a file

You can use the -hide, -hide-joliet and/or -hide-hfs options as many times
as you like on the command line, but if you have many files to hide, then
it may be better to put your file names in a file (one per line) and use
the corresponding 'list' option. You can also use the three -hide-list options
as many times as you want.

The arguments to the -hide options are either the 'basename' or the 'whole
path name' of a file. That is, if you use the option:

% mkisofs -hide ABC [-other-options] CD_directory

then any file with the name ABC will be hidden. If you want to be more
specific, then use the whole name - as seen by mkisofs e.g.:

% mkisofs -hide CD_directory/XYZ/ABC [-other-options] CD_directory

will hide just the file 'CD_directory/XYZ/ABC' - not any other file called
'ABC' that might exist under 'CD_directory'. However, if your command line
is like:

% mkisofs -hide CD_directory/XYZ/ABC [-other-options] ./CD_directory

Then the file 'CD_directory/XYZ/ABC' will not be hidden because as far as
mkisofs is concerned. Its whole path is actually './CD_directory/XYZ/ABC'.

You can use wild cards in the -hide arguments.

If the file name to be hidden is a directory, then the directory and all
its contents are hidden.

The main use of the hide options is on a multi platform (hybrid CD) to hide
various files/directories that are operating system specific from been seen
on the CD when mounted on another OS. i.e. You may want to hide Macintosh
executables from being seen when the CD is mounted as a Joliet CD on a PC etc.

For example, say we want to create a ISO9660/Rock Ridge, Joliet, HFS hybrid
CD from files/directories in the directory called 'cd_dir' - which are:

MAC/
MAC/app
MAC/data/
MAC/data/file1
PC/
PC/app
PC/data/
PC/data/file1
UNIX/
UNIX/app
UNIX/data
UNIX/data/file1
COMMON/
COMMON/some_files

We could use the command line:

% mkisofs -r -J -hfs -hide MAC -hide PC -hide-joliet MAC \
	-hide-joliet UNIX -hide-hfs PC -hide-hfs UNIX -o cd.iso cd_dir

This will give a CD that when mounted as a Rock Ridge CD, you will only 
see the directories UNIX and COMMON, as a Joliet CD the directories
PC and COMMON, and as an HFS CD the directories MAC and COMMON.

If you also had the three files in the current directory called README.hfs,
README.joliet and README.unix - but you wanted to have each of these
files appear as just 'README' when mounted, then you could use the above
command line with the following:

% mkisofs -r -J -hfs -graft-points -hide MAC -hide PC -hide-joliet MAC \
	-hide-joliet UNIX -hide-hfs PC -hide-hfs UNIX \
	-hide README.hfs -hide README.joliet -hide-joliet README.hfs \
	-hide-joliet README.uni -hide-hfs README.joliet -hide-hfs README.unix \
	README=README.hfs README=README.joliet README=README.unix \
	-o cd.iso cd_dir

Note: we've used the -graft-points option as we're using the '=' syntax
to insert the files called README.hfs, README.joliet and README.unix as
'README'

The resulting CD when mounted as a Rock Ridge CD, will have the directories
UNIX and COMMON - with the file called README - which was originally 
called README.unix.

However, in most circumstances, it would be better to have the contents
of each of the OS specific directories (plus the contents of the COMMON
directory) to appear at the top level of the CD. i.e. when the CD is mounted
(as ISO9660/Rock Ridge, Joliet or HFS) it has the contents:

README
app
data/file1
some_files

Unfortunately, this is not as straight forward as it may seem - i.e. doing
the following may seem OK, but it won't work - for reasons I'll explain 
later:

It gets a bit messy using the -graft-points syntax above, so we'll assume
each of the MAC, UNIX and PC directories contain the correct README, We'll
also change to the 'cd_dir' directory and use the command:

mkisofs -r -J -hfs -hide MAC -hide PC -hide-joliet MAC \
	-hide-joliet UNIX -hide-hfs PC -hide-hfs UNIX \
	-o cd.iso MAC PC UNIX COMMON

You will get errors like:

mkisofs: Error: UNIX/README and MAC/README have the same Rock Ridge name
...
mkisofs: Unable to sort directory 

This is because you can not hide "pathspecs" that are directories ("pathspecs"
are file names given on the command line, or in a path-list file). This a 
"feature" of mkisofs. In this case nothing is actually hidden at all.

So you might think that the following may work:

mkisofs -r -J -hfs -hide "MAC/*" -hide "PC/*" -hide-joliet "MAC/*" \
	-hide-joliet "UNIX/*" -hide-hfs "PC/*" -hide-hfs "UNIX/*" \
	-o cd.iso MAC PC UNIX COMMON

which may appear to work - but when the CD is mounted as an ISO9660/Rock Ridge
or Joliet CD, then the directory "data" is missing.

Again this is a feature of mkisofs - the directories PC/data and UNIX/data
are mapped by mkisofs to the same output directory called "/data" - the
various "hide" flags are stored with this directory info - in this case as 
the output directory "/data" is first hidden from the ISO9660/Rock Ridge and
then the Joliet directory, the net result is that "/data" gets hidden from
both directories ... the way mkisofs hides HFS directories is slightly
different, so in this case the directory "data" exists on the HFS volume
and contains the correct contents.

However, it is possible to obtain the required result, but we have to be
careful about hiding multiple input directories that map to a single output
directory.

To do this we have to hide just the files in these directories (or more
accurately, all the non-directories). This is best done by using lists of
files to hide for example: 

find PC -type f -print > pc.list
find UNIX -type f -print > unix.list
find MAC -type f -print > mac.list

mkisofs -r -J -hfs -hide-list pc.list -hide-list mac.list \
	-hide-joliet-list unix.list -hide-joliet-list mac.list \
	-hide-hfs-list pc.list -hide-hfs-list unix.list \
	-o cd.iso MAC PC UNIX COMMON

i.e. instead of trying to hide a directory and letting mkisofs hide its
contents, we explicitly hide all the files in the directory, but not the
directory and any of its sub-directories.

This will work for the above input files, but if your directory trees contain
symbolic links and/or directories that will not get merged, then the hide lists
will have to be tailored to get the required result.


James Pearson 22-Nov-2001

Any comments/problems to j.pearson@ge.ucl.ac.uk
