Minor O_CLOEXEC optimization, "regression" fix
authorJan Kratochvil <jan.kratochvil@redhat.com>
Wed, 9 Oct 2013 16:00:54 +0000 (16:00 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Wed, 9 Oct 2013 16:00:54 +0000 (16:00 +0000)
gdb/
2013-10-09  Jan Kratochvil  <jan.kratochvil@redhat.com>

* common/filestuff.c (gdb_fopen_cloexec): Remove initialization of
result variable.  Rename variable fopen_e_ever_failed to
fopen_e_ever_failed_einval.  Retry fopen only for errno EINVAL.

gdb/ChangeLog
gdb/common/filestuff.c

index d2fb9999268834b4688b17b301d1653e87169c79..3dd66c8c7f0704bf65736324df97e19092c5e35a 100644 (file)
@@ -1,3 +1,9 @@
+2013-10-09  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * common/filestuff.c (gdb_fopen_cloexec): Remove initialization of
+       result variable.  Rename variable fopen_e_ever_failed to
+       fopen_e_ever_failed_einval.  Retry fopen only for errno EINVAL.
+
 2013-10-09  Pedro Alves  <palves@redhat.com>
 
        * monitor.c (monitor_write_memory, monitor_write_memory_bytes)
index d3b13e8c806e9545260709d95fda2758c1b0e54e..4032f36328041c829196349296281813a8dd381b 100644 (file)
@@ -310,16 +310,16 @@ gdb_open_cloexec (const char *filename, int flags, unsigned long mode)
 FILE *
 gdb_fopen_cloexec (const char *filename, const char *opentype)
 {
-  FILE *result = NULL;
+  FILE *result;
   /* Probe for "e" support once.  But, if we can tell the operating
      system doesn't know about close on exec mode "e" without probing,
      skip it.  E.g., the Windows runtime issues an "Invalid parameter
      passed to C runtime function" OutputDebugString warning for
      unknown modes.  Assume that if O_CLOEXEC is zero, then "e" isn't
      supported.  */
-  static int fopen_e_ever_failed = O_CLOEXEC == 0;
+  static int fopen_e_ever_failed_einval = O_CLOEXEC == 0;
 
-  if (!fopen_e_ever_failed)
+  if (!fopen_e_ever_failed_einval)
     {
       char *copy;
 
@@ -329,15 +329,16 @@ gdb_fopen_cloexec (const char *filename, const char *opentype)
         this path.  */
       strcat (copy, "e");
       result = fopen (filename, copy);
-    }
 
-  if (result == NULL)
-    {
-      /* Fallback.  */
-      result = fopen (filename, opentype);
-      if (result != NULL)
-       fopen_e_ever_failed = 1;
+      if (result == NULL && errno == EINVAL)
+       {
+         result = fopen (filename, opentype);
+         if (result != NULL)
+           fopen_e_ever_failed_einval = 1;
+       }
     }
+  else
+    result = fopen (filename, opentype);
 
   if (result != NULL)
     maybe_mark_cloexec (fileno (result));