diff options
author | Christopher Faylor <me@cgf.cx> | 2004-01-24 03:40:33 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2004-01-24 03:40:33 +0000 |
commit | f4e815bc30f3c7179b8a914bb043ce087d7ad988 (patch) | |
tree | 279aa2901ba901b34b6a7a87b9f9511c437dc383 /winsup/cygwin/syscalls.cc | |
parent | 8e21b8e53489c0b02f4ee8972bf3d5db6473c442 (diff) | |
download | cygnal-f4e815bc30f3c7179b8a914bb043ce087d7ad988.tar.gz cygnal-f4e815bc30f3c7179b8a914bb043ce087d7ad988.tar.bz2 cygnal-f4e815bc30f3c7179b8a914bb043ce087d7ad988.zip |
* cygheap.cc (init_cygheap::close_ctty): Protect YA vforkism.
* fhandler.h (fhandler_base::has_acls): Make pass through for path_conv method.
(fhandler_base::isremote): Ditto.
(fhandler_base::is_fs_special): Ditto.
(fhandler_base::has_attribute): Ditto. Define new function.
(fhandler_base::fhaccess): Declare new function based on access_worker.
(fhandler_base::set_has_acls): Eliminate obsolete function.
(fhandler_base::set_isremote): Ditto.
* fhandler.cc (fhandler_base::fhaccess): Move from syscalls.cc and into
fhandler_base class. Use fhandler methods to access data rather than path_conv
stuff.
(fhandler_base::device_access_denied): Use fhaccess method.
* fhandler_disk_file.cc (fhandler_disk_file::opendir): Ditto.
(fhandler_base::open_fs): Remove calls to obsolete functions.
* fhandler_virtual.cc (fhandler_virtual::open): Ditto.
* winsup.h (access_worker): Remove obsolete access_worker declaration.
*syscalls.cc (access_worker): Move function to fhandler.cc.
(access): Use fhaccess method.
* pinfo.cc (_pinfo::set_ctty): Clarify debugging output.
* sigproc.cc (sig_dispatch_pending): Ditto.
* syscalls.cc (setsid): Perform minor rearrangement.
Diffstat (limited to 'winsup/cygwin/syscalls.cc')
-rw-r--r-- | winsup/cygwin/syscalls.cc | 102 |
1 files changed, 10 insertions, 92 deletions
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index 95eeff4f8..16486d9a9 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -327,10 +327,10 @@ setsid (void) myself->ctty = -1; myself->sid = getpid (); myself->pgid = getpid (); - syscall_printf ("sid %d, pgid %d, ctty %d, open_fhs %d", myself->sid, - myself->pgid, myself->ctty, cygheap->open_fhs); if (cygheap->ctty) cygheap->close_ctty (); + syscall_printf ("sid %d, pgid %d, ctty %d, open_fhs %d", myself->sid, + myself->pgid, myself->ctty, cygheap->open_fhs); return myself->sid; } @@ -1239,103 +1239,21 @@ lstat (const char *name, struct __stat32 *buf) return ret; } -int -access_worker (path_conv& real_path, int flags, fhandler_base *fh) -{ - if (real_path.error) - { - set_errno (real_path.error); - return -1; - } - - if (!real_path.exists ()) - { - set_errno (ENOENT); - return -1; - } - - if (!(flags & (R_OK | W_OK | X_OK))) - return 0; - - if (real_path.is_fs_special ()) - /* short circuit */; - else if (real_path.has_attribute (FILE_ATTRIBUTE_READONLY) && (flags & W_OK)) - { - set_errno (EACCES); - return -1; - } - else if (real_path.has_acls () && allow_ntsec) - return check_file_access (real_path, flags); - - struct __stat64 st; - int r = fh ? fh->fstat (&st) : stat_worker (real_path, &st, 0); - if (r) - return -1; - r = -1; - if (flags & R_OK) - { - if (st.st_uid == myself->uid) - { - if (!(st.st_mode & S_IRUSR)) - goto done; - } - else if (st.st_gid == myself->gid) - { - if (!(st.st_mode & S_IRGRP)) - goto done; - } - else if (!(st.st_mode & S_IROTH)) - goto done; - } - if (flags & W_OK) - { - if (st.st_uid == myself->uid) - { - if (!(st.st_mode & S_IWUSR)) - goto done; - } - else if (st.st_gid == myself->gid) - { - if (!(st.st_mode & S_IWGRP)) - goto done; - } - else if (!(st.st_mode & S_IWOTH)) - goto done; - } - if (flags & X_OK) - { - if (st.st_uid == myself->uid) - { - if (!(st.st_mode & S_IXUSR)) - goto done; - } - else if (st.st_gid == myself->gid) - { - if (!(st.st_mode & S_IXGRP)) - goto done; - } - else if (!(st.st_mode & S_IXOTH)) - goto done; - } - r = 0; -done: - if (r) - set_errno (EACCES); - return r; -} - extern "C" int access (const char *fn, int flags) { // flags were incorrectly specified + int res = -1; if (flags & ~(F_OK|R_OK|W_OK|X_OK)) + set_errno (EINVAL); + else { - set_errno (EINVAL); - return -1; + fhandler_base *fh = build_fh_name (fn, NULL, PC_SYM_FOLLOW | PC_FULL, stat_suffixes); + res = fh->fhaccess (flags); + delete fh; } - - path_conv pc (fn, PC_SYM_FOLLOW | PC_FULL, stat_suffixes); - return access_worker (pc, flags); + debug_printf ("returning %d", res); + return res; } extern "C" int |