--- libaitsync/src/dir.c 2010/07/13 15:04:43 1.1.2.1 +++ libaitsync/src/dir.c 2011/03/16 17:17:44 1.1.2.3 @@ -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.3 2011/03/16 17:17:44 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); @@ -128,9 +134,12 @@ 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); @@ -150,6 +159,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 +262,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 +273,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 +309,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 @@ -323,9 +347,12 @@ 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); @@ -342,6 +369,8 @@ sync_dircmpList(const char *csDir1, const char *csDir2 } } closedir(dir); + chdir(old); + free(old); } else { if (strcmp(csDir2, "-")) { f = fopen(csDir2, "r");