From 011d4e6ff76c76fa7c49540282dee0bafef54fac Mon Sep 17 00:00:00 2001 From: Michael Scherle Date: Fri, 2 Nov 2018 05:13:09 -0700 Subject: cleaned up code and added improvements - cleaned up code - using fixed size type variables in file - using types.h fixup macros - replaced write/read with pwrite/pread (except for 2 occurrences) - added create fuse callback--- src/fuse/cowMerger/src/Cow_Merger.c | 10 +++- src/fuse/cowMerger/src/merger.c | 113 ++++++++++++++++-------------------- src/fuse/cowMerger/src/merger.h | 37 ++++++++++++ 3 files changed, 94 insertions(+), 66 deletions(-) (limited to 'src/fuse/cowMerger/src') 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 #include #include "merger.h" -int main(int argc, char *argv[]) { +#include +int main(int argc, char *argv[]) { if(argc != 3){ printf("Error, Check your Command Line Arguments.\nExample: ./Cow_Merger \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 #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 -- cgit v1.2.3-55-g7522