diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2017-11-14 18:28:44 +0300 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2017-11-14 18:30:44 +0300 |
commit | f94fe74aad9c69ed17e55468ce1044eafca34687 (patch) | |
tree | d10a1348bf2992eea119302c9a7e359365c61f32 /winsup/cygwin/syscalls.cc | |
parent | 9cf0c4a012b214504e19fb92b23d5f0f3c9da097 (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.cc | 108 |
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; } |