svn commit: r314117 - in head/usr.sbin/makefs: . cd9660
Ed Maste
emaste at FreeBSD.org
Thu Feb 23 02:28:09 UTC 2017
Author: emaste
Date: Thu Feb 23 02:28:08 2017
New Revision: 314117
URL: https://svnweb.freebsd.org/changeset/base/314117
Log:
makefs: eliminate global cd9660 structure
For diff reduction with NetBSD
NetBSD file versions:
cd9660.c 1.39
cd9660.h 1.19
cd9660/cd9660_debug.c 1.12
cd9660/cd9660_eltorito.c 1.20
cd9660/cd9660_write.c 1.16
cd9660/iso9660_rrip.c 1.12
cd9660/iso9660_rrip.h 1.6
Reviewed by: ngie
Obtained from: NetBSD
MFC after: 1 month
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D9627
Modified:
head/usr.sbin/makefs/cd9660.c
head/usr.sbin/makefs/cd9660.h
head/usr.sbin/makefs/cd9660/cd9660_debug.c
head/usr.sbin/makefs/cd9660/cd9660_eltorito.c
head/usr.sbin/makefs/cd9660/cd9660_write.c
head/usr.sbin/makefs/cd9660/iso9660_rrip.c
head/usr.sbin/makefs/cd9660/iso9660_rrip.h
Modified: head/usr.sbin/makefs/cd9660.c
==============================================================================
--- head/usr.sbin/makefs/cd9660.c Thu Feb 23 01:18:47 2017 (r314116)
+++ head/usr.sbin/makefs/cd9660.c Thu Feb 23 02:28:08 2017 (r314117)
@@ -109,58 +109,59 @@ __FBSDID("$FreeBSD$");
#include "cd9660/iso9660_rrip.h"
#include "cd9660/cd9660_archimedes.h"
-/*
- * Global variables
- */
-iso9660_disk diskStructure;
-
-static void cd9660_finalize_PVD(void);
+static void cd9660_finalize_PVD(iso9660_disk *);
static cd9660node *cd9660_allocate_cd9660node(void);
-static void cd9660_set_defaults(void);
+static void cd9660_set_defaults(iso9660_disk *);
static int cd9660_arguments_set_string(const char *, const char *, int,
char, char *);
static void cd9660_populate_iso_dir_record(
struct _iso_directory_record_cd9660 *, u_char, u_char, u_char,
const char *);
-static void cd9660_setup_root_node(void);
-static int cd9660_setup_volume_descriptors(void);
+static void cd9660_setup_root_node(iso9660_disk *);
+static int cd9660_setup_volume_descriptors(iso9660_disk *);
#if 0
static int cd9660_fill_extended_attribute_record(cd9660node *);
#endif
static void cd9660_sort_nodes(cd9660node *);
-static int cd9660_translate_node_common(cd9660node *);
-static int cd9660_translate_node(fsnode *, cd9660node *);
+static int cd9660_translate_node_common(iso9660_disk *, cd9660node *);
+static int cd9660_translate_node(iso9660_disk *, fsnode *, cd9660node *);
static int cd9660_compare_filename(const char *, const char *);
static void cd9660_sorted_child_insert(cd9660node *, cd9660node *);
-static int cd9660_handle_collisions(cd9660node *, int);
-static cd9660node *cd9660_rename_filename(cd9660node *, int, int);
-static void cd9660_copy_filenames(cd9660node *);
+static int cd9660_handle_collisions(iso9660_disk *, cd9660node *, int);
+static cd9660node *cd9660_rename_filename(iso9660_disk *, cd9660node *, int,
+ int);
+static void cd9660_copy_filenames(iso9660_disk *, cd9660node *);
static void cd9660_sorting_nodes(cd9660node *);
static int cd9660_count_collisions(cd9660node *);
-static cd9660node *cd9660_rrip_move_directory(cd9660node *);
-static int cd9660_add_dot_records(cd9660node *);
+static cd9660node *cd9660_rrip_move_directory(iso9660_disk *, cd9660node *);
+static int cd9660_add_dot_records(iso9660_disk *, cd9660node *);
-static void cd9660_convert_structure(fsnode *, cd9660node *, int,
+static void cd9660_convert_structure(iso9660_disk *, fsnode *, cd9660node *, int,
int *, int *);
static void cd9660_free_structure(cd9660node *);
-static int cd9660_generate_path_table(void);
-static int cd9660_level1_convert_filename(const char *, char *, int);
-static int cd9660_level2_convert_filename(const char *, char *, int);
+static int cd9660_generate_path_table(iso9660_disk *);
+static int cd9660_level1_convert_filename(iso9660_disk *, const char *, char *,
+ int);
+static int cd9660_level2_convert_filename(iso9660_disk *, const char *, char *,
+ int);
#if 0
-static int cd9660_joliet_convert_filename(const char *, char *, int);
+static int cd9660_joliet_convert_filename(iso9660_disk *, const char *, char *,
+ int);
#endif
-static int cd9660_convert_filename(const char *, char *, int);
-static void cd9660_populate_dot_records(cd9660node *);
-static int64_t cd9660_compute_offsets(cd9660node *, int64_t);
+static int cd9660_convert_filename(iso9660_disk *, const char *, char *, int);
+static void cd9660_populate_dot_records(iso9660_disk *, cd9660node *);
+static int64_t cd9660_compute_offsets(iso9660_disk *, cd9660node *, int64_t);
#if 0
static int cd9660_copy_stat_info(cd9660node *, cd9660node *, int);
#endif
-static cd9660node *cd9660_create_virtual_entry(const char *, cd9660node *, int,
- int);
-static cd9660node *cd9660_create_file(const char *, cd9660node *, cd9660node *);
-static cd9660node *cd9660_create_directory(const char *, cd9660node *,
+static cd9660node *cd9660_create_virtual_entry(iso9660_disk *, const char *,
+ cd9660node *, int, int);
+static cd9660node *cd9660_create_file(iso9660_disk *, const char *,
+ cd9660node *, cd9660node *);
+static cd9660node *cd9660_create_directory(iso9660_disk *, const char *,
+ cd9660node *, cd9660node *);
+static cd9660node *cd9660_create_special_directory(iso9660_disk *, u_char,
cd9660node *);
-static cd9660node *cd9660_create_special_directory(u_char, cd9660node *);
/*
@@ -191,72 +192,79 @@ int cd9660_defaults_set = 0;
* Set default values for cd9660 extension to makefs
*/
static void
-cd9660_set_defaults(void)
+cd9660_set_defaults(iso9660_disk *diskStructure)
{
/*Fix the sector size for now, though the spec allows for other sizes*/
- diskStructure.sectorSize = 2048;
+ diskStructure->sectorSize = 2048;
/* Set up defaults in our own structure */
- diskStructure.verbose_level = 0;
- diskStructure.keep_bad_images = 0;
- diskStructure.follow_sym_links = 0;
- diskStructure.isoLevel = 2;
-
- diskStructure.rock_ridge_enabled = 0;
- diskStructure.rock_ridge_renamed_dir_name = 0;
- diskStructure.rock_ridge_move_count = 0;
- diskStructure.rr_moved_dir = 0;
+ diskStructure->verbose_level = 0;
+ diskStructure->keep_bad_images = 0;
+ diskStructure->follow_sym_links = 0;
+ diskStructure->isoLevel = 2;
+
+ diskStructure->rock_ridge_enabled = 0;
+ diskStructure->rock_ridge_renamed_dir_name = 0;
+ diskStructure->rock_ridge_move_count = 0;
+ diskStructure->rr_moved_dir = 0;
- diskStructure.archimedes_enabled = 0;
- diskStructure.chrp_boot = 0;
+ diskStructure->archimedes_enabled = 0;
+ diskStructure->chrp_boot = 0;
- diskStructure.include_padding_areas = 1;
+ diskStructure->include_padding_areas = 1;
/* Spec breaking functionality */
- diskStructure.allow_deep_trees =
- diskStructure.allow_start_dot =
- diskStructure.allow_max_name =
- diskStructure.allow_illegal_chars =
- diskStructure.allow_lowercase =
- diskStructure.allow_multidot =
- diskStructure.omit_trailing_period = 0;
+ diskStructure->allow_deep_trees =
+ diskStructure->allow_start_dot =
+ diskStructure->allow_max_name =
+ diskStructure->allow_illegal_chars =
+ diskStructure->allow_lowercase =
+ diskStructure->allow_multidot =
+ diskStructure->omit_trailing_period = 0;
/* Make sure the PVD is clear */
- memset(&diskStructure.primaryDescriptor, 0, 2048);
+ memset(&diskStructure->primaryDescriptor, 0, 2048);
- memset(diskStructure.primaryDescriptor.publisher_id, 0x20,128);
- memset(diskStructure.primaryDescriptor.preparer_id, 0x20,128);
- memset(diskStructure.primaryDescriptor.application_id, 0x20,128);
- memset(diskStructure.primaryDescriptor.copyright_file_id, 0x20,37);
- memset(diskStructure.primaryDescriptor.abstract_file_id, 0x20,37);
- memset(diskStructure.primaryDescriptor.bibliographic_file_id, 0x20,37);
+ memset(diskStructure->primaryDescriptor.publisher_id, 0x20,128);
+ memset(diskStructure->primaryDescriptor.preparer_id, 0x20,128);
+ memset(diskStructure->primaryDescriptor.application_id, 0x20,128);
+ memset(diskStructure->primaryDescriptor.copyright_file_id, 0x20,37);
+ memset(diskStructure->primaryDescriptor.abstract_file_id, 0x20,37);
+ memset(diskStructure->primaryDescriptor.bibliographic_file_id, 0x20,37);
- strcpy(diskStructure.primaryDescriptor.system_id, "FreeBSD");
+ strcpy(diskStructure->primaryDescriptor.system_id, "FreeBSD");
cd9660_defaults_set = 1;
/* Boot support: Initially disabled */
- diskStructure.has_generic_bootimage = 0;
- diskStructure.generic_bootimage = NULL;
+ diskStructure->has_generic_bootimage = 0;
+ diskStructure->generic_bootimage = NULL;
- diskStructure.boot_image_directory = 0;
- /*memset(diskStructure.boot_descriptor, 0, 2048);*/
+ diskStructure->boot_image_directory = 0;
+ /*memset(diskStructure->boot_descriptor, 0, 2048);*/
- diskStructure.is_bootable = 0;
- TAILQ_INIT(&diskStructure.boot_images);
- LIST_INIT(&diskStructure.boot_entries);
+ diskStructure->is_bootable = 0;
+ TAILQ_INIT(&diskStructure->boot_images);
+ LIST_INIT(&diskStructure->boot_entries);
}
void
-cd9660_prep_opts(fsinfo_t *fsopts __unused)
+cd9660_prep_opts(fsinfo_t *fsopts)
{
- cd9660_set_defaults();
+ iso9660_disk *diskStructure;
+
+ if ((diskStructure = calloc(1, sizeof(*diskStructure))) == NULL)
+ err(EXIT_FAILURE, "%s: calloc", __func__);
+
+ fsopts->fs_specific = diskStructure;
+
+ cd9660_set_defaults(diskStructure);
}
void
-cd9660_cleanup_opts(fsinfo_t *fsopts __unused)
+cd9660_cleanup_opts(fsinfo_t *fsopts)
{
-
+ free(fsopts->fs_specific);
}
static int
@@ -295,20 +303,19 @@ cd9660_parse_opts(const char *option, fs
{
char *var, *val;
int rv;
+ iso9660_disk *diskStructure = fsopts->fs_specific;
+
/* Set up allowed options - integer options ONLY */
option_t cd9660_options[] = {
- { "l", &diskStructure.isoLevel, 1, 2, "ISO Level" },
- { "isolevel", &diskStructure.isoLevel, 1, 2, "ISO Level" },
- { "verbose", &diskStructure.verbose_level, 0, 2,
+ { "l", &diskStructure->isoLevel, 1, 2, "ISO Level" },
+ { "isolevel", &diskStructure->isoLevel, 1, 2, "ISO Level" },
+ { "verbose", &diskStructure->verbose_level, 0, 2,
"Turns on verbose output" },
- { "v", &diskStructure.verbose_level, 0 , 2,
+ { "v", &diskStructure->verbose_level, 0 , 2,
"Turns on verbose output"},
{ .name = NULL }
};
- if (cd9660_defaults_set == 0)
- cd9660_set_defaults();
-
/*
* Todo : finish implementing this, and make a function that
* parses them
@@ -335,33 +342,33 @@ cd9660_parse_opts(const char *option, fs
/* First handle options with no parameters */
if (strcmp(var, "h") == 0) {
- diskStructure.displayHelp = 1;
+ diskStructure->displayHelp = 1;
rv = 1;
} else if (CD9660_IS_COMMAND_ARG_DUAL(var, "S", "follow-symlinks")) {
/* this is not handled yet */
- diskStructure.follow_sym_links = 1;
+ diskStructure->follow_sym_links = 1;
rv = 1;
} else if (CD9660_IS_COMMAND_ARG_DUAL(var, "L", "label")) {
rv = cd9660_arguments_set_string(val, "Disk Label", 32, 'd',
- diskStructure.primaryDescriptor.volume_id);
+ diskStructure->primaryDescriptor.volume_id);
} else if (CD9660_IS_COMMAND_ARG_DUAL(var, "A", "applicationid")) {
rv = cd9660_arguments_set_string(val, "Application Identifier", 128, 'a',
- diskStructure.primaryDescriptor.application_id);
+ diskStructure->primaryDescriptor.application_id);
} else if(CD9660_IS_COMMAND_ARG_DUAL(var, "P", "publisher")) {
rv = cd9660_arguments_set_string(val, "Publisher Identifier",
- 128, 'a', diskStructure.primaryDescriptor.publisher_id);
+ 128, 'a', diskStructure->primaryDescriptor.publisher_id);
} else if (CD9660_IS_COMMAND_ARG_DUAL(var, "p", "preparer")) {
rv = cd9660_arguments_set_string(val, "Preparer Identifier",
- 128, 'a', diskStructure.primaryDescriptor.preparer_id);
+ 128, 'a', diskStructure->primaryDescriptor.preparer_id);
} else if (CD9660_IS_COMMAND_ARG_DUAL(var, "V", "volumeid")) {
rv = cd9660_arguments_set_string(val, "Volume Set Identifier",
- 128, 'a', diskStructure.primaryDescriptor.volume_set_id);
+ 128, 'a', diskStructure->primaryDescriptor.volume_set_id);
/* Boot options */
} else if (CD9660_IS_COMMAND_ARG_DUAL(var, "B", "bootimage")) {
if (val == NULL)
warnx("error: The Boot Image parameter requires a valid boot information string");
else
- rv = cd9660_add_boot_disk(val);
+ rv = cd9660_add_boot_disk(diskStructure, val);
} else if (CD9660_IS_COMMAND_ARG(var, "bootimagedir")) {
/*
* XXXfvdl this is unused.
@@ -370,7 +377,7 @@ cd9660_parse_opts(const char *option, fs
errx(1, "error: The Boot Image Directory parameter"
" requires a directory name\n");
else {
- if ((diskStructure.boot_image_directory =
+ if ((diskStructure->boot_image_directory =
malloc(strlen(val) + 1)) == NULL) {
CD9660_MEM_ALLOC_ERROR("cd9660_parse_opts");
exit(1);
@@ -378,40 +385,40 @@ cd9660_parse_opts(const char *option, fs
/* BIG TODO: Add the max length function here */
cd9660_arguments_set_string(val, "Boot Image Directory",
- 12 , 'd', diskStructure.boot_image_directory);
+ 12 , 'd', diskStructure->boot_image_directory);
}
} else if (CD9660_IS_COMMAND_ARG_DUAL(var, "G", "generic-bootimage")) {
if (val == NULL)
warnx("error: The Boot Image parameter requires a valid boot information string");
else
- rv = cd9660_add_generic_bootimage(val);
+ rv = cd9660_add_generic_bootimage(diskStructure, val);
} else if (CD9660_IS_COMMAND_ARG(var, "no-trailing-padding"))
- diskStructure.include_padding_areas = 0;
+ diskStructure->include_padding_areas = 0;
/* RRIP */
else if (CD9660_IS_COMMAND_ARG_DUAL(var, "R", "rockridge"))
- diskStructure.rock_ridge_enabled = 1;
+ diskStructure->rock_ridge_enabled = 1;
else if (CD9660_IS_COMMAND_ARG_DUAL(var, "A", "archimedes"))
- diskStructure.archimedes_enabled = 1;
+ diskStructure->archimedes_enabled = 1;
else if (CD9660_IS_COMMAND_ARG(var, "chrp-boot"))
- diskStructure.chrp_boot = 1;
+ diskStructure->chrp_boot = 1;
else if (CD9660_IS_COMMAND_ARG_DUAL(var, "K", "keep-bad-images"))
- diskStructure.keep_bad_images = 1;
+ diskStructure->keep_bad_images = 1;
else if (CD9660_IS_COMMAND_ARG(var, "allow-deep-trees"))
- diskStructure.allow_deep_trees = 1;
+ diskStructure->allow_deep_trees = 1;
else if (CD9660_IS_COMMAND_ARG(var, "allow-max-name"))
- diskStructure.allow_max_name = 1;
+ diskStructure->allow_max_name = 1;
else if (CD9660_IS_COMMAND_ARG(var, "allow-illegal-chars"))
- diskStructure.allow_illegal_chars = 1;
+ diskStructure->allow_illegal_chars = 1;
else if (CD9660_IS_COMMAND_ARG(var, "allow-lowercase"))
- diskStructure.allow_lowercase = 1;
+ diskStructure->allow_lowercase = 1;
else if (CD9660_IS_COMMAND_ARG(var,"allow-multidot"))
- diskStructure.allow_multidot = 1;
+ diskStructure->allow_multidot = 1;
else if (CD9660_IS_COMMAND_ARG(var, "omit-trailing-period"))
- diskStructure.omit_trailing_period = 1;
+ diskStructure->omit_trailing_period = 1;
else if (CD9660_IS_COMMAND_ARG(var, "no-emul-boot") ||
CD9660_IS_COMMAND_ARG(var, "no-boot") ||
CD9660_IS_COMMAND_ARG(var, "hard-disk-boot")) {
- cd9660_eltorito_add_boot_option(var, 0);
+ cd9660_eltorito_add_boot_option(diskStructure, var, 0);
/* End of flag variables */
} else if (CD9660_IS_COMMAND_ARG(var, "boot-load-segment")) {
@@ -419,7 +426,8 @@ cd9660_parse_opts(const char *option, fs
warnx("Option `%s' doesn't contain a value", var);
rv = 0;
} else {
- cd9660_eltorito_add_boot_option(var, val);
+ cd9660_eltorito_add_boot_option(diskStructure, var,
+ val);
}
} else {
if (val == NULL) {
@@ -452,19 +460,20 @@ cd9660_makefs(const char *image, const c
int64_t totalSpace;
int error;
cd9660node *real_root;
+ iso9660_disk *diskStructure = fsopts->fs_specific;
- if (diskStructure.verbose_level > 0)
+ if (diskStructure->verbose_level > 0)
printf("cd9660_makefs: ISO level is %i\n",
- diskStructure.isoLevel);
- if (diskStructure.isoLevel < 2 &&
- diskStructure.allow_multidot)
+ diskStructure->isoLevel);
+ if (diskStructure->isoLevel < 2 &&
+ diskStructure->allow_multidot)
errx(1, "allow-multidot requires iso level of 2\n");
assert(image != NULL);
assert(dir != NULL);
assert(root != NULL);
- if (diskStructure.displayHelp) {
+ if (diskStructure->displayHelp) {
/*
* Display help here - probably want to put it in
* a separate function
@@ -472,7 +481,7 @@ cd9660_makefs(const char *image, const c
return;
}
- if (diskStructure.verbose_level > 0)
+ if (diskStructure->verbose_level > 0)
printf("cd9660_makefs: image %s directory %s root %p\n",
image, dir, root);
@@ -496,11 +505,12 @@ cd9660_makefs(const char *image, const c
ISO_FILENAME_MAXLENGTH_WITH_PADDING);
real_root->level = 0;
- diskStructure.rootNode = real_root;
+ diskStructure->rootNode = real_root;
real_root->type = CD9660_TYPE_DIR;
error = 0;
real_root->node = root;
- cd9660_convert_structure(root, real_root, 1, &numDirectories, &error);
+ cd9660_convert_structure(diskStructure, root, real_root, 1,
+ &numDirectories, &error);
if (TAILQ_EMPTY(&real_root->cn_children)) {
errx(1, "cd9660_makefs: converted directory is empty. "
@@ -508,109 +518,111 @@ cd9660_makefs(const char *image, const c
} else if (error != 0) {
errx(1, "cd9660_makefs: tree conversion failed\n");
} else {
- if (diskStructure.verbose_level > 0)
+ if (diskStructure->verbose_level > 0)
printf("cd9660_makefs: tree converted\n");
}
/* Add the dot and dot dot records */
- cd9660_add_dot_records(real_root);
+ cd9660_add_dot_records(diskStructure, real_root);
- cd9660_setup_root_node();
+ cd9660_setup_root_node(diskStructure);
- if (diskStructure.verbose_level > 0)
+ if (diskStructure->verbose_level > 0)
printf("cd9660_makefs: done converting tree\n");
/* non-SUSP extensions */
- if (diskStructure.archimedes_enabled)
- archimedes_convert_tree(diskStructure.rootNode);
+ if (diskStructure->archimedes_enabled)
+ archimedes_convert_tree(diskStructure->rootNode);
/* Rock ridge / SUSP init pass */
- if (diskStructure.rock_ridge_enabled) {
- cd9660_susp_initialize(diskStructure.rootNode,
- diskStructure.rootNode, NULL);
+ if (diskStructure->rock_ridge_enabled) {
+ cd9660_susp_initialize(diskStructure, diskStructure->rootNode,
+ diskStructure->rootNode, NULL);
}
/* Build path table structure */
- diskStructure.pathTableLength = cd9660_generate_path_table();
+ diskStructure->pathTableLength = cd9660_generate_path_table(
+ diskStructure);
- pathTableSectors = CD9660_BLOCKS(diskStructure.sectorSize,
- diskStructure.pathTableLength);
+ pathTableSectors = CD9660_BLOCKS(diskStructure->sectorSize,
+ diskStructure->pathTableLength);
- firstAvailableSector = cd9660_setup_volume_descriptors();
- if (diskStructure.is_bootable) {
- firstAvailableSector = cd9660_setup_boot(firstAvailableSector);
+ firstAvailableSector = cd9660_setup_volume_descriptors(diskStructure);
+ if (diskStructure->is_bootable) {
+ firstAvailableSector = cd9660_setup_boot(diskStructure,
+ firstAvailableSector);
if (firstAvailableSector < 0)
errx(1, "setup_boot failed");
}
/* LE first, then BE */
- diskStructure.primaryLittleEndianTableSector = firstAvailableSector;
- diskStructure.primaryBigEndianTableSector =
- diskStructure.primaryLittleEndianTableSector + pathTableSectors;
+ diskStructure->primaryLittleEndianTableSector = firstAvailableSector;
+ diskStructure->primaryBigEndianTableSector =
+ diskStructure->primaryLittleEndianTableSector + pathTableSectors;
/* Set the secondary ones to -1, not going to use them for now */
- diskStructure.secondaryBigEndianTableSector = -1;
- diskStructure.secondaryLittleEndianTableSector = -1;
+ diskStructure->secondaryBigEndianTableSector = -1;
+ diskStructure->secondaryLittleEndianTableSector = -1;
- diskStructure.dataFirstSector =
- diskStructure.primaryBigEndianTableSector + pathTableSectors;
- if (diskStructure.verbose_level > 0)
+ diskStructure->dataFirstSector =
+ diskStructure->primaryBigEndianTableSector + pathTableSectors;
+ if (diskStructure->verbose_level > 0)
printf("cd9660_makefs: Path table conversion complete. "
"Each table is %i bytes, or %" PRIu64 " sectors.\n",
- diskStructure.pathTableLength, pathTableSectors);
+ diskStructure->pathTableLength, pathTableSectors);
- startoffset = diskStructure.sectorSize*diskStructure.dataFirstSector;
+ startoffset = diskStructure->sectorSize*diskStructure->dataFirstSector;
- totalSpace = cd9660_compute_offsets(real_root, startoffset);
+ totalSpace = cd9660_compute_offsets(diskStructure, real_root, startoffset);
- diskStructure.totalSectors = diskStructure.dataFirstSector +
- CD9660_BLOCKS(diskStructure.sectorSize, totalSpace);
+ diskStructure->totalSectors = diskStructure->dataFirstSector +
+ CD9660_BLOCKS(diskStructure->sectorSize, totalSpace);
/* Disabled until pass 1 is done */
- if (diskStructure.rock_ridge_enabled) {
- diskStructure.susp_continuation_area_start_sector =
- diskStructure.totalSectors;
- diskStructure.totalSectors +=
- CD9660_BLOCKS(diskStructure.sectorSize,
- diskStructure.susp_continuation_area_size);
- cd9660_susp_finalize(diskStructure.rootNode);
+ if (diskStructure->rock_ridge_enabled) {
+ diskStructure->susp_continuation_area_start_sector =
+ diskStructure->totalSectors;
+ diskStructure->totalSectors +=
+ CD9660_BLOCKS(diskStructure->sectorSize,
+ diskStructure->susp_continuation_area_size);
+ cd9660_susp_finalize(diskStructure, diskStructure->rootNode);
}
- cd9660_finalize_PVD();
+ cd9660_finalize_PVD(diskStructure);
/* Add padding sectors, just for testing purposes right now */
- /* diskStructure.totalSectors+=150; */
+ /* diskStructure->totalSectors+=150; */
/* Debugging output */
- if (diskStructure.verbose_level > 0) {
+ if (diskStructure->verbose_level > 0) {
printf("cd9660_makefs: Sectors 0-15 reserved\n");
printf("cd9660_makefs: Primary path tables starts in sector %"
- PRId64 "\n", diskStructure.primaryLittleEndianTableSector);
+ PRId64 "\n", diskStructure->primaryLittleEndianTableSector);
printf("cd9660_makefs: File data starts in sector %"
- PRId64 "\n", diskStructure.dataFirstSector);
+ PRId64 "\n", diskStructure->dataFirstSector);
printf("cd9660_makefs: Total sectors: %"
- PRId64 "\n", diskStructure.totalSectors);
+ PRId64 "\n", diskStructure->totalSectors);
}
/*
* Add padding sectors at the end
* TODO: Clean this up and separate padding
*/
- if (diskStructure.include_padding_areas)
- diskStructure.totalSectors += 150;
+ if (diskStructure->include_padding_areas)
+ diskStructure->totalSectors += 150;
- cd9660_write_image(image);
+ cd9660_write_image(diskStructure, image);
- if (diskStructure.verbose_level > 1) {
- debug_print_volume_descriptor_information();
- debug_print_tree(real_root,0);
+ if (diskStructure->verbose_level > 1) {
+ debug_print_volume_descriptor_information(diskStructure);
+ debug_print_tree(diskStructure, real_root, 0);
debug_print_path_tree(real_root);
}
/* Clean up data structures */
cd9660_free_structure(real_root);
- if (diskStructure.verbose_level > 0)
+ if (diskStructure->verbose_level > 0)
printf("cd9660_makefs: done\n");
}
@@ -618,76 +630,77 @@ cd9660_makefs(const char *image, const c
typedef int (*cd9660node_func)(cd9660node *);
static void
-cd9660_finalize_PVD(void)
+cd9660_finalize_PVD(iso9660_disk *diskStructure)
{
time_t tstamp = stampst.st_ino ? stampst.st_mtime : time(NULL);
/* root should be a fixed size of 34 bytes since it has no name */
- memcpy(diskStructure.primaryDescriptor.root_directory_record,
- diskStructure.rootNode->dot_record->isoDirRecord, 34);
+ memcpy(diskStructure->primaryDescriptor.root_directory_record,
+ diskStructure->rootNode->dot_record->isoDirRecord, 34);
/* In RRIP, this might be longer than 34 */
- diskStructure.primaryDescriptor.root_directory_record[0] = 34;
+ diskStructure->primaryDescriptor.root_directory_record[0] = 34;
/* Set up all the important numbers in the PVD */
- cd9660_bothendian_dword(diskStructure.totalSectors,
- (unsigned char *)diskStructure.primaryDescriptor.volume_space_size);
+ cd9660_bothendian_dword(diskStructure->totalSectors,
+ (unsigned char *)diskStructure->primaryDescriptor.volume_space_size);
cd9660_bothendian_word(1,
- (unsigned char *)diskStructure.primaryDescriptor.volume_set_size);
+ (unsigned char *)diskStructure->primaryDescriptor.volume_set_size);
cd9660_bothendian_word(1,
(unsigned char *)
- diskStructure.primaryDescriptor.volume_sequence_number);
- cd9660_bothendian_word(diskStructure.sectorSize,
+ diskStructure->primaryDescriptor.volume_sequence_number);
+ cd9660_bothendian_word(diskStructure->sectorSize,
(unsigned char *)
- diskStructure.primaryDescriptor.logical_block_size);
- cd9660_bothendian_dword(diskStructure.pathTableLength,
- (unsigned char *)diskStructure.primaryDescriptor.path_table_size);
-
- cd9660_731(diskStructure.primaryLittleEndianTableSector,
- (u_char *)diskStructure.primaryDescriptor.type_l_path_table);
- cd9660_732(diskStructure.primaryBigEndianTableSector,
- (u_char *)diskStructure.primaryDescriptor.type_m_path_table);
+ diskStructure->primaryDescriptor.logical_block_size);
+ cd9660_bothendian_dword(diskStructure->pathTableLength,
+ (unsigned char *)diskStructure->primaryDescriptor.path_table_size);
+
+ cd9660_731(diskStructure->primaryLittleEndianTableSector,
+ (u_char *)diskStructure->primaryDescriptor.type_l_path_table);
+ cd9660_732(diskStructure->primaryBigEndianTableSector,
+ (u_char *)diskStructure->primaryDescriptor.type_m_path_table);
- diskStructure.primaryDescriptor.file_structure_version[0] = 1;
+ diskStructure->primaryDescriptor.file_structure_version[0] = 1;
/* Pad all strings with spaces instead of nulls */
- cd9660_pad_string_spaces(diskStructure.primaryDescriptor.volume_id, 32);
- cd9660_pad_string_spaces(diskStructure.primaryDescriptor.system_id, 32);
- cd9660_pad_string_spaces(diskStructure.primaryDescriptor.volume_set_id,
+ cd9660_pad_string_spaces(diskStructure->primaryDescriptor.volume_id, 32);
+ cd9660_pad_string_spaces(diskStructure->primaryDescriptor.system_id, 32);
+ cd9660_pad_string_spaces(diskStructure->primaryDescriptor.volume_set_id,
128);
- cd9660_pad_string_spaces(diskStructure.primaryDescriptor.publisher_id,
+ cd9660_pad_string_spaces(diskStructure->primaryDescriptor.publisher_id,
128);
- cd9660_pad_string_spaces(diskStructure.primaryDescriptor.preparer_id,
+ cd9660_pad_string_spaces(diskStructure->primaryDescriptor.preparer_id,
128);
- cd9660_pad_string_spaces(diskStructure.primaryDescriptor.application_id,
+ cd9660_pad_string_spaces(diskStructure->primaryDescriptor.application_id,
128);
cd9660_pad_string_spaces(
- diskStructure.primaryDescriptor.copyright_file_id, 37);
+ diskStructure->primaryDescriptor.copyright_file_id, 37);
cd9660_pad_string_spaces(
- diskStructure.primaryDescriptor.abstract_file_id, 37);
+ diskStructure->primaryDescriptor.abstract_file_id, 37);
cd9660_pad_string_spaces(
- diskStructure.primaryDescriptor.bibliographic_file_id, 37);
+ diskStructure->primaryDescriptor.bibliographic_file_id, 37);
/* Setup dates */
cd9660_time_8426(
- (unsigned char *)diskStructure.primaryDescriptor.creation_date,
+ (unsigned char *)diskStructure->primaryDescriptor.creation_date,
tstamp);
cd9660_time_8426(
- (unsigned char *)diskStructure.primaryDescriptor.modification_date,
+ (unsigned char *)diskStructure->primaryDescriptor.modification_date,
tstamp);
#if 0
- cd9660_set_date(diskStructure.primaryDescriptor.expiration_date,
+ cd9660_set_date(diskStructure->primaryDescriptor.expiration_date,
tstamp);
#endif
- memset(diskStructure.primaryDescriptor.expiration_date, '0', 16);
- diskStructure.primaryDescriptor.expiration_date[16] = 0;
+ memset(diskStructure->primaryDescriptor.expiration_date, '0', 16);
+ diskStructure->primaryDescriptor.expiration_date[16] = 0;
+
cd9660_time_8426(
- (unsigned char *)diskStructure.primaryDescriptor.effective_date,
+ (unsigned char *)diskStructure->primaryDescriptor.effective_date,
tstamp);
/* make this sane */
- cd9660_time_915(diskStructure.rootNode->dot_record->isoDirRecord->date,
+ cd9660_time_915(diskStructure->rootNode->dot_record->isoDirRecord->date,
tstamp);
}
@@ -711,16 +724,16 @@ cd9660_populate_iso_dir_record(struct _i
}
static void
-cd9660_setup_root_node(void)
+cd9660_setup_root_node(iso9660_disk *diskStructure)
{
- cd9660_populate_iso_dir_record(diskStructure.rootNode->isoDirRecord,
+ cd9660_populate_iso_dir_record(diskStructure->rootNode->isoDirRecord,
0, ISO_FLAG_DIRECTORY, 1, "\0");
}
/*********** SUPPORT FUNCTIONS ***********/
static int
-cd9660_setup_volume_descriptors(void)
+cd9660_setup_volume_descriptors(iso9660_disk *diskStructure)
{
/* Boot volume descriptor should come second */
int sector = 16;
@@ -734,17 +747,17 @@ cd9660_setup_volume_descriptors(void)
}
temp->volumeDescriptorData =
- (unsigned char *)&diskStructure.primaryDescriptor;
+ (unsigned char *)&diskStructure->primaryDescriptor;
temp->volumeDescriptorData[0] = ISO_VOLUME_DESCRIPTOR_PVD;
temp->volumeDescriptorData[6] = 1;
temp->sector = sector;
memcpy(temp->volumeDescriptorData + 1,
ISO_VOLUME_DESCRIPTOR_STANDARD_ID, 5);
- diskStructure.firstVolumeDescriptor = temp;
+ diskStructure->firstVolumeDescriptor = temp;
sector++;
/* Set up boot support if enabled. BVD must reside in sector 17 */
- if (diskStructure.is_bootable) {
+ if (diskStructure->is_bootable) {
if ((t = malloc(sizeof(volume_descriptor))) == NULL) {
CD9660_MEM_ALLOC_ERROR(
"cd9660_setup_volume_descriptors");
@@ -759,9 +772,9 @@ cd9660_setup_volume_descriptors(void)
temp = t;
memset(t->volumeDescriptorData, 0, 2048);
t->sector = 17;
- if (diskStructure.verbose_level > 0)
+ if (diskStructure->verbose_level > 0)
printf("Setting up boot volume descriptor\n");
- cd9660_setup_boot_volume_descriptor(t);
+ cd9660_setup_boot_volume_descriptor(diskStructure, t);
sector++;
}
@@ -807,7 +820,7 @@ cd9660_fill_extended_attribute_record(cd
#endif
static int
-cd9660_translate_node_common(cd9660node *newnode)
+cd9660_translate_node_common(iso9660_disk *diskStructure, cd9660node *newnode)
{
time_t tstamp = stampst.st_ino ? stampst.st_mtime : time(NULL);
int test;
@@ -817,7 +830,7 @@ cd9660_translate_node_common(cd9660node
/* Now populate the isoDirRecord structure */
memset(temp, 0, ISO_FILENAME_MAXLENGTH_WITH_PADDING);
- test = cd9660_convert_filename(newnode->node->name,
+ test = cd9660_convert_filename(diskStructure, newnode->node->name,
temp, !(S_ISDIR(newnode->node->type)));
flag = ISO_FLAG_CLEAR;
@@ -851,10 +864,11 @@ cd9660_translate_node_common(cd9660node
* @returns int 0 on failure, 1 on success
*/
static int
-cd9660_translate_node(fsnode *node, cd9660node *newnode)
+cd9660_translate_node(iso9660_disk *diskStructure, fsnode *node,
+ cd9660node *newnode)
{
if (node == NULL) {
- if (diskStructure.verbose_level > 0)
+ if (diskStructure->verbose_level > 0)
printf("cd9660_translate_node: NULL node passed, "
"returning\n");
return 0;
@@ -872,7 +886,7 @@ cd9660_translate_node(fsnode *node, cd96
if (!(S_ISDIR(node->type)))
newnode->fileDataLength = node->inode->st.st_size;
- if (cd9660_translate_node_common(newnode) == 0)
+ if (cd9660_translate_node_common(diskStructure, newnode) == 0)
return 0;
/* Finally, overwrite some of the values that are set by default */
@@ -1006,7 +1020,8 @@ cd9660_sorted_child_insert(cd9660node *p
* where n represents the files respective place in the ordering
*/
static int
-cd9660_handle_collisions(cd9660node *colliding, int past)
+cd9660_handle_collisions(iso9660_disk *diskStructure, cd9660node *colliding,
+ int past)
{
cd9660node *iter, *next, *prev;
int skip;
@@ -1041,14 +1056,16 @@ cd9660_handle_collisions(cd9660node *col
temp_past--;
}
skip += past;
- iter = cd9660_rename_filename(iter, skip, delete_chars);
+ iter = cd9660_rename_filename(diskStructure, iter, skip,
+ delete_chars);
}
return flag;
}
static cd9660node *
-cd9660_rename_filename(cd9660node *iter, int num, int delete_chars)
+cd9660_rename_filename(iso9660_disk *diskStructure, cd9660node *iter, int num,
+ int delete_chars)
{
int i = 0;
int numbts, digit, digits, temp, powers, count;
@@ -1056,14 +1073,14 @@ cd9660_rename_filename(cd9660node *iter,
int maxlength;
char *tmp;
- if (diskStructure.verbose_level > 0)
+ if (diskStructure->verbose_level > 0)
printf("Rename_filename called\n");
- assert(1 <= diskStructure.isoLevel && diskStructure.isoLevel <= 2);
+ assert(1 <= diskStructure->isoLevel && diskStructure->isoLevel <= 2);
/* TODO : A LOT of chanes regarding 8.3 filenames */
- if (diskStructure.isoLevel == 1)
+ if (diskStructure->isoLevel == 1)
maxlength = 8;
- else if (diskStructure.isoLevel == 2)
+ else if (diskStructure->isoLevel == 2)
maxlength = 31;
else
maxlength = ISO_FILENAME_MAXLENGTH_BEFORE_VERSION;
@@ -1109,7 +1126,7 @@ cd9660_rename_filename(cd9660node *iter,
*/
/*
- if (diskStructure.isoLevel == 1) {
+ if (diskStructure->isoLevel == 1) {
numbts = 8 - digits - delete_chars;
if (dot < 0) {
@@ -1161,7 +1178,7 @@ cd9660_rename_filename(cd9660node *iter,
/* Todo: Figure out why these functions are nec. */
static void
-cd9660_copy_filenames(cd9660node *node)
+cd9660_copy_filenames(iso9660_disk *diskStructure, cd9660node *node)
{
cd9660node *cn;
@@ -1169,12 +1186,12 @@ cd9660_copy_filenames(cd9660node *node)
return;
if (TAILQ_FIRST(&node->cn_children)->isoDirRecord == NULL) {
- debug_print_tree(diskStructure.rootNode, 0);
+ debug_print_tree(diskStructure, diskStructure->rootNode, 0);
exit(1);
}
TAILQ_FOREACH(cn, &node->cn_children, cn_next_child) {
- cd9660_copy_filenames(cn);
+ cd9660_copy_filenames(diskStructure, cn);
memcpy(cn->o_name, cn->isoDirRecord->name,
ISO_FILENAME_MAXLENGTH_WITH_PADDING);
}
@@ -1241,7 +1258,7 @@ cd9660_count_collisions(cd9660node *copy
}
static cd9660node *
-cd9660_rrip_move_directory(cd9660node *dir)
+cd9660_rrip_move_directory(iso9660_disk *diskStructure, cd9660node *dir)
{
char newname[9];
cd9660node *tfile;
@@ -1252,28 +1269,29 @@ cd9660_rrip_move_directory(cd9660node *d
* 2) Point the virtual file to the new directory
* 3) Point the relocated directory to its old parent
* 4) Move the directory specified by dir into rr_moved_dir,
- * and rename it to "diskStructure.rock_ridge_move_count" (as a string)
+ * and rename it to "diskStructure->rock_ridge_move_count" (as a string)
*/
/* First see if the moved directory even exists */
- if (diskStructure.rr_moved_dir == NULL) {
- diskStructure.rr_moved_dir =
- cd9660_create_directory(ISO_RRIP_DEFAULT_MOVE_DIR_NAME,
- diskStructure.rootNode, dir);
- if (diskStructure.rr_moved_dir == NULL)
+ if (diskStructure->rr_moved_dir == NULL) {
+ diskStructure->rr_moved_dir = cd9660_create_directory(
+ diskStructure, ISO_RRIP_DEFAULT_MOVE_DIR_NAME,
+ diskStructure->rootNode, dir);
+ if (diskStructure->rr_moved_dir == NULL)
return 0;
- cd9660_time_915(diskStructure.rr_moved_dir->isoDirRecord->date,
+ cd9660_time_915(diskStructure->rr_moved_dir->isoDirRecord->date,
stampst.st_ino ? stampst.st_mtime : start_time.tv_sec);
}
/* Create a file with the same ORIGINAL name */
- tfile = cd9660_create_file(dir->node->name, dir->parent, dir);
+ tfile = cd9660_create_file(diskStructure, dir->node->name, dir->parent,
+ dir);
if (tfile == NULL)
return NULL;
- diskStructure.rock_ridge_move_count++;
+ diskStructure->rock_ridge_move_count++;
snprintf(newname, sizeof(newname), "%08i",
- diskStructure.rock_ridge_move_count);
+ diskStructure->rock_ridge_move_count);
/* Point to old parent */
dir->rr_real_parent = dir->parent;
@@ -1287,13 +1305,13 @@ cd9660_rrip_move_directory(cd9660node *d
}
/* Point to new parent */
- dir->parent = diskStructure.rr_moved_dir;
+ dir->parent = diskStructure->rr_moved_dir;
/* Point the file to the moved directory */
tfile->rr_relocated = dir;
/* Actually move the directory */
- cd9660_sorted_child_insert(diskStructure.rr_moved_dir, dir);
+ cd9660_sorted_child_insert(diskStructure->rr_moved_dir, dir);
/* TODO: Inherit permissions / ownership (basically the entire inode) */
@@ -1307,7 +1325,7 @@ cd9660_rrip_move_directory(cd9660node *d
}
static int
-cd9660_add_dot_records(cd9660node *root)
+cd9660_add_dot_records(iso9660_disk *diskStructure, cd9660node *root)
{
struct cd9660_children_head *head = &root->cn_children;
cd9660node *cn;
@@ -1316,10 +1334,11 @@ cd9660_add_dot_records(cd9660node *root)
if ((cn->type & CD9660_TYPE_DIR) == 0)
continue;
/* Recursion first */
- cd9660_add_dot_records(cn);
+ cd9660_add_dot_records(diskStructure, cn);
}
- cd9660_create_special_directory(CD9660_TYPE_DOT, root);
- cd9660_create_special_directory(CD9660_TYPE_DOTDOT, root);
+ cd9660_create_special_directory(diskStructure, CD9660_TYPE_DOT, root);
+ cd9660_create_special_directory(diskStructure, CD9660_TYPE_DOTDOT,
+ root);
return 1;
}
@@ -1334,8 +1353,8 @@ cd9660_add_dot_records(cd9660node *root)
* @param int* Running count of the number of directories that are being created
*/
static void
-cd9660_convert_structure(fsnode *root, cd9660node *parent_node, int level,
- int *numDirectories, int *error)
+cd9660_convert_structure(iso9660_disk *diskStructure, fsnode *root,
+ cd9660node *parent_node, int level, int *numDirectories, int *error)
{
fsnode *iterator = root;
cd9660node *this_node;
@@ -1378,7 +1397,8 @@ cd9660_convert_structure(fsnode *root, c
/* Translate the node, including its filename */
this_node->parent = parent_node;
- cd9660_translate_node(iterator, this_node);
+ cd9660_translate_node(diskStructure, iterator,
+ this_node);
this_node->level = level;
if (S_ISDIR(iterator->type)) {
@@ -1392,14 +1412,14 @@ cd9660_convert_structure(fsnode *root, c
* allowed as per ISO spec
*/
if (level == 8) {
- if ((!diskStructure.allow_deep_trees) &&
- (!diskStructure.rock_ridge_enabled)) {
+ if ((!diskStructure->allow_deep_trees) &&
+ (!diskStructure->rock_ridge_enabled)) {
warnx("error: found entry "
"with depth greater "
"than 8.");
(*error) = 1;
return;
- } else if (diskStructure.
+ } else if (diskStructure->
rock_ridge_enabled) {
working_level = 3;
/*
@@ -1409,6 +1429,7 @@ cd9660_convert_structure(fsnode *root, c
this_node->level =
working_level - 1;
if (cd9660_rrip_move_directory(
+ diskStructure,
this_node) == NULL) {
warnx("Failure in "
"cd9660_rrip_"
@@ -1423,8 +1444,8 @@ cd9660_convert_structure(fsnode *root, c
/* Do the recursive call on the children */
if (iterator->child != NULL) {
- cd9660_convert_structure(
- iterator->child, this_node,
+ cd9660_convert_structure(diskStructure,
+ iterator->child, this_node,
working_level,
numDirectories, error);
@@ -1463,10 +1484,11 @@ cd9660_convert_structure(fsnode *root, c
/* cd9660_handle_collisions(first_node); */
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-all
mailing list