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

Generated on Wed Mar 13 15:34:47 2002 for rpm by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002