From f2094e6b2e4542adf458d8fa58d7bccd5edb762e Mon Sep 17 00:00:00 2001
From: Andrei Gherzan <andrei@gherzan.ro>
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 <andrei.gherzan@windriver.com>
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

