Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/stdio/flags.c')
-rw-r--r--newlib/libc/stdio/flags.c41
1 files changed, 27 insertions, 14 deletions
diff --git a/newlib/libc/stdio/flags.c b/newlib/libc/stdio/flags.c
index 26d2f82fd..518cc33f1 100644
--- a/newlib/libc/stdio/flags.c
+++ b/newlib/libc/stdio/flags.c
@@ -60,27 +60,40 @@ _DEFUN(__sflags, (ptr, mode, optr),
ptr->_errno = EINVAL;
return (0);
}
- if (mode[1] && (mode[1] == '+' || mode[2] == '+'))
- {
- ret = (ret & ~(__SRD | __SWR)) | __SRW;
- m = O_RDWR;
- }
- if (mode[1] && (mode[1] == 'b' || mode[2] == 'b'))
+ while (*++mode)
{
+ switch (*mode)
+ {
+ case '+':
+ ret = (ret & ~(__SRD | __SWR)) | __SRW;
+ m = (m & ~O_ACCMODE) | O_RDWR;
+ break;
+ case 'b':
#ifdef O_BINARY
- m |= O_BINARY;
+ m |= O_BINARY;
#endif
- }
+ break;
#ifdef __CYGWIN__
- else if (mode[1] && (mode[1] == 't' || mode[2] == 't'))
-#else
- else
+ case 't':
+ m |= O_TEXT;
+ break;
#endif
- {
-#ifdef O_TEXT
- m |= O_TEXT;
+#if defined (O_CLOEXEC) && defined (_GLIBC_EXTENSION)
+ case 'e':
+ m |= O_CLOEXEC;
+ break;
#endif
+ case 'x':
+ m |= O_EXCL;
+ break;
+ default:
+ break;
+ }
}
+#if defined (O_TEXT) && !defined (__CYGWIN__)
+ if (!(m | O_BINARY))
+ m |= O_TEXT;
+#endif
*optr = m | o;
return ret;
}