- sample bitwise validator: make it work for binary files

fixes #886, #887

svn path=/trunk/boinc/; revision=17966
This commit is contained in:
David Anderson 2009-05-01 18:25:17 +00:00
parent 59f57dc6e6
commit ad6a61a3a6
5 changed files with 36 additions and 25 deletions

View File

@ -4260,3 +4260,13 @@ Rom 30 Apr 2009
David 1 May 2009
- removed outdated translation files; updated template
David 1 May 2009
- sample bitwise validator: make it work for binary files
fixes #886, #887
lib/
md5_file.h
util.cpp,h
sched/
sample_bitwise_validator.cpp

View File

@ -28,8 +28,7 @@ extern int md5_block(const unsigned char* data, int nbytes, char* output);
extern std::string md5_string(const unsigned char* data, int nbytes);
inline std::string md5_string(std::string const& data)
{
inline std::string md5_string(std::string const& data) {
return md5_string((const unsigned char*) data.c_str(), (int)data.size());
}

View File

@ -306,8 +306,8 @@ void boinc_crash() {
// read file (at most max_len chars, if nonzero) into malloc'd buf
//
int read_file_malloc(const char* path, char*& buf, int max_len, bool tail) {
int retval, isize;
int read_file_malloc(const char* path, char*& buf, size_t max_len, bool tail) {
int retval;
double size;
retval = file_size(path, size);
@ -328,7 +328,7 @@ int read_file_malloc(const char* path, char*& buf, int max_len, bool tail) {
size = max_len;
}
#endif
isize = (int) size;
size_t isize = size;
buf = (char*)malloc(isize+1);
size_t n = fread(buf, 1, isize, f);
buf[n] = 0;
@ -338,7 +338,7 @@ int read_file_malloc(const char* path, char*& buf, int max_len, bool tail) {
// read file (at most max_len chars, if nonzero) into string
//
int read_file_string(const char* path, string& result, int max_len, bool tail) {
int read_file_string(const char* path, string& result, size_t max_len, bool tail) {
result.erase();
int retval;
char* buf;

View File

@ -70,9 +70,19 @@ extern int boinc_calling_thread_cpu_time(double&);
//
extern void mysql_timestamp(double, char*);
// fake a crash
//
extern void boinc_crash();
extern int read_file_malloc(const char* path, char*&, int max_len=0, bool tail=false);
extern int read_file_string(const char* path, std::string&, int max_len=0, bool tail=false);
// read files into memory.
// Use only for non-binary files; returns null-terminated string.
//
extern int read_file_malloc(
const char* path, char*& result, size_t max_len=0, bool tail=false
);
extern int read_file_string(
const char* path, std::string& result, size_t max_len=0, bool tail=false
);
#ifdef _WIN32

View File

@ -15,7 +15,7 @@
// You should have received a copy of the GNU Lesser General Public License
// along with BOINC. If not, see <http://www.gnu.org/licenses/>.
// A sample validator that grants credit if the majority of results are
// A sample validator that requires a majority of results to be
// bitwise identical.
// This is useful only if either
// 1) your application does no floating-point math, or
@ -31,24 +31,15 @@
using std::string;
using std::vector;
struct FILE_CKSUM {
string md5sum;
FILE_CKSUM(string& filedata) {
md5sum = md5_string(filedata);
}
~FILE_CKSUM(){}
};
struct FILE_CKSUM_LIST {
vector<FILE_CKSUM> files;
vector<string> files; // list of MD5s of files
~FILE_CKSUM_LIST(){}
};
bool files_match(FILE_CKSUM_LIST& f1, FILE_CKSUM_LIST& f2) {
if (f1.files.size() != f2.files.size()) return false;
for (unsigned int i=0; i<f1.files.size(); i++) {
if (f1.files[i].md5sum != f2.files[i].md5sum) return false;
if (f1.files[i] != f2.files[i]) return false;
}
return true;
}
@ -57,6 +48,8 @@ int init_result(RESULT& result, void*& data) {
int retval;
FILE_CKSUM_LIST* fcl = new FILE_CKSUM_LIST;
vector<FILE_INFO> files;
char md5_buf[MD5_LEN];
double nbytes;
retval = get_output_file_infos(result, files);
if (retval) {
@ -67,14 +60,14 @@ int init_result(RESULT& result, void*& data) {
return retval;
}
string filedata;
for (unsigned int i=0; i<files.size(); i++) {
FILE_INFO& fi = files[i];
if (fi.no_validate) continue;
retval = read_file_string(fi.path.c_str(), filedata);
retval = md5_file(fi.path.c_str(), md5_buf, nbytes);
if (retval) {
if (fi.optional) {
filedata = "";
strcpy(md5_buf, "");
// indicate file is missing; not the same as md5("")
} else {
log_messages.printf(MSG_CRITICAL,
"[RESULT#%d %s] Couldn't open %s\n",
@ -83,8 +76,7 @@ int init_result(RESULT& result, void*& data) {
return retval;
}
}
FILE_CKSUM fc(filedata);
fcl->files.push_back(fc);
fcl->files.push_back(string(md5_buf));
}
data = (void*) fcl;
return 0;