File:  [ELWIX - Embedded LightWeight unIX -] / embedtools / src / direr.c
Revision 1.2: download - view: text, annotated - select for diffs - revision graph
Wed Jun 8 12:45:41 2011 UTC (12 years, 11 months ago) by misho
Branches: MAIN
CVS tags: tools1_1, TOOLS1_0, HEAD
new ver

/*************************************************************************
 * (C) 2010 AITNET - Sofia/Bulgaria - <office@aitbg.com>
 *  by Michael Pounov <misho@aitbg.com>
 *
 * $Author: misho $
 * $Id: direr.c,v 1.2 2011/06/08 12:45:41 misho Exp $
 *
 *************************************************************************/
#include "global.h"


extern char compiled[], compiledby[], compilehost[];

static void
Usage()
{
	printf(	"-= Direr =- Tool for compare directories by checksum\n"
		"=== %s === %s@%s ===\n\n"
		"  Syntax: direr [options] <dir> [cmp_dir]\n\n"
		"\t-s <cksum>\t\tCompare dir with this checksum ...\n"
		"\n", compiled, compiledby, compilehost);
}

int
main(int argc, char **argv)
{
	u_char *md[2], mode = 0;
	char szCmp[MAXPATHLEN], *str[2], ch;
	int ret = 0;

	memset(md, 0, sizeof md);
	memset(str, 0, sizeof str);
	memset(szCmp, 0, MAXPATHLEN);
	while ((ch = getopt(argc, argv, "hs:")) != -1)
		switch (ch) {
			case 's':
				str[1] = strdup(optarg);
				mode = 1;
				break;
			case 'h':
			default:
				Usage();
				return 1;
		}
	argc -= optind;
	argv += optind;

	if (argc < 1) {
		Usage();
		return 1;
	}
	if (argc > 1) {
		strlcpy(szCmp, argv[1], MAXPATHLEN);
		mode |= 2;
	}

	if (sync_dirCSum(argv[0], &md[0]) == -1) {
		printf("Error:: %s(%d) #%d - %s\n", __func__, __LINE__, errno, strerror(errno));
		return 1;
	}
	str[0] = io_Hex2Ch(md[0], MD5_DIGEST_LENGTH);
	if (!str[0]) {
		free(md[0]);
		return 1;
	}
	printf("1.Directory '%s': %s\n", argv[0], str[0]);

	if (mode & 1 && *str[1]) {
		ret |= !strcmp((char*) str[0], (char*) str[1]) << 1;
		printf("Result checksum:: %s %s %s\n\n", str[0], ret & 2 ? "==" : "!=", str[1]);
		free(str[1]);
	}

	if (mode & 2 && *szCmp) {
		if (sync_dirCSum(szCmp, &md[1]) == -1) {
			printf("Error:: %s(%d) #%d - %s\n", __func__, __LINE__, errno, strerror(errno));
			return 1;
		}
		str[1] = io_Hex2Ch(md[1], MD5_DIGEST_LENGTH);
		if (!str[1]) {
			free(md[0]);
			free(str[0]);
			free(md[1]);
			return 1;
		}
		printf("2.Directory '%s': %s\n", szCmp, str[1]);

		ret |= (!strcmp((char*) str[0], (char*) str[1]) << 2);
		printf("Result directory:: %s %s %s\n\n", argv[0], ret & 4 ? "==" : "!=", szCmp);

		if (str[1])
			free(str[1]);
		if (md[1])
			free(md[1]);
	}

	if (str[0])
		free(str[0]);
	if (md[0])
		free(md[0]);
	return ret;
}

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>