Page MenuHomeFreeBSD

D49141.diff
No OneTemporary

D49141.diff

diff --git a/usr.sbin/makefs/cd9660.h b/usr.sbin/makefs/cd9660.h
--- a/usr.sbin/makefs/cd9660.h
+++ b/usr.sbin/makefs/cd9660.h
@@ -51,6 +51,7 @@
#include <sys/queue.h>
#include <sys/param.h>
#include <sys/endian.h>
+#include <sys/tree.h>
#include "makefs.h"
#include "iso.h"
@@ -203,6 +204,12 @@
struct _volume_descriptor *next;
} volume_descriptor;
+struct inode_map_node {
+ RB_ENTRY(inode_map_node) entry;
+ uint64_t key;
+ uint64_t value;
+};
+
typedef struct _iso9660_disk {
int sectorSize;
struct iso_primary_descriptor primaryDescriptor;
@@ -249,6 +256,9 @@
unsigned rock_ridge_move_count;
cd9660node *rr_moved_dir;
+ uint64_t rr_inode_next;
+ RB_HEAD(inode_map_tree, inode_map_node) rr_inode_map;
+
int chrp_boot;
/* Spec breaking options */
@@ -275,6 +285,8 @@
} iso9660_disk;
+RB_PROTOTYPE(inode_map_tree, inode_map_node, entry, inode_map_node_cmp);
+
/************ FUNCTIONS **************/
int cd9660_valid_a_chars(const char *);
int cd9660_valid_d_chars(const char *);
diff --git a/usr.sbin/makefs/cd9660/iso9660_rrip.h b/usr.sbin/makefs/cd9660/iso9660_rrip.h
--- a/usr.sbin/makefs/cd9660/iso9660_rrip.h
+++ b/usr.sbin/makefs/cd9660/iso9660_rrip.h
@@ -224,7 +224,7 @@
int cd9660_rrip_finalize_node(cd9660node *);
/* POSIX File attribute */
-int cd9660node_rrip_px(struct ISO_SUSP_ATTRIBUTES *, fsnode *);
+int cd9660node_rrip_px(iso9660_disk *, struct ISO_SUSP_ATTRIBUTES *, fsnode *);
/* Device number */
int cd9660node_rrip_pn(struct ISO_SUSP_ATTRIBUTES *, fsnode *);
diff --git a/usr.sbin/makefs/cd9660/iso9660_rrip.c b/usr.sbin/makefs/cd9660/iso9660_rrip.c
--- a/usr.sbin/makefs/cd9660/iso9660_rrip.c
+++ b/usr.sbin/makefs/cd9660/iso9660_rrip.c
@@ -47,7 +47,7 @@
#include "iso9660_rrip.h"
#include <util.h>
-static void cd9660_rrip_initialize_inode(cd9660node *);
+static void cd9660_rrip_initialize_inode(iso9660_disk *, cd9660node *);
static int cd9660_susp_handle_continuation(iso9660_disk *, cd9660node *);
static int cd9660_susp_handle_continuation_common(iso9660_disk *, cd9660node *,
int);
@@ -70,6 +70,9 @@
if (node->dot_dot_record != 0)
TAILQ_INIT(&(node->dot_dot_record->head));
+ RB_INIT(&diskStructure->rr_inode_map);
+ diskStructure->rr_inode_next = 1;
+
/* SUSP specific entries here */
if ((r = cd9660_susp_initialize_node(diskStructure, node)) < 0)
return r;
@@ -101,6 +104,7 @@
cd9660_susp_finalize(iso9660_disk *diskStructure, cd9660node *node)
{
cd9660node *temp;
+ struct inode_map_node *mapnode, *mapnodetmp;
int r;
assert(node != NULL);
@@ -117,6 +121,12 @@
if ((r = cd9660_susp_finalize(diskStructure, temp)) < 0)
return r;
}
+ RB_FOREACH_SAFE(mapnode, inode_map_tree,
+ &(diskStructure->rr_inode_map), mapnodetmp) {
+ RB_REMOVE(inode_map_tree, &(diskStructure->rr_inode_map),
+ mapnode);
+ free(mapnode);
+ }
return 1;
}
@@ -323,7 +333,7 @@
}
static void
-cd9660_rrip_initialize_inode(cd9660node *node)
+cd9660_rrip_initialize_inode(iso9660_disk *diskStructure, cd9660node *node)
{
struct ISO_SUSP_ATTRIBUTES *attr;
@@ -337,7 +347,7 @@
/* PX - POSIX attributes */
attr = cd9660node_susp_create_node(SUSP_TYPE_RRIP,
SUSP_ENTRY_RRIP_PX, "PX", SUSP_LOC_ENTRY);
- cd9660node_rrip_px(attr, node->node);
+ cd9660node_rrip_px(diskStructure, attr, node->node);
TAILQ_INSERT_TAIL(&node->head, attr, rr_ll);
@@ -390,7 +400,8 @@
/* PX - POSIX attributes */
current = cd9660node_susp_create_node(SUSP_TYPE_RRIP,
SUSP_ENTRY_RRIP_PX, "PX", SUSP_LOC_ENTRY);
- cd9660node_rrip_px(current, parent->node);
+ cd9660node_rrip_px(diskStructure, current,
+ parent->node);
TAILQ_INSERT_TAIL(&node->head, current, rr_ll);
/* TF - timestamp */
@@ -405,7 +416,8 @@
/* PX - POSIX attributes */
current = cd9660node_susp_create_node(SUSP_TYPE_RRIP,
SUSP_ENTRY_RRIP_PX, "PX", SUSP_LOC_ENTRY);
- cd9660node_rrip_px(current, grandparent->node);
+ cd9660node_rrip_px(diskStructure, current,
+ grandparent->node);
TAILQ_INSERT_TAIL(&node->head, current, rr_ll);
/* TF - timestamp */
@@ -422,7 +434,7 @@
TAILQ_INSERT_TAIL(&node->head, current, rr_ll);
}
} else {
- cd9660_rrip_initialize_inode(node);
+ cd9660_rrip_initialize_inode(diskStructure, node);
if (node == diskStructure->rr_moved_dir) {
cd9660_rrip_add_NM(node, RRIP_DEFAULT_MOVE_DIR_NAME);
@@ -630,8 +642,45 @@
}
}
+static int
+inode_map_node_cmp(struct inode_map_node *a, struct inode_map_node *b)
+{
+ if (a->key < b->key)
+ return (-1);
+ if (a->key > b->key)
+ return (1);
+ return (0);
+}
+
+RB_GENERATE(inode_map_tree, inode_map_node, entry, inode_map_node_cmp);
+
+static uint64_t
+inode_map(iso9660_disk *diskStructure, uint64_t in)
+{
+ struct inode_map_node lookup = { .key = in };
+ struct inode_map_node *node;
+
+ /*
+ * Always assign an inode number if src inode unset. mtree mode leaves
+ * src inode unset for files with st_nlink == 1.
+ */
+ if (in != 0) {
+ node = RB_FIND(inode_map_tree, &(diskStructure->rr_inode_map),
+ &lookup);
+ if (node != 0)
+ return (node->value);
+ }
+
+ node = emalloc(sizeof(struct inode_map_node));
+ node->key = in;
+ node->value = diskStructure->rr_inode_next++;
+ RB_INSERT(inode_map_tree, &(diskStructure->rr_inode_map), node);
+ return (node->value);
+}
+
int
-cd9660node_rrip_px(struct ISO_SUSP_ATTRIBUTES *v, fsnode *pxinfo)
+cd9660node_rrip_px(iso9660_disk *diskStructure, struct ISO_SUSP_ATTRIBUTES *v,
+ fsnode *pxinfo)
{
v->attr.rr_entry.PX.h.length[0] = 44;
v->attr.rr_entry.PX.h.version[0] = 1;
@@ -643,8 +692,8 @@
v->attr.rr_entry.PX.uid);
cd9660_bothendian_dword(pxinfo->inode->st.st_gid,
v->attr.rr_entry.PX.gid);
- cd9660_bothendian_dword(pxinfo->inode->st.st_ino,
- v->attr.rr_entry.PX.serial);
+ cd9660_bothendian_dword(inode_map(diskStructure,
+ pxinfo->inode->st.st_ino), v->attr.rr_entry.PX.serial);
return 1;
}

File Metadata

Mime Type
text/plain
Expires
Sat, Mar 1, 8:35 PM (15 h, 58 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16911571
Default Alt Text
D49141.diff (5 KB)

Event Timeline