version 1.3.2.3, 2012/11/13 13:53:14
|
version 1.5, 2014/02/04 16:58:17
|
Line 12 terms:
|
Line 12 terms:
|
All of the documentation and software included in the ELWIX and AITNET |
All of the documentation and software included in the ELWIX and AITNET |
Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org> |
Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org> |
|
|
Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 | Copyright 2004 - 2014 |
by Michael Pounov <misho@elwix.org>. All rights reserved. |
by Michael Pounov <misho@elwix.org>. All rights reserved. |
|
|
Redistribution and use in source and binary forms, with or without |
Redistribution and use in source and binary forms, with or without |
Line 65 find_tag(int const * __restrict tags, struct tagDirNam
|
Line 65 find_tag(int const * __restrict tags, struct tagDirNam
|
if (l[tags[t] + i].hash == hash) { |
if (l[tags[t] + i].hash == hash) { |
/* finded & marked for delete! */ |
/* finded & marked for delete! */ |
find = (struct tagDirName*) &l[tags[t] + i]; |
find = (struct tagDirName*) &l[tags[t] + i]; |
find->ch = '*'; | find->ch = DIFF_D0; |
break; |
break; |
} |
} |
} |
} |
Line 78 create_tags()
|
Line 78 create_tags()
|
{ |
{ |
int *tags; |
int *tags; |
|
|
tags = calloc(TABLESIZ, sizeof(int)); | tags = e_calloc(TABLESIZ, sizeof(int)); |
if (!tags) { |
if (!tags) { |
LOGERR; |
LOGERR; |
} else |
} else |
Line 98 create_diridx(const char *csDir, int lm, int *tags, st
|
Line 98 create_diridx(const char *csDir, int lm, int *tags, st
|
struct stat sb; |
struct stat sb; |
register int i; |
register int i; |
|
|
l = malloc(sizeof(struct tagDirName)); | l = e_malloc(sizeof(struct tagDirName)); |
if (!l) { |
if (!l) { |
LOGERR; |
LOGERR; |
*list = NULL; |
*list = NULL; |
Line 111 create_diridx(const char *csDir, int lm, int *tags, st
|
Line 111 create_diridx(const char *csDir, int lm, int *tags, st
|
old = getcwd(NULL, 0); |
old = getcwd(NULL, 0); |
if (chdir(csDir) == -1) { |
if (chdir(csDir) == -1) { |
LOGERR; |
LOGERR; |
free(old); | e_free(old); |
free(l); | e_free(l); |
*list = NULL; |
*list = NULL; |
return -1; |
return -1; |
} |
} |
Line 120 create_diridx(const char *csDir, int lm, int *tags, st
|
Line 120 create_diridx(const char *csDir, int lm, int *tags, st
|
if (!dir) { |
if (!dir) { |
LOGERR; |
LOGERR; |
chdir(old); |
chdir(old); |
free(old); | e_free(old); |
free(l); | e_free(l); |
*list = NULL; |
*list = NULL; |
return -1; |
return -1; |
} |
} |
Line 129 create_diridx(const char *csDir, int lm, int *tags, st
|
Line 129 create_diridx(const char *csDir, int lm, int *tags, st
|
if (d.d_type == DT_DIR && (!strcmp(d.d_name, ".") || !strcmp(d.d_name, ".."))) |
if (d.d_type == DT_DIR && (!strcmp(d.d_name, ".") || !strcmp(d.d_name, ".."))) |
continue; |
continue; |
|
|
l = realloc(l, sizeof(struct tagDirName) * (n + 2)); | l = e_realloc(l, sizeof(struct tagDirName) * (n + 2)); |
if (!l) { |
if (!l) { |
LOGERR; |
LOGERR; |
chdir(old); |
chdir(old); |
free(old); | e_free(old); |
free(l); | e_free(l); |
*list = NULL; |
*list = NULL; |
closedir(dir); |
closedir(dir); |
return -1; |
return -1; |
} else |
} else |
memset(&l[n + 1], 0, sizeof(struct tagDirName)); |
memset(&l[n + 1], 0, sizeof(struct tagDirName)); |
|
|
l[n].ch = '<'; | l[n].ch = DIFF_D1; |
l[n].tag = crcFletcher16((u_short*) d.d_name, |
l[n].tag = crcFletcher16((u_short*) d.d_name, |
d.d_namlen / 2 + d.d_namlen % 2); |
d.d_namlen / 2 + d.d_namlen % 2); |
l[n].hash = crcAdler((u_char*) d.d_name, d.d_namlen); |
l[n].hash = crcAdler((u_char*) d.d_name, d.d_namlen); |
Line 206 create_diridx(const char *csDir, int lm, int *tags, st
|
Line 206 create_diridx(const char *csDir, int lm, int *tags, st
|
tags[l[i].tag] = i; |
tags[l[i].tag] = i; |
|
|
chdir(old); |
chdir(old); |
free(old); | e_free(old); |
|
|
*list = l; |
*list = l; |
return n; |
return n; |
Line 218 create_diridx(const char *csDir, int lm, int *tags, st
|
Line 218 create_diridx(const char *csDir, int lm, int *tags, st
|
* sync_dirChkSum() - Calculate checksum of directory |
* sync_dirChkSum() - Calculate checksum of directory |
* |
* |
* @csDir = Directory |
* @csDir = Directory |
* @md = Message digest allocated memory, must be free() after use! | * @md = Message digest allocated memory, must be e_free() after use! |
* return: -1 error or !=-1 ok |
* return: -1 error or !=-1 ok |
*/ |
*/ |
int |
int |
Line 229 sync_dirChkSum(const char *csDir, u_char **md)
|
Line 229 sync_dirChkSum(const char *csDir, u_char **md)
|
MD5_CTX ctx; |
MD5_CTX ctx; |
register int ret = 0; |
register int ret = 0; |
|
|
*md = malloc(MD5_DIGEST_LENGTH); | *md = e_malloc(MD5_DIGEST_LENGTH); |
if (!*md) { |
if (!*md) { |
LOGERR; |
LOGERR; |
return -1; |
return -1; |
Line 239 sync_dirChkSum(const char *csDir, u_char **md)
|
Line 239 sync_dirChkSum(const char *csDir, u_char **md)
|
dir = opendir(csDir); |
dir = opendir(csDir); |
if (!dir) { |
if (!dir) { |
LOGERR; |
LOGERR; |
free(*md); | e_free(*md); |
return -1; |
return -1; |
} |
} |
|
|
Line 275 sync_dircmp(const char *csDir1, const char *csDir2)
|
Line 275 sync_dircmp(const char *csDir1, const char *csDir2)
|
if (sync_dirChkSum(csDir1, &md[0]) == -1) |
if (sync_dirChkSum(csDir1, &md[0]) == -1) |
return ret; |
return ret; |
if (sync_dirChkSum(csDir2, &md[1]) == -1) { |
if (sync_dirChkSum(csDir2, &md[1]) == -1) { |
free(md[0]); | e_free(md[0]); |
return ret; |
return ret; |
} |
} |
|
|
Line 284 sync_dircmp(const char *csDir1, const char *csDir2)
|
Line 284 sync_dircmp(const char *csDir1, const char *csDir2)
|
else |
else |
ret = 1; |
ret = 1; |
|
|
free(md[1]); | e_free(md[1]); |
free(md[0]); | e_free(md[0]); |
return ret; |
return ret; |
} |
} |
|
|
Line 295 sync_dircmp(const char *csDir1, const char *csDir2)
|
Line 295 sync_dircmp(const char *csDir1, const char *csDir2)
|
* @csDir1 = Directory 1 |
* @csDir1 = Directory 1 |
* @csDir2 = Directory 2 or File list, if "-" get input from console |
* @csDir2 = Directory 2 or File list, if "-" get input from console |
* @lm = Long mode options, !=NULL long output |
* @lm = Long mode options, !=NULL long output |
* @list = Output diff list, after use must be free()! | * @list = Output diff list, after use must be e_free()! |
* return: -1 error, 0 is equal or >0 count of returned list items |
* return: -1 error, 0 is equal or >0 count of returned list items |
*/ |
*/ |
int |
int |
Line 324 sync_dircmpList(const char *csDir1, const char *csDir2
|
Line 324 sync_dircmpList(const char *csDir1, const char *csDir2
|
|
|
if (lstat(csDir2, &sb) == -1) { |
if (lstat(csDir2, &sb) == -1) { |
LOGERR; |
LOGERR; |
free(l); | e_free(tags); |
| e_free(l); |
return -1; |
return -1; |
} |
} |
if (S_ISDIR(sb.st_mode)) { |
if (S_ISDIR(sb.st_mode)) { |
Line 332 sync_dircmpList(const char *csDir1, const char *csDir2
|
Line 333 sync_dircmpList(const char *csDir1, const char *csDir2
|
if (chdir(csDir2) == -1) { |
if (chdir(csDir2) == -1) { |
LOGERR; |
LOGERR; |
chdir(old); |
chdir(old); |
free(old); | e_free(old); |
free(l); | e_free(tags); |
| e_free(l); |
return -1; |
return -1; |
} |
} |
dir = opendir("."); |
dir = opendir("."); |
if (!dir) { |
if (!dir) { |
LOGERR; |
LOGERR; |
chdir(old); |
chdir(old); |
free(old); | e_free(old); |
free(l); | e_free(tags); |
| e_free(l); |
return -1; |
return -1; |
} |
} |
while (!readdir_r(dir, &d, &pd) && pd) { |
while (!readdir_r(dir, &d, &pd) && pd) { |
Line 355 sync_dircmpList(const char *csDir1, const char *csDir2
|
Line 358 sync_dircmpList(const char *csDir1, const char *csDir2
|
find = find_tag(tags, l, t, hash); |
find = find_tag(tags, l, t, hash); |
/* element not find in dir1, added */ |
/* element not find in dir1, added */ |
if (!find) { |
if (!find) { |
l = realloc(l, sizeof(struct tagDirName) * (n + 2)); | l = e_realloc(l, sizeof(struct tagDirName) * (n + 2)); |
if (!l) { |
if (!l) { |
LOGERR; |
LOGERR; |
chdir(old); |
chdir(old); |
free(old); | e_free(old); |
closedir(dir); |
closedir(dir); |
|
e_free(tags); |
return -1; |
return -1; |
} else |
} else |
memset(&l[n + 1], 0, sizeof(struct tagDirName)); |
memset(&l[n + 1], 0, sizeof(struct tagDirName)); |
|
|
l[n].ch = '>'; | l[n].ch = DIFF_D2; |
l[n].tag = t; |
l[n].tag = t; |
l[n].hash = hash; |
l[n].hash = hash; |
strlcpy(l[n].name, d.d_name, sizeof l[n].name); |
strlcpy(l[n].name, d.d_name, sizeof l[n].name); |
Line 426 sync_dircmpList(const char *csDir1, const char *csDir2
|
Line 430 sync_dircmpList(const char *csDir1, const char *csDir2
|
} |
} |
closedir(dir); |
closedir(dir); |
chdir(old); |
chdir(old); |
free(old); | e_free(old); |
} else { |
} else { |
if (strcmp(csDir2, "-")) { |
if (strcmp(csDir2, "-")) { |
f = fopen(csDir2, "r"); |
f = fopen(csDir2, "r"); |
if (!f) { |
if (!f) { |
LOGERR; |
LOGERR; |
free(l); | e_free(tags); |
| e_free(l); |
return -1; |
return -1; |
} |
} |
} |
} |
Line 455 sync_dircmpList(const char *csDir1, const char *csDir2
|
Line 460 sync_dircmpList(const char *csDir1, const char *csDir2
|
find = find_tag(tags, l, t, hash); |
find = find_tag(tags, l, t, hash); |
/* element not find in dir1, added */ |
/* element not find in dir1, added */ |
if (!find) { |
if (!find) { |
l = realloc(l, sizeof(struct tagDirName) * (n + 2)); | l = e_realloc(l, sizeof(struct tagDirName) * (n + 2)); |
if (!l) { |
if (!l) { |
LOGERR; |
LOGERR; |
if (strcmp(csDir2, "-")) |
if (strcmp(csDir2, "-")) |
fclose(f); |
fclose(f); |
|
e_free(tags); |
return -1; |
return -1; |
} else |
} else |
memset(&l[n + 1], 0, sizeof(struct tagDirName)); |
memset(&l[n + 1], 0, sizeof(struct tagDirName)); |
|
|
l[n].ch = '>'; | l[n].ch = DIFF_D2; |
l[n].tag = t; |
l[n].tag = t; |
l[n].hash = hash; |
l[n].hash = hash; |
strlcpy(l[n].name, str, sizeof l[n].name); |
strlcpy(l[n].name, str, sizeof l[n].name); |
Line 480 sync_dircmpList(const char *csDir1, const char *csDir2
|
Line 486 sync_dircmpList(const char *csDir1, const char *csDir2
|
|
|
/* delete equal elemets !!! */ |
/* delete equal elemets !!! */ |
for (i = cx = 0; i < n; i++) |
for (i = cx = 0; i < n; i++) |
if (l[i].ch == '*') { | if (l[i].ch == DIFF_D0) { |
memmove(&l[i], &l[i + 1], (n - i + 1) * sizeof(struct tagDirName)); |
memmove(&l[i], &l[i + 1], (n - i + 1) * sizeof(struct tagDirName)); |
cx++; |
cx++; |
i--; |
i--; |
} |
} |
n -= cx; |
n -= cx; |
|
|
|
e_free(tags); |
*list = l; |
*list = l; |
return n; |
return n; |
} |
} |