/*************************************************************************
* (C) 2010 AITNET - Sofia/Bulgaria - <office@aitbg.com>
* by Michael Pounov <misho@aitbg.com>
*
* $Author: misho $
* $Id: dircmp.c,v 1.1.2.8 2010/09/20 23:07:11 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>