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

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
1.6     ! bertrand   86:        // etre inferieur à la taille du fichier sur le disque.
1.4       bertrand   87: 
                     88:        fprintf(stderr, "read() failed\n");
1.6     ! bertrand   89:        fprintf(stderr, "Meditation: %d < %d\n", (int) octets_lus,
        !            90:                (int) taille_fichier);
1.4       bertrand   91:        perror("read");
1.1       bertrand   92:        close(in_fd);
                     93:        free(chaine);
                     94:        exit(EXIT_FAILURE);
1.4       bertrand   95: #      endif
1.1       bertrand   96:    }
                     97: 
                     98:    close(in_fd);
                     99: 
                    100:    if (EVP_DigestInit(&contexte, EVP_sum()) != 1)
                    101:    {
1.4       bertrand  102:        fprintf(stderr, "EVP_DigestInit() failed\n");
1.1       bertrand  103:        close(in_fd);
                    104:        free(chaine);
                    105:        exit(EXIT_FAILURE);
                    106:    }
                    107: 
                    108:    if (EVP_DigestUpdate(&contexte, chaine, taille_fichier) != 1)
                    109:    {
1.4       bertrand  110:        fprintf(stderr, "EVP_DigestUpdate() failed\n");
1.1       bertrand  111:        close(in_fd);
                    112:        free(chaine);
                    113:        exit(EXIT_FAILURE);
                    114:    }
                    115: 
                    116:    if (EVP_DigestFinal_ex(&contexte, somme, &longueur_somme) != 1)
                    117:    {
1.4       bertrand  118:        fprintf(stderr, "EVP_DigestFinal_ex() failed\n");
1.1       bertrand  119:        close(in_fd);
                    120:        free(chaine);
                    121:        exit(EXIT_FAILURE);
                    122:    }
                    123: 
                    124:    EVP_MD_CTX_cleanup(&contexte);
                    125:    free(chaine);
                    126: 
                    127:    for(i = 0; i < longueur_somme; i++)
                    128:    {
                    129:        sprintf(&(somme_hexadecimale[2 * i]), "%02x", somme[i]);
                    130:    }
                    131: 
                    132:    printf("%s\n", somme_hexadecimale);
                    133: 
                    134:    return(EXIT_SUCCESS);
                    135: }
                    136: 
                    137: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>