Handle cases where readdir() does not return the file type
authorChristian Linke <christian.linke@bmw.de>
Mon, 2 Sep 2013 11:37:37 +0000 (13:37 +0200)
committerChristian Linke <christian.linke@bmw.de>
Mon, 2 Sep 2013 11:37:37 +0000 (13:37 +0200)
readdir() does not guarantee that the d_type member is set on all file
systems. This resulted in plugins not being loaded on some platforms as
regular files were not detected.

Signed-off-by: Christian Linke <christian.linke@bmw.de>
AudioManagerDaemon/src/CAmCommandSender.cpp
AudioManagerDaemon/src/CAmRoutingSender.cpp

index a03e5a8..bb49c19 100644 (file)
 
 #include "CAmCommandSender.h"
 #include <dirent.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/types.h>
 #include <sstream>
 #include <string>
+#include <cstring>
 #include "CAmCommandReceiver.h"
 #include "TAmPluginTemplate.h"
 #include "shared/CAmDltWrapper.h"
@@ -72,10 +76,23 @@ CAmCommandSender::CAmCommandSender(const std::vector<std::string>& listOfPluginD
         {
             unsigned char entryType = itemInDirectory->d_type;
             std::string entryName = itemInDirectory->d_name;
+            std::string fullName = *dirIter + "/" + entryName;
 
             bool regularFile = (entryType == DT_REG || entryType == DT_LNK);
             bool sharedLibExtension = ("so" == entryName.substr(entryName.find_last_of(".") + 1));
 
+            // Handle cases where readdir() could not determine the file type
+               if (entryType == DT_UNKNOWN) {
+                   struct stat buf;
+
+                   if (stat(fullName.c_str(), &buf)) {
+                       logInfo(__PRETTY_FUNCTION__,"Failed to stat file: ", entryName, errno);
+                       continue;
+                   }
+
+                   regularFile = S_ISREG(buf.st_mode);
+               }
+
             if (regularFile && sharedLibExtension)
             {
                 std::string name(directoryName);
index 590f6df..5f7f03a 100644 (file)
@@ -22,6 +22,9 @@
 #include "CAmRoutingSender.h"
 #include <utility>
 #include <dirent.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/types.h>
 #include <dlfcn.h>
 #include <cassert>
 #include <iostream>
@@ -71,10 +74,23 @@ CAmRoutingSender::CAmRoutingSender(const std::vector<std::string>& listOfPluginD
         {
             unsigned char entryType = itemInDirectory->d_type;
             std::string entryName = itemInDirectory->d_name;
+            std::string fullName = *dirIter + "/" + entryName;
 
             bool regularFile = (entryType == DT_REG || entryType == DT_LNK);
             bool sharedLibExtension = ("so" == entryName.substr(entryName.find_last_of(".") + 1));
 
+            // Handle cases where readdir() could not determine the file type
+               if (entryType == DT_UNKNOWN) {
+                   struct stat buf;
+
+                   if (stat(fullName.c_str(), &buf)) {
+                       logInfo(__PRETTY_FUNCTION__,"Failed to stat file: ", entryName, errno);
+                       continue;
+                   }
+
+                   regularFile = S_ISREG(buf.st_mode);
+               }
+
             if (regularFile && sharedLibExtension)
             {
                 logInfo("RoutingSender::RoutingSender adding file: ", entryName);