--- libaitsync/src/dir.c 2011/05/08 00:49:45 1.1.2.5 +++ libaitsync/src/dir.c 2014/02/04 16:39:00 1.4.6.1 @@ -3,9 +3,46 @@ * by Michael Pounov * * $Author: misho $ -* $Id: dir.c,v 1.1.2.5 2011/05/08 00:49:45 misho Exp $ +* $Id: dir.c,v 1.4.6.1 2014/02/04 16:39:00 misho Exp $ * -*************************************************************************/ +************************************************************************** +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 + +Copyright 2004 - 2014 + by Michael Pounov . 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 +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" @@ -21,14 +58,14 @@ find_tag(int const * __restrict tags, struct tagDirNam struct tagDirName *find = NULL; register int i; - // search in index tags + /* search in index tags */ if (tags[t] != -1 && l[tags[t]].tag == t) { - // search in sorted hashes + /* search in sorted hashes */ for (i = 0; l[tags[t] + i].tag == t; i++) if (l[tags[t] + i].hash == hash) { - // finded & marked for delete! + /* finded & marked for delete! */ find = (struct tagDirName*) &l[tags[t] + i]; - find->ch = '*'; + find->ch = DIFF_D0; break; } } @@ -43,7 +80,7 @@ create_tags() tags = calloc(TABLESIZ, sizeof(int)); if (!tags) { - SETERR; + LOGERR; } else memset(tags, -1, TABLESIZ * sizeof(int)); @@ -63,7 +100,7 @@ create_diridx(const char *csDir, int lm, int *tags, st l = malloc(sizeof(struct tagDirName)); if (!l) { - SETERR; + LOGERR; *list = NULL; return -1; } else { @@ -73,7 +110,7 @@ create_diridx(const char *csDir, int lm, int *tags, st old = getcwd(NULL, 0); if (chdir(csDir) == -1) { - SETERR; + LOGERR; free(old); free(l); *list = NULL; @@ -81,7 +118,7 @@ create_diridx(const char *csDir, int lm, int *tags, st } dir = opendir("."); if (!dir) { - SETERR; + LOGERR; chdir(old); free(old); free(l); @@ -94,7 +131,7 @@ create_diridx(const char *csDir, int lm, int *tags, st l = realloc(l, sizeof(struct tagDirName) * (n + 2)); if (!l) { - SETERR; + LOGERR; chdir(old); free(old); free(l); @@ -104,54 +141,59 @@ create_diridx(const char *csDir, int lm, int *tags, st } else memset(&l[n + 1], 0, sizeof(struct tagDirName)); - l[n].ch = '<'; - l[n].tag = crcFletcher16((u_short*) d.d_name, d.d_namlen / 2 + d.d_namlen % 2); + l[n].ch = DIFF_D1; + l[n].tag = crcFletcher16((u_short*) d.d_name, + d.d_namlen / 2 + d.d_namlen % 2); l[n].hash = crcAdler((u_char*) d.d_name, d.d_namlen); - strlcpy(l[n].name, d.d_name, MAXPATHLEN); + strlcpy(l[n].name, d.d_name, sizeof l[n].name); if (lm & 1) { if (lstat(d.d_name, &sb) != -1) { - memset(szStr, 0, STRSIZ); + memset(szStr, 0, sizeof szStr); #if defined(__OpenBSD__) - strftime(szStr, STRSIZ, "%Y-%m-%d %H:%M:%S", localtime((time_t*) &sb.st_mtim)); + strftime(szStr, sizeof szStr, "%Y-%m-%d %H:%M:%S", + localtime((time_t*) &sb.st_mtim)); #else - strftime(szStr, STRSIZ, "%Y-%m-%d %H:%M:%S", localtime((time_t*) &sb.st_mtime)); + strftime(szStr, sizeof szStr, "%Y-%m-%d %H:%M:%S", + localtime((time_t*) &sb.st_mtime)); #endif switch (d.d_type) { case DT_FIFO: - strlcpy(szType, "fifo", STRSIZ); + strlcpy(szType, "fifo", sizeof szType); break; case DT_CHR: - strlcpy(szType, "char", STRSIZ); + strlcpy(szType, "char", sizeof szType); break; case DT_DIR: - strlcpy(szType, "dir", STRSIZ); + strlcpy(szType, "dir", sizeof szType); break; case DT_BLK: - strlcpy(szType, "block", STRSIZ); + strlcpy(szType, "block", sizeof szType); break; case DT_REG: - strlcpy(szType, "file", STRSIZ); + strlcpy(szType, "file", sizeof szType); break; case DT_LNK: - strlcpy(szType, "link", STRSIZ); + strlcpy(szType, "link", sizeof szType); break; case DT_SOCK: - strlcpy(szType, "socket", STRSIZ); + strlcpy(szType, "socket", sizeof szType); break; /* OpenBSD does not have this type */ #ifdef DT_WHT case DT_WHT: - strlcpy(szType, "wht", STRSIZ); + strlcpy(szType, "wht", sizeof szType); break; #endif case DT_UNKNOWN: default: - strlcpy(szType, "unknown", STRSIZ); + strlcpy(szType, "unknown", sizeof szType); break; } - snprintf(l[n].extra, STRSIZ, "%s links=%d inode=%lu %d:%d perm=0%o size=%ld %s", - szType, sb.st_nlink, sb.st_ino, sb.st_uid, sb.st_gid, - sb.st_mode & 0x1fff, sb.st_size, szStr); + snprintf(l[n].extra, sizeof l[n].extra, + "%s links=%d inode=%ld %d:%d perm=0%o size=%ld %s", + szType, sb.st_nlink, (long) sb.st_ino, + sb.st_uid, sb.st_gid, sb.st_mode & 0x1fff, + (long) sb.st_size, szStr); } } @@ -170,16 +212,17 @@ create_diridx(const char *csDir, int lm, int *tags, st return n; } -// ------------------------------------------------------ +/* ------------------------------------------------------ */ /* - * sync_dirCSum() Calculate checksum of directory + * sync_dirChkSum() - Calculate checksum of directory + * * @csDir = Directory - * @md = Message digest allocated memory, must be free after use! + * @md = Message digest allocated memory, must be free() after use! * return: -1 error or !=-1 ok */ int -sync_dirCSum(const char *csDir, u_char **md) +sync_dirChkSum(const char *csDir, u_char **md) { DIR *dir; struct dirent d, *pd; @@ -188,14 +231,14 @@ sync_dirCSum(const char *csDir, u_char **md) *md = malloc(MD5_DIGEST_LENGTH); if (!*md) { - SETERR; + LOGERR; return -1; } else memset(*md, 0, MD5_DIGEST_LENGTH); dir = opendir(csDir); if (!dir) { - SETERR; + LOGERR; free(*md); return -1; } @@ -214,7 +257,8 @@ sync_dirCSum(const char *csDir, u_char **md) } /* - * sync_dircmp() Compare directories + * sync_dircmp() - Compare directories + * * @csDir1 = Directory 1 * @csDir2 = Directory 2 * return: -1 error, 0 is equal or 1 different @@ -228,9 +272,9 @@ sync_dircmp(const char *csDir1, const char *csDir2) if (!csDir1 || !csDir2) return ret; - if (sync_dirCSum(csDir1, &md[0]) == -1) + if (sync_dirChkSum(csDir1, &md[0]) == -1) return ret; - if (sync_dirCSum(csDir2, &md[1]) == -1) { + if (sync_dirChkSum(csDir2, &md[1]) == -1) { free(md[0]); return ret; } @@ -246,11 +290,12 @@ sync_dircmp(const char *csDir1, const char *csDir2) } /* - * sync_dircmpList() Compare directories or directory and file list + * sync_dircmpList() - Compare directories or directory and file list + * * @csDir1 = Directory 1 * @csDir2 = Directory 2 or File list, if "-" get input from console - * @lm = Long mode options, 1 long output - * @list = Output diff list, after use must be free! + * @lm = Long mode options, !=NULL long output + * @list = Output diff list, after use must be free()! * return: -1 error, 0 is equal or >0 count of returned list items */ int @@ -278,24 +323,27 @@ sync_dircmpList(const char *csDir1, const char *csDir2 } if (lstat(csDir2, &sb) == -1) { - SETERR; + LOGERR; + free(tags); free(l); return -1; } if (S_ISDIR(sb.st_mode)) { old = getcwd(NULL, 0); if (chdir(csDir2) == -1) { - SETERR; + LOGERR; chdir(old); free(old); + free(tags); free(l); return -1; } dir = opendir("."); if (!dir) { - SETERR; + LOGERR; chdir(old); free(old); + free(tags); free(l); return -1; } @@ -308,69 +356,72 @@ sync_dircmpList(const char *csDir1, const char *csDir2 } find = find_tag(tags, l, t, hash); - // element not find in dir1, added + /* element not find in dir1, added */ if (!find) { l = realloc(l, sizeof(struct tagDirName) * (n + 2)); if (!l) { - SETERR; + LOGERR; chdir(old); free(old); closedir(dir); + free(tags); return -1; } else memset(&l[n + 1], 0, sizeof(struct tagDirName)); - l[n].ch = '>'; + l[n].ch = DIFF_D2; l[n].tag = t; l[n].hash = hash; - strlcpy(l[n].name, d.d_name, MAXPATHLEN); + strlcpy(l[n].name, d.d_name, sizeof l[n].name); if (lm & 1) { if (lstat(d.d_name, &sb) != -1) { - memset(szStr, 0, STRSIZ); + memset(szStr, 0, sizeof szStr); #if defined(__OpenBSD__) - strftime(szStr, STRSIZ, "%Y-%m-%d %H:%M:%S", + strftime(szStr, sizeof szStr, "%Y-%m-%d %H:%M:%S", localtime((time_t*) &sb.st_mtim)); #else - strftime(szStr, STRSIZ, "%Y-%m-%d %H:%M:%S", + strftime(szStr, sizeof szStr, "%Y-%m-%d %H:%M:%S", localtime((time_t*) &sb.st_mtime)); #endif switch (d.d_type) { case DT_FIFO: - strlcpy(szType, "fifo", STRSIZ); + strlcpy(szType, "fifo", sizeof szType); break; case DT_CHR: - strlcpy(szType, "char", STRSIZ); + strlcpy(szType, "char", sizeof szType); break; case DT_DIR: - strlcpy(szType, "dir", STRSIZ); + strlcpy(szType, "dir", sizeof szType); break; case DT_BLK: - strlcpy(szType, "block", STRSIZ); + strlcpy(szType, "block", sizeof szType); break; case DT_REG: - strlcpy(szType, "file", STRSIZ); + strlcpy(szType, "file", sizeof szType); break; case DT_LNK: - strlcpy(szType, "link", STRSIZ); + strlcpy(szType, "link", sizeof szType); break; case DT_SOCK: - strlcpy(szType, "socket", STRSIZ); + strlcpy(szType, "socket", sizeof szType); break; /* OpenBSD does not have this type */ #ifdef DT_WHT case DT_WHT: - strlcpy(szType, "wht", STRSIZ); + strlcpy(szType, "wht", sizeof szType); break; #endif case DT_UNKNOWN: default: - strlcpy(szType, "unknown", STRSIZ); + strlcpy(szType, "unknown", sizeof szType); break; } - snprintf(l[n].extra, STRSIZ, - "%s links=%d inode=%lu %d:%d perm=0%o size=%ld %s", - szType, sb.st_nlink, sb.st_ino, sb.st_uid, sb.st_gid, - sb.st_mode & 0x1fff, sb.st_size, szStr); + snprintf(l[n].extra, sizeof l[n].extra, + "%s links=%d inode=%ld %d:%d perm=0%o " + "size=%ld %s", szType, sb.st_nlink, + (long) sb.st_ino, sb.st_uid, sb.st_gid, + sb.st_mode & 0x1fff, (long) sb.st_size, + szStr); } } @@ -384,12 +435,13 @@ sync_dircmpList(const char *csDir1, const char *csDir2 if (strcmp(csDir2, "-")) { f = fopen(csDir2, "r"); if (!f) { - SETERR; + LOGERR; + free(tags); free(l); return -1; } } - while (fgets(szLine, STRSIZ, f)) { + while (fgets(szLine, sizeof szLine, f)) { if (!*szLine || *szLine == '#') continue; @@ -406,23 +458,24 @@ sync_dircmpList(const char *csDir1, const char *csDir2 } find = find_tag(tags, l, t, hash); - // element not find in dir1, added + /* element not find in dir1, added */ if (!find) { l = realloc(l, sizeof(struct tagDirName) * (n + 2)); if (!l) { - SETERR; + LOGERR; if (strcmp(csDir2, "-")) fclose(f); + free(tags); return -1; } else memset(&l[n + 1], 0, sizeof(struct tagDirName)); - l[n].ch = '>'; + l[n].ch = DIFF_D2; l[n].tag = t; l[n].hash = hash; - strlcpy(l[n].name, str, MAXPATHLEN); + strlcpy(l[n].name, str, sizeof l[n].name); if (lm & 1 && (str = strtok_r(NULL, "\r\n", &pbrk))) - strlcpy(l[n].extra, str, STRSIZ); + strlcpy(l[n].extra, str, sizeof l[n].extra); n++; } @@ -431,15 +484,16 @@ sync_dircmpList(const char *csDir1, const char *csDir2 fclose(f); } - // delete equal elemets !!! + /* delete equal elemets !!! */ 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)); cx++; i--; } n -= cx; + free(tags); *list = l; return n; }