[Ada] Fix errno for rename for the VxWorks 6 target
authorFrederic Konrad <konrad@adacore.com>
Wed, 18 Sep 2019 08:32:09 +0000 (08:32 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 18 Sep 2019 08:32:09 +0000 (08:32 +0000)
This fixes the wrong errno for rename when the file is not existing on a
dosFs. In the end it makes Ada.Directories.Rename raising the right
exception in the case we are trying to move a file in a non existing
directory.

2019-09-18  Frederic Konrad  <konrad@adacore.com>

gcc/ada/

* adaint.c: Include dosFsLib.h and vwModNum.h for VxWorks 6.
(__gnat_rename): Map S_dosFsLib_FILE_NOT_FOUND to ENOENT.

From-SVN: r275846

gcc/ada/ChangeLog
gcc/ada/adaint.c

index 0c1c554f62b719aa15e49661a17fdab1d233fc92..38c5a7ee16469b94b61138d7919eda0abebe45f9 100644 (file)
@@ -1,3 +1,8 @@
+2019-09-18  Frederic Konrad  <konrad@adacore.com>
+
+       * adaint.c: Include dosFsLib.h and vwModNum.h for VxWorks 6.
+       (__gnat_rename): Map S_dosFsLib_FILE_NOT_FOUND to ENOENT.
+
 2019-09-18  Steve Baird  <baird@adacore.com>
 
        * freeze.adb (Freeze_Object_Declaration): Do not call
index c76e9ad5955dca7e7138bfa5c838c7439ed8f966..595abf87d65e3a7a1d11e317ee2ed7fd00b0c1a1 100644 (file)
    (such as chmod) are only available on VxWorks 6.  */
 #include "version.h"
 
+/* vwModNum.h and dosFsLib.h are needed for the VxWorks 6 rename workaround.
+   See below.  */
+#if (_WRS_VXWORKS_MAJOR == 6)
+#include <vwModNum.h>
+#include <dosFsLib.h>
+#endif /* 6.x */
 #endif /* VxWorks */
 
 #if defined (__APPLE__)
@@ -754,6 +760,20 @@ __gnat_rename (char *from, char *to)
     S2WSC (wto, to, GNAT_MAX_PATH_LEN);
     return _trename (wfrom, wto);
   }
+#elif defined (__vxworks) && (_WRS_VXWORKS_MAJOR == 6)
+  {
+    /* When used on a dos filesystem under VxWorks 6.9 rename will trigger a
+       S_dosFsLib_FILE_NOT_FOUND errno when the file is not found.  Let's map
+       that to ENOENT so Ada.Directory.Rename can detect that and raise the
+       Name_Error exception.  */
+    int ret = rename (from, to);
+
+    if (ret && (errno == S_dosFsLib_FILE_NOT_FOUND))
+      {
+        errno = ENOENT;
+      }
+    return ret;
+  }
 #else
   return rename (from, to);
 #endif