Annotation of rpl/rplsums/rplsum.c, revision 1.4

1.1       bertrand    1: /*
                      2: ================================================================================
                      3:   RPL/2 (R) version 4.0.12
1.2       bertrand    4:   Copyright (C) 1989-2010 Dr. BERTRAND Joël
1.1       bertrand    5: 
                      6:   This file is part of RPL/2.
                      7: 
                      8:   RPL/2 is free software; you can redistribute it and/or modify it
                      9:   under the terms of the CeCILL V2 License as published by the french
                     10:   CEA, CNRS and INRIA.
                     11:  
                     12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
                     13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
                     14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
                     15:   for more details.
                     16:  
                     17:   You should have received a copy of the CeCILL License
                     18:   along with RPL/2. If not, write to info@cecill.info.
                     19: ================================================================================
                     20: */
                     21: 
                     22: 
                     23: #include <stdio.h>
                     24: #include <stdlib.h>
                     25: #include <unistd.h>
                     26: #include "openssl/evp.h"
                     27: #include <sys/stat.h>
                     28: #include <fcntl.h>
                     29: 
                     30: int
                     31: main(int argc, char *argv[])
                     32: {
                     33:    EVP_MD_CTX          contexte;
                     34: 
                     35:    int                 in_fd;
                     36: 
                     37:    off_t               taille_fichier;
                     38: 
                     39:    ssize_t             octets_lus;
                     40: 
                     41:    struct stat         stat_buf;
                     42: 
                     43:    unsigned char       *chaine;
                     44:    unsigned char       *fichier;
                     45:    unsigned char       somme[EVP_MAX_MD_SIZE];
                     46:    unsigned char       somme_hexadecimale[2 * EVP_MAX_MD_SIZE];
                     47: 
                     48:    unsigned int        i;
                     49:    unsigned int        longueur_somme;
                     50: 
                     51:    if (argc != 2)
                     52:    {
                     53:        printf("Usage: rplmd5sum filename\n");
                     54:        exit(EXIT_FAILURE);
                     55:    }
                     56: 
                     57:    fichier = argv[1];
                     58: 
                     59:    if (stat(fichier, &stat_buf) != 0)
                     60:    {
1.4     ! bertrand   61:        fprintf(stderr, "stat() failed\n");
        !            62:        perror("stat");
1.1       bertrand   63:        exit(EXIT_FAILURE);
                     64:    }
                     65: 
                     66:    taille_fichier = stat_buf.st_size;
                     67: 
                     68:    if ((chaine = malloc(taille_fichier)) == NULL)
                     69:    {
1.4     ! bertrand   70:        fprintf(stderr, "malloc() failed\n");
1.1       bertrand   71:        exit(EXIT_FAILURE);
                     72:    }
                     73: 
                     74:    if ((in_fd = open(fichier, 0, O_RDONLY)) < 0)
                     75:    {
1.4     ! bertrand   76:        fprintf(stderr, "open() failed\n");
        !            77:        perror("open");
1.1       bertrand   78:        free(chaine);
                     79:        exit(EXIT_FAILURE);
                     80:    }
                     81: 
                     82:    if ((octets_lus = read(in_fd, chaine, taille_fichier)) != taille_fichier)
                     83:    {
1.4     ! bertrand   84: #      ifndef OS2
        !            85:        // Sur des fichiers binaires et sous OS/2, le nombre d'octets lus peut
        !            86:        // etre inferieur … la taille du fichier sur le disque.
        !            87: 
        !            88:        fprintf(stderr, "read() failed\n");
        !            89:        fprintf(stderr, "Meditation: %d < %d\n", octets_lus, taille_fichier);
        !            90:        perror("read");
1.1       bertrand   91:        close(in_fd);
                     92:        free(chaine);
                     93:        exit(EXIT_FAILURE);
1.4     ! bertrand   94: #      endif
1.1       bertrand   95:    }
                     96: 
                     97:    close(in_fd);
                     98: 
                     99:    if (EVP_DigestInit(&contexte, EVP_sum()) != 1)
                    100:    {
1.4     ! bertrand  101:        fprintf(stderr, "EVP_DigestInit() failed\n");
1.1       bertrand  102:        close(in_fd);
                    103:        free(chaine);
                    104:        exit(EXIT_FAILURE);
                    105:    }
                    106: 
                    107:    if (EVP_DigestUpdate(&contexte, chaine, taille_fichier) != 1)
                    108:    {
1.4     ! bertrand  109:        fprintf(stderr, "EVP_DigestUpdate() failed\n");
1.1       bertrand  110:        close(in_fd);
                    111:        free(chaine);
                    112:        exit(EXIT_FAILURE);
                    113:    }
                    114: 
                    115:    if (EVP_DigestFinal_ex(&contexte, somme, &longueur_somme) != 1)
                    116:    {
1.4     ! bertrand  117:        fprintf(stderr, "EVP_DigestFinal_ex() failed\n");
1.1       bertrand  118:        close(in_fd);
                    119:        free(chaine);
                    120:        exit(EXIT_FAILURE);
                    121:    }
                    122: 
                    123:    EVP_MD_CTX_cleanup(&contexte);
                    124:    free(chaine);
                    125: 
                    126:    for(i = 0; i < longueur_somme; i++)
                    127:    {
                    128:        sprintf(&(somme_hexadecimale[2 * i]), "%02x", somme[i]);
                    129:    }
                    130: 
                    131:    printf("%s\n", somme_hexadecimale);
                    132: 
                    133:    return(EXIT_SUCCESS);
                    134: }
                    135: 
                    136: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>