--- libaitsync/src/dir.c 2010/07/13 15:04:43 1.1.2.1 +++ libaitsync/src/dir.c 2011/05/08 00:49:45 1.1.2.5 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: dir.c,v 1.1.2.1 2010/07/13 15:04:43 misho Exp $ +* $Id: dir.c,v 1.1.2.5 2011/05/08 00:49:45 misho Exp $ * *************************************************************************/ #include "global.h" @@ -57,7 +57,7 @@ create_diridx(const char *csDir, int lm, int *tags, st DIR *dir; struct dirent d, *pd; int n; - char szStr[STRSIZ], szType[STRSIZ]; + char szStr[STRSIZ], szType[STRSIZ], *old; struct stat sb; register int i; @@ -71,8 +71,10 @@ create_diridx(const char *csDir, int lm, int *tags, st memset(l, 0, sizeof(struct tagDirName)); } + old = getcwd(NULL, 0); if (chdir(csDir) == -1) { SETERR; + free(old); free(l); *list = NULL; return -1; @@ -80,6 +82,8 @@ create_diridx(const char *csDir, int lm, int *tags, st dir = opendir("."); if (!dir) { SETERR; + chdir(old); + free(old); free(l); *list = NULL; return -1; @@ -91,6 +95,8 @@ create_diridx(const char *csDir, int lm, int *tags, st l = realloc(l, sizeof(struct tagDirName) * (n + 2)); if (!l) { SETERR; + chdir(old); + free(old); free(l); *list = NULL; closedir(dir); @@ -105,7 +111,11 @@ create_diridx(const char *csDir, int lm, int *tags, st if (lm & 1) { if (lstat(d.d_name, &sb) != -1) { memset(szStr, 0, STRSIZ); +#if defined(__OpenBSD__) strftime(szStr, STRSIZ, "%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)); +#endif switch (d.d_type) { case DT_FIFO: strlcpy(szType, "fifo", STRSIZ); @@ -128,15 +138,18 @@ create_diridx(const char *csDir, int lm, int *tags, st case DT_SOCK: strlcpy(szType, "socket", STRSIZ); break; +/* OpenBSD does not have this type */ +#ifdef DT_WHT case DT_WHT: strlcpy(szType, "wht", STRSIZ); break; +#endif case DT_UNKNOWN: default: strlcpy(szType, "unknown", STRSIZ); break; } - snprintf(l[n].extra, STRSIZ, "%s links=%d inode=%u %d:%d perm=0%o size=%llu %s", + 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); } @@ -150,6 +163,9 @@ create_diridx(const char *csDir, int lm, int *tags, st for (i = n - 1; i > -1; i--) tags[l[i].tag] = i; + chdir(old); + free(old); + *list = l; return n; } @@ -250,7 +266,7 @@ sync_dircmpList(const char *csDir1, const char *csDir2 u_short t; u_int hash; struct stat sb; - char szLine[STRSIZ], szStr[STRSIZ], szType[STRSIZ], *str, *pbrk; + char szLine[STRSIZ], szStr[STRSIZ], szType[STRSIZ], *str, *pbrk, *old; if (!csDir1 || !list || !(tags = create_tags())) return -1; @@ -261,15 +277,25 @@ sync_dircmpList(const char *csDir1, const char *csDir2 return n; } - if (!lstat(csDir2, &sb) && S_ISDIR(sb.st_mode)) { + if (lstat(csDir2, &sb) == -1) { + SETERR; + free(l); + return -1; + } + if (S_ISDIR(sb.st_mode)) { + old = getcwd(NULL, 0); if (chdir(csDir2) == -1) { SETERR; + chdir(old); + free(old); free(l); return -1; } dir = opendir("."); if (!dir) { SETERR; + chdir(old); + free(old); free(l); return -1; } @@ -287,6 +313,8 @@ sync_dircmpList(const char *csDir1, const char *csDir2 l = realloc(l, sizeof(struct tagDirName) * (n + 2)); if (!l) { SETERR; + chdir(old); + free(old); closedir(dir); return -1; } else @@ -299,8 +327,13 @@ sync_dircmpList(const char *csDir1, const char *csDir2 if (lm & 1) { if (lstat(d.d_name, &sb) != -1) { memset(szStr, 0, STRSIZ); +#if defined(__OpenBSD__) strftime(szStr, STRSIZ, "%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)); +#endif switch (d.d_type) { case DT_FIFO: strlcpy(szType, "fifo", STRSIZ); @@ -323,16 +356,19 @@ sync_dircmpList(const char *csDir1, const char *csDir2 case DT_SOCK: strlcpy(szType, "socket", STRSIZ); break; +/* OpenBSD does not have this type */ +#ifdef DT_WHT case DT_WHT: strlcpy(szType, "wht", STRSIZ); break; +#endif case DT_UNKNOWN: default: strlcpy(szType, "unknown", STRSIZ); break; } snprintf(l[n].extra, STRSIZ, - "%s links=%d inode=%u %d:%d perm=0%o size=%llu %s", + "%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); } @@ -342,6 +378,8 @@ sync_dircmpList(const char *csDir1, const char *csDir2 } } closedir(dir); + chdir(old); + free(old); } else { if (strcmp(csDir2, "-")) { f = fopen(csDir2, "r");