summaryrefslogtreecommitdiffstats
path: root/src/fuse/cowMerger
diff options
context:
space:
mode:
Diffstat (limited to 'src/fuse/cowMerger')
-rw-r--r--src/fuse/cowMerger/src/Cow_Merger.c10
-rw-r--r--src/fuse/cowMerger/src/merger.c113
-rw-r--r--src/fuse/cowMerger/src/merger.h37
3 files changed, 94 insertions, 66 deletions
diff --git a/src/fuse/cowMerger/src/Cow_Merger.c b/src/fuse/cowMerger/src/Cow_Merger.c
index b73cadc..f7d35aa 100644
--- a/src/fuse/cowMerger/src/Cow_Merger.c
+++ b/src/fuse/cowMerger/src/Cow_Merger.c
@@ -1,16 +1,20 @@
#include <stdio.h>
#include <stdlib.h>
#include "merger.h"
-int main(int argc, char *argv[]) {
+#include <time.h>
+int main(int argc, char *argv[]) {
if(argc != 3){
printf("Error, Check your Command Line Arguments.\nExample: ./Cow_Merger <path_to_Image> <path_to_CowFile>\n");
return EXIT_SUCCESS;
}
-
char *imageFilePath = argv[1];
char *cowFilePath = argv[2];
-
+ clock_t t;
+ t = clock();
merger(imageFilePath, cowFilePath);
+ t = clock() - t;
+ double time_taken = ((double)t)/CLOCKS_PER_SEC; // in seconds
+ printf("merger took %f seconds to execute \n", time_taken);
return EXIT_SUCCESS;
}
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;
}
-
-
-
diff --git a/src/fuse/cowMerger/src/merger.h b/src/fuse/cowMerger/src/merger.h
index c7d256d..c665df7 100644
--- a/src/fuse/cowMerger/src/merger.h
+++ b/src/fuse/cowMerger/src/merger.h
@@ -13,3 +13,40 @@
bool merger(char *imageFilePath, char *cowFilePath);
bool loadFiles(char *imageFilePath, char *cowFilePath);
bool merge();
+
+typedef struct {
+ uint32_t version;
+ uint64_t imageSize;
+ uint32_t nameLenght;
+ uint32_t pageSize;
+}cow_metadata;
+
+#if defined(__BIG_ENDIAN__) || (defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && __BYTE_ORDER == __BIG_ENDIAN) || (defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
+static const uint16_t dnbd3_packet_magic = (0x73 << 8) | (0x72);
+// Flip bytes around on big endian when putting stuff on the net
+#define net_order_64(a) ((uint64_t)((((a) & 0xFFull) << 56) | (((a) & 0xFF00ull) << 40) | (((a) & 0xFF0000ull) << 24) | (((a) & 0xFF000000ull) << 8) | (((a) & 0xFF00000000ull) >> 8) | (((a) & 0xFF0000000000ull) >> 24) | (((a) & 0xFF000000000000ull) >> 40) | (((a) & 0xFF00000000000000ull) >> 56)))
+#define net_order_32(a) ((uint32_t)((((a) & (uint32_t)0xFF) << 24) | (((a) & (uint32_t)0xFF00) << 8) | (((a) & (uint32_t)0xFF0000) >> 8) | (((a) & (uint32_t)0xFF000000) >> 24)))
+#define net_order_16(a) ((uint16_t)((((a) & (uint16_t)0xFF) << 8) | (((a) & (uint16_t)0xFF00) >> 8)))
+#define fixup_cow_metadata(a) do { \
+ (a).version = net_order_32((a).version); \
+ (a).imageSize = net_order_64((a).imageSize); \
+ (a).nameLenght = net_order_32((a).nameLenght); \
+ (a).pageSize = net_order_32((a).pageSize); \
+} while (0)
+#define ENDIAN_MODE "Big Endian"
+#ifndef BIG_ENDIAN
+#define BIG_ENDIAN
+#endif
+#elif defined(__LITTLE_ENDIAN__) || (defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && __BYTE_ORDER == __LITTLE_ENDIAN) || (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || defined(__i386__) || defined(__i386) || defined(__x86_64)
+// Make little endian our network byte order as probably 99.999% of machines this will be used on are LE
+#define net_order_64(a) (a)
+#define net_order_32(a) (a)
+#define net_order_16(a) (a)
+#define fixup_cow_metadata(a) while(0)
+#define ENDIAN_MODE "Little Endian"
+#ifndef LITTLE_ENDIAN
+#define LITTLE_ENDIAN
+#endif
+#else
+#error "Unknown Endianness"
+#endif