You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2022/06/24 03:42:47 UTC

[incubator-nuttx] branch master updated: tools: Fix warnings and replace deprecated readdir_r()

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new d4dc2f8ab2 tools: Fix warnings and replace deprecated readdir_r()
d4dc2f8ab2 is described below

commit d4dc2f8ab22c34ae5c5b63263d433af9e30160a2
Author: Alan Carvalho de Assis <ac...@gmail.com>
AuthorDate: Thu Jun 23 13:20:55 2022 -0300

    tools: Fix warnings and replace deprecated readdir_r()
---
 tools/initialconfig.c | 161 ++++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 136 insertions(+), 25 deletions(-)

diff --git a/tools/initialconfig.c b/tools/initialconfig.c
index b907b19f4f..8322f1af5c 100644
--- a/tools/initialconfig.c
+++ b/tools/initialconfig.c
@@ -389,8 +389,7 @@ static bool test_dirpath(const char *filepath)
 static int foreach_dirent(const char *dirpath, direntcb_t cb, void *arg)
 {
   DIR *dirp;
-  struct dirent *result;
-  struct dirent entry;
+  struct dirent *entry;
   int ret;
 
   dirp = opendir(dirpath);
@@ -403,29 +402,37 @@ static int foreach_dirent(const char *dirpath, direntcb_t cb, void *arg)
 
   for (; ; )
     {
-      ret = readdir_r(dirp, &entry, &result);
-      if (ret != 0)
+      /* To distinguish between end of stream and error, set
+       * errno to 0 and verify whether its value changed if
+       * readdir returned NULL.
+       */
+
+      errno = 0;
+
+      entry = readdir(dirp);
+      if (entry == NULL && errno != 0)
         {
           fprintf(stderr,
-                  "ERROR: Failed to reed directory '%s' entry: %s\n",
-                  dirpath, strerror(ret));
+                  "ERROR: Failed to read directory '%s' entry: %s\n",
+                  dirpath, strerror(errno));
            closedir(dirp);
            exit(EXIT_FAILURE);
         }
 
-      if (result == NULL)
+      if (entry == NULL)
         {
           break;
         }
 
       /* Skip over the . and .. hard links */
 
-      if (strcmp(entry.d_name, ".") == 0 || strcmp(entry.d_name, "..") == 0)
+      if (strcmp(entry->d_name, ".") == 0 ||
+          strcmp(entry->d_name, "..") == 0)
         {
           continue;
         }
 
-      ret = cb(dirpath, &entry, arg);
+      ret = cb(dirpath, entry, arg);
       if (ret != 0)
         {
           break;
@@ -447,6 +454,7 @@ static int foreach_dirent(const char *dirpath, direntcb_t cb, void *arg)
 static int enum_architectures(const char *dirpath, struct dirent *entry,
                               void *arg)
 {
+  int ret;
   char *archpath;
   char *testpath;
 
@@ -454,16 +462,46 @@ static int enum_architectures(const char *dirpath, struct dirent *entry,
    * directory, and a src/ directory.
    */
 
-  asprintf(&archpath, "%s%c%s", dirpath, g_delim, entry->d_name);
-  asprintf(&testpath, "%s%cKconfig", archpath, g_delim);
+  ret = asprintf(&archpath, "%s%c%s", dirpath, g_delim, entry->d_name);
+  if (ret < 0)
+    {
+      fprintf(stderr,
+              "ERROR: asprintf() failed to archpath\n");
+      return ret;
+    }
+
+  ret = asprintf(&testpath, "%s%cKconfig", archpath, g_delim);
+  if (ret < 0)
+    {
+      fprintf(stderr,
+              "ERROR: asprintf() failed to testpath\n");
+      return ret;
+    }
+
   if (test_filepath(testpath))
     {
       free(testpath);
-      asprintf(&testpath, "%s%cinclude", archpath, g_delim);
+
+      ret = asprintf(&testpath, "%s%cinclude", archpath, g_delim);
+      if (ret < 0)
+        {
+          fprintf(stderr,
+                  "ERROR: asprintf() failed to testpath/include\n");
+          return ret;
+        }
+
       if (test_dirpath(testpath))
         {
           free(testpath);
-          asprintf(&testpath, "%s%csrc", archpath, g_delim);
+
+          ret = asprintf(&testpath, "%s%csrc", archpath, g_delim);
+          if (ret < 0)
+            {
+              fprintf(stderr,
+                      "ERROR: asprintf() failed to testpath/src\n");
+              return ret;
+            }
+
           if (test_dirpath(testpath))
             {
               if (g_narch >= MAX_ARCHITECTURES)
@@ -494,17 +532,39 @@ static int enum_architectures(const char *dirpath, struct dirent *entry,
 
 static int enum_mcus(const char *dirpath, struct dirent *entry, void *arg)
 {
+  int ret;
   char *mcupath;
   char *testpath;
 
   /* All MCU directories should contain a Kconfig and a Make.defs file. */
 
-  asprintf(&mcupath, "%s%c%s", dirpath, g_delim, entry->d_name);
-  asprintf(&testpath, "%s%cKconfig", mcupath, g_delim);
+  ret = asprintf(&mcupath, "%s%c%s", dirpath, g_delim, entry->d_name);
+  if (ret < 0)
+    {
+      fprintf(stderr,
+              "ERROR: asprintf() failed to mcupath\n");
+      return ret;
+    }
+
+  ret = asprintf(&testpath, "%s%cKconfig", mcupath, g_delim);
+  if (ret < 0)
+    {
+      fprintf(stderr,
+              "ERROR: asprintf() failed to archpath/Kconfig\n");
+      return ret;
+    }
+
   if (test_filepath(testpath))
     {
       free(testpath);
-      asprintf(&testpath, "%s%cMake.defs", mcupath, g_delim);
+      ret = asprintf(&testpath, "%s%cMake.defs", mcupath, g_delim);
+      if (ret < 0)
+        {
+          fprintf(stderr,
+                  "ERROR: asprintf() failed to testpath/Make.defs\n");
+          return ret;
+        }
+
       if (test_filepath(testpath))
         {
           if (g_nmcu >= MAX_MCUS)
@@ -542,8 +602,15 @@ static int enum_board_configurations(const char *dirpath,
 
   /* All board directories should contain a defconfig file. */
 
-  asprintf(&configpath, "%s%c%s%cdefconfig",
-           dirpath, g_delim, entry->d_name, g_delim);
+  ret = asprintf(&configpath, "%s%c%s%cdefconfig",
+                 dirpath, g_delim, entry->d_name, g_delim);
+  if (ret < 0)
+    {
+      fprintf(stderr,
+              "ERROR: asprintf() failed to configpath\n");
+      return ret;
+    }
+
   if (test_filepath(configpath))
     {
       /* We don't want all board configurations, we only want the name of
@@ -554,7 +621,14 @@ static int enum_board_configurations(const char *dirpath,
        * Where xxxx is the selected MCU name.
        */
 
-      asprintf(&varvalue, "\"%s\"", g_selected_mcu);
+      ret = asprintf(&varvalue, "\"%s\"", g_selected_mcu);
+      if (ret < 0)
+        {
+          fprintf(stderr,
+                  "ERROR: asprintf() failed to varvalue\n");
+          return ret;
+        }
+
       if (check_variable(configpath, "CONFIG_ARCH_CHIP", varvalue))
         {
           /* Found it... add the board name to the list of boards for the
@@ -611,6 +685,7 @@ static int enum_board_configurations(const char *dirpath,
 
 static int enum_boards(const char *dirpath, struct dirent *entry, void *arg)
 {
+  int ret = 0;
   char *boardpath;
   char *testpath;
 
@@ -618,16 +693,44 @@ static int enum_boards(const char *dirpath, struct dirent *entry, void *arg)
    * directory, and a src/ directory.
    */
 
-  asprintf(&boardpath, "%s%c%s", dirpath, g_delim, entry->d_name);
-  asprintf(&testpath, "%s%cKconfig", boardpath, g_delim);
+  ret = asprintf(&boardpath, "%s%c%s", dirpath, g_delim, entry->d_name);
+  if (ret < 0)
+    {
+      fprintf(stderr,
+              "ERROR: asprintf() failed to boardpath\n");
+      return ret;
+    }
+
+  ret = asprintf(&testpath, "%s%cKconfig", boardpath, g_delim);
+  if (ret < 0)
+    {
+      fprintf(stderr,
+              "ERROR: asprintf() failed to testpath\n");
+      return ret;
+    }
+
   if (test_filepath(testpath))
     {
       free(testpath);
-      asprintf(&testpath, "%s%cinclude", boardpath, g_delim);
+      ret = asprintf(&testpath, "%s%cinclude", boardpath, g_delim);
+      if (ret < 0)
+        {
+          fprintf(stderr,
+                  "ERROR: asprintf() failed to testpath\n");
+          return ret;
+        }
+
       if (test_dirpath(testpath))
         {
           free(testpath);
-          asprintf(&testpath, "%s%csrc", boardpath, g_delim);
+          ret = asprintf(&testpath, "%s%csrc", boardpath, g_delim);
+          if (ret < 0)
+            {
+              fprintf(stderr,
+                      "ERROR: asprintf() failed to archpath\n");
+              return ret;
+            }
+
           if (test_dirpath(testpath))
             {
               /* Enumerate the board configurations */
@@ -791,6 +894,7 @@ static void create_config(void)
 
 int main(int argc, char **argv)
 {
+  int ret;
   char *archpath;
 
   /* Enumerate all of the architectures */
@@ -806,8 +910,15 @@ int main(int argc, char **argv)
   /* Enumerate the MCUs for the selected architecture */
 
   g_nmcu = 0;
-  asprintf(&archpath, "%s%c%s%csrc",
-           g_archdir, g_delim, g_selected_arch, g_delim);
+  ret = asprintf(&archpath, "%s%c%s%csrc",
+                 g_archdir, g_delim, g_selected_arch, g_delim);
+  if (ret < 0)
+    {
+      fprintf(stderr,
+              "ERROR: asprintf() failed to archpath/src\n");
+      return ret;
+    }
+
   foreach_dirent(archpath, enum_mcus, NULL);
 
   /* Select an MCU */