genchecksum.c revision 285830
150276Speter/* Generate checksums of executables for PCH validation
250276Speter   Copyright (C) 2005
350276Speter   Free Software Foundation, Inc.
450276Speter
550276SpeterThis file is part of GCC.
650276Speter
750276SpeterGCC is free software; you can redistribute it and/or modify it under
850276Speterthe terms of the GNU General Public License as published by the Free
950276SpeterSoftware Foundation; either version 2, or (at your option) any later
1050276Speterversion.
1150276Speter
1250276SpeterGCC is distributed in the hope that it will be useful, but WITHOUT ANY
1350276SpeterWARRANTY; without even the implied warranty of MERCHANTABILITY or
1450276SpeterFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1550276Speterfor more details.
1650276Speter
1750276SpeterYou should have received a copy of the GNU General Public License
1850276Speteralong with GCC; see the file COPYING.  If not, write to the Free
1950276SpeterSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
2050276Speter02110-1301, USA.  */
2150276Speter
2250276Speter#include "bconfig.h"
2350276Speter#include "system.h"
2450276Speter#include "md5.h"
2550276Speter
2650276Speterstatic void
2750276Speterusage (void)
2850276Speter{
2950276Speter  fputs ("Usage: genchecksums <filename>\n", stderr);
3050276Speter}
3150276Speter
3250276Speterstatic void
3350276Speterdosum (const char *file)
3450276Speter{
3550276Speter  FILE *f;
3650276Speter  unsigned char result[16];
3750276Speter  int i;
3850276Speter
3950276Speter  f = fopen (file, "rb");
4050276Speter  if (!f)
4150276Speter    {
4250276Speter      fprintf (stderr, "opening %s: %s\n", file, xstrerror (errno));
4350276Speter      exit (1);
4450276Speter    }
4550276Speter
4650276Speter  /* Some executable formats have timestamps in the first 16 bytes, yuck.  */
4750276Speter  if (fseek (f, 16, SEEK_SET) != 0)
4850276Speter     {
4950276Speter      fprintf (stderr, "seeking in %s: %s\n", file, xstrerror (errno));
5050276Speter      exit (1);
5150276Speter    }
5250276Speter
5350276Speter  if (md5_stream (f, result) != 0
5450276Speter      || fclose (f) != 0)
5550276Speter     {
5650276Speter      fprintf (stderr, "reading %s: %s\n", file, xstrerror (errno));
5750276Speter      exit (1);
5850276Speter    }
5950276Speter
6050276Speter  fputs ("const unsigned char executable_checksum[16] = { ", stdout);
6150276Speter  for (i = 0; i < 16; i++)
6250276Speter    printf ("%#02x%s", result[i], i == 15 ? " };\n" : ", ");
6350276Speter}
6450276Speter
6550276Speterint
6650276Spetermain (int argc, char ** argv)
6750276Speter{
6850276Speter  if (argc != 2)
6950276Speter    {
7050276Speter      usage ();
7150276Speter      return 1;
7250276Speter    }
7350276Speter
7450276Speter  dosum (argv[1]);
7550276Speter
7650276Speter  return 0;
7750276Speter}
7850276Speter