From bec557f51c26bf9216fb315c23150d86dadb10be Mon Sep 17 00:00:00 2001 From: Nikolaj Date: Fri, 12 Nov 2021 12:58:32 +0100 Subject: [PATCH] Heck yeah :smile: --- A3/src/Makefile | 4 +- A3/src/cascade | Bin 59968 -> 86512 bytes A3/src/cascade.c | 221 +++++++++++++++++------------ A3/src/cascade.h | 6 +- A3/src/tests/shakespeare.10mib.txt | 1 - 5 files changed, 132 insertions(+), 100 deletions(-) diff --git a/A3/src/Makefile b/A3/src/Makefile index da85a6e..aa191c5 100644 --- a/A3/src/Makefile +++ b/A3/src/Makefile @@ -1,5 +1,5 @@ -#GCC=gcc -O3 -g -Wall -Wextra -pedantic -std=gnu11 -GCC=gcc -O3 +GCC=gcc -O3 -g -Wall -Wextra -pedantic -std=gnu11 +#GCC=gcc -O3 LD_FLAGS= -lpthread all: cascade diff --git a/A3/src/cascade b/A3/src/cascade index 9038e7dee5a104b93873542e700e2134bcc0c9ae..b7d75e8720e844019dec0291c697ce7226102038 100755 GIT binary patch literal 86512 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 delta 19845 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 = 1; + + FILE* fp = fopen(destination, "a+w"); + if (fp == NULL) + { + printf("Failed to open destination file %s\n", destination); + csc_free_file(casc_file_data); + return NULL; + } + + void* buffer = malloc(casc_file_data->blocksize); + if (buffer == NULL) + { + printf("No block buffer asigned: %ld\n", casc_file_data->blocksize); + csc_free_file(casc_file_data); + fclose(fp); + return NULL; + } + + SHA256_CTX shactx; + for(unsigned long long i = 0; i < casc_file_data->blockcount; i++) + { + uint8_t* shabuffer = malloc(sizeof(uint8_t) * SHA256_HASH_SIZE); + unsigned long long size = casc_file_data->blocks[i].length; + if (fread(buffer, size, 1, fp) != 1) + { + break; + } + + sha256_init(&shactx); + sha256_update(&shactx, buffer, size); + sha256_final(&shactx, shabuffer); + + if (memcmp((&(&casc_file_data->blocks[i])->hash)->x, shabuffer, 32) == 0) { + (&casc_file_data->blocks[i])->completed = 1; + } else { + (&casc_file_data->blocks[i])->completed = 0; + casc_file_data->completed = 0; + } + } + + + if (casc_file_data->completed) { + rewind(fp); + buffer = malloc(casc_file_data->targetsize); + uint8_t* shabuffer = malloc(sizeof(uint8_t) * SHA256_HASH_SIZE); + fread(buffer, casc_file_data->targetsize, 1, fp); + + sha256_init(&shactx); + sha256_update(&shactx, buffer, casc_file_data->targetsize); + sha256_final(&shactx, shabuffer); + + if (!(memcmp((&casc_file_data->targethash)->x, shabuffer, 32) == 0)) { + casc_file_data->completed = 0; + for (unsigned long long i = 0;i < casc_file_data->blockcount;i++) { + (&casc_file_data->blocks[i])->completed = 0; + } + } + } + + fclose(fp); + + return casc_file_data; +} + /* * Gets a sha256 hash of specified data, sourcedata. The hash itself is * placed into the given variable 'hash'. Any size can be created, but a * a normal size for the hash would be given by the global variable * 'SHA256_HASH_SIZE', that has been defined in sha256.h */ -void get_data_sha(const char* sourcedata, char* hash, uint32_t data_size, int hash_size) +void get_data_sha(const char* sourcedata, unsigned char* hash, uint32_t data_size, int hash_size) { SHA256_CTX shactx; - unsigned char shabuffer[hash_size]; + uint8_t* shabuffer = malloc(sizeof(uint8_t) * hash_size); sha256_init(&shactx); sha256_update(&shactx, sourcedata, data_size); - sha256_final(&shactx, &shabuffer); + sha256_final(&shactx, shabuffer); for (int i=0; icompleted) { + int peercount = 0; + while (peercount == 0) { - printf("No peers were found. Will try again in %d seconds\n", PEER_REQUEST_DELAY); - fflush(stdout); - sleep(PEER_REQUEST_DELAY); + peercount = get_peers_list(&peers, hash_buf); + if (peercount == 0) + { + printf("No peers were found. Will try again in %d seconds\n", PEER_REQUEST_DELAY); + fflush(stdout); + sleep(PEER_REQUEST_DELAY); + } + else + { + printf("Found %d peer(s)\n", peercount); + } } - else + + csc_peer_t peer = (peers[0]); + // Get a good peer if one is available + for (int i=0; ix,x,SHA256_HASH_SIZE); + casc_file_data->targethash = *hash; casc_file_data->blockcount = 1 + floor( (casc_file_data->targetsize - 1.0)/casc_file_data->blocksize ); casc_file_data->trailblocksize = casc_file_data->targetsize - ((casc_file_data->blockcount - 1) * casc_file_data->blocksize); + casc_file_data->completed = 0; csc_block_t* block_list = malloc( sizeof(csc_block_t) * casc_file_data->blockcount @@ -282,52 +354,14 @@ csc_file_t* csc_parse_file(const char* sourcefile, const char* destination) fclose(fp); return NULL; } - csc_hashdata_t* hash = {block_x}; + csc_hashdata_t* hash = malloc(sizeof(csc_hashdata_t)); + memcpy(hash->x,block_x,SHA256_HASH_SIZE); block->hash = *hash; } fclose(fp); - fp = fopen(destination, "a+w"); - if (fp == NULL) - { - printf("Failed to open destination file %s\n", destination); - csc_free_file(casc_file_data); - return NULL; - } - - void* buffer = malloc(casc_file_data->blocksize); - if (buffer == NULL) - { - printf("No block buffer asigned: %d\n", casc_file_data->blocksize); - csc_free_file(casc_file_data); - fclose(fp); - return NULL; - } - - SHA256_CTX shactx; - for(unsigned long long i = 0; i < casc_file_data->blockcount; i++) - { - uint8_t shabuffer[SHA256_HASH_SIZE]; - unsigned long long size = casc_file_data->blocks[i].length; - if (fread(buffer, size, 1, fp) != 1) - { - break; - } - - sha256_init(&shactx); - sha256_update(&shactx, buffer, size); - sha256_final(&shactx, &shabuffer); - - if (memcmp((&(&casc_file_data->blocks[i])->hash)->x, shabuffer, 32) == 0) { - (&casc_file_data->blocks[i])->completed = 1; - } else { - (&casc_file_data->blocks[i])->completed = 0; - } - } - fclose(fp); - - return casc_file_data; + return check_blocks(destination, casc_file_data); } /* @@ -340,12 +374,12 @@ void csc_free_file(csc_file_t* file) free(file); } -size_t readbytes(int sock, void* buffer, size_t count) +size_t readbytes(int sock, uint8_t* buffer, size_t count) { size_t remaining = count; while(remaining > 0) { - size_t read = recv(sock, buffer, remaining, NULL); + size_t read = recv(sock, buffer, remaining, 0); if (read == 0) return 0; buffer += read; @@ -361,7 +395,7 @@ size_t readbytes(int sock, void* buffer, size_t count) */ void get_block(csc_block_t* block, csc_peer_t peer, unsigned char* hash, char* output_file) { - printf("Attempting to get block %d from %s:%s for %s\n", block->index, peer.ip, peer.port, output_file); + printf("Attempting to get block %ld from %s:%s for %s\n", block->index, peer.ip, peer.port, output_file); int buffer_size; if (block->length + PEER_RESPONSE_HEADER_SIZE > MAX_LINE) { @@ -396,7 +430,7 @@ void get_block(csc_block_t* block, csc_peer_t peer, unsigned char* hash, char* o if (msglen == 0) { Close(peer_socket); - return 0; + return; } if (reply_header[0] != 0) @@ -406,27 +440,27 @@ void get_block(csc_block_t* block, csc_peer_t peer, unsigned char* hash, char* o { printf("Tracker error %d and out-of-memory reading error\n", reply_header[0]); Close(peer_socket); - return NULL; + return; } memset(error_buf, 0, msglen + 1); memcpy(error_buf, &rio_buf[PEER_RESPONSE_HEADER_SIZE], msglen); printf("Peer gave error: %d - %s\n", reply_header[0], error_buf); free(error_buf); Close(peer_socket); - return NULL; + return; } - uint8_t shabuffer[SHA256_HASH_SIZE]; + uint8_t* shabuffer = malloc(sizeof(uint8_t) * SHA256_HASH_SIZE); SHA256_CTX shactx; sha256_init(&shactx); sha256_update(&shactx, &rio_buf[PEER_RESPONSE_HEADER_SIZE], msglen); - sha256_final(&shactx, &shabuffer); + sha256_final(&shactx, shabuffer); if (memcmp(shabuffer, (&block->hash)->x, SHA256_HASH_SIZE) != 0) { printf("Not the same hash\n"); Close(peer_socket); - return NULL; + return; } FILE* fp = fopen(output_file, "rb+"); @@ -438,9 +472,9 @@ void get_block(csc_block_t* block, csc_peer_t peer, unsigned char* hash, char* o } fseek(fp, block->offset, SEEK_SET); - fputs(&rio_buf[0,PEER_RESPONSE_HEADER_SIZE],fp); + fwrite(&rio_buf[PEER_RESPONSE_HEADER_SIZE],msglen,1,fp); - printf("Got block %d. Wrote from %d to %d\n", block->index, block->offset, block->offset+msglen-1); + printf("Got block %ld. Wrote from %ld to %ld\n", block->index, block->offset, block->offset+msglen-1); Close(peer_socket); fclose(fp); } @@ -461,7 +495,7 @@ int get_peers_list(csc_peer_t** peers, uint8_t hash[32]) Rio_readinitb(&rio, tracker_socket); struct RequestHeader request_header; - strncpy(request_header.protocol, "CASC", 4); + memcpy(request_header.protocol, "CASC", 4); request_header.version = htonl(1); request_header.command = htonl(1); request_header.length = htonl(BODY_SIZE); @@ -495,21 +529,21 @@ int get_peers_list(csc_peer_t** peers, uint8_t hash[32]) { printf("Tracker error %d and out-of-memory reading error\n", reply_header[0]); Close(tracker_socket); - return NULL; + return 0; } memset(error_buf, 0, msglen + 1); memcpy(error_buf, &rio_buf[REPLY_HEADER_SIZE], msglen); // Fixed by Rune printf("Tracker gave error: %d - %s\n", reply_header[0], error_buf); free(error_buf); Close(tracker_socket); - return NULL; + return 0; } if (msglen % 12 != 0) { - printf("LIST response from tracker was length %llu but should be evenly divisible by 12\n", msglen); + printf("LIST response from tracker was length %u but should be evenly divisible by 12\n", msglen); Close(tracker_socket); - return NULL; + return 0; } int peercount = msglen/12; *peers = malloc(peercount * sizeof(csc_peer_t)); @@ -517,7 +551,6 @@ int get_peers_list(csc_peer_t** peers, uint8_t hash[32]) for (int i = 0;i