tFactorize glch_loadtorrent() into smaller functions - libeech - bittorrent library
 (HTM) git clone git://z3bra.org/libeech.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 27f38a6292d4d6c6de8ea1712dc5060024b44189
 (DIR) parent 34cb6c512c6609748925c64f4b8058ef3dc30e5d
 (HTM) Author: z3bra <contactatz3bradotorg>
       Date:   Wed, 18 Oct 2017 08:47:49 +0200
       
       Factorize glch_loadtorrent() into smaller functions
       
       Diffstat:
         M libeech.c                           |      63 ++++++++++++++++++++++++++-----
         M torrent.c                           |       5 ++++-
       
       2 files changed, 58 insertions(+), 10 deletions(-)
       ---
 (DIR) diff --git a/libeech.c b/libeech.c
       t@@ -15,7 +15,13 @@
        #include "util.h"
        #include "libeech.h"
        
       +
       +/* Initialization of the torrent struct */
        static char * peerid();
       +static int loadfile(struct torrent *, char *);
       +static int loadtracker(struct torrent *);
       +static int loadinfohash(struct torrent *);
       +static int loadpeerid(struct torrent *);
        
        static char *
        peerid()
       t@@ -34,45 +40,84 @@ peerid()
                return peerid;
        }
        
       -int
       -glch_loadtorrent(struct torrent *t, char *path)
       +/* Read torrent file into a memory buffer */
       +static int
       +loadfile(struct torrent *t, char *path)
        {
                FILE *f;
       -        char *b, *sp;
       -        struct be be;
       +        char *b;
                struct stat sb;
        
       -        /* read torrent file into a memory buffer */
                if (stat(path, &sb))
                        return -1;
                if (!(f = fopen(path, "r")))
                        return -1;
                b = malloc(sb.st_size);
       +        if (!b)
       +                return -1;
                fread(b, 1, sb.st_size, f);
                b[sb.st_size - 1] = '\0';
                beinit(&t->be, b, sb.st_size);
                fclose(f);
       +        return 0;
       +}
       +
       +/* Retrieve the "announce" key */
       +static int
       +loadtracker(struct torrent *t)
       +{
       +        char *sp;
        
       -        /* retrieve "announce" key */
                sp = bekstr(&t->be, "announce", 8);
                if (!sp)
                        return -1;
                memcpy(t->tr, sp, strlen(sp));
       +        return 0;
       +}
       +
       +/* Calculate the SHA1 hash of the "info" key */
       +static int
       +loadinfohash(struct torrent *t)
       +{
       +        char *sp;
       +        struct be be;
        
       -        /* store SHA1 of the info key */
                if (bekv(&t->be, "info", 4, &be) < 0)
                        return -1;
                sp = be.off;
                if (benext(&be) < 0)
                        return -1;
       -        sha1((unsigned char *)sp, be.off - sp, t->infohash);
       +        return sha1((unsigned char *)sp, be.off - sp, t->infohash);
       +}
       +
       +/* Generate a random peer ID */
       +static int
       +loadpeerid(struct torrent *t)
       +{
       +        char *sp;
        
       -        /* generate a random peer ID */
                sp = peerid();
                if (!sp)
                        return -1;
                memcpy(t->id, sp, 20);
                t->id[20] = 0;
       +        return 0;
       +}
       +
       +int
       +glch_loadtorrent(struct torrent *t, char *f)
       +{
       +        if (loadfile(t, f) < 0)
       +                return -1;
       +
       +        if (loadtracker(t) < 0)
       +                return -1;
       +
       +        if (loadinfohash(t) < 0)
       +                return -1;
       +
       +        if (loadpeerid(t) < 0)
       +                return -1;
        
                return 0;
        }
 (DIR) diff --git a/torrent.c b/torrent.c
       t@@ -1,11 +1,13 @@
        #include <stdio.h>
        #include <stdlib.h>
       -
        #include <libeech.h>
        
       +#include "util.h"
       +
        int
        main(int argc, char *argv[])
        {
       +        char hex[41];
                struct torrent t;
        
                if (argc < 2) {
       t@@ -16,6 +18,7 @@ main(int argc, char *argv[])
                if (!glch_loadtorrent(&t, argv[1])) {
                        printf("Peer ID: %s\n", t.id);
                        printf("Tracker: %s\n", t.tr);
       +                printf("Infokey: %s\n", tohex(t.infohash, hex, 20));
                }
                        
                return 0;