Wider scope of hardlink reconstruction with extract operations
This commit is contained in:
@ -142,15 +142,7 @@ int Xorriso_destroy_node_array(struct XorrisO *xorriso, int flag)
|
||||
iso_node_unref((IsoNode *) xorriso->node_array[i]);
|
||||
free(xorriso->node_array);
|
||||
}
|
||||
if(xorriso->node_targets != NULL) {
|
||||
for(i= 0; i < xorriso->node_counter; i++)
|
||||
if(xorriso->node_targets[i] != NULL)
|
||||
free(xorriso->node_targets[i]);
|
||||
free(xorriso->node_targets);
|
||||
}
|
||||
xorriso->node_array= NULL;
|
||||
xorriso->node_targets= NULL;
|
||||
xorriso->node_targets_availmem= 0;
|
||||
xorriso->node_counter= xorriso->node_array_size= 0;
|
||||
Xorriso_lst_destroy_all(&(xorriso->node_disk_prefixes), 0);
|
||||
Xorriso_lst_destroy_all(&(xorriso->node_img_prefixes), 0);
|
||||
@ -158,6 +150,32 @@ int Xorriso_destroy_node_array(struct XorrisO *xorriso, int flag)
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= do not destroy hln_array but only hln_targets
|
||||
*/
|
||||
int Xorriso_destroy_hln_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
||||
if(xorriso->hln_array != NULL && !(flag & 1)) {
|
||||
for(i= 0; i < xorriso->hln_count; i++)
|
||||
iso_node_unref((IsoNode *) xorriso->hln_array[i]);
|
||||
free(xorriso->hln_array);
|
||||
xorriso->hln_array= NULL;
|
||||
xorriso->hln_count= 0;
|
||||
}
|
||||
if(xorriso->hln_targets != NULL) {
|
||||
for(i= 0; i < xorriso->hln_count; i++)
|
||||
if(xorriso->hln_targets[i] != NULL)
|
||||
free(xorriso->hln_targets[i]);
|
||||
free(xorriso->hln_targets);
|
||||
xorriso->hln_targets= NULL;
|
||||
}
|
||||
xorriso->node_targets_availmem= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_destroy_di_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int i;
|
||||
@ -181,16 +199,13 @@ int Xorriso_destroy_di_array(struct XorrisO *xorriso, int flag)
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= allocate xorriso->node_targets too
|
||||
*/
|
||||
int Xorriso_new_node_array(struct XorrisO *xorriso, off_t mem_limit, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(xorriso->node_counter <= 0) {
|
||||
Xorriso_destroy_node_array(xorriso, 0);
|
||||
if(xorriso->node_counter <= 0)
|
||||
return(1);
|
||||
}
|
||||
|
||||
xorriso->node_array= calloc(xorriso->node_counter, sizeof(IsoNode *));
|
||||
if(xorriso->node_array == NULL) {
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
@ -198,24 +213,48 @@ int Xorriso_new_node_array(struct XorrisO *xorriso, off_t mem_limit, int flag)
|
||||
}
|
||||
for(i= 0; i < xorriso->node_counter; i++)
|
||||
xorriso->node_array[i]= NULL;
|
||||
if(flag & 1) {
|
||||
xorriso->node_targets= calloc(xorriso->node_counter, sizeof(char *));
|
||||
if(xorriso->node_array == NULL) {
|
||||
free(xorriso->node_array);
|
||||
xorriso->node_array= NULL;
|
||||
xorriso->node_array_size= xorriso->node_counter;
|
||||
xorriso->node_counter= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= do not allocate hln_array but only hln_targets
|
||||
*/
|
||||
int Xorriso_new_hln_array(struct XorrisO *xorriso, off_t mem_limit, int flag)
|
||||
{
|
||||
int i;
|
||||
|
||||
Xorriso_destroy_hln_array(xorriso, flag & 1);
|
||||
if(xorriso->hln_count <= 0)
|
||||
return(1);
|
||||
|
||||
if(!(flag & 1)) {
|
||||
xorriso->hln_array= calloc(xorriso->hln_count, sizeof(char *));
|
||||
if(xorriso->hln_array == NULL) {
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
return(-1);
|
||||
}
|
||||
for(i= 0; i < xorriso->node_counter; i++)
|
||||
xorriso->node_targets[i]= NULL;
|
||||
xorriso->node_targets_availmem= mem_limit
|
||||
- xorriso->node_counter * sizeof(void *)
|
||||
- xorriso->node_counter * sizeof(char *);
|
||||
for(i= 0; i < xorriso->hln_count; i++)
|
||||
xorriso->hln_array[i]= NULL;
|
||||
}
|
||||
|
||||
xorriso->hln_targets= calloc(xorriso->hln_count, sizeof(char *));
|
||||
if(xorriso->hln_targets == NULL) {
|
||||
if(!(flag & 1)) {
|
||||
free(xorriso->hln_array);
|
||||
xorriso->hln_array= NULL;
|
||||
}
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
return(-1);
|
||||
}
|
||||
for(i= 0; i < xorriso->hln_count; i++)
|
||||
xorriso->hln_targets[i]= NULL;
|
||||
xorriso->node_targets_availmem= mem_limit
|
||||
- xorriso->hln_count * sizeof(void *)
|
||||
- xorriso->hln_count * sizeof(char *);
|
||||
if(xorriso->node_targets_availmem < 0)
|
||||
xorriso->node_targets_availmem= 0;
|
||||
}
|
||||
xorriso->node_array_size= xorriso->node_counter;
|
||||
xorriso->node_counter= 0;
|
||||
return(1);
|
||||
}
|
||||
|
||||
@ -299,14 +338,14 @@ int Xorriso__search_node(void *node_array[], int n,
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_search_in_node_array(struct XorrisO *xorriso,
|
||||
int Xorriso_search_in_hln_array(struct XorrisO *xorriso,
|
||||
void *node, int *idx, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if(xorriso->node_array_size <= 0 || xorriso->node_array == NULL)
|
||||
if(xorriso->hln_array == NULL || xorriso->hln_count <= 0)
|
||||
return(0);
|
||||
ret= Xorriso__search_node(xorriso->node_array, xorriso->node_counter,
|
||||
ret= Xorriso__search_node(xorriso->hln_array, xorriso->hln_count,
|
||||
Xorriso__findi_sorted_ino_cmp, node, idx, 0);
|
||||
return ret;
|
||||
}
|
||||
@ -3832,7 +3871,7 @@ int Xorriso_restore_overwrite(struct XorrisO *xorriso,
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= do not accept node_targets[i] != NULL as *node_idx
|
||||
/* @param flag bit0= do not accept hln_targets[i] != NULL as *node_idx
|
||||
bit1= use *node_idx as found index rather than searching it
|
||||
*/
|
||||
int Xorriso_search_hardlinks(struct XorrisO *xorriso, IsoNode *node,
|
||||
@ -3847,16 +3886,16 @@ int Xorriso_search_hardlinks(struct XorrisO *xorriso, IsoNode *node,
|
||||
idx= *node_idx;
|
||||
} else {
|
||||
*node_idx= -1;
|
||||
ret= Xorriso_search_in_node_array(xorriso, np, &idx, 0);
|
||||
ret= Xorriso_search_in_hln_array(xorriso, np, &idx, 0);
|
||||
if(ret <= 0)
|
||||
return(ret);
|
||||
}
|
||||
for(i= idx - 1; i >= 0 ; i--)
|
||||
if(Xorriso__findi_sorted_ino_cmp(&(xorriso->node_array[i]), &np) != 0)
|
||||
if(Xorriso__findi_sorted_ino_cmp(&(xorriso->hln_array[i]), &np) != 0)
|
||||
break;
|
||||
*min_hl= i + 1;
|
||||
for(i= idx + 1; i < xorriso->node_counter; i++)
|
||||
if(Xorriso__findi_sorted_ino_cmp(&(xorriso->node_array[i]), &np) != 0)
|
||||
for(i= idx + 1; i < xorriso->hln_count; i++)
|
||||
if(Xorriso__findi_sorted_ino_cmp(&(xorriso->hln_array[i]), &np) != 0)
|
||||
break;
|
||||
*max_hl= i - 1;
|
||||
|
||||
@ -3864,9 +3903,9 @@ int Xorriso_search_hardlinks(struct XorrisO *xorriso, IsoNode *node,
|
||||
if(flag & 2)
|
||||
return(1);
|
||||
for(i= *min_hl; i <= *max_hl; i++)
|
||||
if(xorriso->node_array[i] == np) {
|
||||
if((flag & 1) && xorriso->node_targets != NULL)
|
||||
if(xorriso->node_targets[i] != NULL)
|
||||
if(xorriso->hln_array[i] == np) {
|
||||
if((flag & 1) && xorriso->hln_targets != NULL)
|
||||
if(xorriso->hln_targets[i] != NULL)
|
||||
continue;
|
||||
*node_idx= i;
|
||||
break;
|
||||
@ -3886,7 +3925,7 @@ int Xorriso_restore_target_hl(struct XorrisO *xorriso, IsoNode *node,
|
||||
{
|
||||
int ret, min_hl, max_hl, i, null_target_sibling= 0, link_sibling= 0;
|
||||
|
||||
if(xorriso->node_targets == NULL)
|
||||
if(xorriso->hln_targets == NULL)
|
||||
return(0);
|
||||
ret= Xorriso_search_hardlinks(xorriso, node, node_idx, &min_hl, &max_hl, 1);
|
||||
if(ret < 0)
|
||||
@ -3894,13 +3933,13 @@ int Xorriso_restore_target_hl(struct XorrisO *xorriso, IsoNode *node,
|
||||
if(ret == 0 || *node_idx < 0 || min_hl == max_hl)
|
||||
return(0);
|
||||
for(i= min_hl; i <= max_hl; i++) {
|
||||
if(xorriso->node_targets[i] == NULL) {
|
||||
if(xorriso->hln_targets[i] == NULL) {
|
||||
if(i != *node_idx)
|
||||
null_target_sibling= 1;
|
||||
continue;
|
||||
}
|
||||
link_sibling= 1;
|
||||
ret= Xorriso_restore_make_hl(xorriso, xorriso->node_targets[i], disk_path,
|
||||
ret= Xorriso_restore_make_hl(xorriso, xorriso->hln_targets[i], disk_path,
|
||||
0);
|
||||
if(ret > 0)
|
||||
return(1);
|
||||
@ -3967,12 +4006,12 @@ int Xorriso_register_node_target(struct XorrisO *xorriso, int node_idx,
|
||||
|
||||
if(xorriso->node_targets_availmem == 0)
|
||||
return(2);
|
||||
if(xorriso->node_targets == NULL || node_idx < 0 ||
|
||||
node_idx >= xorriso->node_array_size || node_idx >= xorriso->node_counter)
|
||||
if(xorriso->hln_targets == NULL || node_idx < 0 ||
|
||||
node_idx >= xorriso->hln_count)
|
||||
return(0);
|
||||
if(xorriso->node_targets[node_idx] != NULL) {
|
||||
xorriso->node_targets_availmem+= strlen(xorriso->node_targets[node_idx]) +1;
|
||||
free(xorriso->node_targets[node_idx]);
|
||||
if(xorriso->hln_targets[node_idx] != NULL) {
|
||||
xorriso->node_targets_availmem+= strlen(xorriso->hln_targets[node_idx]) +1;
|
||||
free(xorriso->hln_targets[node_idx]);
|
||||
}
|
||||
l= strlen(disk_path);
|
||||
if(xorriso->node_targets_availmem <= l + 1) {
|
||||
@ -3982,8 +4021,8 @@ int Xorriso_register_node_target(struct XorrisO *xorriso, int node_idx,
|
||||
xorriso->node_targets_availmem= 0;
|
||||
return(0);
|
||||
}
|
||||
xorriso->node_targets[node_idx]= strdup(disk_path);
|
||||
if(xorriso->node_targets[node_idx] == NULL) {
|
||||
xorriso->hln_targets[node_idx]= strdup(disk_path);
|
||||
if(xorriso->hln_targets[node_idx] == NULL) {
|
||||
Xorriso_no_malloc_memory(xorriso, NULL, 0);
|
||||
return(-1);
|
||||
}
|
||||
@ -11592,26 +11631,12 @@ int Xorriso_status_zisofs(struct XorrisO *xorriso, char *filter, FILE *fp,
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= overwrite existing di_array (else return 2)
|
||||
bit1= make di_array despite xorriso->ino_behavior bit 3
|
||||
*/
|
||||
int Xorriso_make_di_array(struct XorrisO *xorriso, int flag)
|
||||
int Xorriso_all_node_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret;
|
||||
int ret;
|
||||
struct FindjoB *job= NULL;
|
||||
struct stat dir_stbuf;
|
||||
|
||||
#ifdef NIX
|
||||
/* <<< */
|
||||
unsigned long old_gdic;
|
||||
old_gdic= Xorriso_get_di_counteR;
|
||||
#endif /* NIX */
|
||||
|
||||
if((xorriso->ino_behavior & 8 ) && !(flag & 2))
|
||||
return(2);
|
||||
if(xorriso->di_array != NULL && !(flag & 1))
|
||||
return(2);
|
||||
Xorriso_destroy_di_array(xorriso, 0);
|
||||
ret= Findjob_new(&job, "/", 0);
|
||||
if(ret<=0) {
|
||||
Xorriso_no_findjob(xorriso, "xorriso", 0);
|
||||
@ -11631,11 +11656,76 @@ int Xorriso_make_di_array(struct XorrisO *xorriso, int flag)
|
||||
&dir_stbuf, 0, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
ret= 1;
|
||||
ex:;
|
||||
Findjob_destroy(&job, 0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= overwrite existing hln_array (else return 2)
|
||||
*/
|
||||
int Xorriso_make_hln_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if(xorriso->hln_array != NULL && !(flag & 1))
|
||||
return(2);
|
||||
Xorriso_destroy_hln_array(xorriso, 0);
|
||||
|
||||
ret= Xorriso_all_node_array(xorriso, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
Xorriso_sort_node_array(xorriso, 0);
|
||||
|
||||
/* Transfer node_array to di_array without unrefering nodes */
|
||||
xorriso->hln_count= xorriso->node_counter;
|
||||
xorriso->hln_array= xorriso->node_array;
|
||||
xorriso->node_counter= 0;
|
||||
xorriso->node_array_size= 0;
|
||||
xorriso->node_array= NULL;
|
||||
|
||||
/* Allocate hln_targets */
|
||||
ret= Xorriso_new_hln_array(xorriso, xorriso->temp_mem_limit, 1);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
|
||||
ret= 1;
|
||||
ex:;
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= overwrite existing di_array (else return 2)
|
||||
bit1= make di_array despite xorriso->ino_behavior bit 3
|
||||
*/
|
||||
int Xorriso_make_di_array(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret;
|
||||
|
||||
#ifdef NIX
|
||||
/* <<< */
|
||||
unsigned long old_gdic;
|
||||
old_gdic= Xorriso_get_di_counteR;
|
||||
#endif /* NIX */
|
||||
|
||||
if((xorriso->ino_behavior & 8 ) && !(flag & 2))
|
||||
return(2);
|
||||
if(xorriso->di_array != NULL && !(flag & 1))
|
||||
return(2);
|
||||
Xorriso_destroy_di_array(xorriso, 0);
|
||||
|
||||
ret= Xorriso_all_node_array(xorriso, 0);
|
||||
if(ret <= 0)
|
||||
goto ex;
|
||||
|
||||
/* Transfer node_array to di_array without unrefering nodes */
|
||||
xorriso->di_count= xorriso->node_counter;
|
||||
xorriso->di_array= xorriso->node_array;
|
||||
xorriso->node_counter= 0;
|
||||
xorriso->node_array_size= 0;
|
||||
xorriso->node_array= 0;
|
||||
xorriso->node_array= NULL;
|
||||
|
||||
Xorriso__sort_di((void *) xorriso->di_array, xorriso->di_count, 0);
|
||||
|
||||
ret= 1;
|
||||
@ -11647,7 +11737,6 @@ ex:;
|
||||
Xorriso_get_di_counteR - old_gdic);
|
||||
#endif /* NIX */
|
||||
|
||||
Findjob_destroy(&job, 0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user