Main Page   Modules   Data Structures   File List   Data Fields   Globals   Related Pages  

lib/md5sum.c

Go to the documentation of this file.
00001 
00014 #include "system.h"
00015 #include "md5.h"
00016 #include "rpmio_internal.h"
00017 #include "debug.h"
00018 
00027 static int domd5(const char * fn, unsigned char * digest, int asAscii,
00028                  int brokenEndian)
00029 {
00030     int rc;
00031 
00032 #ifndef DYING
00033     unsigned char buf[1024];
00034     unsigned char bindigest[16];
00035     FILE * fp;
00036     MD5_CTX ctx;
00037 
00038     memset(bindigest, 0, sizeof(bindigest));
00039     fp = fopen(fn, "r");
00040     if (!fp) {
00041         return 1;
00042     }
00043 
00044     rpmMD5Init(&ctx, brokenEndian);
00045     while ((rc = fread(buf, sizeof(buf[0]), sizeof(buf), fp)) > 0)
00046             rpmMD5Update(&ctx, buf, rc);
00047     rpmMD5Final(bindigest, &ctx);
00048     if (ferror(fp)) {
00049         (void) fclose(fp);
00050         return 1;
00051     }
00052 
00053     if (!asAscii) {
00054         memcpy(digest, bindigest, 16);
00055     } else {
00056         sprintf(digest, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"
00057                         "%02x%02x%02x%02x%02x",
00058                 (unsigned)bindigest[0],
00059                 (unsigned)bindigest[1],
00060                 (unsigned)bindigest[2],
00061                 (unsigned)bindigest[3],
00062                 (unsigned)bindigest[4],
00063                 (unsigned)bindigest[5],
00064                 (unsigned)bindigest[6],
00065                 (unsigned)bindigest[7],
00066                 (unsigned)bindigest[8],
00067                 (unsigned)bindigest[9],
00068                 (unsigned)bindigest[10],
00069                 (unsigned)bindigest[11],
00070                 (unsigned)bindigest[12],
00071                 (unsigned)bindigest[13],
00072                 (unsigned)bindigest[14],
00073                 (unsigned)bindigest[15]);
00074 
00075     }
00076     (void) fclose(fp);
00077     rc = 0;
00078 #else
00079     FD_t fd = Fopen(fn, "r.ufdio");
00080     unsigned char buf[BUFSIZ];
00081     unsigned char * md5sum = NULL;
00082     size_t md5len;
00083 
00084     if (fd == NULL || Ferror(fd)) {
00085         if (fd)
00086             Fclose(fd);
00087         return 1;
00088     }
00089 
00090     /* Preserve legacy "brokenEndian" behavior. */
00091     fdInitMD5(fd, (brokenEndian ? RPMDIGEST_NATIVE : 0) );
00092 
00093     while ((rc = Fread(buf, sizeof(buf[0]), sizeof(buf), fd)) > 0)
00094         ;
00095     fdFiniMD5(fd, (void **)&md5sum, &md5len, 1);
00096 
00097     if (Ferror(fd))
00098         rc = 1;
00099     Fclose(fd);
00100 
00101     if (!rc)
00102         memcpy(digest, md5sum, md5len);
00103     if (md5sum)
00104         free(md5sum);
00105 #endif
00106 
00107     return rc;
00108 }
00109 
00110 int mdbinfile(const char *fn, unsigned char *bindigest) {
00111     return domd5(fn, bindigest, 0, 0);
00112 }
00113 
00114 int mdbinfileBroken(const char *fn, unsigned char *bindigest) {
00115     return domd5(fn, bindigest, 0, 1);
00116 }
00117 
00118 int mdfile(const char *fn, unsigned char *digest) {
00119     return domd5(fn, digest, 1, 0);
00120 }
00121 
00122 int mdfileBroken(const char *fn, unsigned char *digest) {
00123     return domd5(fn, digest, 1, 1);
00124 }

Generated at Thu Sep 6 11:25:41 2001 for rpm by doxygen1.2.8.1 written by Dimitri van Heesch, © 1997-2001