version 1.1.2.1, 2010/07/12 15:20:41
|
version 1.3.4.4, 2014/02/04 16:52:32
|
Line 5
|
Line 5
|
* $Author$ |
* $Author$ |
* $Id$ |
* $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 - 2014 |
| 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 "global.h" |
#include "global.h" |
|
|
|
|
Line 17 Usage()
|
Line 54 Usage()
|
printf( "-= Direr =- Tool for compare directories by checksum\n" |
printf( "-= Direr =- Tool for compare directories by checksum\n" |
"=== %s === %s@%s ===\n\n" |
"=== %s === %s@%s ===\n\n" |
" Syntax: direr [options] <dir> [cmp_dir]\n\n" |
" Syntax: direr [options] <dir> [cmp_dir]\n\n" |
|
"\t-q\t\t\tQuiet mode\n" |
"\t-s <cksum>\t\tCompare dir with this checksum ...\n" |
"\t-s <cksum>\t\tCompare dir with this checksum ...\n" |
"\n", compiled, compiledby, compilehost); |
"\n", compiled, compiledby, compilehost); |
} |
} |
|
|
|
|
int |
int |
calcDir(const char *csDir, u_char **md) |
|
{ |
|
DIR *dir; |
|
struct dirent d, *pd; |
|
MD5_CTX ctx; |
|
|
|
*md = malloc(MD5_DIGEST_LENGTH); |
|
if (!*md) { |
|
printf("Error:: %s(%d) #%d - %s\n", __func__, __LINE__, errno, strerror(errno)); |
|
return -1; |
|
} else |
|
memset(*md, 0, MD5_DIGEST_LENGTH); |
|
|
|
dir = opendir(csDir); |
|
if (!dir) { |
|
printf("Error:: %s(%d) #%d - %s\n", __func__, __LINE__, errno, strerror(errno)); |
|
free(*md); |
|
return -1; |
|
} |
|
|
|
MD5_Init(&ctx); |
|
while (!readdir_r(dir, &d, &pd) && pd) { |
|
if (d.d_type == DT_DIR && (!strcmp(d.d_name, ".") || !strcmp(d.d_name, ".."))) |
|
continue; |
|
MD5_Update(&ctx, d.d_name, d.d_namlen); |
|
} |
|
MD5_Final(*md, &ctx); |
|
|
|
closedir(dir); |
|
return 0; |
|
} |
|
|
|
inline int |
|
convMD5(u_char *md, char **str) |
|
{ |
|
register int i; |
|
|
|
*str = malloc(MD5_DIGEST_LENGTH * 2 + 1); |
|
if (!*str) { |
|
printf("Error:: %s(%d) #%d - %s\n", __func__, __LINE__, errno, strerror(errno)); |
|
return -1; |
|
} else |
|
(*str)[MD5_DIGEST_LENGTH * 2] = 0; |
|
|
|
for (i = 0; i < MD5_DIGEST_LENGTH; i++) |
|
snprintf(&(*str)[i * 2], 3, "%02x", md[i]); |
|
|
|
return 0; |
|
} |
|
|
|
// ---------------------------------------------------- |
|
|
|
int |
|
main(int argc, char **argv) |
main(int argc, char **argv) |
{ |
{ |
u_char *md[2], mode = 0; | u_char *md[2], mode = 0, quiet = 0; |
char szCmp[MAXPATHLEN], *str[2], ch; |
char szCmp[MAXPATHLEN], *str[2], ch; |
int ret = 0; |
int ret = 0; |
|
ait_val_t v = AIT_VAL_INITIALIZER(v); |
|
|
memset(md, 0, sizeof md); |
memset(md, 0, sizeof md); |
memset(str, 0, sizeof str); |
memset(str, 0, sizeof str); |
memset(szCmp, 0, MAXPATHLEN); |
memset(szCmp, 0, MAXPATHLEN); |
while ((ch = getopt(argc, argv, "hs:")) != -1) | while ((ch = getopt(argc, argv, "hqs:")) != -1) |
switch (ch) { |
switch (ch) { |
case 's': |
case 's': |
str[1] = strdup(optarg); |
str[1] = strdup(optarg); |
mode = 1; |
mode = 1; |
break; |
break; |
|
case 'q': |
|
quiet = 1; |
|
break; |
case 'h': |
case 'h': |
default: |
default: |
Usage(); |
Usage(); |
Line 108 main(int argc, char **argv)
|
Line 96 main(int argc, char **argv)
|
mode |= 2; |
mode |= 2; |
} |
} |
|
|
if (calcDir(argv[0], &md[0]) == -1) | if (sync_dirChkSum(argv[0], &md[0]) == -1) { |
| ELIBERR(sync); |
return 1; |
return 1; |
if (convMD5(md[0], &str[0]) == -1) { | } |
free(md[0]); | AIT_SET_BUF(&v, md[0], MD5_DIGEST_LENGTH); |
| str[0] = str_Dig2Hex(&v); |
| AIT_FREE_VAL(&v); |
| if (!str[0]) { |
| e_free(md[0]); |
return 1; |
return 1; |
} |
} |
printf("1.Directory '%s': %s\n", argv[0], str[0]); | if (!quiet) |
| printf("1.Directory '%s': %s\n", argv[0], str[0]); |
|
|
if (mode & 1 && *str[1]) { |
if (mode & 1 && *str[1]) { |
ret |= !strcmp((char*) str[0], (char*) str[1]) << 1; |
ret |= !strcmp((char*) str[0], (char*) str[1]) << 1; |
printf("Result checksum:: %s %s %s\n\n", str[0], ret & 1 ? "==" : "!=", str[1]); | if (!quiet) |
free(str[1]); | printf("Result checksum:: %s %s %s\n\n", str[0], |
| ret & 2 ? "==" : "!=", str[1]); |
| e_free(str[1]); |
} |
} |
|
|
if (mode & 2 && *szCmp) { |
if (mode & 2 && *szCmp) { |
if (calcDir(szCmp, &md[1]) == -1) | if (sync_dirChkSum(szCmp, &md[1]) == -1) { |
| ELIBERR(sync); |
return 1; |
return 1; |
if (convMD5(md[1], &str[1]) == -1) { | } |
free(md[0]); | AIT_SET_BUF(&v, md[1], MD5_DIGEST_LENGTH); |
free(str[0]); | str[1] = str_Dig2Hex(&v); |
free(md[1]); | AIT_FREE_VAL(&v); |
| if (!str[1]) { |
| e_free(md[0]); |
| e_free(str[0]); |
| e_free(md[1]); |
return 1; |
return 1; |
} |
} |
printf("2.Directory '%s': %s\n", szCmp, str[1]); | if (!quiet) |
| printf("2.Directory '%s': %s\n", szCmp, str[1]); |
|
|
ret |= (!strcmp((char*) str[0], (char*) str[1]) << 2); |
ret |= (!strcmp((char*) str[0], (char*) str[1]) << 2); |
printf("Result directory:: %s %s %s\n\n", argv[0], ret & 2 ? "==" : "!=", szCmp); | if (!quiet) |
| printf("Result directory:: %s %s %s\n\n", argv[0], |
if (str[1]) | ret & 4 ? "==" : "!=", szCmp); |
free(str[1]); | e_free(str[1]); |
if (md[1]) | e_free(md[1]); |
free(md[1]); | |
} |
} |
|
|
if (str[0]) | e_free(str[0]); |
free(str[0]); | e_free(md[0]); |
if (md[0]) | |
free(md[0]); | |
return ret; |
return ret; |
} |
} |