blob: 7774a46c5338b8525e31ec78424a54574ed21057 [file] [log] [blame]
/*
* md5args.c: Command-line argument verifier.
*
* ====================================================================
* Copyright (c) 2000-2002 CollabNet. All rights reserved.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://subversion.tigris.org/license-1.html.
* If newer versions of this license are posted there, you may use a
* newer version instead, at your option.
*
* This software consists of voluntary contributions made by many
* individuals. For exact contribution history, see the revision
* history and logs, available at http://subversion.tigris.org/.
* ====================================================================
*/
#include <stdio.h>
#include <string.h>
#include <apr_general.h>
#include <apr_md5.h>
#include "svn_types.h"
#include "svn_error.h"
#include "svn_pools.h"
#include "svn_string.h"
/*** Main. ***/
static void
print_usage (const char *progname)
{
printf ("%s - Argument verification tool\n"
"\n"
"USAGE: %s MD5CHECKSUM ARG1 [ARG2 ... ARGn]\n"
"\n"
"MD5CHECKSUM is string of hexpairs (using capitals for A - F)\n"
"representing an MD5 checksum\n"
"\n"
"This program returns 0 if the concatenation of ARG1, ARG2,\n"
"... ARGn (with a single space character ' ' between them)\n"
"results in a string whose MD5 checksum is equivalent to the\n"
"MD5CHECKSUM passed as the first argument to this program.\n",
progname,
progname);
return;
}
int
main (int argc, const char * const *argv)
{
int i;
apr_pool_t *pool;
svn_stringbuf_t *string, *digest_str;
unsigned char digest[MD5_DIGESTSIZE];
if (apr_initialize () != APR_SUCCESS)
{
printf ("apr_initialize() failed.\n");
exit (1);
}
/* set up the global pool */
pool = svn_pool_create (NULL);
if (argc == 1)
{
/* Nothing to do...not an error. */
exit (0);
}
if (argc == 2)
{
print_usage (argv[0]);
exit (-1);
}
/* Create our expected digest. */
if (strlen (argv[1]) != (MD5_DIGESTSIZE * 2))
{
printf ("md5 checksum has unexpected length.\n");
exit (-2);
}
/* Build the string of space-separated arguments. */
string = svn_stringbuf_create ("", pool);
for (i = 2; i < (argc - 1); i++)
{
svn_stringbuf_appendcstr (string, argv[i]);
svn_stringbuf_appendcstr (string, " ");
}
svn_stringbuf_appendcstr (string, argv[argc - 1]);
printf ("args=%s\n", string->data);
/* Now, run the MD5 digest calculation on that string. */
apr_md5 (digest, string->data, string->len);
digest_str = svn_stringbuf_create ("", pool);
for (i = 0; i < MD5_DIGESTSIZE; i++)
{
svn_stringbuf_t *tmp_str =
svn_stringbuf_createf (pool, "%02X", digest[i]);
svn_stringbuf_appendstr (digest_str, tmp_str);
}
/* Exit with an error if the two digests don't match. */
if (strcmp (argv[1], digest_str->data))
{
printf ("md5 checksum failure.\n");
exit (1);
}
/* Clean up APR */
svn_pool_destroy (pool);
apr_terminate();
exit (0);
}
/*
* local variables:
* eval: (load-file "../../../tools/dev/svn-dev.el")
* end:
*/