/*
 * This file has been modified for the cdrkit suite.
 *
 * The behaviour and appearence of the program code below can differ to a major
 * extent from the version distributed by the original author(s).
 *
 * For details, see Changelog file distributed with the cdrkit package. If you
 * received this file from another source then ask the distributing person for
 * a log of modifications.
 *
 */

/* @(#)desktop.c	1.6 04/03/04 joerg, Copyright 1997, 1998, 1999, 2000 James Pearson */
/*
 *      Copyright (c) 1997, 1998, 1999, 2000 James Pearson
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; see the file COPYING.  If not, write to
 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 */

/*
 *	make_desktop: create "Desktop DB" and "Desktop DF" files.
 *
 *	These are set up to prevent the Mac "rebuilding the desktop"
 *	when the CD is inserted ???
 *
 *	I don't know if these files should be populated, but I've just
 *	created these files in their initial states:
 *
 *	Desktop DB:	Initial size == volume's clump size
 *			first block contents found by using od ...
 *			rest of file seems to be padding
 *			No resource fork
 *
 *	Desktop DF:	Empty
 *
 *	If the files already exist, then set correct type/creator/flags
 *
 *	James Pearson 11/8/97
 *	Adapted from mkhfs routines for mkhybrid
 */

#ifdef APPLE_HYB

#include <mconfig.h>
#include "genisoimage.h"

#define	DB	"Desktop DB"
#define	DBFC	"DMGR"
#define	DBT	"BTFL"

#define	DF	"Desktop DF"
#define	DFT	"DTFL"

/*
 * from "data.h" - libhfs routines
 */
extern	void d_putw(unsigned char *, short);
extern	void d_putl(unsigned char *, long);

int	make_desktop(hfsvol *vol, int end);


extern	hce_mem *hce;	/* libhfs/genisoimage extras */

int
make_desktop(hfsvol *vol, int end)
{
	hfsfile		*hfp;			/* Mac file */
	hfsdirent	ent;			/* Mac finderinfo */
	unsigned long	clps;			/* clump size */
	unsigned short	blks;			/* blocks in a clump */
	unsigned char	*blk;			/* user data */

	/*
	 * set up default directory entries - not all these fields are needed,
	 * but we'll set them up anyway ...
	 * First do a memset because there was a report about randomly
	 * changing Desktop DB/DF entries...
	 */
	memset(&ent, 0, sizeof (hfsdirent));	/* First clear all ... */
	ent.u.file.rsize = 0;			/* resource size == 0 */
	strcpy(ent.u.file.creator, DBFC);	/* creator */
	strcpy(ent.u.file.type, DBT);		/* type */
	ent.crdate = ent.mddate = time(0);	/* date is now */
	ent.fdflags = HFS_FNDR_ISINVISIBLE;	/* invisible files */

	/*
	 * clear the DB file
	 */
	blk = hce->hfs_ce + hce->hfs_ce_size * HFS_BLOCKSZ;
	blks = hce->hfs_dt_size;
	clps = blks * HFS_BLOCKSZ;

	memset(blk, 0, clps);

	/*
	 * create "Desktop DB" (if it doesn't exist)
	 */
	if (hfs_create(vol, DB, ent.u.file.type, ent.u.file.creator) == 0) {
		/*
		 * DB file size from hce_mem info
		 * set up "Desktop DB" data - following found by od'ing the
		 * "Desktop DB" file
		 */
		d_putw(blk + 8, 0x100);
		d_putw(blk + 10, 0x3);

		d_putw(blk + 32, 0x200);
		d_putw(blk + 34, 0x25);

		d_putl(blk + 36, blks);
		d_putl(blk + 40, blks - 1);

		d_putl(blk + 46, clps);
		d_putw(blk + 50, 0xff);

		d_putw(blk + 120, 0x20a);
		d_putw(blk + 122, 0x100);

		d_putw(blk + 248, 0x8000);

		d_putl(blk + 504, 0x1f800f8);
		d_putl(blk + 508, 0x78000e);

		/* entries for "Desktop DB" */
		ent.u.file.dsize = clps;	/* size = clump size */

		/* open file */
		if ((hfp = hfs_open(vol, DB)) == 0)
			perr(hfs_error);

		/* "write" file */
		write_fork(hfp, clps);

		/* set DB file attributes */
		if (hfs_fsetattr(hfp, &ent) < 0)
			perr(hfs_error);

		/* find the real start of the file */
		end += hce->hfs_ce_size;

		/* close DB file */
		if (hfs_close(hfp, end, 0) < 0)
			perr(hfs_error);
	} else {
		/*
		 * if it already exists, then make sure it has the correct
		 * type/creator and flags
		 */
		if (hfs_setattr(vol, DB, &ent) < 0)
			perr(hfs_error);
	}

	/* setup "Desktop DF" file as an empty file */
	strcpy(ent.u.file.type, DFT);		/* type */
	ent.u.file.dsize = 0;			/* empty */

	/* create DF file (if it doesn't exist) - no need to open it */
	hfs_create(vol, DF, ent.u.file.type, ent.u.file.creator);

	/* set DB file attributes */
	if (hfs_setattr(vol, DF, &ent) < 0)
		perr(hfs_error);

	return (0);
}

#endif	/* APPLE_HYB */
