#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
+#include <gcrypt.h>
#include "pmhash.h"
#include "rnet_message.h"
return 0;
out:
decfile->lines_len -= 1;
- return -1;
+ return -ENOMEM;
}
static void decfile_release_lines(struct rnet_decfile *decfile)
{
char *buffer = get_header(decfile);
if (!buffer || strlen(buffer) != 765)
- return 1;
+ return -EINVAL;
return parse_header(decfile->header, buffer);
}
buffer = NULL;
len = 0;
}
- if (!decfile_parse_header(decfile) && !decfile_parse_file(decfile))
+ if (!(r = decfile_parse_header(decfile)) && !(r = decfile_parse_file(decfile)))
return 0;
out:
decfile_release_lines(decfile);
- return -1;
+ return r;
}
struct rnet_decfile * rnet_decfile_open(char *filename)
{
struct rnet_decfile *decfile;
+ int r = -ENOMEM;
decfile = malloc(sizeof(*decfile));
if (!decfile)
return NULL;
goto out_file;
decfile->lines_len = 0;
decfile->lines = NULL;
- if (decfile_parse(decfile))
+ if ((r = decfile_parse(decfile)))
goto out_parse;
return decfile;
out_parse:
pmhash_del(decfile->header);
out_header:
free(decfile);
+ errno = -r;
return NULL;
}
{
return decfile->message;
}
+
+char * rnet_decfile_get_file_hash(struct rnet_decfile *decfile)
+{
+ char *hash;
+ size_t len;
+ if (gcry_md_test_algo(GCRY_MD_MD5))
+ return NULL;
+ len = gcry_md_get_algo_dlen(GCRY_MD_MD5);
+ hash = malloc(len);
+ if (!hash)
+ return NULL;
+ gcry_md_hash_buffer(GCRY_MD_MD5, hash, decfile->message->buffer,
+ decfile->message->len);
+ return hash;
+}
+
+char * rnet_decfile_get_header(struct rnet_decfile *decfile)
+{
+ return get_header(decfile);
+}