151 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
#include <stdio.h>
 | 
						|
#include <fcntl.h>
 | 
						|
 | 
						|
#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
 |