Created means to inquire ECMA119_SYMLINK and ECMA119_SPECIAL

for their original fs,dev,ino
This commit is contained in:
Thomas Schmitt 2009-05-03 19:21:21 +02:00
parent 56796ff55f
commit 46a947b602
6 changed files with 102 additions and 23 deletions

View File

@ -925,10 +925,31 @@ int ecma119_node_cmp(const void *v1, const void *v2)
ret1 = iso_file_src_cmp(n2->info.file, n2->info.file);
return ret1;
/* >>> Create means to inquire ECMA119_SYMLINK and ECMA119_SPECIAL
for their original fs,dev,ino tuple */
} else {
#ifdef Libisofs_hardlink_matcheR
} else if (n1->type == ECMA119_SYMLINK) {
IsoSymlink *t1, *t2;
t1 = (IsoSymlink *) (n1->node);
t2 = (IsoSymlink *) (n2->node);
return (t1->fs_id < t2->fs_id ? -1 : t1->fs_id > t2->fs_id ? 1 :
t1->st_dev < t2->st_dev ? -1 : t1->st_dev > t2->st_dev ? 1 :
t1->st_ino < t2->st_ino ? -1 : t1->st_ino > t2->st_ino ? 1 :
t1->fs_id || t1->st_dev || t1->st_ino ? 0 : (v1 < v2 ? -1 : 1));
} else if (n1->type == ECMA119_SPECIAL) {
IsoSpecial *t1, *t2;
t1 = (IsoSpecial *) (n1->node);
t2 = (IsoSpecial *) (n2->node);
return (t1->fs_id < t2->fs_id ? -1 : t1->fs_id > t2->fs_id ? 1 :
t1->st_dev < t2->st_dev ? -1 : t1->st_dev > t2->st_dev ? 1 :
t1->st_ino < t2->st_ino ? -1 : t1->st_ino > t2->st_ino ? 1 :
t1->fs_id || t1->st_dev || t1->st_ino ? 0 : (v1 < v2 ? -1 : 1));
#endif /* Libisofs_hardlink_matcheR */
} else {
return (v1 < v2 ? -1 : 1); /* case v1 == v2 is handled above */
}
return 0;

View File

@ -2744,6 +2744,13 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
}
link->dest = strdup(dest);
link->node.type = LIBISO_SYMLINK;
#ifdef Libisofs_hardlink_matcheR
link->fs_id = ISO_IMAGE_FS_ID;
link->st_dev = info.st_dev;
link->st_ino = info.st_ino;
#endif
new = (IsoNode*) link;
new->refcount = 0;
}
@ -2762,6 +2769,13 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
}
special->dev = info.st_rdev;
special->node.type = LIBISO_SPECIAL;
#ifdef Libisofs_hardlink_matcheR
special->fs_id = ISO_IMAGE_FS_ID;
special->st_dev = info.st_dev;
special->st_ino = info.st_ino;
#endif
new = (IsoNode*) special;
new->refcount = 0;
}

View File

@ -5333,7 +5333,7 @@ struct burn_source {
/* Experiment: Ignore PX inode numbers,
have boot image inode number counted by fs_give_ino_number()
Overridden if Libisofs_hardlink_prooF is defined.
<<< Overridden if Libisofs_hardlink_prooF is defined.
*/
#define Libisofs_new_fs_image_inO yes
@ -5341,18 +5341,12 @@ struct burn_source {
/* Experiment: Revoke Ticket 144, use data file LBAs again.
(will work only if not Libisofs_new_fs_image_inO)
<<< Overridden if Libisofs_hardlink_prooF is defined.
#define Libisofs_ino_from_lbA yes
*/
/* Experiment: Regarding (fs_id == 0 && dev_id == 0 && ino_id == 0)
as always unique.
WAS DANGEROUS: In a previous experiment iso_rbtree_insert() needed equality.
Now i changed the test in there, so that identical IsoFileSrc
objects are considered equal regardless of their id.
STILL UNTESTED.
#define Libisofs_file_src_cmp_non_zerO yes
*/
/* Experiment: Write obsolete RR entries with Rock Ridge.
I suspect Solaris wants to see them.

View File

@ -1309,6 +1309,13 @@ int iso_node_new_symlink(char *name, char *dest, IsoSymlink **link)
new->node.name = name;
new->dest = dest;
new->node.mode = S_IFLNK;
#ifdef Libisofs_hardlink_matcheR
new->fs_id = 0;
new->st_dev = 0;
new->st_ino = 0;
#endif
*link = new;
return ISO_SUCCESS;
}
@ -1341,6 +1348,12 @@ int iso_node_new_special(char *name, mode_t mode, dev_t dev,
new->node.mode = mode;
new->dev = dev;
#ifdef Libisofs_hardlink_matcheR
new->fs_id = 0;
new->st_dev = 0;
new->st_ino = 0;
#endif
*special = new;
return ISO_SUCCESS;
}
@ -2286,7 +2299,16 @@ int iso_node_get_id(IsoNode *node, unsigned int *fs_id, dev_t *dev_id,
goto no_id;
}
return 1;
#ifdef Libisofs_hardlink_matcheR
/* >>> check for id tuples of LIBISO_SYMLINK and LIBISO_SPECIAL */;
#endif
}
ret = 0;
no_id:;
*fs_id = 0;
@ -2338,6 +2360,14 @@ int iso_node_set_ino(IsoNode *node, ino_t ino, int flag)
ret = iso_stream_set_image_ino(file->stream, ino, 0);
if (ret < 0 || ret == 1)
return ret;
#ifdef Libisofs_hardlink_matcheR
/* >>> check for id tuples of LIBISO_SYMLINK and LIBISO_SPECIAL :
if fs_id = ISO_IMAGE_FS_ID then overwite .st_ino */;
#endif
}
ret = iso_node_set_ino_xinfo(node, ino, 0);
if (ret < 0)

View File

@ -122,7 +122,7 @@ struct Iso_File
* Higher weighting files are written at the beginning of image
*/
int sort_weight;
IsoStream *stream;
IsoStream *stream; /* Knows fs_id, st_dev, and st_ino */
};
struct Iso_Symlink
@ -130,12 +130,34 @@ struct Iso_Symlink
IsoNode node;
char *dest;
#ifdef Libisofs_hardlink_matcheR
/* If the IsoNode represents an object in an existing filesystem then
the following three numbers should unique identify it.
(0,0,0) will always be taken as unique.
*/
unsigned int fs_id;
dev_t st_dev;
ino_t st_ino;
#endif
};
struct Iso_Special
{
IsoNode node;
dev_t dev;
#ifdef Libisofs_hardlink_matcheR
/* If the IsoNode represents an object in an existing filesystem then
the following three numbers should unique identify it.
(0,0,0) will always be taken as unique.
*/
unsigned int fs_id;
dev_t st_dev;
ino_t st_ino;
#endif
};
struct iso_dir_iter_iface

View File

@ -742,15 +742,6 @@ int iso_stream_cmp_ino(IsoStream *s1, IsoStream *s2, int flag)
}
iso_stream_get_id(s1, &fs_id1, &dev_id1, &ino_id1);
iso_stream_get_id(s2, &fs_id2, &dev_id2, &ino_id2);
#ifdef Libisofs_file_src_cmp_non_zerO
if (fs_id1 == 0 && dev_id1 == 0 && ino_id1 == 0) {
return -1;
} else if (fs_id2 == 0 && dev_id2 == 0 && ino_id2 == 0)
return 1;
}
#endif
if (fs_id1 < fs_id2) {
return -1;
} else if (fs_id1 > fs_id2) {
@ -773,5 +764,12 @@ int iso_stream_cmp_ino(IsoStream *s1, IsoStream *s2, int flag)
} else if (size1 > size2) {
return 1;
}
#ifdef Libisofs_hardlink_matcheR
if (fs_id1 == 0 && dev_id1 == 0 && ino_id1 == 0) {
return (s1 < s2 ? -1 : 1);
}
#endif
return 0;
}