Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Feb 2017 02:28:08 +0000 (UTC)
From:      Ed Maste <emaste@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r314117 - in head/usr.sbin/makefs: . cd9660
Message-ID:  <201702230228.v1N2S8V3003636@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201702230228.v1N2S8V3003636>