diff --git a/CMakeLists.txt b/CMakeLists.txt index 38fc821c0..9287cb70b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,6 +19,12 @@ set(FILES util.c fnv.h data_sizes.h) +if (MSVC) + list(APPEND FILES io_win32.c) +else() + list(APPEND FILES io_posix.c) +endif() + if (NOT CRYPTOPP_FOUND) find_package(CryptoPP 5.6.2) endif() diff --git a/io.h b/io.h new file mode 100644 index 000000000..55fea239e --- /dev/null +++ b/io.h @@ -0,0 +1,53 @@ +/* + This file is part of ethash. + + ethash is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + ethash is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with ethash. If not, see . +*/ +/** @file io.h + * @author Lefteris Karapetsas + * @date 2015 + */ +#pragma once +#include +#include +#include +#include "ethash.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Prepares io for ethash + * @param dirname A null terminated c-string of the path of the ethash + * data directory. If it does not exist it's created. + * @param block_number The current block number. Used in seedhash calculation. + * @returns True if all went fine, and false if there was any kind + * of error + */ +bool ethash_io_prepare(char const *dirname, uint32_t block_number); +void ethash_io_write(); +static inline void ethash_io_serialize_info(uint32_t revision, + uint32_t block_number, + char *output) +{ + // if .info is only consumed locally we don't really care about endianess + memcpy(output, &revision, 4); + ethash_get_seedhash((uint8_t*)(output + 4), block_number); +} + + +#ifdef __cplusplus +} +#endif diff --git a/io_posix.c b/io_posix.c new file mode 100644 index 000000000..2944aeb37 --- /dev/null +++ b/io_posix.c @@ -0,0 +1,82 @@ +/* + This file is part of ethash. + + ethash is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + ethash is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with ethash. If not, see . +*/ +/** @file io_posix.c + * @author Lefteris Karapetsas + * @date 2015 + */ +#include "io.h" +#include +#include +#include +#include +#include +#include +#include + +static const char DAG_FILE_NAME[] = "full"; +static const char DAG_MEMO_NAME[] = "full.info"; +static const unsigned int DAG_MEMO_BYTESIZE = 36; + +bool ethash_io_prepare(char const *dirname, uint32_t block_number) +{ + char read_buffer[DAG_MEMO_BYTESIZE]; + char expect_buffer[DAG_MEMO_BYTESIZE]; + bool ret = false; + + // assert directory exists, full owner permissions and read/search for others + int rc = mkdir(dirname, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); + if (rc == -1 && errno != EEXIST) { + goto end; + } + + // try to open memo file + char *memofile = malloc(strlen(dirname) + sizeof(DAG_MEMO_NAME)); + if (!memofile) { + goto end; + } + + FILE *f = fopen(memofile, "rb"); + if (!f) { + // file does not exist, so no checking happens. All is fine. + ret = true; + goto free_memo; + } + + if (fread(read_buffer, 1, DAG_MEMO_BYTESIZE, f) != DAG_MEMO_BYTESIZE) { + goto free_memo; + } + + ethash_io_serialize_info(REVISION, block_number, expect_buffer); + if (memcmp(read_buffer, expect_buffer, DAG_MEMO_BYTESIZE) != 0) { + // we have different memo contents so delete the memo file + if (unlink(memofile) != 0) { + goto free_memo; + } + } + + ret = true; + +free_memo: + free(memofile); +end: + return ret; +} + +void ethash_io_write() +{ +} +