|
|
| version 1.1, 2012/11/13 13:41:36 | version 1.2, 2012/11/13 14:19:39 |
|---|---|
| Line 0 | Line 1 |
| /************************************************************************* | |
| * (C) 2010 AITNET - Sofia/Bulgaria - <office@aitbg.com> | |
| * by Michael Pounov <misho@aitbg.com> | |
| * | |
| * $Author$ | |
| * $Id$ | |
| * | |
| ************************************************************************* | |
| The ELWIX and AITNET software is distributed under the following | |
| terms: | |
| All of the documentation and software included in the ELWIX and AITNET | |
| Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org> | |
| Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 | |
| by Michael Pounov <misho@elwix.org>. All rights reserved. | |
| Redistribution and use in source and binary forms, with or without | |
| modification, are permitted provided that the following conditions | |
| are met: | |
| 1. Redistributions of source code must retain the above copyright | |
| notice, this list of conditions and the following disclaimer. | |
| 2. Redistributions in binary form must reproduce the above copyright | |
| notice, this list of conditions and the following disclaimer in the | |
| documentation and/or other materials provided with the distribution. | |
| 3. All advertising materials mentioning features or use of this software | |
| must display the following acknowledgement: | |
| This product includes software developed by Michael Pounov <misho@elwix.org> | |
| ELWIX - Embedded LightWeight unIX and its contributors. | |
| 4. Neither the name of AITNET nor the names of its contributors | |
| may be used to endorse or promote products derived from this software | |
| without specific prior written permission. | |
| THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND | |
| ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
| FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
| OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
| HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
| LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
| OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
| SUCH DAMAGE. | |
| */ | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <unistd.h> | |
| #include <errno.h> | |
| #include <sys/types.h> | |
| #include <sys/param.h> | |
| #include <sys/stat.h> | |
| #include <aitsync.h> | |
| static void | |
| Usage() | |
| { | |
| printf( "-= DirCmp =- Tool for compare directories and show differences\n" | |
| "====================\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"); | |
| } | |
| 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; | |
| } |