summaryrefslogtreecommitdiffstats
path: root/src/fuse/cowMerger/src/merger.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fuse/cowMerger/src/merger.c')
-rw-r--r--src/fuse/cowMerger/src/merger.c113
1 files changed, 50 insertions, 63 deletions
diff --git a/src/fuse/cowMerger/src/merger.c b/src/fuse/cowMerger/src/merger.c
index 17926f7..3f4aa89 100644
--- a/src/fuse/cowMerger/src/merger.c
+++ b/src/fuse/cowMerger/src/merger.c
@@ -1,4 +1,5 @@
#include "merger.h"
+#include <inttypes.h>
#define TestBit(A,k) ( A[(k/32)] & (1 << (k%32)) )
int fhImage;
int fhCow;
@@ -6,102 +7,88 @@ off_t *filePointers;
uint64_t imageBlockCount;
uint64_t size;
-bool merger(char *imageFilePath, char *cowFilePath){
-
- if(!loadFiles(imageFilePath, cowFilePath)){
+bool merger( char *imageFilePath, char *cowFilePath )
+{
+ if( !loadFiles( imageFilePath, cowFilePath ) ) {
return false;
}
- if (merge()){
+ if ( merge() ) {
printf("File Merged");
return true;
}
return false;
}
-
-
-
-bool loadFiles(char *imageFilePath, char *cowFilePath){
-
- if((fhImage = open (imageFilePath, O_RDWR))==-1){
+bool loadFiles(char *imageFilePath, char *cowFilePath)
+{
+ if ( ( fhImage = open ( imageFilePath, O_RDWR ) ) == -1 ) {
printf( "Could not open Image.\n" );
return false;
}
- if((fhCow = open (cowFilePath, O_RDONLY))==-1){
+ if ( ( fhCow = open ( cowFilePath, O_RDONLY ) ) == -1 ) {
printf( "Could not open Cow File.\n" );
- close(fhImage);
+ close( fhImage );
return false;
}
- unsigned int version ;
-
- read(fhCow,&version,sizeof(unsigned int));
- read(fhCow,&size,sizeof(uint64_t));
- int l;
- read(fhCow,&l,sizeof(int));
-
- char *buffer = malloc(sizeof(char)*(l+1));
- read(fhCow,buffer,l*sizeof(char));
- buffer[l]='\0';
-
- int pageSize;
- read(fhCow,&pageSize,sizeof(int));
- printf("Version: %u\n",version);
- printf("länge: %i \n",l);
- printf("Image Name: %s\n",buffer);
- printf("Size: %ld\n", (long)size);
- printf("pageSize: %i\n", (pageSize));
- free(buffer);
+ cow_metadata metadata;
+ read( fhCow, &metadata, sizeof( cow_metadata ) );
+ fixup_cow_metadata( metadata );
+ char *buffer = malloc(sizeof(char) * ( metadata.nameLenght + 1 ) );
+ read( fhCow, buffer, metadata.nameLenght * sizeof( char ) );
+ size = metadata.imageSize;
+ printf( "Version: %u\n",metadata.version );
+ printf( "Länge: %i \n", metadata.nameLenght );
+ printf( "Image Name: %s\n", buffer );
+ printf( "Size: %"PRIu64"\n", size );
+ printf( "pageSize: %i\n", metadata.pageSize );
+ free( buffer );
//TODO Image Validation
-
imageBlockCount = ( size + (4096*256)-1 ) / (4096*256);
-
- off_t mmapStart = lseek(fhCow, 0L, SEEK_CUR);
+ off_t mmapStart = lseek( fhCow, 0L, SEEK_CUR );
int maxPageSize = 8192;
- mmapStart= ((mmapStart+maxPageSize-1)/maxPageSize)*maxPageSize;
- filePointers = mmap(NULL,imageBlockCount*sizeof(off_t), PROT_READ, MAP_SHARED,fhCow, mmapStart);
+ mmapStart = ( ( mmapStart + maxPageSize - 1) / maxPageSize ) * maxPageSize;
+ printf( "mmapStart: %"PRIu64"\n", mmapStart );
+ filePointers = mmap( NULL, imageBlockCount * sizeof(uint64_t), PROT_READ, MAP_SHARED, fhCow, mmapStart);
if(filePointers == MAP_FAILED ){
- printf("Error creating mmap in COW File.\n%s\nBye.\n ", strerror(errno));
- close(fhCow);
- close(fhImage);
+ printf("Error creating mmap in COW File.\n%s\nBye.\n ", strerror(errno) );
+ close( fhCow );
+ close( fhImage );
return false;
}
-
return true;
}
-
-bool merge(){
+bool merge()
+{
uint64_t mergedBlocks = 0;
- for(uint64_t i = 0; i < imageBlockCount;i++){
- printf("Merged %llu of %llu Blocks \n",i,imageBlockCount);
- off_t pointer =(off_t)filePointers[i];
- if(pointer !=0){
+ for( uint64_t i = 0; i < imageBlockCount; i++ ) {
+ printf( "Merged %"PRIu64" of %"PRIu64" Blocks \n", i, imageBlockCount );
+ off_t pointer = (off_t) filePointers[i];
+ if( pointer != 0) {
int blockState[8];
- lseek(fhCow,filePointers[i],SEEK_SET);
- read(fhCow,&blockState,sizeof(int)*8);
- for(int j = 0; j < 256;j++){
- if(TestBit(blockState,j)){
- lseek(fhCow,filePointers[i]+(4096*(j+1)),SEEK_SET);
+ lseek( fhCow, filePointers[i], SEEK_SET );
+ read( fhCow, &blockState, sizeof(int) * 8 );
+ for( int j = 0; j < 256; j++ ) {
+ if( TestBit( blockState, j ) ) {
+ lseek( fhCow, ((off_t) filePointers[i] + ( 4096 * ( j + 1) ) ), SEEK_SET );
char buff[4096] = {0};
- if(read(fhCow, &buff, 4096) < 0){
- printf("Error on reading Cow File. BigBlock: %llu\n",i);
+ if( read(fhCow, &buff, 4096) < 0) {
+ printf("Error on reading Cow File."
+ " BigBlock: %"PRIu64"n", i );
return false;
}
- lseek(fhImage,(i*4096*256)+(4096*j),SEEK_SET);
- if(write(fhImage, &buff, 4096) < 0){
- printf("Error on writing to File. BigBlock: %llu\n",i);
+ lseek( fhImage, ( i * 4096 * 256) + ( 4096 * j ), SEEK_SET );
+ if( write( fhImage, &buff, 4096 ) < 0) {
+ printf("Error on writing to File."
+ " BigBlock: %"PRIu64"\n", i );
return false;
}
-
+ mergedBlocks++;
}
}
- mergedBlocks++;
}
}
- printf("Merged %llu Blocks\n",mergedBlocks);
- ftruncate(fhImage, size);
+ printf( "Merged %"PRIu64" Blocks\n", mergedBlocks );
+ ftruncate( fhImage, size);
return true;
}
-
-
-