mirror of https://github.com/BOINC/boinc.git
add check_download_file function
This commit is contained in:
parent
d15a3b7590
commit
097fb464ed
|
@ -22,6 +22,7 @@
|
||||||
#include <csignal>
|
#include <csignal>
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <sstream>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
@ -169,6 +170,60 @@ static void filename_hash(const char* filename, int fanout, char* dir) {
|
||||||
sprintf(dir, "%x", x % fanout);
|
sprintf(dir, "%x", x % fanout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// returns:
|
||||||
|
// 0 if same file is already there and has correct .md5, we don't need to copy or create .md5
|
||||||
|
// 1 if same file is already there and .md5 file is missing, need to create corresponding .md5 file
|
||||||
|
// 2 if a file isn't there, need to copy and create .md5
|
||||||
|
// -1 if a different file is there
|
||||||
|
// -2 if a file operation failed
|
||||||
|
//
|
||||||
|
// file_path - source path to file, dl_hier_path - path to the same file in download hier
|
||||||
|
//
|
||||||
|
int check_download_file(const char* file_path, const char* dl_hier_path) {
|
||||||
|
bool md5_file_exists = false;
|
||||||
|
char md5_file_path[256];
|
||||||
|
char md5_hash_src[33], md5_hash_dst[33];
|
||||||
|
double nbytes;
|
||||||
|
std::string file_content, file_hash;
|
||||||
|
int file_size;
|
||||||
|
|
||||||
|
int retval = md5_file(file_path, md5_hash_src, nbytes);
|
||||||
|
if (retval) {
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(md5_file_path, "%s.md5", dl_hier_path);
|
||||||
|
if (boinc_file_exists(md5_file_path)) {
|
||||||
|
retval = read_file_string(md5_file_path, file_content);
|
||||||
|
if (retval) {
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
std::stringstream stream(file_content);
|
||||||
|
stream >> file_hash >> file_size;
|
||||||
|
md5_file_exists = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!boinc_file_exists(dl_hier_path)) {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
// calculating md5 hash of existing file in dl hier
|
||||||
|
retval = md5_file(dl_hier_path, md5_hash_dst, nbytes);
|
||||||
|
if (retval) {
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
int hashes_equal = !strcmp(md5_hash_src, md5_hash_dst);
|
||||||
|
if (md5_file_exists && hashes_equal) {
|
||||||
|
// the right file with correct .md5 is there
|
||||||
|
return 0;
|
||||||
|
} else if (hashes_equal) {
|
||||||
|
// files are the same, but need to create .md5
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
// if the content of the file in dl hier differs from the source file's content
|
||||||
|
// then skip staging, consider to manually delete file in dl hier and retry
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// given a filename, compute its path in a directory hierarchy
|
// given a filename, compute its path in a directory hierarchy
|
||||||
// If create is true, create the directory if needed
|
// If create is true, create the directory if needed
|
||||||
//
|
//
|
||||||
|
|
|
@ -40,6 +40,10 @@ extern void install_stop_signal_handler();
|
||||||
extern int try_fopen(const char* path, FILE*& f, const char* mode);
|
extern int try_fopen(const char* path, FILE*& f, const char* mode);
|
||||||
extern int get_log_path(char*, const char*);
|
extern int get_log_path(char*, const char*);
|
||||||
|
|
||||||
|
// check the status of a file with the given path and its .md5 in download hier
|
||||||
|
//
|
||||||
|
extern int check_download_file(const char* file_path, const char* dl_hier_path);
|
||||||
|
|
||||||
// convert filename to path in a hierarchical directory system
|
// convert filename to path in a hierarchical directory system
|
||||||
//
|
//
|
||||||
extern int dir_hier_path(
|
extern int dir_hier_path(
|
||||||
|
|
Loading…
Reference in New Issue