From f2094e6b2e4542adf458d8fa58d7bccd5edb762e Mon Sep 17 00:00:00 2001 From: Andrei Gherzan Date: Tue, 17 Jul 2012 17:27:39 +0300 Subject: [PATCH V3 1/2] timezone.c: If there is no d_type support use fstatat() This is useful for filesystems where d_type is always DT_UNKNOWN. In this case use fstatat() function. Signed-off-by: Andrei Gherzan Upstream-Status: Submitted --- src/timezone.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/timezone.c b/src/timezone.c index 173d658..f951f6b 100644 --- a/src/timezone.c +++ b/src/timezone.c @@ -157,6 +157,8 @@ static char *find_origin(void *src_map, struct stat *src_st, DIR *dir; struct dirent *d; char *str, pathname[PATH_MAX]; + struct stat buf; + int ret; if (subpath == NULL) strncpy(pathname, basepath, sizeof(pathname)); @@ -205,6 +207,28 @@ static char *find_origin(void *src_map, struct stat *src_st, return str; } break; + case DT_UNKNOWN: + /* + * If there is no d_type support use fstatat() + * to check if directory + */ + ret = fstatat(dirfd(dir), d->d_name, &buf, 0); + if (ret < 0) + continue; + if (!(buf.st_mode & S_IFDIR)) + continue; + if (subpath == NULL) + strncpy(pathname, d->d_name, sizeof(pathname)); + else + snprintf(pathname, sizeof(pathname), + "%s/%s", subpath, d->d_name); + + str = find_origin(src_map, src_st, basepath, pathname); + if (str != NULL) { + closedir(dir); + return str; + } + break; } } -- 1.7.9.5