File:  [ELWIX - Embedded LightWeight unIX -] / embedtools / src / dircmp.c
Revision 1.2: download - view: text, annotated - select for diffs - revision graph
Wed Jun 8 12:45:41 2011 UTC (13 years 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: dircmp.c,v 1.2 2011/06/08 12:45:41 misho Exp $
 *
 *************************************************************************/
#include "global.h"


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


static void
Usage()
{
	printf(	"-= DirCmp =- Tool for compare directories and show differences\n"
		"=== %s === %s@%s ===\n\n"
		"  Syntax: dircmp [options] <dir> [<cmp_dir>]\n\n"
		"\t-l\t\tLong directory output ...\n"
		"\t-o <filename>\tOutput diff to filename\n"
		"\n", compiled, compiledby, compilehost);
}

int
main(int argc, char **argv)
{
	char ch, szFName[MAXPATHLEN];
	int lm = 0;
	struct tagDirName *list;
	register int i;
	FILE *f = stdout;
	struct stat sb;

	while ((ch = getopt(argc, argv, "hlo:")) != -1)
		switch (ch) {
			case 'o':
				lm |= 2;
				strlcpy(szFName, optarg, MAXPATHLEN);
				break;
			case 'l':
				lm |= 1;
				break;
			case 'h':
			default:
				Usage();
				return 127;
		}
	argc -= optind;
	argv += optind;

	if (!argc || (!(lm & 2) && argc < 2)) {
		Usage();
		return 127;
	}
	// check for general differences
	if (argc > 1) {
		if (lstat(argv[1], &sb) == -1) {
			printf("Error:: %s(%d) #%d - %s\n", __func__, __LINE__, errno, strerror(errno));
			return 127;
		}

		if (S_ISDIR(sb.st_mode))
			switch (sync_dircmp(argv[0], argv[1])) {
				case -1:
					printf("Error:: %s(%d) #%d - %s\n", __func__, __LINE__, errno, strerror(errno));
					return 127;
				case 0:
					printf("Directory %s == %s\n\n", argv[0], argv[1]);
					return 0;
				case 1:
					printf("Directory %s != %s ::\n\n", argv[0], argv[1]);
			}
	}

	if (sync_dircmpList(argv[0], argc > 1 ? argv[1] : NULL, lm, &list) == -1) {
		printf("Error:: %s(%d) #%d - %s\n", __func__, __LINE__, sync_GetErrno(), sync_GetError());
		return 127;
	}

	if (lm & 2 && strcmp(szFName, "-")) {
		f = fopen(szFName, "w");
		if (!f) {
			printf("Error:: %s(%d) #%d - %s\n", __func__, __LINE__, errno, strerror(errno));
			if (list)
				free(list);
			return 0;
		}
	}
	for (i = 0; list[i].ch; i++)
		fprintf(f, "%c  %s %s\n", list[i].ch, list[i].name, list[i].extra);
	if (lm & 2)
		fclose(f);

	printf("\nTotal count of elements = %d\n", i);
	free(list);
	return 1;
}

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