summaryrefslogtreecommitdiff
path: root/genisoimage/desktop.c
diff options
context:
space:
mode:
Diffstat (limited to 'genisoimage/desktop.c')
-rw-r--r--genisoimage/desktop.c180
1 files changed, 180 insertions, 0 deletions
diff --git a/genisoimage/desktop.c b/genisoimage/desktop.c
new file mode 100644
index 0000000..51b0269
--- /dev/null
+++ b/genisoimage/desktop.c
@@ -0,0 +1,180 @@
+/*
+ * 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 */