desktop.c revision 1.6
1/*
2**	make_desktop: create "Desktop DB" and "Desktop DF" files.
3**
4**	These are set up to prevent the Mac "rebuilding the desktop"
5**	when the CD is inserted ???
6**
7**	I don't know if these files should be populated, but I've just
8**	created these files in their initial states:
9**
10**	Desktop DB:	Initial size == volume's clump size
11**			first block contents found by using od ...
12**			rest of file seems to be padding
13**			No resource fork
14**
15**	Desktop DF:	Empty
16**
17**	If the files already exist, then set correct type/creator/flags
18**
19**	James Pearson 11/8/97
20**	Adapted from mkhfs routines for mkhybrid
21*/
22
23#ifdef APPLE_HYB
24
25#include <string.h>
26#include <err.h>
27#include "hfs.h"
28
29#define	DB	"Desktop DB"
30#define DBFC	"DMGR"
31#define DBT	"BTFL"
32
33#define	DF	"Desktop DF"
34#define DFT	"DTFL"
35
36/* from "data.h" - libhfs routines */
37void d_putw(unsigned char *, short);
38void d_putl(unsigned char *, long);
39/* from volume.c */
40void write_fork(hfsfile *, long);
41
42extern hce_mem *hce;		/* libhfs/mkisofs extras */
43
44int
45make_desktop(hfsvol *vol, int end)
46/* hfsvol  *vol;				   Mac volume */
47{
48	hfsfile		*hfp;			/* Mac file */
49	hfsdirent	ent;			/* Mac finderinfo */
50	unsigned short	clps;			/* clump size */
51	unsigned short	blks;			/* blocks in a clump */
52	unsigned char	*blk;			/* user data */
53
54	/* set up default directory entries - not all these fields
55	   are needed, but we'll set them up anyway ... */
56	ent.rsize = 0;				/* resource size == 0 */
57	strcpy(ent.creator, DBFC);		/* creator */
58	strcpy(ent.type, DBT);			/* type */
59	ent.crdate = ent.mddate = time(0);	/* date is now */
60	ent.fdflags = HFS_FNDR_ISINVISIBLE;	/* invisible files */
61
62	/* clear the DB file */
63	blk = hce->hfs_ce + hce->hfs_ce_size*HFS_BLOCKSZ;
64	blks = hce->hfs_dt_size;
65	clps = blks*HFS_BLOCKSZ;
66
67	memset(blk, 0, clps);
68
69	/* create "Desktop DB" (if it doesn't exist) */
70	if(hfs_create(vol, DB, ent.type, ent.creator) == 0)
71	{
72	    /* DB file size from hce_mem info */
73	    /* set up "Desktop DB" data - following found by od'ing
74	       the "Desktop DB" file */
75	    d_putw(blk+8, 0x100);
76	    d_putw(blk+10, 0x3);
77
78	    d_putw(blk+32, 0x200);
79	    d_putw(blk+34, 0x25);
80
81	    d_putl(blk+36, blks);
82	    d_putl(blk+40, blks - 1);
83
84	    d_putw(blk+48, clps);
85	    d_putw(blk+50, 0xff);
86
87	    d_putw(blk+120, 0x20a);
88	    d_putw(blk+122, 0x100);
89
90	    d_putw(blk+248, 0x8000);
91
92	    d_putl(blk+504, 0x1f800f8);
93	    d_putl(blk+508, 0x78000e);
94
95	    /* entries for "Desktop DB" */
96	    ent.dsize = clps;			/* size = clump size */
97
98	    /* open file */
99	    if((hfp = hfs_open(vol, DB)) == 0)
100		err(1, "%s", hfs_error);
101
102	    /* "write" file */
103	    write_fork(hfp, clps);
104
105	    /* set DB file attributes */
106	    if (hfs_fsetattr(hfp, &ent) < 0)
107		err(1, "%s", hfs_error);
108
109	    /* find the real start of the file */
110	    end += hce->hfs_ce_size;
111
112	    /* close DB file */
113	    if (hfs_close(hfp, end, 0) < 0)
114		err(1, "%s", hfs_error);
115	}
116	else
117	{
118	    /* if it already exists, then make sure it has the correct
119	       type/creator and flags */
120	    if(hfs_setattr(vol, DB, &ent) < 0)
121		err(1, "%s", hfs_error);
122	}
123
124	/* setup "Desktop DF" file as an empty file */
125	strcpy(ent.type, DFT);			/* type */
126	ent.dsize = 0;				/* empty */
127
128	/* create DF file (if it doesn't exist) - no need to open it */
129	hfs_create(vol, DF, ent.type, ent.creator);
130
131	/* set DB file attributes */
132	if (hfs_setattr(vol, DF, &ent) < 0)
133	    err(1, "%s", hfs_error);
134	return 0;
135}
136#endif /* APPLE_HYB */
137