* Use new unified status_flag accessor methods from classes fhandler_*,

tty_min, mtinfo and fs_info thoroughout.
	* fhandler.h: Redefine all set_close_on_exec methods to take a bool
	argument.
	(enum conn_state): Rename from connect_state.
	(class fhandler_base): Rename some status flags to align with
	accessor method names.  Drop encoded flag entirely.  Unify status
	accessor methods.  Const'ify all read accessor methods.
	(class fhandler_socket): Ditto.
	(class fhandler_dev_raw): Ditto.
	* fhandler_disk_file.cc (fhandler_base::fstat_fs): Use fs.fs_is_fat()
	instead of evaluating FATness of file system here.
	(fhandler_disk_file::opendir): Drop call to set_encoded().
	(fhandler_disk_file::readdir): Use pc.isencoded() directly.
	* mtinfo.h (class mtinfo_drive): Const'ify all read accessor methods.
	* path.cc (fsinfo_cnt): Add.
	(fs_info::update): Accomodate class changes. Evaluate file system
	name specific flags right here. Add thread safety for reading and
	writing global fsinfo array.
	* path.h (enum path_types): Drop values for flags kept in fs already.
	(struct fs_info): Move status informatin into private struct type
	status_flags.  Add accessor methods. Remove path and file system
	name string arrays in favor of status bits.
	(class path_conv): Use new fs_info status information where
	appropriate.
	(path_conf::fs_has_ea): Rename from fs_fast_ea.
	(path_conf::fs_has_acls): New method.
	(path_conf::root_dir): Remove.
	(path_conf::volname): Remove.
	* syscalls (statfs): Evaluate root dir locally.
	* tty.h (class tty_min): Unify status accessor methods.  Const'ify
	all read accessor methods.
This commit is contained in:
Corinna Vinschen 2004-04-10 13:45:10 +00:00
parent 56a188d1f3
commit 56551a9bfb
29 changed files with 341 additions and 292 deletions

View File

@ -1,3 +1,38 @@
2004-04-10 Corinna Vinschen <corinna@vinschen.de>
* Use new unified status_flag accessor methods from classes fhandler_*,
tty_min, mtinfo and fs_info thoroughout.
* fhandler.h: Redefine all set_close_on_exec methods to take a bool
argument.
(enum conn_state): Rename from connect_state.
(class fhandler_base): Rename some status flags to align with
accessor method names. Drop encoded flag entirely. Unify status
accessor methods. Const'ify all read accessor methods.
(class fhandler_socket): Ditto.
(class fhandler_dev_raw): Ditto.
* fhandler_disk_file.cc (fhandler_base::fstat_fs): Use fs.fs_is_fat()
instead of evaluating FATness of file system here.
(fhandler_disk_file::opendir): Drop call to set_encoded().
(fhandler_disk_file::readdir): Use pc.isencoded() directly.
* mtinfo.h (class mtinfo_drive): Const'ify all read accessor methods.
* path.cc (fsinfo_cnt): Add.
(fs_info::update): Accomodate class changes. Evaluate file system
name specific flags right here. Add thread safety for reading and
writing global fsinfo array.
* path.h (enum path_types): Drop values for flags kept in fs already.
(struct fs_info): Move status informatin into private struct type
status_flags. Add accessor methods. Remove path and file system
name string arrays in favor of status bits.
(class path_conv): Use new fs_info status information where
appropriate.
(path_conf::fs_has_ea): Rename from fs_fast_ea.
(path_conf::fs_has_acls): New method.
(path_conf::root_dir): Remove.
(path_conf::volname): Remove.
* syscalls (statfs): Evaluate root dir locally.
* tty.h (class tty_min): Unify status accessor methods. Const'ify
all read accessor methods.
2004-04-09 Thomas Pfaff <tpfaff@gmx.net> 2004-04-09 Thomas Pfaff <tpfaff@gmx.net>
* thread.h (pthread::init_mainthread): Remove parameter forked. * thread.h (pthread::init_mainthread): Remove parameter forked.

View File

@ -484,7 +484,7 @@ dtable::dup_worker (fhandler_base *oldfh)
return NULL; return NULL;
} }
newfh->set_close_on_exec_flag (0); newfh->close_on_exec (false);
MALLOC_CHECK; MALLOC_CHECK;
debug_printf ("duped '%s' old %p, new %p", oldfh->get_name (), oldfh->get_io_handle (), newfh->get_io_handle ()); debug_printf ("duped '%s' old %p, new %p", oldfh->get_name (), oldfh->get_io_handle (), newfh->get_io_handle ());
return newfh; return newfh;
@ -639,7 +639,7 @@ dtable::fixup_before_exec (DWORD target_proc_id)
lock (); lock ();
fhandler_base *fh; fhandler_base *fh;
for (size_t i = 0; i < size; i++) for (size_t i = 0; i < size; i++)
if ((fh = fds[i]) != NULL && !fh->get_close_on_exec ()) if ((fh = fds[i]) != NULL && !fh->close_on_exec ())
{ {
debug_printf ("fd %d (%s)", i, fh->get_name ()); debug_printf ("fd %d (%s)", i, fh->get_name ());
fh->fixup_before_fork_exec (target_proc_id); fh->fixup_before_fork_exec (target_proc_id);
@ -668,7 +668,7 @@ dtable::fixup_after_exec ()
if ((fh = fds[i]) != NULL) if ((fh = fds[i]) != NULL)
{ {
fh->clear_readahead (); fh->clear_readahead ();
if (fh->get_close_on_exec ()) if (fh->close_on_exec ())
{ {
if (fh->archetype) if (fh->archetype)
fh->close (); fh->close ();
@ -693,7 +693,7 @@ dtable::fixup_after_fork (HANDLE parent)
for (size_t i = 0; i < size; i++) for (size_t i = 0; i < size; i++)
if ((fh = fds[i]) != NULL) if ((fh = fds[i]) != NULL)
{ {
if (fh->get_close_on_exec () || fh->get_need_fork_fixup ()) if (fh->close_on_exec () || fh->need_fork_fixup ())
{ {
debug_printf ("fd %d (%s)", i, fh->get_name ()); debug_printf ("fd %d (%s)", i, fh->get_name ());
fh->fixup_after_fork (parent); fh->fixup_after_fork (parent);
@ -727,7 +727,7 @@ dtable::vfork_child_dup ()
if (not_open (i)) if (not_open (i))
continue; continue;
else if ((newtable[i] = dup_worker (fds[i])) != NULL) else if ((newtable[i] = dup_worker (fds[i])) != NULL)
newtable[i]->set_close_on_exec (fds[i]->get_close_on_exec ()); newtable[i]->set_close_on_exec (fds[i]->close_on_exec ());
else else
{ {
res = 0; res = 0;
@ -783,7 +783,7 @@ dtable::vfork_child_fixup ()
if ((fh = fds[i]) != NULL) if ((fh = fds[i]) != NULL)
{ {
fh->clear_readahead (); fh->clear_readahead ();
if (!fh->archetype && fh->get_close_on_exec ()) if (!fh->archetype && fh->close_on_exec ())
release (i); release (i);
else else
{ {

View File

@ -180,8 +180,8 @@ fhandler_base::set_flags (int flags, int supplied_bin)
debug_printf ("flags %p, supplied_bin %p", flags, supplied_bin); debug_printf ("flags %p, supplied_bin %p", flags, supplied_bin);
if ((bin = flags & (O_BINARY | O_TEXT))) if ((bin = flags & (O_BINARY | O_TEXT)))
debug_printf ("O_TEXT/O_BINARY set in flags %p", bin); debug_printf ("O_TEXT/O_BINARY set in flags %p", bin);
else if (get_r_binset () && get_w_binset ()) else if (rbinset () && wbinset ())
bin = get_r_binary () ? O_BINARY : O_TEXT; // FIXME: Not quite right bin = rbinary () ? O_BINARY : O_TEXT; // FIXME: Not quite right
else if ((fmode = get_default_fmode (flags)) & O_BINARY) else if ((fmode = get_default_fmode (flags)) & O_BINARY)
bin = O_BINARY; bin = O_BINARY;
else if (fmode & O_TEXT) else if (fmode & O_TEXT)
@ -189,14 +189,14 @@ fhandler_base::set_flags (int flags, int supplied_bin)
else if (supplied_bin) else if (supplied_bin)
bin = supplied_bin; bin = supplied_bin;
else else
bin = get_w_binary () || get_r_binary () || (binmode != O_TEXT) bin = wbinary () || rbinary () || (binmode != O_TEXT)
? O_BINARY : O_TEXT; ? O_BINARY : O_TEXT;
openflags = flags | bin; openflags = flags | bin;
bin &= O_BINARY; bin &= O_BINARY;
set_r_binary (bin); rbinary (bin ? true : false);
set_w_binary (bin); wbinary (bin ? true : false);
syscall_printf ("filemode set to %s", bin ? "binary" : "text"); syscall_printf ("filemode set to %s", bin ? "binary" : "text");
} }
@ -434,7 +434,7 @@ fhandler_base::open (int flags, mode_t mode)
SECURITY_ATTRIBUTES sa = sec_none; SECURITY_ATTRIBUTES sa = sec_none;
security_descriptor sd; security_descriptor sd;
syscall_printf ("(%s, %p) query_open %d", get_win32_name (), flags, get_query_open ()); syscall_printf ("(%s, %p) query_open %d", get_win32_name (), flags, query_open ());
if (get_win32_name () == NULL) if (get_win32_name () == NULL)
{ {
@ -442,8 +442,8 @@ fhandler_base::open (int flags, mode_t mode)
goto done; goto done;
} }
if (get_query_open ()) if (query_open ())
access = get_query_open () == query_read_control ? READ_CONTROL : 0; access = (query_open () == query_read_control ? READ_CONTROL : 0);
else if (get_major () == DEV_TAPE_MAJOR) else if (get_major () == DEV_TAPE_MAJOR)
access = GENERIC_READ | GENERIC_WRITE; access = GENERIC_READ | GENERIC_WRITE;
else if ((flags & (O_RDONLY | O_WRONLY | O_RDWR)) == O_RDONLY) else if ((flags & (O_RDONLY | O_WRONLY | O_RDWR)) == O_RDONLY)
@ -475,7 +475,7 @@ fhandler_base::open (int flags, mode_t mode)
creation_distribution = CREATE_NEW; creation_distribution = CREATE_NEW;
if (flags & O_APPEND) if (flags & O_APPEND)
set_append_p (); append_mode (true);
/* These flags are host dependent. */ /* These flags are host dependent. */
shared = wincap.shared (); shared = wincap.shared ();
@ -498,7 +498,7 @@ fhandler_base::open (int flags, mode_t mode)
/* CreateFile() with dwDesiredAccess == 0 when called on remote /* CreateFile() with dwDesiredAccess == 0 when called on remote
share returns some handle, even if file doesn't exist. This code share returns some handle, even if file doesn't exist. This code
works around this bug. */ works around this bug. */
if (get_query_open () && isremote () && if (query_open () && isremote () &&
creation_distribution == OPEN_EXISTING && !pc.exists ()) creation_distribution == OPEN_EXISTING && !pc.exists ())
{ {
set_errno (ENOENT); set_errno (ENOENT);
@ -526,13 +526,13 @@ fhandler_base::open (int flags, mode_t mode)
else if (flags & (O_WRONLY | O_RDWR)) else if (flags & (O_WRONLY | O_RDWR))
set_errno (EISDIR); set_errno (EISDIR);
else else
set_nohandle (true); nohandle (true);
} }
else if (GetLastError () == ERROR_INVALID_HANDLE) else if (GetLastError () == ERROR_INVALID_HANDLE)
set_errno (ENOENT); set_errno (ENOENT);
else else
__seterrno (); __seterrno ();
if (!get_nohandle ()) if (!nohandle ())
goto done; goto done;
} }
@ -597,7 +597,7 @@ fhandler_base::read (void *in_ptr, size_t& len)
else else
len = copied_chars; len = copied_chars;
if (get_r_binary () || len <= 0) if (rbinary () || len <= 0)
goto out; goto out;
/* Scan buffer and turn \r\n into \n */ /* Scan buffer and turn \r\n into \n */
@ -660,8 +660,7 @@ out:
if (need_signal) if (need_signal)
SetEvent (read_state); SetEvent (read_state);
debug_printf ("returning %d, %s mode", len, debug_printf ("returning %d, %s mode", len, rbinary () ? "binary" : "text");
get_r_binary () ? "binary" : "text");
return; return;
} }
@ -670,15 +669,15 @@ fhandler_base::write (const void *ptr, size_t len)
{ {
int res; int res;
if (get_append_p ()) if (append_mode ())
SetFilePointer (get_output_handle (), 0, 0, FILE_END); SetFilePointer (get_output_handle (), 0, 0, FILE_END);
else if (get_did_lseek ()) else if (did_lseek ())
{ {
_off64_t actual_length, current_position; _off64_t actual_length, current_position;
DWORD size_high = 0; DWORD size_high = 0;
LONG pos_high = 0; LONG pos_high = 0;
set_did_lseek (false); /* don't do it again */ did_lseek (false); /* don't do it again */
actual_length = GetFileSize (get_output_handle (), &size_high); actual_length = GetFileSize (get_output_handle (), &size_high);
actual_length += ((_off64_t) size_high) << 32; actual_length += ((_off64_t) size_high) << 32;
@ -745,7 +744,7 @@ fhandler_base::write (const void *ptr, size_t len)
} }
} }
if (get_w_binary ()) if (wbinary ())
{ {
debug_printf ("binary write"); debug_printf ("binary write");
res = raw_write (ptr, len); res = raw_write (ptr, len);
@ -970,7 +969,7 @@ fhandler_base::lseek (_off64_t offset, int whence)
/* When next we write(), we will check to see if *this* seek went beyond /* When next we write(), we will check to see if *this* seek went beyond
the end of the file, and back-seek and fill with zeros if so - DJ */ the end of the file, and back-seek and fill with zeros if so - DJ */
set_did_lseek (true); did_lseek (true);
/* If this was a SEEK_CUR with offset 0, we still might have /* If this was a SEEK_CUR with offset 0, we still might have
readahead that we have to take into account when calculating readahead that we have to take into account when calculating
@ -988,7 +987,7 @@ fhandler_base::close ()
int res = -1; int res = -1;
syscall_printf ("closing '%s' handle %p", get_name (), get_handle ()); syscall_printf ("closing '%s' handle %p", get_name (), get_handle ());
if (get_nohandle () || CloseHandle (get_handle ())) if (nohandle () || CloseHandle (get_handle ()))
res = 0; res = 0;
else else
{ {
@ -1109,7 +1108,7 @@ fhandler_base::init (HANDLE f, DWORD a, mode_t bin)
flags = O_RDWR; flags = O_RDWR;
set_flags (flags | bin); set_flags (flags | bin);
set_open_status (); set_open_status ();
debug_printf ("created new fhandler_base for handle %p, bin %d", f, get_r_binary ()); debug_printf ("created new fhandler_base for handle %p, bin %d", f, rbinary ());
} }
void void
@ -1124,7 +1123,7 @@ fhandler_base::dup (fhandler_base *child)
debug_printf ("in fhandler_base dup"); debug_printf ("in fhandler_base dup");
HANDLE nh; HANDLE nh;
if (!get_nohandle ()) if (!nohandle ())
{ {
if (!DuplicateHandle (hMainProc, get_handle (), hMainProc, &nh, 0, TRUE, if (!DuplicateHandle (hMainProc, get_handle (), hMainProc, &nh, 0, TRUE,
DUPLICATE_SAME_ACCESS)) DUPLICATE_SAME_ACCESS))
@ -1148,10 +1147,10 @@ int fhandler_base::fcntl (int cmd, void *arg)
switch (cmd) switch (cmd)
{ {
case F_GETFD: case F_GETFD:
res = get_close_on_exec () ? FD_CLOEXEC : 0; res = close_on_exec () ? FD_CLOEXEC : 0;
break; break;
case F_SETFD: case F_SETFD:
set_close_on_exec ((int) arg); set_close_on_exec (((int) arg & FD_CLOEXEC) ? 1 : 0);
res = 0; res = 0;
break; break;
case F_GETFL: case F_GETFL:
@ -1320,9 +1319,9 @@ void
fhandler_base::fork_fixup (HANDLE parent, HANDLE &h, const char *name) fhandler_base::fork_fixup (HANDLE parent, HANDLE &h, const char *name)
{ {
HANDLE oh = h; HANDLE oh = h;
if (/* !is_socket () && */ !get_close_on_exec ()) if (/* !is_socket () && */ !close_on_exec ())
debug_printf ("handle %p already opened", h); debug_printf ("handle %p already opened", h);
else if (!DuplicateHandle (parent, h, hMainProc, &h, 0, !get_close_on_exec (), else if (!DuplicateHandle (parent, h, hMainProc, &h, 0, !close_on_exec (),
DUPLICATE_SAME_ACCESS)) DUPLICATE_SAME_ACCESS))
system_printf ("%s - %E, handle %s<%p>", get_name (), name, h); system_printf ("%s - %E, handle %s<%p>", get_name (), name, h);
else if (oh != h) else if (oh != h)
@ -1330,11 +1329,11 @@ fhandler_base::fork_fixup (HANDLE parent, HANDLE &h, const char *name)
} }
void void
fhandler_base::set_close_on_exec (int val) fhandler_base::set_close_on_exec (bool val)
{ {
if (!get_nohandle ()) if (!nohandle ())
set_no_inheritance (io_handle, val); set_no_inheritance (io_handle, val);
set_close_on_exec_flag (val); close_on_exec (val);
debug_printf ("set close_on_exec for %s to %d", get_name (), val); debug_printf ("set close_on_exec for %s to %d", get_name (), val);
} }
@ -1342,7 +1341,7 @@ void
fhandler_base::fixup_after_fork (HANDLE parent) fhandler_base::fixup_after_fork (HANDLE parent)
{ {
debug_printf ("inheriting '%s' from parent", get_name ()); debug_printf ("inheriting '%s' from parent", get_name ());
if (!get_nohandle ()) if (!nohandle ())
fork_fixup (parent, io_handle, "io_handle"); fork_fixup (parent, io_handle, "io_handle");
} }

View File

@ -36,7 +36,7 @@ typedef struct __DIR DIR;
struct dirent; struct dirent;
struct iovec; struct iovec;
enum connect_state enum conn_state
{ {
unconnected = 0, unconnected = 0,
connect_pending = 1, connect_pending = 1,
@ -77,15 +77,13 @@ class fhandler_base
unsigned rbinset : 1; /* binary read mode explicitly set */ unsigned rbinset : 1; /* binary read mode explicitly set */
unsigned wbinary : 1; /* binary write mode */ unsigned wbinary : 1; /* binary write mode */
unsigned wbinset : 1; /* binary write mode explicitly set */ unsigned wbinset : 1; /* binary write mode explicitly set */
unsigned no_handle : 1; /* No handle associated with fhandler. */ unsigned nohandle : 1; /* No handle associated with fhandler. */
unsigned async_io : 1; /* async I/O */
unsigned uninterruptible_io : 1; /* Set if I/O should be uninterruptible. */ unsigned uninterruptible_io : 1; /* Set if I/O should be uninterruptible. */
unsigned append_mode : 1; /* always append */ unsigned append_mode : 1; /* always append */
unsigned lseeked : 1; /* set when lseek is called as a flag that unsigned did_lseek : 1; /* set when lseek is called as a flag that
_write should check if we've moved _write should check if we've moved
beyond EOF, zero filling or making beyond EOF, zero filling or making
file sparse if so. */ file sparse if so. */
unsigned encoded : 1; /* native path is encoded */
unsigned query_open : 2; /* open file without requesting either unsigned query_open : 2; /* open file without requesting either
read or write access */ read or write access */
unsigned close_on_exec : 1; /* close-on-exec */ unsigned close_on_exec : 1; /* close-on-exec */
@ -93,10 +91,9 @@ class fhandler_base
public: public:
status_flags () : status_flags () :
rbinary (0), rbinset (0), wbinary (0), wbinset (0), no_handle (0), rbinary (0), rbinset (0), wbinary (0), wbinset (0), nohandle (0),
async_io (0), uninterruptible_io (0), append_mode (0), lseeked (0), uninterruptible_io (0), append_mode (0), did_lseek (0),
encoded (0), query_open (no_query), close_on_exec (0), query_open (no_query), close_on_exec (0), need_fork_fixup (0)
need_fork_fixup (0)
{} {}
} status, open_status; } status, open_status;
@ -148,28 +145,20 @@ class fhandler_base
int get_access () const { return access; } int get_access () const { return access; }
void set_access (int x) { access = x; } void set_access (int x) { access = x; }
bool get_async () { return status.async_io; }
void set_async (int x) { status.async_io = (x ? 1 : 0); }
int get_flags () { return openflags; } int get_flags () { return openflags; }
void set_flags (int x, int supplied_bin = 0); void set_flags (int x, int supplied_bin = 0);
bool is_nonblocking (); bool is_nonblocking ();
void set_nonblocking (int yes); void set_nonblocking (int yes);
bool get_w_binary () { return status.wbinset ? status.wbinary : 1; } bool wbinary () const { return status.wbinset ? status.wbinary : 1; }
bool get_r_binary () { return status.rbinset ? status.rbinary : 1; } bool rbinary () const { return status.rbinset ? status.rbinary : 1; }
bool get_w_binset () { return status.wbinset; } bool wbinset () const { return status.wbinset; }
bool get_r_binset () { return status.rbinset; } bool rbinset () const { return status.rbinset; }
void set_w_binary (int b) {status.wbinary = (b ? 1 : 0); status.wbinset = 1;} void wbinary (bool b) {status.wbinary = b; status.wbinset = 1;}
void set_r_binary (int b) {status.rbinary = (b ? 1 : 0); status.rbinset = 1;} void rbinary (bool b) {status.rbinary = b; status.rbinset = 1;}
void clear_w_binary () { status.wbinary = 0; status.wbinset = 0; }
void clear_r_binary () { status.rbinary = 0; status.rbinset = 0; }
bool get_nohandle () { return status.no_handle; }
void set_nohandle (bool x) { status.no_handle = x; }
void set_open_status () {open_status = status;} void set_open_status () {open_status = status;}
void reset_to_open_binmode () void reset_to_open_binmode ()
@ -179,47 +168,47 @@ class fhandler_base
? O_BINARY : O_TEXT)); ? O_BINARY : O_TEXT));
} }
bool nohandle () const { return status.nohandle; }
void nohandle (bool x) { status.nohandle = x; }
bool uninterruptible_io () const { return status.uninterruptible_io; }
void uninterruptible_io (bool b) { status.uninterruptible_io = b; }
bool append_mode () const { return status.append_mode; }
void append_mode (bool b) { status.append_mode = b; }
bool did_lseek () const { return status.did_lseek; }
void did_lseek (bool b) { status.did_lseek = b; }
query_state query_open () const { return (query_state) status.query_open; }
void query_open (query_state val) { status.query_open = val; }
bool close_on_exec () const { return status.close_on_exec; }
void close_on_exec (bool b) { status.close_on_exec = b; }
bool need_fork_fixup () const { return status.need_fork_fixup; }
void need_fork_fixup (bool b) { status.need_fork_fixup = b; }
int get_default_fmode (int flags); int get_default_fmode (int flags);
bool get_r_no_interrupt () { return status.uninterruptible_io; } virtual void set_close_on_exec (bool val);
void set_r_no_interrupt (bool b) { status.uninterruptible_io = b; }
bool get_close_on_exec () { return status.close_on_exec; }
void set_close_on_exec_flag (int b) { status.close_on_exec = (b ? 1 : 0); }
LPSECURITY_ATTRIBUTES get_inheritance (bool all = 0) LPSECURITY_ATTRIBUTES get_inheritance (bool all = 0)
{ {
if (all) if (all)
return get_close_on_exec () ? &sec_all_nih : &sec_all; return close_on_exec () ? &sec_all_nih : &sec_all;
else else
return get_close_on_exec () ? &sec_none_nih : &sec_none; return close_on_exec () ? &sec_none_nih : &sec_none;
} }
void set_did_lseek (bool b) { status.lseeked = b; }
bool get_did_lseek () { return status.lseeked; }
bool get_need_fork_fixup () { return status.need_fork_fixup; }
void set_need_fork_fixup () { status.need_fork_fixup = 1; }
bool get_encoded () { return status.encoded;}
void set_encoded () { status.encoded = 1;}
virtual void set_close_on_exec (int val);
virtual void fixup_before_fork_exec (DWORD) {} virtual void fixup_before_fork_exec (DWORD) {}
virtual void fixup_after_fork (HANDLE); virtual void fixup_after_fork (HANDLE);
virtual void fixup_after_exec () {} virtual void fixup_after_exec () {}
bool get_append_p () { return status.append_mode; }
void set_append_p () { status.append_mode = 1; }
void set_fs_flags (DWORD flags) { fs_flags = flags; } void set_fs_flags (DWORD flags) { fs_flags = flags; }
bool get_fs_flags (DWORD flagval = UINT32_MAX) bool get_fs_flags (DWORD flagval = UINT32_MAX)
{ return (fs_flags & (flagval)); } { return (fs_flags & (flagval)); }
query_state get_query_open () { return (query_state) status.query_open; }
void set_query_open (query_state val) { status.query_open = val; }
bool get_readahead_valid () { return raixget < ralen; } bool get_readahead_valid () { return raixget < ralen; }
int puts_readahead (const char *s, size_t len = (size_t) -1); int puts_readahead (const char *s, size_t len = (size_t) -1);
int put_readahead (char value); int put_readahead (char value);
@ -356,13 +345,14 @@ class fhandler_socket: public fhandler_base
char *sun_path; char *sun_path;
struct status_flags struct status_flags
{ {
unsigned sock_saw_shut_rd : 1; /* Socket saw a SHUT_RD */ unsigned async_io : 1; /* async I/O */
unsigned sock_saw_shut_wr : 1; /* Socket saw a SHUT_WR */ unsigned saw_shutdown_read : 1; /* Socket saw a SHUT_RD */
unsigned had_connect_or_listen : 2; unsigned saw_shutdown_write : 1; /* Socket saw a SHUT_WR */
unsigned connect_state : 2;
public: public:
status_flags () : status_flags () :
sock_saw_shut_rd (0), sock_saw_shut_wr (0), async_io (0), saw_shutdown_read (0), saw_shutdown_write (0),
had_connect_or_listen (unconnected) connect_state (unconnected)
{} {}
} status; } status;
@ -372,22 +362,19 @@ class fhandler_socket: public fhandler_base
int get_socket () { return (int) get_handle(); } int get_socket () { return (int) get_handle(); }
fhandler_socket *is_socket () { return this; } fhandler_socket *is_socket () { return this; }
bool saw_shutdown_read () const { return status.sock_saw_shut_rd; } bool async_io () const { return status.async_io; }
bool saw_shutdown_write () const { return status.sock_saw_shut_wr; } void async_io (bool b) { status.async_io = b; }
void set_shutdown_read () { status.sock_saw_shut_rd = 1;} bool saw_shutdown_read () const { return status.saw_shutdown_read; }
void set_shutdown_write () { status.sock_saw_shut_wr = 1;} bool saw_shutdown_write () const { return status.saw_shutdown_write; }
bool is_unconnected () const void saw_shutdown_read (bool b) { status.saw_shutdown_read = b;}
{ return status.had_connect_or_listen == unconnected; } void saw_shutdown_write (bool b) { status.saw_shutdown_write = b;}
bool is_connect_pending () const
{ return status.had_connect_or_listen == connect_pending; } conn_state connect_state () const
bool is_connected () const { return (conn_state) status.connect_state; }
{ return status.had_connect_or_listen == connected; } void connect_state (conn_state newstate)
void set_connect_state (connect_state newstate) { status.connect_state = newstate; }
{ status.had_connect_or_listen = newstate; }
connect_state get_connect_state () const
{ return (connect_state) status.had_connect_or_listen; }
int bind (const struct sockaddr *name, int namelen); int bind (const struct sockaddr *name, int namelen);
int connect (const struct sockaddr *name, int namelen); int connect (const struct sockaddr *name, int namelen);
@ -414,7 +401,7 @@ class fhandler_socket: public fhandler_base
void hclose (HANDLE) {close ();} void hclose (HANDLE) {close ();}
int dup (fhandler_base *child); int dup (fhandler_base *child);
void set_close_on_exec (int val); void set_close_on_exec (bool val);
virtual void fixup_before_fork_exec (DWORD); virtual void fixup_before_fork_exec (DWORD);
void fixup_after_fork (HANDLE); void fixup_after_fork (HANDLE);
void fixup_after_exec (); void fixup_after_exec ();
@ -453,7 +440,7 @@ public:
select_record *select_read (select_record *s); select_record *select_read (select_record *s);
select_record *select_write (select_record *s); select_record *select_write (select_record *s);
select_record *select_except (select_record *s); select_record *select_except (select_record *s);
void set_close_on_exec (int val); void set_close_on_exec (bool val);
void __stdcall read (void *ptr, size_t& len) __attribute__ ((regparm (3))); void __stdcall read (void *ptr, size_t& len) __attribute__ ((regparm (3)));
int close (); int close ();
void create_guard (SECURITY_ATTRIBUTES *sa) {guard = CreateMutex (sa, FALSE, NULL);} void create_guard (SECURITY_ATTRIBUTES *sa) {guard = CreateMutex (sa, FALSE, NULL);}
@ -509,14 +496,17 @@ class fhandler_dev_raw: public fhandler_base
{} {}
} status; } status;
bool eom_detected () const { return status.eom_detected; }
void eom_detected (bool b) { status.eom_detected = b; } void eom_detected (bool b) { status.eom_detected = b; }
bool eom_detected () { return status.eom_detected; }
bool eof_detected () const { return status.eof_detected; }
void eof_detected (bool b) { status.eof_detected = b; } void eof_detected (bool b) { status.eof_detected = b; }
bool eof_detected () { return status.eof_detected; }
bool lastblk_to_read () const { return status.lastblk_to_read; }
void lastblk_to_read (bool b) { status.lastblk_to_read = b; } void lastblk_to_read (bool b) { status.lastblk_to_read = b; }
bool lastblk_to_read () { return status.lastblk_to_read; }
bool is_writing () const { return status.is_writing; }
void is_writing (bool b) { status.is_writing = b; } void is_writing (bool b) { status.is_writing = b; }
bool is_writing () { return status.is_writing; }
virtual BOOL write_file (const void *buf, DWORD to_write, virtual BOOL write_file (const void *buf, DWORD to_write,
DWORD *written, int *err); DWORD *written, int *err);
@ -704,7 +694,7 @@ class fhandler_termios: public fhandler_base
fhandler_termios () : fhandler_termios () :
fhandler_base () fhandler_base ()
{ {
set_need_fork_fixup (); need_fork_fixup (true);
} }
HANDLE& get_output_handle () { return output_handle; } HANDLE& get_output_handle () { return output_handle; }
line_edit_status line_edit (const char *rptr, int nread, termios&); line_edit_status line_edit (const char *rptr, int nread, termios&);
@ -850,7 +840,7 @@ class fhandler_console: public fhandler_termios
select_record *select_write (select_record *s); select_record *select_write (select_record *s);
select_record *select_except (select_record *s); select_record *select_except (select_record *s);
void fixup_after_exec (); void fixup_after_exec ();
void set_close_on_exec (int val); void set_close_on_exec (bool val);
void fixup_after_fork (HANDLE parent); void fixup_after_fork (HANDLE parent);
void set_input_state (); void set_input_state ();
void send_winch_maybe (); void send_winch_maybe ();
@ -886,7 +876,7 @@ class fhandler_tty_common: public fhandler_termios
tty *get_ttyp () { return (tty *) tc; } tty *get_ttyp () { return (tty *) tc; }
int close (); int close ();
void set_close_on_exec (int val); void set_close_on_exec (bool val);
void fixup_after_fork (HANDLE parent); void fixup_after_fork (HANDLE parent);
select_record *select_read (select_record *s); select_record *select_read (select_record *s);
select_record *select_write (select_record *s); select_record *select_write (select_record *s);
@ -947,7 +937,7 @@ public:
_off64_t lseek (_off64_t, int) { return 0; } _off64_t lseek (_off64_t, int) { return 0; }
char *ptsname (); char *ptsname ();
void set_close_on_exec (int val); void set_close_on_exec (bool val);
bool hit_eof (); bool hit_eof ();
int get_unit () const { return slave.minor; } int get_unit () const { return slave.minor; }
}; };
@ -1074,7 +1064,7 @@ class fhandler_windows: public fhandler_base
_off64_t lseek (_off64_t, int) { return 0; } _off64_t lseek (_off64_t, int) { return 0; }
int close (void) { return 0; } int close (void) { return 0; }
void set_close_on_exec (int val); void set_close_on_exec (bool val);
void fixup_after_fork (HANDLE parent); void fixup_after_fork (HANDLE parent);
select_record *select_read (select_record *s); select_record *select_read (select_record *s);
select_record *select_write (select_record *s); select_record *select_write (select_record *s);

View File

@ -73,7 +73,7 @@ fhandler_dev_clipboard::open (int flags, mode_t)
membuffer = NULL; membuffer = NULL;
if (!cygnativeformat) if (!cygnativeformat)
cygnativeformat = RegisterClipboardFormat (CYGWIN_NATIVE); cygnativeformat = RegisterClipboardFormat (CYGWIN_NATIVE);
set_nohandle (true); nohandle (true);
set_open_status (); set_open_status ();
return 1; return 1;
} }

View File

@ -155,7 +155,7 @@ set_console_state_for_spawn ()
{ {
/* ACK. Temporarily define for use in TTYSETF macro */ /* ACK. Temporarily define for use in TTYSETF macro */
SetConsoleMode (h, ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT); SetConsoleMode (h, ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT);
shared_console_info->tty_min_state.set_rstcons (); shared_console_info->tty_min_state.rstcons (true);
} }
CloseHandle (h); CloseHandle (h);
@ -536,7 +536,7 @@ sig_exit:
void void
fhandler_console::set_input_state () fhandler_console::set_input_state ()
{ {
if (tc->needs_rstcons ()) if (tc->rstcons ())
input_tcsetattr (0, &tc->ti); input_tcsetattr (0, &tc->ti);
} }
@ -633,7 +633,7 @@ fhandler_console::open (int flags, mode_t)
return 0; return 0;
} }
set_io_handle (h); set_io_handle (h);
set_r_no_interrupt (1); // Handled explicitly in read code uninterruptible_io (true); // Handled explicitly in read code
h = CreateFile ("CONOUT$", GENERIC_READ | GENERIC_WRITE, h = CreateFile ("CONOUT$", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, &sec_none, FILE_SHARE_READ | FILE_SHARE_WRITE, &sec_none,
@ -658,7 +658,7 @@ fhandler_console::open (int flags, mode_t)
SetConsoleMode (get_io_handle (), ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT | cflags); SetConsoleMode (get_io_handle (), ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT | cflags);
} }
tc->clear_rstcons (); tc->rstcons (false);
set_open_status (); set_open_status ();
cygheap->open_fhs++; cygheap->open_fhs++;
debug_printf ("incremented open_fhs, now %d", cygheap->open_fhs); debug_printf ("incremented open_fhs, now %d", cygheap->open_fhs);
@ -789,7 +789,7 @@ fhandler_console::input_tcsetattr (int, struct termios const *t)
#if 0 #if 0
/* Enable/disable LF -> CRLF conversions */ /* Enable/disable LF -> CRLF conversions */
set_r_binary ((t->c_iflag & INLCR) ? 0 : 1); rbinary ((t->c_iflag & INLCR) ? false : true);
#endif #endif
/* There's some disparity between what we need and what's /* There's some disparity between what we need and what's
@ -842,7 +842,7 @@ fhandler_console::input_tcsetattr (int, struct termios const *t)
res, t, flags, t->c_lflag, t->c_iflag); res, t, flags, t->c_lflag, t->c_iflag);
} }
tc->clear_rstcons (); tc->rstcons (false);
return res; return res;
} }
@ -1742,7 +1742,7 @@ fhandler_console::igncr_enabled (void)
} }
void void
fhandler_console::set_close_on_exec (int val) fhandler_console::set_close_on_exec (bool val)
{ {
fhandler_base::set_close_on_exec (val); fhandler_base::set_close_on_exec (val);
set_no_inheritance (output_handle, val); set_no_inheritance (output_handle, val);
@ -1761,7 +1761,7 @@ fhandler_console::fixup_after_fork (HANDLE)
if (!open (O_NOCTTY | get_flags (), 0)) if (!open (O_NOCTTY | get_flags (), 0))
system_printf ("error opening console after fork, %E"); system_printf ("error opening console after fork, %E");
if (!get_close_on_exec ()) if (!close_on_exec ())
{ {
CloseHandle (h); CloseHandle (h);
CloseHandle (oh); CloseHandle (oh);

View File

@ -164,7 +164,7 @@ fhandler_base::fstat_fs (struct __stat64 *buf)
if (get_io_handle ()) if (get_io_handle ())
{ {
if (get_nohandle ()) if (nohandle ())
return fstat_by_name (buf); return fstat_by_name (buf);
else else
return fstat_by_handle (buf); return fstat_by_handle (buf);
@ -173,9 +173,8 @@ fhandler_base::fstat_fs (struct __stat64 *buf)
then just do a "query open" as it is apparently much faster. */ then just do a "query open" as it is apparently much faster. */
if (pc.exec_state () != dont_know_if_executable) if (pc.exec_state () != dont_know_if_executable)
{ {
set_query_open (query_read_control); query_open (query_read_control);
if (strncasematch (pc.volname (), "FAT", 3) if (pc.fs_is_fat () && !strpbrk (get_win32_name (), "?*|<>"))
&& !strpbrk (get_win32_name (), "?*|<>"))
return fstat_by_name (buf); return fstat_by_name (buf);
} }
if (!(oret = open_fs (open_flags, 0)) && get_errno () == EACCES) if (!(oret = open_fs (open_flags, 0)) && get_errno () == EACCES)
@ -183,21 +182,21 @@ fhandler_base::fstat_fs (struct __stat64 *buf)
/* If we couldn't open the file, try a query open with no permissions. /* If we couldn't open the file, try a query open with no permissions.
This allows us to determine *some* things about the file, at least. */ This allows us to determine *some* things about the file, at least. */
pc.set_exec (0); pc.set_exec (0);
set_query_open (query_null_access); query_open (query_null_access);
oret = open_fs (open_flags, 0); oret = open_fs (open_flags, 0);
} }
if (oret) if (oret)
{ {
/* We now have a valid handle, regardless of the "nohandle" state. /* We now have a valid handle, regardless of the "nohandle" state.
Since fhandler_base::open only calls CloseHandle if !get_nohandle, Since fhandler_base::open only calls CloseHandle if !nohandle,
we have to set it to false before calling close_fs and restore we have to set it to false before calling close_fs and restore
the state afterwards. */ the state afterwards. */
res = fstat_by_handle (buf); res = fstat_by_handle (buf);
bool nohandle = get_nohandle (); bool no_handle = nohandle ();
set_nohandle (false); nohandle (false);
close_fs (); close_fs ();
set_nohandle (nohandle); nohandle (no_handle);
set_io_handle (NULL); set_io_handle (NULL);
} }
else else
@ -631,7 +630,7 @@ fhandler_disk_file::opendir ()
goto free_dirent; goto free_dirent;
fd = this; fd = this;
fd->set_nohandle (true); fd->nohandle (true);
dir->__d_dirent->d_fd = fd; dir->__d_dirent->d_fd = fd;
dir->__fh = this; dir->__fh = this;
/* FindFirstFile doesn't seem to like duplicate /'s. */ /* FindFirstFile doesn't seem to like duplicate /'s. */
@ -647,8 +646,6 @@ fhandler_disk_file::opendir ()
res = dir; res = dir;
if (pc.isencoded ())
set_encoded ();
} }
syscall_printf ("%p = opendir (%s)", res, get_name ()); syscall_printf ("%p = opendir (%s)", res, get_name ());
@ -715,7 +712,7 @@ fhandler_disk_file::readdir (DIR *dir)
} }
/* We get here if `buf' contains valid data. */ /* We get here if `buf' contains valid data. */
if (get_encoded ()) if (pc.isencoded ())
(void) fnunmunge (dir->__d_dirent->d_name, buf.cFileName); (void) fnunmunge (dir->__d_dirent->d_name, buf.cFileName);
else else
strcpy (dir->__d_dirent->d_name, buf.cFileName); strcpy (dir->__d_dirent->d_name, buf.cFileName);

View File

@ -1075,8 +1075,8 @@ fhandler_dev_dsp::open (int flags, mode_t mode)
{ /* All tried query () succeeded */ { /* All tried query () succeeded */
rc = 1; rc = 1;
set_open_status (); set_open_status ();
set_need_fork_fixup (); need_fork_fixup (true);
set_close_on_exec_flag (1); close_on_exec (true);
} }
else else
{ /* One of the tried query () failed */ { /* One of the tried query () failed */

View File

@ -106,7 +106,7 @@ fhandler_fifo::open_not_mine (int flags)
if (i == 0) if (i == 0)
{ {
read_state = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL); read_state = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL);
set_need_fork_fixup (); need_fork_fixup (true);
} }
} }
CloseHandle (hp); CloseHandle (hp);

View File

@ -219,7 +219,7 @@ fhandler_proc::open (int flags, mode_t mode)
if (!res) if (!res)
goto out; goto out;
set_nohandle (true); nohandle (true);
const char *path; const char *path;

View File

@ -163,7 +163,7 @@ fhandler_process::open (int flags, mode_t mode)
if (!res) if (!res)
goto out; goto out;
set_nohandle (true); nohandle (true);
const char *path; const char *path;
path = get_name () + proc_len + 1; path = get_name () + proc_len + 1;

View File

@ -32,7 +32,7 @@ int
fhandler_dev_random::open (int flags, mode_t) fhandler_dev_random::open (int flags, mode_t)
{ {
set_flags ((flags & ~O_TEXT) | O_BINARY); set_flags ((flags & ~O_TEXT) | O_BINARY);
set_nohandle (true); nohandle (true);
set_open_status (); set_open_status ();
return 1; return 1;
} }

View File

@ -95,7 +95,7 @@ fhandler_dev_raw::writebuf (void)
fhandler_dev_raw::fhandler_dev_raw () fhandler_dev_raw::fhandler_dev_raw ()
: fhandler_base (), status () : fhandler_base (), status ()
{ {
set_need_fork_fixup (); need_fork_fixup (true);
} }
fhandler_dev_raw::~fhandler_dev_raw (void) fhandler_dev_raw::~fhandler_dev_raw (void)

View File

@ -26,7 +26,7 @@ details. */
fhandler_serial::fhandler_serial () fhandler_serial::fhandler_serial ()
: fhandler_base (), vmin_ (0), vtime_ (0), pgrp_ (myself->pgid) : fhandler_base (), vmin_ (0), vtime_ (0), pgrp_ (myself->pgid)
{ {
set_need_fork_fixup (); need_fork_fixup (true);
} }
void void
@ -226,7 +226,7 @@ fhandler_serial::open (int flags, mode_t mode)
(void) SetCommMask (get_handle (), EV_RXCHAR); (void) SetCommMask (get_handle (), EV_RXCHAR);
set_r_no_interrupt (1); // Handled explicitly in read code uninterruptible_io (true); // Handled explicitly in read code
overlapped_setup (); overlapped_setup ();
@ -765,8 +765,8 @@ fhandler_serial::tcsetattr (int action, const struct termios *t)
res = -1; res = -1;
} }
set_r_binary ((t->c_iflag & IGNCR) ? 0 : 1); rbinary ((t->c_iflag & IGNCR) ? false : true);
set_w_binary ((t->c_oflag & ONLCR) ? 0 : 1); wbinary ((t->c_oflag & ONLCR) ? false : true);
if (dropDTR) if (dropDTR)
{ {
@ -1020,11 +1020,11 @@ fhandler_serial::tcgetattr (struct termios *t)
/* FIXME: need to handle IGNCR */ /* FIXME: need to handle IGNCR */
#if 0 #if 0
if (!get_r_binary ()) if (!rbinary ())
t->c_iflag |= IGNCR; t->c_iflag |= IGNCR;
#endif #endif
if (!get_w_binary ()) if (!wbinary ())
t->c_oflag |= ONLCR; t->c_oflag |= ONLCR;
t->c_cc[VTIME] = vtime_ / 100; t->c_cc[VTIME] = vtime_ / 100;
@ -1038,7 +1038,7 @@ fhandler_serial::tcgetattr (struct termios *t)
void void
fhandler_serial::fixup_after_fork (HANDLE parent) fhandler_serial::fixup_after_fork (HANDLE parent)
{ {
if (get_close_on_exec ()) if (close_on_exec ())
fhandler_base::fixup_after_fork (parent); fhandler_base::fixup_after_fork (parent);
overlapped_setup (); overlapped_setup ();
debug_printf ("io_status.hEvent %p", io_status.hEvent); debug_printf ("io_status.hEvent %p", io_status.hEvent);

View File

@ -126,7 +126,7 @@ fhandler_socket::fhandler_socket () :
sun_path (NULL), sun_path (NULL),
status () status ()
{ {
set_need_fork_fixup (); need_fork_fixup (true);
prot_info_ptr = (LPWSAPROTOCOL_INFOA) cmalloc (HEAP_BUF, prot_info_ptr = (LPWSAPROTOCOL_INFOA) cmalloc (HEAP_BUF,
sizeof (WSAPROTOCOL_INFOA)); sizeof (WSAPROTOCOL_INFOA));
#if 0 #if 0
@ -200,7 +200,7 @@ fhandler_socket::create_secret_event (int* secret)
if (!secret_event) if (!secret_event)
debug_printf("create event %E"); debug_printf("create event %E");
else if (get_close_on_exec ()) else if (close_on_exec ())
/* Event allows inheritance, but handle will not be inherited */ /* Event allows inheritance, but handle will not be inherited */
set_no_inheritance (secret_event, 1); set_no_inheritance (secret_event, 1);
@ -308,7 +308,7 @@ void
fhandler_socket::fixup_after_exec () fhandler_socket::fixup_after_exec ()
{ {
debug_printf ("here"); debug_printf ("here");
if (!get_close_on_exec ()) if (!close_on_exec ())
fixup_after_fork (NULL); fixup_after_fork (NULL);
#if 0 #if 0
else if (!winsock2_active) else if (!winsock2_active)
@ -325,7 +325,7 @@ fhandler_socket::dup (fhandler_base *child)
if (get_addr_family () == AF_LOCAL) if (get_addr_family () == AF_LOCAL)
fhs->set_sun_path (get_sun_path ()); fhs->set_sun_path (get_sun_path ());
fhs->set_socket_type (get_socket_type ()); fhs->set_socket_type (get_socket_type ());
fhs->set_connect_state (get_connect_state ()); fhs->connect_state (connect_state ());
if (winsock2_active) if (winsock2_active)
{ {
@ -501,7 +501,7 @@ fhandler_socket::connect (const struct sockaddr *name, int namelen)
{ {
/* Special handling for connect to return the correct error code /* Special handling for connect to return the correct error code
when called on a non-blocking socket. */ when called on a non-blocking socket. */
if (is_nonblocking () || is_connect_pending ()) if (is_nonblocking () || connect_state () == connect_pending)
{ {
err = WSAGetLastError (); err = WSAGetLastError ();
if (err == WSAEWOULDBLOCK || err == WSAEALREADY) if (err == WSAEWOULDBLOCK || err == WSAEALREADY)
@ -547,9 +547,9 @@ fhandler_socket::connect (const struct sockaddr *name, int namelen)
err = WSAGetLastError (); err = WSAGetLastError ();
if (err == WSAEINPROGRESS || err == WSAEALREADY) if (err == WSAEINPROGRESS || err == WSAEALREADY)
set_connect_state (connect_pending); connect_state (connect_pending);
else else
set_connect_state (connected); connect_state (connected);
return res; return res;
} }
@ -561,7 +561,7 @@ fhandler_socket::listen (int backlog)
if (res) if (res)
set_winsock_errno (); set_winsock_errno ();
else else
set_connect_state (connected); connect_state (connected);
return res; return res;
} }
@ -636,7 +636,7 @@ fhandler_socket::accept (struct sockaddr *peer, int *len)
((fhandler_socket *) res_fd)->set_sun_path (get_sun_path ()); ((fhandler_socket *) res_fd)->set_sun_path (get_sun_path ());
((fhandler_socket *) res_fd)->set_addr_family (get_addr_family ()); ((fhandler_socket *) res_fd)->set_addr_family (get_addr_family ());
((fhandler_socket *) res_fd)->set_socket_type (get_socket_type ()); ((fhandler_socket *) res_fd)->set_socket_type (get_socket_type ());
((fhandler_socket *) res_fd)->set_connect_state (connected); ((fhandler_socket *) res_fd)->connect_state (connected);
res = res_fd; res = res_fd;
} }
else else
@ -1088,14 +1088,14 @@ fhandler_socket::shutdown (int how)
switch (how) switch (how)
{ {
case SHUT_RD: case SHUT_RD:
set_shutdown_read (); saw_shutdown_read (true);
break; break;
case SHUT_WR: case SHUT_WR:
set_shutdown_write (); saw_shutdown_write (true);
break; break;
case SHUT_RDWR: case SHUT_RDWR:
set_shutdown_read (); saw_shutdown_read (true);
set_shutdown_write (); saw_shutdown_write (true);
break; break;
} }
return res; return res;
@ -1246,7 +1246,7 @@ fhandler_socket::ioctl (unsigned int cmd, void *p)
*(int *) p ? ASYNC_MASK : 0); *(int *) p ? ASYNC_MASK : 0);
syscall_printf ("Async I/O on socket %s", syscall_printf ("Async I/O on socket %s",
*(int *) p ? "started" : "cancelled"); *(int *) p ? "started" : "cancelled");
set_async (*(int *) p); async_io (*(int *) p != 0);
break; break;
case FIONREAD: case FIONREAD:
res = ioctlsocket (get_socket (), FIONREAD, (unsigned long *) p); res = ioctlsocket (get_socket (), FIONREAD, (unsigned long *) p);
@ -1267,7 +1267,7 @@ fhandler_socket::ioctl (unsigned int cmd, void *p)
syscall_printf ("socket is now %sblocking", syscall_printf ("socket is now %sblocking",
*(int *) p ? "non" : ""); *(int *) p ? "non" : "");
/* Start AsyncSelect if async socket unblocked */ /* Start AsyncSelect if async socket unblocked */
if (*(int *) p && get_async ()) if (*(int *) p && async_io ())
WSAAsyncSelect (get_socket (), gethwnd (), WM_ASYNCIO, ASYNC_MASK); WSAAsyncSelect (get_socket (), gethwnd (), WM_ASYNCIO, ASYNC_MASK);
set_nonblocking (*(int *) p); set_nonblocking (*(int *) p);
@ -1309,13 +1309,13 @@ fhandler_socket::fcntl (int cmd, void *arg)
} }
void void
fhandler_socket::set_close_on_exec (int val) fhandler_socket::set_close_on_exec (bool val)
{ {
if (secret_event) if (secret_event)
set_no_inheritance (secret_event, val); set_no_inheritance (secret_event, val);
if (!winsock2_active) /* < Winsock 2.0 */ if (!winsock2_active) /* < Winsock 2.0 */
set_no_inheritance (get_handle (), val); set_no_inheritance (get_handle (), val);
set_close_on_exec_flag (val); close_on_exec (val);
debug_printf ("set close_on_exec for %s to %d", get_name (), val); debug_printf ("set close_on_exec for %s to %d", get_name (), val);
} }

View File

@ -31,7 +31,7 @@ fhandler_termios::tcinit (tty_min *this_tc, bool force)
tc = this_tc; tc = this_tc;
if (force || !tc->is_initialized ()) if (force || !tc->initialized ())
{ {
tc->ti.c_iflag = BRKINT | ICRNL | IXON; tc->ti.c_iflag = BRKINT | ICRNL | IXON;
tc->ti.c_oflag = OPOST | ONLCR; tc->ti.c_oflag = OPOST | ONLCR;

View File

@ -440,7 +440,7 @@ process_ioctl (void *)
fhandler_tty_slave::fhandler_tty_slave () fhandler_tty_slave::fhandler_tty_slave ()
: fhandler_tty_common () : fhandler_tty_common ()
{ {
set_r_no_interrupt (1); uninterruptible_io (true);
} }
/* FIXME: This function needs to close handles when it has /* FIXME: This function needs to close handles when it has
@ -1334,10 +1334,10 @@ fhandler_pty_master::ptsname ()
} }
void void
fhandler_tty_common::set_close_on_exec (int val) fhandler_tty_common::set_close_on_exec (bool val)
{ {
if (archetype) if (archetype)
set_close_on_exec_flag (val); close_on_exec (val);
else else
{ {
if (output_done_event) if (output_done_event)
@ -1359,7 +1359,7 @@ fhandler_tty_common::set_close_on_exec (int val)
It is here because we need to specify the "from_pty" stuff here or It is here because we need to specify the "from_pty" stuff here or
we'll get warnings from ForceCloseHandle when debugging. */ we'll get warnings from ForceCloseHandle when debugging. */
set_no_inheritance (get_io_handle (), val); set_no_inheritance (get_io_handle (), val);
set_close_on_exec_flag (val); close_on_exec (val);
#endif #endif
} }
} }
@ -1391,7 +1391,7 @@ fhandler_tty_common::fixup_after_fork (HANDLE parent)
} }
void void
fhandler_pty_master::set_close_on_exec (int val) fhandler_pty_master::set_close_on_exec (bool val)
{ {
fhandler_tty_common::set_close_on_exec (val); fhandler_tty_common::set_close_on_exec (val);
@ -1414,6 +1414,6 @@ fhandler_tty_master::init_console ()
console->init (INVALID_HANDLE_VALUE, GENERIC_READ | GENERIC_WRITE, O_BINARY); console->init (INVALID_HANDLE_VALUE, GENERIC_READ | GENERIC_WRITE, O_BINARY);
cygheap->open_fhs--; /* handled when individual fds are opened */ cygheap->open_fhs--; /* handled when individual fds are opened */
console->set_r_no_interrupt (1); console->uninterruptible_io (true);
return 0; return 0;
} }

View File

@ -75,7 +75,7 @@ fhandler_virtual::opendir ()
if (fd >= 0) if (fd >= 0)
{ {
fd = this; fd = this;
fd->set_nohandle (true); fd->nohandle (true);
dir->__d_dirent->d_fd = fd; dir->__d_dirent->d_fd = fd;
dir->__fh = this; dir->__fh = this;
dir->__d_cookie = __DIRENT_COOKIE; dir->__d_cookie = __DIRENT_COOKIE;
@ -207,8 +207,8 @@ fhandler_virtual::write (const void *ptr, size_t len)
int int
fhandler_virtual::open (int flags, mode_t mode) fhandler_virtual::open (int flags, mode_t mode)
{ {
set_r_binary (1); rbinary (true);
set_w_binary (1); wbinary (true);
set_flags ((flags & ~O_TEXT) | O_BINARY); set_flags ((flags & ~O_TEXT) | O_BINARY);

View File

@ -55,7 +55,7 @@ int
fhandler_windows::open (int flags, mode_t) fhandler_windows::open (int flags, mode_t)
{ {
set_flags ((flags & ~O_TEXT) | O_BINARY); set_flags ((flags & ~O_TEXT) | O_BINARY);
set_close_on_exec_flag (1); close_on_exec (true);
set_open_status (); set_open_status ();
return 1; return 1;
} }
@ -125,12 +125,12 @@ fhandler_windows::ioctl (unsigned int cmd, void *val)
} }
void void
fhandler_windows::set_close_on_exec (int val) fhandler_windows::set_close_on_exec (bool val)
{ {
if (get_handle ()) if (get_handle ())
fhandler_base::set_close_on_exec (val); fhandler_base::set_close_on_exec (val);
else else
fhandler_base::set_close_on_exec_flag (val); fhandler_base::close_on_exec (val);
void *h = hWnd_; void *h = hWnd_;
if (h) if (h)
set_no_inheritance (h, val); set_no_inheritance (h, val);

View File

@ -25,7 +25,7 @@ int
fhandler_dev_zero::open (int flags, mode_t) fhandler_dev_zero::open (int flags, mode_t)
{ {
set_flags ((flags & ~O_TEXT) | O_BINARY); set_flags ((flags & ~O_TEXT) | O_BINARY);
set_nohandle (true); nohandle (true);
set_open_status (); set_open_status ();
return 1; return 1;
} }

View File

@ -113,18 +113,18 @@ public:
int ioctl (HANDLE mt, unsigned int cmd, void *buf); int ioctl (HANDLE mt, unsigned int cmd, void *buf);
int set_pos (HANDLE mt, int mode, long count, bool sfm_func); int set_pos (HANDLE mt, int mode, long count, bool sfm_func);
bool buffer_writes () const { return status.buffer_writes; }
void buffer_writes (bool b) { status.buffer_writes = b; } void buffer_writes (bool b) { status.buffer_writes = b; }
bool buffer_writes () { return status.buffer_writes; } bool two_fm () const { return status.two_fm; }
void two_fm (bool b) { status.two_fm = b; } void two_fm (bool b) { status.two_fm = b; }
bool two_fm () { return status.two_fm; } bool fast_eom () const { return status.fast_eom; }
void fast_eom (bool b) { status.fast_eom = b; } void fast_eom (bool b) { status.fast_eom = b; }
bool fast_eom () { return status.fast_eom; } bool auto_lock () const { return status.auto_lock; }
void auto_lock (bool b) { status.auto_lock = b; } void auto_lock (bool b) { status.auto_lock = b; }
bool auto_lock () { return status.auto_lock; } bool sysv () const { return status.sysv; }
void sysv (bool b) { status.sysv = b; } void sysv (bool b) { status.sysv = b; }
bool sysv () { return status.sysv; } bool nowait () const { return status.nowait; }
void nowait (bool b) { status.nowait = b; } void nowait (bool b) { status.nowait = b; }
bool nowait () { return status.nowait; }
PTAPE_GET_DRIVE_PARAMETERS dp (void) { return &_dp; } PTAPE_GET_DRIVE_PARAMETERS dp (void) { return &_dp; }
PTAPE_GET_MEDIA_PARAMETERS mp (void) { return &_mp; } PTAPE_GET_MEDIA_PARAMETERS mp (void) { return &_mp; }
mtinfo_part *part (int num) { return &_part[num]; } mtinfo_part *part (int num) { return &_part[num]; }

View File

@ -636,7 +636,7 @@ fdsock (cygheap_fdmanip& fd, const device *dev, SOCKET soc)
return false; return false;
fd->set_io_handle ((HANDLE) soc); fd->set_io_handle ((HANDLE) soc);
fd->set_flags (O_RDWR | O_BINARY); fd->set_flags (O_RDWR | O_BINARY);
fd->set_r_no_interrupt (winsock2_active); fd->uninterruptible_io (winsock2_active);
cygheap->fdtab.inc_need_fixup_before (); cygheap->fdtab.inc_need_fixup_before ();
debug_printf ("fd %d, name '%s', soc %p", (int) fd, dev->name, soc); debug_printf ("fd %d, name '%s', soc %p", (int) fd, dev->name, soc);
return true; return true;
@ -1960,7 +1960,7 @@ cygwin_rcmd (char **ahost, unsigned short inport, char *locuser,
if (res_fd >= 0 && fdsock (res_fd, tcp_dev, res)) if (res_fd >= 0 && fdsock (res_fd, tcp_dev, res))
{ {
((fhandler_socket *) res_fd)->set_connect_state (connected); ((fhandler_socket *) res_fd)->connect_state (connected);
res = res_fd; res = res_fd;
} }
else else
@ -1977,7 +1977,7 @@ cygwin_rcmd (char **ahost, unsigned short inport, char *locuser,
if (newfd >= 0 && fdsock (newfd, tcp_dev, fd2s)) if (newfd >= 0 && fdsock (newfd, tcp_dev, fd2s))
{ {
*fd2p = newfd; *fd2p = newfd;
((fhandler_socket *) fd2p)->set_connect_state (connected); ((fhandler_socket *) fd2p)->connect_state (connected);
} }
else else
{ {
@ -2040,7 +2040,7 @@ cygwin_rexec (char **ahost, unsigned short inport, char *locuser,
if (res_fd >= 0 && fdsock (res_fd, tcp_dev, res)) if (res_fd >= 0 && fdsock (res_fd, tcp_dev, res))
{ {
((fhandler_socket *) res_fd)->set_connect_state (connected); ((fhandler_socket *) res_fd)->connect_state (connected);
res = res_fd; res = res_fd;
} }
else else
@ -2056,7 +2056,7 @@ cygwin_rexec (char **ahost, unsigned short inport, char *locuser,
if (newfd >= 0 && fdsock (newfd, tcp_dev, fd2s)) if (newfd >= 0 && fdsock (newfd, tcp_dev, fd2s))
{ {
((fhandler_socket *) fd2p)->set_connect_state (connected); ((fhandler_socket *) fd2p)->connect_state (connected);
*fd2p = newfd; *fd2p = newfd;
} }
else else
@ -2230,7 +2230,7 @@ socketpair (int family, int type, int protocol, int *sb)
((fhandler_socket *) sb0)->set_sun_path (""); ((fhandler_socket *) sb0)->set_sun_path ("");
((fhandler_socket *) sb0)->set_addr_family (family); ((fhandler_socket *) sb0)->set_addr_family (family);
((fhandler_socket *) sb0)->set_socket_type (type); ((fhandler_socket *) sb0)->set_socket_type (type);
((fhandler_socket *) sb0)->set_connect_state (connected); ((fhandler_socket *) sb0)->connect_state (connected);
cygheap_fdnew sb1 (sb0, false); cygheap_fdnew sb1 (sb0, false);
@ -2239,7 +2239,7 @@ socketpair (int family, int type, int protocol, int *sb)
((fhandler_socket *) sb1)->set_sun_path (""); ((fhandler_socket *) sb1)->set_sun_path ("");
((fhandler_socket *) sb1)->set_addr_family (family); ((fhandler_socket *) sb1)->set_addr_family (family);
((fhandler_socket *) sb1)->set_socket_type (type); ((fhandler_socket *) sb1)->set_socket_type (type);
((fhandler_socket *) sb1)->set_connect_state (connected); ((fhandler_socket *) sb1)->connect_state (connected);
sb[0] = sb0; sb[0] = sb0;
sb[1] = sb1; sb[1] = sb1;

View File

@ -354,26 +354,28 @@ mkrelpath (char *path)
#define MAX_FS_INFO_CNT 25 #define MAX_FS_INFO_CNT 25
fs_info fsinfo[MAX_FS_INFO_CNT]; fs_info fsinfo[MAX_FS_INFO_CNT];
LONG fsinfo_cnt;
bool bool
fs_info::update (const char *win32_path) fs_info::update (const char *win32_path)
{ {
char tmp_buf [CYG_MAX_PATH]; char fsname [CYG_MAX_PATH];
strncpy (tmp_buf, win32_path, CYG_MAX_PATH); char root_dir [CYG_MAX_PATH];
strncpy (root_dir, win32_path, CYG_MAX_PATH);
if (!rootdir (tmp_buf)) if (!rootdir (root_dir))
{ {
debug_printf ("Cannot get root component of path %s", win32_path); debug_printf ("Cannot get root component of path %s", win32_path);
name_storage [0] = '\0'; clear ();
sym_opt_storage = flags_storage = serial_storage = 0;
return false; return false;
} }
__ino64_t tmp_name_hash = hash_path_name (1, tmp_buf); __ino64_t tmp_name_hash = hash_path_name (1, root_dir);
if (tmp_name_hash == name_hash) if (tmp_name_hash == name_hash)
return true; return true;
int idx = 0; int idx = 0;
while (idx < MAX_FS_INFO_CNT && fsinfo[idx].name_hash) LONG cur_fsinfo_cnt = fsinfo_cnt;
while (idx < cur_fsinfo_cnt && fsinfo[idx].name_hash)
{ {
if (tmp_name_hash == fsinfo[idx].name_hash) if (tmp_name_hash == fsinfo[idx].name_hash)
{ {
@ -384,21 +386,22 @@ fs_info::update (const char *win32_path)
} }
name_hash = tmp_name_hash; name_hash = tmp_name_hash;
strncpy (root_dir_storage, tmp_buf, CYG_MAX_PATH); drive_type (GetDriveType (root_dir));
drive_type_storage = GetDriveType (root_dir_storage); if (drive_type () == DRIVE_REMOTE
if (drive_type_storage == DRIVE_REMOTE || (drive_type () == DRIVE_UNKNOWN
|| (drive_type_storage == DRIVE_UNKNOWN && (root_dir[0] == '\\' && root_dir[1] == '\\')))
&& (root_dir_storage[0] == '\\' && root_dir_storage[1] == '\\'))) is_remote_drive (true);
is_remote_drive_storage = 1;
else else
is_remote_drive_storage = 0; is_remote_drive (false);
if (!GetVolumeInformation (root_dir_storage, NULL, 0, &serial_storage, NULL, &flags_storage, if (!GetVolumeInformation (root_dir, NULL, 0, &status.serial, NULL,
name_storage, sizeof (name_storage))) &status.flags, fsname, sizeof (fsname)))
{ {
debug_printf ("Cannot get volume information (%s), %E", root_dir_storage); debug_printf ("Cannot get volume information (%s), %E", root_dir);
name_storage[0] = '\0'; flags () = 0;
sym_opt_storage = flags_storage = serial_storage = 0; has_buggy_open (false);
has_ea (false);
flags () = serial () = 0;
return false; return false;
} }
/* FIXME: Samba by default returns "NTFS" in file system name, but /* FIXME: Samba by default returns "NTFS" in file system name, but
@ -406,10 +409,34 @@ fs_info::update (const char *win32_path)
* distinguish between samba and real ntfs, it should be implemented * distinguish between samba and real ntfs, it should be implemented
* here. * here.
*/ */
sym_opt_storage = (!is_remote_drive_storage && strcmp (name_storage, "NTFS") == 0) ? PC_CHECK_EA : 0; has_ea (!is_remote_drive () && strcmp (fsname, "NTFS") == 0);
has_acls ((flags () & FS_PERSISTENT_ACLS)
&& (allow_smbntsec || !is_remote_drive ()));
is_fat (strncasematch (fsname, "FAT", 3));
/* Known file systems with buggy open calls. Further explanation
in fhandler.cc (fhandler_disk_file::open). */
has_buggy_open (!strcmp (fsname, "SUNWNFS"));
if (idx < MAX_FS_INFO_CNT && drive_type_storage != DRIVE_REMOVABLE) /* Only append non-removable drives to the global fsinfo storage */
fsinfo[idx] = *this; if (drive_type () != DRIVE_REMOVABLE && drive_type () != DRIVE_CDROM
&& idx < MAX_FS_INFO_CNT)
{
LONG exc_cnt;
while ((exc_cnt = InterlockedExchange (&fsinfo_cnt, -1)) == -1)
low_priority_sleep (0);
if (exc_cnt < MAX_FS_INFO_CNT)
{
/* Check if another thread has already appended that very drive */
while (idx < exc_cnt)
{
if (fsinfo[idx++].name_hash == name_hash)
goto done;
}
fsinfo[exc_cnt++] = *this;
}
done:
InterlockedExchange (&fsinfo_cnt, exc_cnt);
}
return true; return true;
} }
@ -427,7 +454,7 @@ path_conv::fillin (HANDLE h)
fileattr = local.dwFileAttributes; fileattr = local.dwFileAttributes;
fs.serial () = local.dwVolumeSerialNumber; fs.serial () = local.dwVolumeSerialNumber;
} }
fs.drive_type () = DRIVE_UNKNOWN; fs.drive_type (DRIVE_UNKNOWN);
} }
void void
@ -492,12 +519,7 @@ path_conv::check (const char *src, unsigned opt,
fileattr = INVALID_FILE_ATTRIBUTES; fileattr = INVALID_FILE_ATTRIBUTES;
case_clash = false; case_clash = false;
memset (&dev, 0, sizeof (dev)); memset (&dev, 0, sizeof (dev));
fs.root_dir ()[0] = '\0'; fs.clear ();
fs.name ()[0] = '\0';
fs.flags () = fs.serial () = 0;
fs.sym_opt () = 0;
fs.drive_type () = 0;
fs.is_remote_drive () = 0;
normalized_path = NULL; normalized_path = NULL;
if (!(opt & PC_NULLEMPTY)) if (!(opt & PC_NULLEMPTY))
@ -624,7 +646,7 @@ path_conv::check (const char *src, unsigned opt,
goto out; goto out;
} }
symlen = sym.check (full_path, suff, opt | fs.sym_opt ()); symlen = sym.check (full_path, suff, opt | fs.has_ea ());
if (sym.minor || sym.major) if (sym.minor || sym.major)
{ {
@ -794,30 +816,14 @@ out:
if (dev.devn == FH_FS) if (dev.devn == FH_FS)
{ {
if (!fs.update (path)) if (fs.update (path))
{
fs.root_dir ()[0] = '\0';
set_has_acls (false); // already implied but...
set_has_buggy_open (false); // ditto
}
else
{ {
set_isdisk (); set_isdisk ();
debug_printf ("root_dir(%s), this->path(%s), set_has_acls(%d)", debug_printf ("this->path(%s), has_acls(%d)", path, fs.has_acls ());
fs.root_dir (), this->path, fs.flags () & FS_PERSISTENT_ACLS); if (fs.has_acls () && allow_ntsec && wincap.has_security ())
if (!(fs.flags () & FS_PERSISTENT_ACLS) || (!allow_smbntsec && fs.is_remote_drive ())) set_exec (0); /* We really don't know if this is executable or not here
set_has_acls (false); but set it to not executable since it will be figured out
else later by anything which cares about this. */
{
set_has_acls (true);
if (allow_ntsec && wincap.has_security ())
set_exec (0); /* We really don't know if this is executable or not here
but set it to not executable since it will be figured out
later by anything which cares about this. */
}
/* Known file systems with buggy open calls. Further explanation
in fhandler.cc (fhandler_disk_file::open). */
set_has_buggy_open (strcmp (fs.name (), "SUNWNFS") == 0);
} }
if (exec_state () != dont_know_if_executable) if (exec_state () != dont_know_if_executable)
/* ok */; /* ok */;
@ -2657,7 +2663,7 @@ symlink_worker (const char *topath, const char *frompath, bool use_winsym,
#endif #endif
SetFileAttributes (win32_path, attr); SetFileAttributes (win32_path, attr);
if (!isdevice && win32_path.fs_fast_ea ()) if (!isdevice && win32_path.fs_has_ea ())
set_symlink_ea (win32_path, topath); set_symlink_ea (win32_path, topath);
res = 0; res = 0;
} }

View File

@ -65,29 +65,52 @@ enum path_types
PATH_TEXT = 0x02000000, PATH_TEXT = 0x02000000,
PATH_ISDISK = 0x04000000, PATH_ISDISK = 0x04000000,
PATH_HAS_SYMLINKS = 0x10000000, PATH_HAS_SYMLINKS = 0x10000000,
PATH_HASBUGGYOPEN = 0x20000000, PATH_SOCKET = 0x40000000
PATH_SOCKET = 0x40000000,
PATH_HASACLS = 0x80000000
}; };
class symlink_info; class symlink_info;
struct fs_info struct fs_info
{ {
char name_storage[CYG_MAX_PATH]; private:
char root_dir_storage[CYG_MAX_PATH];
__ino64_t name_hash; __ino64_t name_hash;
DWORD flags_storage; struct status_flags
DWORD serial_storage; {
DWORD sym_opt_storage; /* additional options to pass to symlink_info resolver */ DWORD flags; /* Volume flags */
bool is_remote_drive_storage; DWORD serial; /* Volume serial number */
DWORD drive_type_storage; unsigned is_remote_drive : 1;
inline char* name () const {return (char *) name_storage;} unsigned has_buggy_open : 1;
inline char* root_dir () const {return (char *) root_dir_storage;} unsigned has_ea : 1;
inline DWORD& flags () {return flags_storage;}; unsigned has_acls : 1;
inline DWORD& serial () {return serial_storage;}; unsigned is_fat : 1;
inline DWORD& sym_opt () {return sym_opt_storage;}; unsigned drive_type : 3;
inline bool& is_remote_drive () {return is_remote_drive_storage;}; } status;
inline DWORD& drive_type () {return drive_type_storage;}; public:
void clear ()
{
name_hash = 0;
flags () = serial () = 0;
is_remote_drive (false);
has_buggy_open (false);
has_ea (false);
has_acls (false);
is_fat (false);
drive_type (false);
}
inline DWORD& flags () {return status.flags;};
inline DWORD& serial () {return status.serial;};
void is_remote_drive (bool b) { status.is_remote_drive = b; }
bool is_remote_drive () const { return status.is_remote_drive; }
void has_buggy_open (bool b) { status.has_buggy_open = b; }
bool has_buggy_open () const { return status.has_buggy_open; }
void is_fat (bool b) { status.is_fat = b; }
bool is_fat () const { return status.is_fat; }
void has_ea (bool b) { status.has_ea = b; }
int has_ea () const { return status.has_ea ? PC_CHECK_EA : 0; }
void has_acls (bool b) { status.has_acls = b; }
bool has_acls () const { return status.has_acls; }
void drive_type (DWORD d) { status.is_remote_drive = d; }
DWORD drive_type () const { return status.drive_type; }
bool update (const char *); bool update (const char *);
}; };
@ -105,11 +128,11 @@ class path_conv
bool case_clash; bool case_clash;
int isdisk () const { return path_flags & PATH_ISDISK;} int isdisk () const { return path_flags & PATH_ISDISK;}
bool& isremote () {return fs.is_remote_drive ();} bool isremote () {return fs.is_remote_drive ();}
int has_acls () const {return path_flags & PATH_HASACLS;} int has_acls () const {return fs.has_acls (); }
int has_symlinks () const {return path_flags & PATH_HAS_SYMLINKS;} int has_symlinks () const {return path_flags & PATH_HAS_SYMLINKS;}
int hasgood_inode () const {return path_flags & PATH_HASACLS;} // Not strictly correct int hasgood_inode () const {return has_acls ();} // Not strictly correct
int has_buggy_open () const {return path_flags & PATH_HASBUGGYOPEN;} int has_buggy_open () const {return fs.has_buggy_open ();}
bool isencoded () {return path_flags & PATH_ENC;} bool isencoded () {return path_flags & PATH_ENC;}
int binmode () const int binmode () const
{ {
@ -148,8 +171,6 @@ class path_conv
void set_has_symlinks () {path_flags |= PATH_HAS_SYMLINKS;} void set_has_symlinks () {path_flags |= PATH_HAS_SYMLINKS;}
void set_isdisk () {path_flags |= PATH_ISDISK; dev.devn = FH_FS;} void set_isdisk () {path_flags |= PATH_ISDISK; dev.devn = FH_FS;}
void set_exec (int x = 1) {path_flags |= x ? PATH_EXEC : PATH_NOTEXEC;} void set_exec (int x = 1) {path_flags |= x ? PATH_EXEC : PATH_NOTEXEC;}
void set_has_acls (int x = 1) {path_flags |= x ? PATH_HASACLS : PATH_NOTHING;}
void set_has_buggy_open (int x = 1) {path_flags |= x ? PATH_HASBUGGYOPEN : PATH_NOTHING;}
void check (const char *src, unsigned opt = PC_SYM_FOLLOW, void check (const char *src, unsigned opt = PC_SYM_FOLLOW,
const suffix_info *suffixes = NULL) __attribute__ ((regparm(3))); const suffix_info *suffixes = NULL) __attribute__ ((regparm(3)));
@ -185,11 +206,10 @@ class path_conv
DWORD file_attributes () {return fileattr;} DWORD file_attributes () {return fileattr;}
DWORD drive_type () {return fs.drive_type ();} DWORD drive_type () {return fs.drive_type ();}
DWORD fs_flags () {return fs.flags ();} DWORD fs_flags () {return fs.flags ();}
bool fs_fast_ea () {return !!(fs.sym_opt () & PC_CHECK_EA);} bool fs_has_ea () {return fs.has_ea ();}
bool fs_is_fat () {return fs.is_fat ();}
void set_path (const char *p) {strcpy (path, p);} void set_path (const char *p) {strcpy (path, p);}
const char * root_dir () const { return fs.root_dir (); }
DWORD volser () { return fs.serial (); } DWORD volser () { return fs.serial (); }
const char *volname () {return fs.name (); }
void fillin (HANDLE h); void fillin (HANDLE h);
inline size_t size () inline size_t size ()
{ {

View File

@ -41,7 +41,7 @@ fhandler_pipe::lseek (_off64_t offset, int whence)
} }
void void
fhandler_pipe::set_close_on_exec (int val) fhandler_pipe::set_close_on_exec (bool val)
{ {
fhandler_base::set_close_on_exec (val); fhandler_base::set_close_on_exec (val);
if (guard) if (guard)
@ -230,12 +230,12 @@ fhandler_pipe::create (fhandler_pipe *fhs[2], unsigned psize, int mode, bool fif
fhs[1]->init (w, GENERIC_WRITE, binmode); fhs[1]->init (w, GENERIC_WRITE, binmode);
if (mode & O_NOINHERIT) if (mode & O_NOINHERIT)
{ {
fhs[0]->set_close_on_exec_flag (1); fhs[0]->close_on_exec (true);
fhs[1]->set_close_on_exec_flag (1); fhs[1]->close_on_exec (true);
} }
fhs[0]->read_state = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL); fhs[0]->read_state = CreateEvent (&sec_none_nih, FALSE, FALSE, NULL);
fhs[0]->set_need_fork_fixup (); fhs[0]->need_fork_fixup (true);
ProtectHandle1 (fhs[0]->read_state, read_state); ProtectHandle1 (fhs[0]->read_state, read_state);
res = 0; res = 0;
@ -312,7 +312,7 @@ _pipe (int filedes[2], unsigned int psize, int mode)
{ {
cygheap_fdnew fdin; cygheap_fdnew fdin;
cygheap_fdnew fdout (fdin, false); cygheap_fdnew fdout (fdin, false);
fhs[0]->set_r_no_interrupt (1); fhs[0]->uninterruptible_io (true);
fdin = fhs[0]; fdin = fhs[0];
fdout = fhs[1]; fdout = fhs[1];
filedes[0] = fdin; filedes[0] = fdin;

View File

@ -335,7 +335,7 @@ set_bits (select_record *me, fd_set *readfds, fd_set *writefds,
{ {
UNIX_FD_SET (me->fd, writefds); UNIX_FD_SET (me->fd, writefds);
if (me->except_on_write && me->fh->is_socket ()) if (me->except_on_write && me->fh->is_socket ())
((fhandler_socket *) me->fh)->set_connect_state (connected); ((fhandler_socket *) me->fh)->connect_state (connected);
ready++; ready++;
} }
if ((me->except_selected || me->except_on_write) && me->except_ready) if ((me->except_selected || me->except_on_write) && me->except_ready)
@ -344,7 +344,7 @@ set_bits (select_record *me, fd_set *readfds, fd_set *writefds,
{ {
UNIX_FD_SET (me->fd, writefds); UNIX_FD_SET (me->fd, writefds);
if (me->fh->is_socket ()) if (me->fh->is_socket ())
((fhandler_socket *) me->fh)->set_connect_state (connected); ((fhandler_socket *) me->fh)->connect_state (connected);
} }
if (me->except_selected) if (me->except_selected)
UNIX_FD_SET (me->fd, exceptfds); UNIX_FD_SET (me->fd, exceptfds);
@ -1400,9 +1400,9 @@ fhandler_socket::select_write (select_record *s)
s->cleanup = socket_cleanup; s->cleanup = socket_cleanup;
} }
s->peek = peek_socket; s->peek = peek_socket;
s->write_ready = saw_shutdown_write () || is_unconnected (); s->write_ready = saw_shutdown_write () || connect_state () == unconnected;
s->write_selected = true; s->write_selected = true;
if (is_connect_pending ()) if (connect_state () == connect_pending)
{ {
s->except_ready = saw_shutdown_write () || saw_shutdown_read (); s->except_ready = saw_shutdown_write () || saw_shutdown_read ();
s->except_on_write = true; s->except_on_write = true;

View File

@ -185,7 +185,7 @@ handle (int n, int direction)
if (!fh) if (!fh)
return INVALID_HANDLE_VALUE; return INVALID_HANDLE_VALUE;
if (fh->get_close_on_exec ()) if (fh->close_on_exec ())
return INVALID_HANDLE_VALUE; return INVALID_HANDLE_VALUE;
if (direction == 0) if (direction == 0)
return fh->get_handle (); return fh->get_handle ();

View File

@ -424,7 +424,7 @@ readv (int fd, const struct iovec *const iov, const int iovcnt)
syscall_printf ("readv (%d, %p, %d) %sblocking, sigcatchers %d", syscall_printf ("readv (%d, %p, %d) %sblocking, sigcatchers %d",
fd, iov, iovcnt, wait ? "" : "non", sigcatchers); fd, iov, iovcnt, wait ? "" : "non", sigcatchers);
if (wait && (!cfd->is_slow () || cfd->get_r_no_interrupt ())) if (wait && (!cfd->is_slow () || cfd->uninterruptible_io ()))
debug_printf ("no need to call ready_for_read"); debug_printf ("no need to call ready_for_read");
else if (!cfd->ready_for_read (fd, wait)) else if (!cfd->ready_for_read (fd, wait))
{ {
@ -1617,7 +1617,7 @@ _cygwin_istext_for_stdio (int fd)
} }
#endif #endif
if (cfd->get_w_binary () || cfd->get_r_binary ()) if (cfd->wbinary () || cfd->rbinary ())
{ {
syscall_printf ("fd %d: opened as binary", fd); syscall_printf ("fd %d: opened as binary", fd);
return 0; return 0;
@ -1681,9 +1681,9 @@ setmode (int fd, int mode)
interfaces should not use setmode. */ interfaces should not use setmode. */
int res; int res;
if (cfd->get_w_binary () && cfd->get_r_binary ()) if (cfd->wbinary () && cfd->rbinary ())
res = O_BINARY; res = O_BINARY;
else if (cfd->get_w_binset () && cfd->get_r_binset ()) else if (cfd->wbinset () && cfd->rbinset ())
res = O_TEXT; /* Specifically set O_TEXT */ res = O_TEXT; /* Specifically set O_TEXT */
else else
res = 0; res = 0;
@ -1793,6 +1793,8 @@ get_osfhandle (int fd)
extern "C" int extern "C" int
statfs (const char *fname, struct statfs *sfs) statfs (const char *fname, struct statfs *sfs)
{ {
char root_dir[CYG_MAX_PATH];
if (!sfs) if (!sfs)
{ {
set_errno (EFAULT); set_errno (EFAULT);
@ -1800,7 +1802,8 @@ statfs (const char *fname, struct statfs *sfs)
} }
path_conv full_path (fname, PC_SYM_FOLLOW | PC_FULL); path_conv full_path (fname, PC_SYM_FOLLOW | PC_FULL);
const char *root = full_path.root_dir (); strncpy (root_dir, full_path, CYG_MAX_PATH);
const char *root = rootdir (root_dir);
syscall_printf ("statfs %s", root); syscall_printf ("statfs %s", root);

View File

@ -49,11 +49,10 @@ public:
int ntty; int ntty;
DWORD last_ctrl_c; // tick count of last ctrl-c DWORD last_ctrl_c; // tick count of last ctrl-c
bool initialized () const { return status.initialized; }
void initialize () { status.initialized = 1; } void initialize () { status.initialized = 1; }
bool is_initialized () { return status.initialized; } bool rstcons () const { return status.rstcons; }
void set_rstcons () { status.rstcons = 1; } void rstcons (bool b) { status.rstcons = b; }
void clear_rstcons () { status.rstcons = 1; }
bool needs_rstcons () { return status.rstcons; }
tty_min (int t = -1, pid_t s = -1) : sid (s), ntty (t) {} tty_min (int t = -1, pid_t s = -1) : sid (s), ntty (t) {}
void setntty (int n) {ntty = n;} void setntty (int n) {ntty = n;}