summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--isomd5sum/Makefile3
-rw-r--r--isomd5sum/checkisomd5.c149
2 files changed, 102 insertions, 50 deletions
diff --git a/isomd5sum/Makefile b/isomd5sum/Makefile
index a12597856..1292fac62 100644
--- a/isomd5sum/Makefile
+++ b/isomd5sum/Makefile
@@ -4,11 +4,10 @@ all:
gcc -c -O -g md5.c
gcc -O -g -o implantisomd5 implantisomd5.c md5.o -lm
gcc -O -g -o checkisomd5 checkisomd5.c md5.o -lm
-# gcc -O -g -c checkisomd5.c
-# gcc -O -g -o newtcheckiso newtcheckiso.c checkisomd5.o md5.o -lm -lnewt
install:
install -m 755 implantisomd5 $(DESTDIR)/$(RUNTIMEDIR)
+ install -m 755 checkisomd5 $(DESTDIR)/$(RUNTIMEDIR)
clean:
rm -f *.o
diff --git a/isomd5sum/checkisomd5.c b/isomd5sum/checkisomd5.c
index 653c1bdfd..aa52999dd 100644
--- a/isomd5sum/checkisomd5.c
+++ b/isomd5sum/checkisomd5.c
@@ -6,19 +6,21 @@
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <unistd.h>
#include <fcntl.h>
+#include <string.h>
#include "md5.h"
-/* number of sectors to ignore at end of iso when computing sum */
-#define SKIPSECTORS 0
-
#define APPDATA_OFFSET 883
#define SIZE_OFFSET 84
#define MAX(x, y) ((x > y) ? x : y)
#define MIN(x, y) ((x < y) ? x : y)
+/* number of sectors to ignore at end of iso when computing sum */
+#define SKIPSECTORS 15
+
/* finds primary volume descriptor and returns info from it */
/* mediasum must be a preallocated buffer at least 33 bytes long */
int parsepvd(int isofd, char *mediasum, long long *isosize) {
@@ -65,32 +67,20 @@ int parsepvd(int isofd, char *mediasum, long long *isosize) {
/* both strings must be pre-allocated at least 33 chars in length */
int checkmd5sum(int isofd, char *mediasum, char *computedsum) {
int nread;
- int nattempt;
int i;
- int dirty;
- int sector;
int appdata_start_offset, appdata_end_offset;
- long long isosize;
+ int nattempt;
unsigned int bufsize = 32768;
unsigned char md5sum[16];
- unsigned int offset;
unsigned int len;
unsigned char *buf;
- unsigned char orig_appdata[512];
- unsigned char new_appdata[512];
- char orig_md5str[40], md5str[40];
+ long long isosize, offset, pvd_offset, apoff;
MD5_CTX md5ctx;
+ if ((pvd_offset = parsepvd(isofd, mediasum, &isosize)) < 0)
+ return -1;
- pvd_offset = parsepvd(isofd, &orig_md5str, &isosize);
-
- /* seek to application data, read */
- lseek(isofd, pvd_offset + APPDATA_OFFSET, SEEK_SET);
- nread = read(isofd, orig_appdata, 512);
-
- /* read out md5sum */
- memcpy(mediasum, orig_appdata+13, 32);
- mediasum[32] = '\0';
+ /* printf("Mediasum = %s\n",mediasum); */
/* rewind, compute md5sum */
lseek(isofd, 0L, SEEK_SET);
@@ -98,37 +88,50 @@ int checkmd5sum(int isofd, char *mediasum, char *computedsum) {
MD5_Init(&md5ctx);
offset = 0;
+ apoff = pvd_offset + APPDATA_OFFSET;
buf = malloc(bufsize * sizeof(unsigned char));
- while (total < isosize - SKIPSECTORS*2048) {
- nattempt = MIN( isosize - SKIPSECTORS*2048 - total, bufsize );
+ printf("Percent complete: %05.1f%%", (100.0*offset)/(isosize-SKIPSECTORS*2048.0));
+ fflush(stdout);
+ while (offset < isosize - SKIPSECTORS*2048) {
+ nattempt = MIN(isosize - SKIPSECTORS*2048 - offset, bufsize);
+
+ /* printf("%lld %lld %lld %d\n", offset, isosize, isosize-SKIPSECTORS*2048, nattempt); */
+
nread = read(isofd, buf, nattempt);
if (nread <= 0)
break;
/* overwrite md5sum we implanted with original data */
- if (offset < APPDATA_OFFSET && offset+nread >= APPDATA_OFFSET) {
- appdata_start_offset = APPDATA_OFFSET - offset;
+ if (offset < apoff && offset+nread >= apoff) {
+ appdata_start_offset = apoff - offset;
appdata_end_offset = MIN(appdata_start_offset+MIN(nread, 512),
- offset+nread - APPDATA_OFFSET);
+ offset + nread - apoff);
len = appdata_end_offset - appdata_start_offset;
memset(buf+appdata_start_offset, ' ', len);
- } else if (offset >= APPDATA_OFFSET && offset+nread < APPDATA_OFFSET+512) {
+ } else if (offset >= apoff && offset+nread < apoff + 512) {
appdata_start_offset = 0;
appdata_end_offset = nread;
len = appdata_end_offset - appdata_start_offset;
memset(buf+appdata_start_offset, ' ', len);
- } else if (offset < APPDATA_OFFSET + 512 && offset+nread >= APPDATA_OFFSET+512) {
+ } else if (offset < apoff + 512 && offset+nread >= apoff + 512) {
appdata_start_offset = 0;
- appdata_end_offset = APPDATA_OFFSET+512 - offset;
+ appdata_end_offset = apoff + 512 - offset;
len = appdata_end_offset - appdata_start_offset;
memset(buf+appdata_start_offset, ' ', len);
}
MD5_Update(&md5ctx, buf, nread);
offset = offset + nread;
+
+ printf("\b\b\b\b\b\b%05.1f%%", (100.0*offset)/(isosize-SKIPSECTORS*2048.0));
+ fflush(stdout);
}
+ printf("\b\b\b\b\b\b\n\n", (100.0*offset)/(isosize-SKIPSECTORS*2048.0));
+
+ sleep(1);
+
free(buf);
MD5_Final(md5sum, &md5ctx);
@@ -140,42 +143,92 @@ int checkmd5sum(int isofd, char *mediasum, char *computedsum) {
strcat(computedsum, tmpstr);
}
+ /* printf("mediasum, computedsum = %s %s\n", mediasum, computedsum); */
+
if (strcmp(mediasum, computedsum))
return 0;
else
return 1;
}
-#ifdef TESTING
-int main(int argc, char **argv) {
+
+#if 0
+static void readCB(void *co, long long pos) {
+ struct progressCBdata *data = co;
+ static int tick = 0;
+ char tickmark[2] = "-";
+ char * ticks = "-\\|/";
+
+ newtScaleSet(data->scale, pos);
+ tick++;
+ if (tick > 399) tick = 0;
+ *tickmark = ticks[tick / 100];
+
+ newtLabelSetText(data->label, tickmark);
+ newtRefresh();
+}
+#endif
+
+int doMediaCheck(int isofd, char *mediasum, char *computedsum, long long *isosize) {
+ int rc;
+ int llen;
+
+ if (parsepvd(isofd, mediasum, isosize) < 0) {
+ fprintf(stderr, "Unable to read the disc checksum from the "
+ "primary volume descriptor. This probably "
+ "means the disc was created without adding the "
+ "checksum.");
+ return -1;
+ }
+
+ rc = checkmd5sum(isofd, mediasum, computedsum);
+
+ return rc;
+}
+
+int mediaCheckFile(char *file) {
int isofd;
int rc;
+ char *result;
unsigned char mediasum[33], computedsum[33];
+ char tmpstr[256];
+ long long isosize;
- printf ("Do not use\n");
- exit(1);
+ isofd = open(file, O_RDONLY);
- if (argc < 2) {
- printf("Usage: checkisomd5 <isofilename>\n\n");
- exit(1);
+ if (isofd < 0) {
+ fprintf(stderr, "Unable to find install image %s\n", file);
+ return -1;
}
- isofd = open(argv[1], O_RDWR);
+ rc = doMediaCheck(isofd, mediasum, computedsum, &isosize);
+
+ close(isofd);
+
+ /* printf("isosize = %lld\n", isosize);
+ printf("%s\n%s\n", mediasum, computedsum);*/
- if (isofd < 0) {
- fprintf(stderr, "Error - Unable to open file %s\n\n", argv[1]);
- exit(1);
- }
-
- rc = checkmd5sum(isofd, mediasum, computedsum);
- printf("%s\n%s\n", mediasum, computedsum);
if ( rc == 0)
- printf("Md5sums differ.\n");
+ result = "FAIL.\n\nIt is not recommended to use this media.";
else if (rc > 0)
- printf("Md5sums match.\n");
+ result = "PASS.\n\nIt is OK to install from this media.";
else
- printf("None checksum information in iso, check skipped.\n");
+ result = "NA.\n\nNo checksum information available, unable to verify media.";
- close(isofd);
+ fprintf(stderr, "The media check is complete, the "
+ "result is: %s", result);
+
+ return rc;
+}
+
+
+int main(int argc, char **argv) {
+ int rc;
+
+ if (argc < 2) {
+ printf("Usage: checkisomd5 <isofilename>\n\n");
+ exit(1);
+ }
+
+ rc = mediaCheckFile(argv[1]);
}
-#endif