This file is part of GNUnet.
Copyright (C) 2001-2013 GNUnet e.V.
- GNUnet 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, or (at your
- option) any later version.
+ GNUnet is free software: you can redistribute it and/or modify it
+ under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License,
+ or (at your option) any later version.
GNUnet 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.
+ Affero General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with GNUnet; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
+ SPDX-License-Identifier: AGPL3.0-or-later
+
+ */
/**
* @file util/crypto_hash_file.c
* @brief incremental hashing of files
#include "gnunet_util_lib.h"
#include <gcrypt.h>
-#define LOG(kind,...) GNUNET_log_from (kind, "util-crypto-hash-file", __VA_ARGS__)
+#define LOG(kind, ...) GNUNET_log_from (kind, "util-crypto-hash-file", \
+ __VA_ARGS__)
-#define LOG_STRERROR_FILE(kind,syscall,filename) GNUNET_log_from_strerror_file (kind, "util-crypto-hash-file", syscall, filename)
+#define LOG_STRERROR_FILE(kind, syscall, \
+ filename) GNUNET_log_from_strerror_file (kind, \
+ "util-crypto-hash-file", \
+ syscall, \
+ filename)
/**
*/
struct GNUNET_CRYPTO_FileHashContext
{
-
/**
* Function to call upon completion.
*/
/**
* Current task for hashing.
*/
- struct GNUNET_SCHEDULER_Task * task;
+ struct GNUNET_SCHEDULER_Task *task;
/**
* Priority we use.
* Blocksize.
*/
size_t bsize;
-
};
*/
static void
file_hash_finish (struct GNUNET_CRYPTO_FileHashContext *fhc,
- const struct GNUNET_HashCode * res)
+ const struct GNUNET_HashCode *res)
{
fhc->callback (fhc->callback_cls, res);
GNUNET_free (fhc->filename);
- if (!GNUNET_DISK_handle_invalid (fhc->fh))
+ if (! GNUNET_DISK_handle_invalid (fhc->fh))
GNUNET_break (GNUNET_OK == GNUNET_DISK_file_close (fhc->fh));
gcry_md_close (fhc->md);
- GNUNET_free (fhc); /* also frees fhc->buffer */
+ GNUNET_free (fhc); /* also frees fhc->buffer */
}
struct GNUNET_CRYPTO_FileHashContext *fhc = cls;
struct GNUNET_HashCode *res;
size_t delta;
+ ssize_t sret;
fhc->task = NULL;
GNUNET_assert (fhc->offset <= fhc->fsize);
delta = fhc->bsize;
if (fhc->fsize - fhc->offset < delta)
delta = fhc->fsize - fhc->offset;
- if (delta != GNUNET_DISK_file_read (fhc->fh,
- fhc->buffer,
- delta))
+ sret = GNUNET_DISK_file_read (fhc->fh,
+ fhc->buffer,
+ delta);
+ if ((sret < 0) ||
+ (delta != (size_t) sret))
{
LOG_STRERROR_FILE (GNUNET_ERROR_TYPE_WARNING,
- "read",
- fhc->filename);
- file_hash_finish (fhc, NULL);
+ "read",
+ fhc->filename);
+ file_hash_finish (fhc,
+ NULL);
return;
}
- gcry_md_write (fhc->md, fhc->buffer, delta);
+ gcry_md_write (fhc->md,
+ fhc->buffer,
+ delta);
fhc->offset += delta;
if (fhc->offset == fhc->fsize)
{
res = (struct GNUNET_HashCode *) gcry_md_read (fhc->md,
- GCRY_MD_SHA512);
+ GCRY_MD_SHA512);
file_hash_finish (fhc, res);
return;
}
fhc->task = GNUNET_SCHEDULER_add_with_priority (fhc->priority,
- &file_hash_task,
- fhc);
+ &file_hash_task,
+ fhc);
}
struct GNUNET_CRYPTO_FileHashContext *
GNUNET_CRYPTO_hash_file (enum GNUNET_SCHEDULER_Priority priority,
const char *filename,
- size_t blocksize,
+ size_t blocksize,
GNUNET_CRYPTO_HashCompletedCallback callback,
void *callback_cls)
{
GNUNET_assert (blocksize > 0);
fhc =
- GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_FileHashContext) + blocksize);
+ GNUNET_malloc (sizeof(struct GNUNET_CRYPTO_FileHashContext) + blocksize);
fhc->callback = callback;
fhc->callback_cls = callback_cls;
fhc->buffer = (unsigned char *) &fhc[1];
fhc->bsize = blocksize;
if (GNUNET_OK !=
GNUNET_DISK_file_size (filename,
- &fhc->fsize,
- GNUNET_NO,
- GNUNET_YES))
+ &fhc->fsize,
+ GNUNET_NO,
+ GNUNET_YES))
{
GNUNET_free (fhc->filename);
GNUNET_free (fhc);
return NULL;
}
fhc->fh = GNUNET_DISK_file_open (filename,
- GNUNET_DISK_OPEN_READ,
- GNUNET_DISK_PERM_NONE);
+ GNUNET_DISK_OPEN_READ,
+ GNUNET_DISK_PERM_NONE);
if (! fhc->fh)
{
GNUNET_free (fhc->filename);
}
fhc->priority = priority;
fhc->task = GNUNET_SCHEDULER_add_with_priority (priority,
- &file_hash_task,
- fhc);
+ &file_hash_task,
+ fhc);
return fhc;
}
GNUNET_SCHEDULER_cancel (fhc->task);
GNUNET_free (fhc->filename);
GNUNET_break (GNUNET_OK ==
- GNUNET_DISK_file_close (fhc->fh));
+ GNUNET_DISK_file_close (fhc->fh));
GNUNET_free (fhc);
}
+
/* end of crypto_hash_file.c */