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:
authorCorinna Vinschen <corinna@vinschen.de>2017-11-14 18:28:44 +0300
committerCorinna Vinschen <corinna@vinschen.de>2017-11-14 18:30:44 +0300
commitf94fe74aad9c69ed17e55468ce1044eafca34687 (patch)
treed10a1348bf2992eea119302c9a7e359365c61f32 /winsup/cygwin/syscalls.cc
parent9cf0c4a012b214504e19fb92b23d5f0f3c9da097 (diff)
Cygwin: open: cleanup code in preparation of O_TMPFILE
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'winsup/cygwin/syscalls.cc')
-rw-r--r--winsup/cygwin/syscalls.cc108
1 files changed, 53 insertions, 55 deletions
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
index a045dcda9..aa796d3e8 100644
--- a/winsup/cygwin/syscalls.cc
+++ b/winsup/cygwin/syscalls.cc
@@ -1361,6 +1361,7 @@ open (const char *unix_path, int flags, ...)
int res = -1;
va_list ap;
mode_t mode = 0;
+ fhandler_base *fh = NULL;
pthread_testcancel ();
@@ -1368,69 +1369,66 @@ open (const char *unix_path, int flags, ...)
{
syscall_printf ("open(%s, %y)", unix_path, flags);
if (!*unix_path)
- set_errno (ENOENT);
- else
{
- /* check for optional mode argument */
- va_start (ap, flags);
- mode = va_arg (ap, mode_t);
- va_end (ap);
+ set_errno (ENOENT);
+ __leave;
+ }
- fhandler_base *fh;
- cygheap_fdnew fd;
+ /* check for optional mode argument */
+ va_start (ap, flags);
+ mode = va_arg (ap, mode_t);
+ va_end (ap);
- if (fd >= 0)
- {
- /* This is a temporary kludge until all utilities can catch up
- with a change in behavior that implements linux functionality:
- opening a tty should not automatically cause it to become the
- controlling tty for the process. */
- int opt = PC_OPEN | ((flags & (O_NOFOLLOW | O_EXCL))
- ? PC_SYM_NOFOLLOW : PC_SYM_FOLLOW);
- if (!(flags & O_NOCTTY) && fd > 2 && myself->ctty != -2)
- {
- flags |= O_NOCTTY;
- /* flag that, if opened, this fhandler could later be capable
- of being a controlling terminal if /dev/tty is opened. */
- opt |= PC_CTTY;
- }
- if (!(fh = build_fh_name (unix_path, opt, stat_suffixes)))
- ; // errno already set
- else if ((flags & O_NOFOLLOW) && fh->issymlink ())
- {
- delete fh;
- set_errno (ELOOP);
- }
- else if ((flags & O_DIRECTORY) && fh->exists ()
- && !fh->pc.isdir ())
- {
- delete fh;
- set_errno (ENOTDIR);
- }
- else if (((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))
- && fh->exists ())
- {
- delete fh;
- set_errno (EEXIST);
- }
- else if ((fh->is_fs_special ()
- && fh->device_access_denied (flags))
- || !fh->open_with_arch (flags, mode & 07777))
- delete fh;
- else
- {
- fd = fh;
- if (fd <= 2)
- set_std_handle (fd);
- res = fd;
- }
- }
+ cygheap_fdnew fd;
+
+ if (fd < 0)
+ __leave; /* errno already set */
+
+ /* This is a temporary kludge until all utilities can catch up
+ with a change in behavior that implements linux functionality:
+ opening a tty should not automatically cause it to become the
+ controlling tty for the process. */
+ int opt = PC_OPEN | ((flags & (O_NOFOLLOW | O_EXCL))
+ ? PC_SYM_NOFOLLOW : PC_SYM_FOLLOW);
+ if (!(flags & O_NOCTTY) && fd > 2 && myself->ctty != -2)
+ {
+ flags |= O_NOCTTY;
+ /* flag that, if opened, this fhandler could later be capable
+ of being a controlling terminal if /dev/tty is opened. */
+ opt |= PC_CTTY;
+ }
+
+ if (!(fh = build_fh_name (unix_path, opt, stat_suffixes)))
+ __leave; /* errno already set */
+ if ((flags & O_NOFOLLOW) && fh->issymlink ())
+ {
+ set_errno (ELOOP);
+ __leave;
+ }
+ if ((flags & O_DIRECTORY) && fh->exists () && !fh->pc.isdir ())
+ {
+ set_errno (ENOTDIR);
+ __leave;
+ }
+ if (((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) && fh->exists ())
+ {
+ set_errno (EEXIST);
+ __leave;
}
+ if ((fh->is_fs_special () && fh->device_access_denied (flags))
+ || !fh->open_with_arch (flags, mode & 07777))
+ __leave; /* errno already set */
- syscall_printf ("%R = open(%s, %y)", res, unix_path, flags);
+ fd = fh;
+ if (fd <= 2)
+ set_std_handle (fd);
+ res = fd;
}
__except (EFAULT) {}
__endtry
+ if (res < 0 && fh)
+ delete fh;
+ syscall_printf ("%R = open(%s, %y)", res, unix_path, flags);
return res;
}