Created means to inquire ECMA119_SYMLINK and ECMA119_SPECIAL
for their original fs,dev,ino
This commit is contained in:
parent
56796ff55f
commit
46a947b602
@ -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);
|
ret1 = iso_file_src_cmp(n2->info.file, n2->info.file);
|
||||||
return ret1;
|
return ret1;
|
||||||
|
|
||||||
/* >>> Create means to inquire ECMA119_SYMLINK and ECMA119_SPECIAL
|
#ifdef Libisofs_hardlink_matcheR
|
||||||
for their original fs,dev,ino tuple */
|
|
||||||
} else {
|
|
||||||
|
|
||||||
|
} 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 (v1 < v2 ? -1 : 1); /* case v1 == v2 is handled above */
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2744,6 +2744,13 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
|||||||
}
|
}
|
||||||
link->dest = strdup(dest);
|
link->dest = strdup(dest);
|
||||||
link->node.type = LIBISO_SYMLINK;
|
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 = (IsoNode*) link;
|
||||||
new->refcount = 0;
|
new->refcount = 0;
|
||||||
}
|
}
|
||||||
@ -2762,6 +2769,13 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
|||||||
}
|
}
|
||||||
special->dev = info.st_rdev;
|
special->dev = info.st_rdev;
|
||||||
special->node.type = LIBISO_SPECIAL;
|
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 = (IsoNode*) special;
|
||||||
new->refcount = 0;
|
new->refcount = 0;
|
||||||
}
|
}
|
||||||
|
@ -5333,7 +5333,7 @@ struct burn_source {
|
|||||||
/* Experiment: Ignore PX inode numbers,
|
/* Experiment: Ignore PX inode numbers,
|
||||||
have boot image inode number counted by fs_give_ino_number()
|
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
|
#define Libisofs_new_fs_image_inO yes
|
||||||
|
|
||||||
@ -5341,18 +5341,12 @@ struct burn_source {
|
|||||||
|
|
||||||
/* Experiment: Revoke Ticket 144, use data file LBAs again.
|
/* Experiment: Revoke Ticket 144, use data file LBAs again.
|
||||||
(will work only if not Libisofs_new_fs_image_inO)
|
(will work only if not Libisofs_new_fs_image_inO)
|
||||||
|
|
||||||
|
<<< Overridden if Libisofs_hardlink_prooF is defined.
|
||||||
|
|
||||||
#define Libisofs_ino_from_lbA yes
|
#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.
|
/* Experiment: Write obsolete RR entries with Rock Ridge.
|
||||||
I suspect Solaris wants to see them.
|
I suspect Solaris wants to see them.
|
||||||
|
@ -1309,6 +1309,13 @@ int iso_node_new_symlink(char *name, char *dest, IsoSymlink **link)
|
|||||||
new->node.name = name;
|
new->node.name = name;
|
||||||
new->dest = dest;
|
new->dest = dest;
|
||||||
new->node.mode = S_IFLNK;
|
new->node.mode = S_IFLNK;
|
||||||
|
|
||||||
|
#ifdef Libisofs_hardlink_matcheR
|
||||||
|
new->fs_id = 0;
|
||||||
|
new->st_dev = 0;
|
||||||
|
new->st_ino = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
*link = new;
|
*link = new;
|
||||||
return ISO_SUCCESS;
|
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->node.mode = mode;
|
||||||
new->dev = dev;
|
new->dev = dev;
|
||||||
|
|
||||||
|
#ifdef Libisofs_hardlink_matcheR
|
||||||
|
new->fs_id = 0;
|
||||||
|
new->st_dev = 0;
|
||||||
|
new->st_ino = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
*special = new;
|
*special = new;
|
||||||
return ISO_SUCCESS;
|
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;
|
goto no_id;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
#ifdef Libisofs_hardlink_matcheR
|
||||||
|
|
||||||
|
/* >>> check for id tuples of LIBISO_SYMLINK and LIBISO_SPECIAL */;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
no_id:;
|
no_id:;
|
||||||
*fs_id = 0;
|
*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);
|
ret = iso_stream_set_image_ino(file->stream, ino, 0);
|
||||||
if (ret < 0 || ret == 1)
|
if (ret < 0 || ret == 1)
|
||||||
return ret;
|
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);
|
ret = iso_node_set_ino_xinfo(node, ino, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
@ -122,7 +122,7 @@ struct Iso_File
|
|||||||
* Higher weighting files are written at the beginning of image
|
* Higher weighting files are written at the beginning of image
|
||||||
*/
|
*/
|
||||||
int sort_weight;
|
int sort_weight;
|
||||||
IsoStream *stream;
|
IsoStream *stream; /* Knows fs_id, st_dev, and st_ino */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Iso_Symlink
|
struct Iso_Symlink
|
||||||
@ -130,12 +130,34 @@ struct Iso_Symlink
|
|||||||
IsoNode node;
|
IsoNode node;
|
||||||
|
|
||||||
char *dest;
|
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
|
struct Iso_Special
|
||||||
{
|
{
|
||||||
IsoNode node;
|
IsoNode node;
|
||||||
dev_t dev;
|
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
|
struct iso_dir_iter_iface
|
||||||
|
@ -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(s1, &fs_id1, &dev_id1, &ino_id1);
|
||||||
iso_stream_get_id(s2, &fs_id2, &dev_id2, &ino_id2);
|
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) {
|
if (fs_id1 < fs_id2) {
|
||||||
return -1;
|
return -1;
|
||||||
} else if (fs_id1 > fs_id2) {
|
} 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) {
|
} else if (size1 > size2) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef Libisofs_hardlink_matcheR
|
||||||
|
if (fs_id1 == 0 && dev_id1 == 0 && ino_id1 == 0) {
|
||||||
|
return (s1 < s2 ? -1 : 1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user