Use errno to indicate error in parsing file.
[cascardo/libreceita.git] / decfile.c
index edd0937..98501b1 100644 (file)
--- a/decfile.c
+++ b/decfile.c
@@ -23,6 +23,7 @@
 #include <stdlib.h>
 #include <errno.h>
 #include <unistd.h>
+#include <gcrypt.h>
 #include "pmhash.h"
 #include "rnet_message.h"
 
@@ -59,7 +60,7 @@ static int append_line(struct rnet_decfile *decfile, char *line)
        return 0;
 out:
        decfile->lines_len -= 1;
-       return -1;
+       return -ENOMEM;
 }
 
 static void decfile_release_lines(struct rnet_decfile *decfile)
@@ -79,7 +80,7 @@ static int decfile_parse_header(struct rnet_decfile *decfile)
 {
        char *buffer = get_header(decfile);
        if (!buffer || strlen(buffer) != 765)
-               return 1;
+               return -EINVAL;
        return parse_header(decfile->header, buffer);
 }
 
@@ -97,16 +98,17 @@ static int decfile_parse(struct rnet_decfile *decfile)
                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;
@@ -124,7 +126,7 @@ struct rnet_decfile * rnet_decfile_open(char *filename)
                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:
@@ -137,6 +139,7 @@ out_message:
        pmhash_del(decfile->header);
 out_header:
        free(decfile);
+       errno = -r;
        return NULL;
 }
 
@@ -326,3 +329,23 @@ struct rnet_message * rnet_decfile_get_file(struct rnet_decfile *decfile)
 {
        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);
+}