Просмотр исходного кода

Merge trunk revision 2664:
r2664 | asalkeld | 2010-02-25 12:26:54 -0700 (Thu, 25 Feb 2010) | 2 lines

convert readdir into readdir_r



git-svn-id: http://svn.fedorahosted.org/svn/corosync/branches/flatiron@2708 fd59a12c-fef9-0310-b244-a6a79926bd2f

Steven Dake 16 лет назад
Родитель
Сommit
d5c0fb9236
2 измененных файлов с 43 добавлено и 7 удалено
  1. 25 2
      exec/coroparse.c
  2. 18 5
      lcr/lcr_ifact.c

+ 25 - 2
exec/coroparse.c

@@ -49,6 +49,7 @@
 #include <string.h>
 #include <dirent.h>
 #include <limits.h>
+#include <stddef.h>
 
 #include <corosync/lcr/lcr_comp.h>
 #include <corosync/engine/objdb.h>
@@ -264,8 +265,11 @@ static int read_uidgid_files_into_objdb(
 	const char *dirname;
 	DIR *dp;
 	struct dirent *dirent;
+	struct dirent *entry;
 	char filename[PATH_MAX + FILENAME_MAX + 1];
 	int res = 0;
+	size_t len;
+	int return_code;
 	struct stat stat_buf;
 
 	dirname = COROSYSCONFDIR "/uidgid.d";
@@ -274,7 +278,14 @@ static int read_uidgid_files_into_objdb(
 	if (dp == NULL)
 		return 0;
 
-	while ((dirent = readdir (dp))) {
+	len = offsetof(struct dirent, d_name) +
+                     pathconf(dirname, _PC_NAME_MAX) + 1;
+	entry = malloc(len);
+
+	for (return_code = readdir_r(dp, entry, &dirent);
+		dirent != NULL && return_code == 0;
+		return_code = readdir_r(dp, entry, &dirent)) {
+
 		snprintf(filename, sizeof (filename), "%s/%s", dirname, dirent->d_name);
 		stat (filename, &stat_buf);
 		if (S_ISREG(stat_buf.st_mode)) {
@@ -293,6 +304,7 @@ static int read_uidgid_files_into_objdb(
 	}
 
 error_exit:
+	free (entry);
 	closedir(dp);
 
 	return res;
@@ -306,9 +318,12 @@ static int read_service_files_into_objdb(
 	const char *dirname;
 	DIR *dp;
 	struct dirent *dirent;
+	struct dirent *entry;
 	char filename[PATH_MAX + FILENAME_MAX + 1];
 	int res = 0;
 	struct stat stat_buf;
+	size_t len;
+	int return_code;
 
 	dirname = COROSYSCONFDIR "/service.d";
 	dp = opendir (dirname);
@@ -316,7 +331,14 @@ static int read_service_files_into_objdb(
 	if (dp == NULL)
 		return 0;
 
-	while ((dirent = readdir (dp))) {
+	len = offsetof(struct dirent, d_name) +
+                     pathconf(dirname, _PC_NAME_MAX) + 1;
+	entry = malloc(len);
+
+	for (return_code = readdir_r(dp, entry, &dirent);
+		dirent != NULL && return_code == 0;
+		return_code = readdir_r(dp, entry, &dirent)) {
+
 		snprintf(filename, sizeof (filename), "%s/%s", dirname, dirent->d_name);
 		stat (filename, &stat_buf);
 		if (S_ISREG(stat_buf.st_mode)) {
@@ -335,6 +357,7 @@ static int read_service_files_into_objdb(
 	}
 
 error_exit:
+	free (entry);
 	closedir(dp);
 
 	return res;

+ 18 - 5
lcr/lcr_ifact.c

@@ -285,17 +285,29 @@ static int scandir (
 	int (*compar)(const struct dirent **, const struct dirent **))
 {
 	DIR *d;
-	struct dirent *entry, **names = NULL;
+	struct dirent *entry;
+	struct dirent *result;
+	struct dirent **names = NULL;
 	int namelist_items = 0, namelist_size = 0;
+	size_t len;
+	int return_code;
 
 	d = opendir(dir);
 	if (d == NULL)
 		return -1;
 
 	names = NULL;
-	while ((entry = readdir (d)) != NULL) {
+
+	len = offsetof(struct dirent, d_name) +
+                     pathconf(dir, _PC_NAME_MAX) + 1;
+	entry = malloc(len);
+
+	for (return_code = readdir_r (d, entry, &result);
+		dirent != NULL && return_code == 0;
+		return_code = readdir_r(d, entry, &result)) {
+
 		struct dirent *tmpentry;
-		if ((filter != NULL) && ((*filter)(entry) == 0)) {
+		if ((filter != NULL) && ((*filter)(result) == 0)) {
 			continue;
 		}
 		if (namelist_items >= namelist_size) {
@@ -312,11 +324,11 @@ static int scandir (
 			}
 			names = tmp;
 		}
-		tmpentry = malloc (entry->d_reclen);
+		tmpentry = malloc (result->d_reclen);
 		if (tmpentry == NULL) {
 			goto fail;
 		}
-		(void) memcpy (tmpentry, entry, entry->d_reclen);
+		(void) memcpy (tmpentry, result, result->d_reclen);
 		names[namelist_items++] = tmpentry;
 	}
 	(void) closedir (d);
@@ -337,6 +349,7 @@ fail:
 		namelist_items--;
 		free (*namelist[namelist_items]);
 	}
+	free (entry);
 	free (names);
 	*namelist = NULL;
 	errno = err;