#include #include #define USAGE "USAGE: checkum -[vhcs] infile outfile\n\t-v\tverbose\n\ \t-h\thelp\n\t-c\tcheck checksum\n\t-s\tprint the ipl size" static int verbose = 0; static int verify = 0; static int size = 0; typedef int word_t; #define WORDSIZE (sizeof(word_t)) main(argc, argv) int argc; char **argv; { char *infile; char *outfile; int infd; int outfd; word_t checksum = 0; int nbytes; word_t buf; int i = 1; int filesize = 0; while (*argv[i] == '-') { switch (*(argv[i]+1)) { case 'v': verbose++; break; case 'c': verify++; puts ("Sorry, unimplemented for now"); exit(1); break; case 's': size++; break; case 'h': puts (USAGE); exit(0); default: printf ("\"%s\", Illegal option\n", argv[i]); puts (USAGE); exit(1); } i++; } infile = *(argv + i); outfile = *(argv + i+1); /* see it there were file names on the command line */ if (infile == 0x0) { puts("Didn't specify an input file name"); exit(1); } if (outfile == 0x0) { puts("Didn't specify an output file name"); exit(1); } /* try to open the files */ infd = open(infile, O_RDONLY); if (infd == -1) { printf("Couldn't open %s\n", infile); exit(1); } outfd = open(outfile, O_WRONLY|O_CREAT|O_TRUNC); if (outfd == -1) { printf("Couldn't open %s\n", outfile); exit(1); } if (verbose > 2) putchar('\n'); /* calculate the checksum */ while ((nbytes = read(infd, &buf, WORDSIZE)) == WORDSIZE) { if (verbose > 2) putchar('.'); checksum+= buf; filesize+= WORDSIZE; if (write(outfd, &buf, WORDSIZE) != WORDSIZE) { puts("Couldn't write"); } if (verbose > 3) putchar('+'); } if (verbose > 2) putchar('\n'); /* write the last byte read */ if (nbytes > 0) { write(outfd, &buf, nbytes); checksum+= buf; /* calculate the last word */ filesize+= nbytes; } /* write the checksum */ buf = -checksum; write(outfd, &buf, WORDSIZE); filesize+= WORDSIZE; /* checksum increase the size */ if (verbose > 0) printf("The calculated checksum is:\n\t0x%x,\n\t%u\n", -checksum, -checksum); /* calculate the extra 2K here */ buf = 0; while ((filesize % 2048) !=0) { filesize+=WORDSIZE; write(outfd, &buf, WORDSIZE); } if (size > 0) { printf ("%u is the new file size\n", filesize); } close(outfd); close(infd); exit(0); } #if 0 /* Calculate a simple checksum and concatenate it to the end of BUF. */ void compute_and_concatenate_checksum (word *buf, size_t bufsize_in_words) { size_t i; word sum; sum = buf[0] for (i = 1; i < bufsize_in_words; i++) sum += buf[i]; buf[bufsize_in_words] = -sum; } /* Calculate a simple checksum and verify it. NOTE: bufsize_in_words should include the checksum, i.e., it should be one larger than when the checksum was calculated using compute_and_concatenate_checksum! */ int compute_and_and_verify_checksum (word *buf, size_t bufsize_in_words) { size_t i; word sum; sum = buf[0]; for (i = 1; i < bufsize_in_words; i++) sum += buf[i]; if (sum != 0) return ERROR; return SUCCESS; } #endif