static int src_fd=-1,dst_fd=-1;
static const char *src_name,*dst_name;
-static ext2_loff_t src_len; /* in blocks! */
-static blk_t src_lenblk; /* ==src_len, just a different type */
+static ext2_loff_t src_len,dst_len; /* in blocks! */
+static blk_t src_lenblk,dst_lenblk; /* ==src_len,==dst_len, just a different type */
static ext2_loff_t stat_lastread,stat_todo,stat_bads,stat_largest,stat_todo_hunks;
if (start>=end)
return;
key=node_build(start,end);
- if ((neigh_left =g_tree_search(bad_tree,(GSearchFunc)search_end ,&start))) {
+ if ((neigh_left =g_tree_search(bad_tree,(GCompareFunc)search_end ,&start))) {
g_assert(neigh_left->end==key->start);
key->start=neigh_left->start;
g_tree_remove(bad_tree,neigh_left);
g_mem_chunk_free(node_memchunk,neigh_left);
}
- if ((neigh_right=g_tree_search(bad_tree,(GSearchFunc)search_start,&end ))) {
+ if ((neigh_right=g_tree_search(bad_tree,(GCompareFunc)search_start,&end ))) {
g_assert(neigh_right->start==key->end);
key->end=neigh_right->end;
g_tree_remove(bad_tree,neigh_right);
fprintf(stderr,"\"%s\" length %llu <=0\n",src_name,(unsigned long long)src_len);
exit(EXIT_FAILURE);
}
+ if (dst_fd!=-1) {
+ if (ext2fs_get_device_size(dst_name,BLOCK,&dst_lenblk)) {
+ fprintf(stderr,"ext2fs_get_device_size(\"%s\",%d,...): %m\n",dst_name,BLOCK);
+ exit(EXIT_FAILURE);
+ }
+ dst_len=dst_lenblk;
+ if (dst_len<=0) {
+ fprintf(stderr,"\"%s\" length %llu <=0\n",dst_name,(unsigned long long)dst_len);
+ exit(EXIT_FAILURE);
+ }
+ if (dst_len<src_len) {
+ fprintf(stderr,"WARNING: Ignoring exceeding trailing data of \"%s\" from %llu up to its end %llu!\n",
+ src_name,(unsigned long long)dst_len,(unsigned long long)src_len);
+ src_len=dst_len;
+ src_lenblk=dst_lenblk;
+ }
+ }
node_memchunk=g_mem_chunk_new("node_memchunk",sizeof(struct range)/*atom_size*/,
0x1000 /*are_size: 64KB*/,G_ALLOC_AND_FREE);