* dtable.cc (dtable::delete_archetype): Improve debugging output.

(dtable::init_std_file_from_handle): Close console handle early, before
initialization.  Build up openflags for passing to open_setup, just to be safe.
(last_tty_dev): New variable.
(fh_last_tty_dev): New macro.
(fh_alloc): Try again to keep track of previously opened tty, this time by just
saving the device and using that to potentially open an archetype.  Avoid
setting the "/dev/tty" name if the creation of the fhandler failed.
(build_fh_pc): Remove unused second argument.  Reorganize how and where the
name is set.  Set last_tty_dev as appropriate.  Avoid a NULL dereference in a
debug printf.
* dtable.h (build_fh_pc): Reflect removal of second parameter.
* fhandler.cc (fhandler_base::reset): Use new '<<' operator to copy pc since it
preserves any potentially previously set name.
(fhandler_base::set_name): Ditto.
* fhandler.h (fhandler_*::clone): Throughout use ccalloc to allocate new
fhandler, primarily to make sure that pc field is properly zeroed.
(fhandler_termios::last): Eliminate.
(fhandler_termios): Remove setting of last.
(fhandler_base::~fhandler_termios): Ditto.
* fhandler_console.cc (fhandler_console::open): Don't make decisions about
opening close-on-exec handles here since it makes no sense for archetypes.
(fhandler_console::init): Assume that input handle has already been opened.
* fhandler_termios.cc (fhandler_termios::last): Delete.
* path.h (path_conv::eq_worker): New function.  Move bulk of operator = here.
(operator <<): New function.
(operator =): Use eq_worker to perform old functionality.
This commit is contained in:
Christopher Faylor 2011-10-22 16:26:30 +00:00
parent bdea9e5fe8
commit 6ae28c2263
11 changed files with 183 additions and 110 deletions

View File

@ -1,3 +1,38 @@
2011-10-21 Christopher Faylor <me.cygwin2011@cgf.cx>
* dtable.cc (dtable::delete_archetype): Improve debugging output.
(dtable::init_std_file_from_handle): Close console handle early, before
initialization. Build up openflags for passing to open_setup, just to
be safe.
(last_tty_dev): New variable.
(fh_last_tty_dev): New macro.
(fh_alloc): Try again to keep track of previously opened tty, this time
by just saving the device and using that to potentially open an
archetype. Avoid setting the "/dev/tty" name if the creation of the
fhandler failed.
(build_fh_pc): Remove unused second argument. Reorganize how and where
the name is set. Set last_tty_dev as appropriate. Avoid a NULL
dereference in a debug printf.
* dtable.h (build_fh_pc): Reflect removal of second parameter.
* fhandler.cc (fhandler_base::reset): Use new '<<' operator to copy pc
since it preserves any potentially previously set name.
(fhandler_base::set_name): Ditto.
* fhandler.h (fhandler_*::clone): Throughout use ccalloc to allocate
new fhandler, primarily to make sure that pc field is properly zeroed.
(fhandler_termios::last): Eliminate.
(fhandler_termios): Remove setting of last.
(fhandler_base::~fhandler_termios): Ditto.
* fhandler_console.cc (fhandler_console::open): Don't make decisions
about opening close-on-exec handles here since it makes no sense for
archetypes.
(fhandler_console::init): Assume that input handle has already been
opened.
* fhandler_termios.cc (fhandler_termios::last): Delete.
* path.h (path_conv::eq_worker): New function. Move bulk of operator =
here.
(operator <<): New function.
(operator =): Use eq_worker to perform old functionality.
2011-10-21 Corinna Vinschen <corinna@vinschen.de> 2011-10-21 Corinna Vinschen <corinna@vinschen.de>
* fhandler_disk_file.cc (fhandler_disk_file::rmdir): Check invalid * fhandler_disk_file.cc (fhandler_disk_file::rmdir): Check invalid

View File

@ -40,6 +40,8 @@ enum child_status
/* Change this value if you get a message indicating that it is out-of-sync. */ /* Change this value if you get a message indicating that it is out-of-sync. */
#define CURR_CHILD_INFO_MAGIC 0x29afd207U #define CURR_CHILD_INFO_MAGIC 0x29afd207U
#define NPROCS 256
/* NOTE: Do not make gratuitous changes to the names or organization of the /* NOTE: Do not make gratuitous changes to the names or organization of the
below class. The layout is checksummed to determine compatibility between below class. The layout is checksummed to determine compatibility between
different cygwin versions. */ different cygwin versions. */
@ -54,6 +56,8 @@ public:
HANDLE subproc_ready; // used for synchronization with parent HANDLE subproc_ready; // used for synchronization with parent
HANDLE user_h; HANDLE user_h;
HANDLE parent; HANDLE parent;
int nprocs;
pid_t children[NPROCS];
init_cygheap *cygheap; init_cygheap *cygheap;
void *cygheap_max; void *cygheap_max;
DWORD cygheap_reserve_sz; DWORD cygheap_reserve_sz;

View File

@ -217,7 +217,8 @@ dtable::delete_archetype (fhandler_base *fh)
for (unsigned i = 0; i < farchetype; i++) for (unsigned i = 0; i < farchetype; i++)
if (fh == archetypes[i]) if (fh == archetypes[i])
{ {
debug_printf ("deleting element %d for %s", i, fh->get_name ()); debug_printf ("deleting element %d for %s(%d/%d)", i, fh->get_name (),
fh->dev ().get_major (), fh->dev ().get_minor ());
if (i < --farchetype) if (i < --farchetype)
archetypes[i] = archetypes[farchetype]; archetypes[i] = archetypes[farchetype];
break; break;
@ -314,7 +315,11 @@ dtable::init_std_file_from_handle (int fd, HANDLE handle)
if (myself->ctty > 0) if (myself->ctty > 0)
dev.parse (myself->ctty); dev.parse (myself->ctty);
else else
dev.parse (FH_CONSOLE); {
dev.parse (FH_CONSOLE);
CloseHandle (handle);
handle = INVALID_HANDLE_VALUE;
}
} }
else if (GetCommState (handle, &dcb)) else if (GetCommState (handle, &dcb))
/* FIXME: Not right - assumes ttyS0 */ /* FIXME: Not right - assumes ttyS0 */
@ -347,48 +352,48 @@ dtable::init_std_file_from_handle (int fd, HANDLE handle)
IO_STATUS_BLOCK io; IO_STATUS_BLOCK io;
FILE_ACCESS_INFORMATION fai; FILE_ACCESS_INFORMATION fai;
int openflags = O_BINARY;
/* Console windows are not kernel objects, so the access mask returned /* Console windows are not kernel objects, so the access mask returned
by NtQueryInformationFile is meaningless. CMD always hands down by NtQueryInformationFile is meaningless. CMD always hands down
stdin handles as R/O handles, but our tty slave sides are R/W. */ stdin handles as R/O handles, but our tty slave sides are R/W. */
if (dev == FH_TTY || iscons_dev (dev) || dev.get_major () == DEV_PTYS_MAJOR) if (!iscons_dev (dev) && fh->is_tty ())
access |= GENERIC_READ | GENERIC_WRITE; {
else if (NT_SUCCESS (NtQueryInformationFile (handle, &io, &fai, openflags |= O_RDWR;
sizeof fai, access |= GENERIC_READ | GENERIC_WRITE;
FileAccessInformation))) }
else if (!iscons_dev (dev)
&& NT_SUCCESS (NtQueryInformationFile (handle, &io, &fai,
sizeof fai,
FileAccessInformation)))
{ {
if (fai.AccessFlags & FILE_READ_DATA)
access |= GENERIC_READ;
if (fai.AccessFlags & FILE_WRITE_DATA) if (fai.AccessFlags & FILE_WRITE_DATA)
access |= GENERIC_WRITE; {
openflags |= O_WRONLY;
access |= GENERIC_WRITE;
}
if (fai.AccessFlags & FILE_READ_DATA)
{
openflags |= openflags & O_WRONLY ? O_RDWR : O_RDONLY;
access |= GENERIC_READ;
}
} }
else if (fd == 0) else if (fd == 0)
access |= GENERIC_READ; {
openflags |= O_RDONLY;
access |= GENERIC_READ;
}
else else
access |= GENERIC_WRITE; /* Should be rdwr for stderr but not sure that's {
possible for some versions of handles */ openflags |= O_WRONLY;
/* FIXME: Workaround Windows 7 issue. If the parent process of access |= GENERIC_WRITE; /* Should be rdwr for stderr but not sure that's
the process tree closes the original handles to the console window, possible for some versions of handles */
strange problems occur when starting child processes later on if }
stdio redirection is used. if (!fh->init (handle, access, bin))
CV 2009-08-08: It looks like this problem has been fixed only
half-heartedly in RTM. Unfortunately the new implementation
has still a problem which now also occurs on the 32 bit release
of Windows 7. It's still not quite clear what happens but it's
easily reproducible. Just start X via the start menu entry.
This opens an xterm window with a shell. Exit from the shell,
and you get a Windows error box reporting a crash in the
Console Window Host application (conhost.exe) due to an access
violation.
This needs further investigation but the workaround not to close
the handles will have a marginal hit of three extra handles per
process at most. */
if (!fh->init (iscons_dev (dev) && wincap.has_console_handle_problem ()
? INVALID_HANDLE_VALUE : handle, access, bin))
api_fatal ("couldn't initialize fd %d for %s", fd, fh->get_name ()); api_fatal ("couldn't initialize fd %d for %s", fd, fh->get_name ());
fh->open_setup (openflags);
fh->usecount = 0;
cygheap->fdtab[fd] = fh; cygheap->fdtab[fd] = fh;
set_std_handle (fd); set_std_handle (fd);
paranoid_printf ("fd %d, handle %p", fd, handle); paranoid_printf ("fd %d, handle %p", fd, handle);
@ -435,6 +440,8 @@ build_fh_dev (const device& dev, const char *unix_name)
} }
#define fh_unset ((fhandler_base *) 1) #define fh_unset ((fhandler_base *) 1)
static device last_tty_dev;
#define fh_last_tty_dev ((fhandler_termios *) cygheap->fdtab.find_archetype (last_tty_dev))
static fhandler_base * static fhandler_base *
fh_alloc (path_conv& pc) fh_alloc (path_conv& pc)
@ -555,17 +562,22 @@ fh_alloc (path_conv& pc)
break; break;
case FH_TTY: case FH_TTY:
if (!pc.isopen ()) if (!pc.isopen ())
fhraw = cnew_no_ctor (fhandler_console, -1);
else if (myself->ctty <= 0
&& !myself->set_ctty (fhandler_termios::last, 0))
/* no tty assigned */;
else
{ {
fhraw = cnew_no_ctor (fhandler_console, -1);
debug_printf ("not called from open for /dev/tty");
}
else if (myself->ctty <= 0 && last_tty_dev
&& !myself->set_ctty (fh_last_tty_dev, 0))
debug_printf ("no /dev/tty assigned");
else if (myself->ctty > 0)
{
debug_printf ("determining /dev/tty assignment for ctty %p", myself->ctty);
if (iscons_dev (myself->ctty)) if (iscons_dev (myself->ctty))
fh = cnew (fhandler_console, pc.dev); fh = cnew (fhandler_console, pc.dev);
else else
fh = cnew (fhandler_pty_slave, myself->ctty); fh = cnew (fhandler_pty_slave, myself->ctty);
fh->set_name ("/dev/tty"); if (fh->dev () != FH_NADA)
fh->set_name ("/dev/tty");
} }
break; break;
case FH_KMSG: case FH_KMSG:
@ -595,7 +607,7 @@ fh_alloc (path_conv& pc)
} }
fhandler_base * fhandler_base *
build_fh_pc (path_conv& pc, bool set_name) build_fh_pc (path_conv& pc)
{ {
fhandler_base *fh = fh_alloc (pc); fhandler_base *fh = fh_alloc (pc);
@ -604,35 +616,38 @@ build_fh_pc (path_conv& pc, bool set_name)
set_errno (ENXIO); set_errno (ENXIO);
goto out; goto out;
} }
else if (fh->get_name ())
/* already got one */;
else if (fh->dev () != FH_NADA)
fh->set_name (fh->dev ().name);
else if (set_name)
fh->set_name (pc);
if (!fh->use_archetype ()) if (!fh->use_archetype ())
/* doesn't use archetypes */; fh->set_name (pc);
else if ((fh->archetype = cygheap->fdtab.find_archetype (fh->dev ()))) else if ((fh->archetype = cygheap->fdtab.find_archetype (fh->dev ())))
debug_printf ("found an archetype for %s(%d/%d) io_handle %p", fh->get_name (), fh->dev ().get_major (), fh->dev ().get_minor (), {
fh->archetype->get_io_handle ()); debug_printf ("found an archetype for %s(%d/%d) io_handle %p", fh->get_name (), fh->dev ().get_major (), fh->dev ().get_minor (),
fh->archetype->get_io_handle ());
if (!fh->get_name ())
fh->set_name (fh->archetype->dev ().name);
}
else if (cygwin_finished_initializing && !pc.isopen ())
fh->set_name (pc);
else else
{ {
if (!fh->get_name ())
fh->set_name (fh->dev ().name);
fh->archetype = fh->clone (); fh->archetype = fh->clone ();
debug_printf ("created an archetype (%p) for %s(%d/%d)", fh->archetype, fh->get_name (), fh->dev ().get_major (), fh->dev ().get_minor ()); debug_printf ("created an archetype (%p) for %s(%d/%d)", fh->archetype, fh->get_name (), fh->dev ().get_major (), fh->dev ().get_minor ());
fh->archetype->archetype = NULL; fh->archetype->archetype = NULL;
*cygheap->fdtab.add_archetype () = fh->archetype; *cygheap->fdtab.add_archetype () = fh->archetype;
} }
/* The fhandler_termios constructor keeps track of the last tty-like thing
opened but we're only interested in this if we don't have a controlling /* Keep track of the last tty-like thing opened. We could potentially want
terminal since we could potentially want to open it if /dev/tty is to open it if /dev/tty is referenced. */
referenced. */
if (myself->ctty > 0 || !fh->is_tty () || !pc.isctty_capable ()) if (myself->ctty > 0 || !fh->is_tty () || !pc.isctty_capable ())
fhandler_termios::last = NULL; last_tty_dev = FH_NADA;
else
last_tty_dev = fh->dev ();
out: out:
debug_printf ("fh %p, dev %p", fh, (DWORD) fh->dev ()); debug_printf ("fh %p, dev %p", fh, fh ? (DWORD) fh->dev () : 0);
return fh; return fh;
} }
@ -668,9 +683,10 @@ dtable::dup_worker (fhandler_base *oldfh, int flags)
debug_printf ("duped output_handles old %p, new %p", debug_printf ("duped output_handles old %p, new %p",
oldfh->get_output_handle (), oldfh->get_output_handle (),
newfh->get_output_handle ()); newfh->get_output_handle ());
debug_printf ("duped output_handles archetype old %p, archetype new %p", if (oldfh->archetype)
oldfh->archetype->get_output_handle (), debug_printf ("duped output_handles archetype old %p, archetype new %p",
newfh->archetype->get_output_handle ()); oldfh->archetype->get_output_handle (),
newfh->archetype->get_output_handle ());
#endif /*DEBUGGING*/ #endif /*DEBUGGING*/
} }
} }

View File

@ -95,7 +95,7 @@ public:
fhandler_base *build_fh_dev (const device&, const char * = NULL); fhandler_base *build_fh_dev (const device&, const char * = NULL);
fhandler_base *build_fh_name (const char *, unsigned = 0, suffix_info * = NULL); fhandler_base *build_fh_name (const char *, unsigned = 0, suffix_info * = NULL);
fhandler_base *build_fh_pc (path_conv& pc, bool set_name = true); fhandler_base *build_fh_pc (path_conv& pc);
void dtable_init (); void dtable_init ();
void stdio_init (); void stdio_init ();

View File

@ -40,7 +40,7 @@ struct __cygwin_perfile *perfile_table;
void void
fhandler_base::reset (const fhandler_base *from) fhandler_base::reset (const fhandler_base *from)
{ {
pc = from->pc; pc << from->pc;
rabuf = NULL; rabuf = NULL;
ralen = 0; ralen = 0;
raixget = 0; raixget = 0;
@ -148,7 +148,7 @@ fhandler_base::get_readahead_into_buffer (char *buf, size_t buflen)
void void
fhandler_base::set_name (path_conv &in_pc) fhandler_base::set_name (path_conv &in_pc)
{ {
pc = in_pc; pc << in_pc;
} }
char *fhandler_base::get_proc_fd_name (char *buf) char *fhandler_base::get_proc_fd_name (char *buf)

View File

@ -437,7 +437,7 @@ public:
virtual fhandler_base *clone () virtual fhandler_base *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_base)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_base));
fhandler_base *fh = new (ptr) fhandler_base (ptr); fhandler_base *fh = new (ptr) fhandler_base (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -604,7 +604,7 @@ class fhandler_socket: public fhandler_base
fhandler_socket *clone () fhandler_socket *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_socket)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_socket));
fhandler_socket *fh = new (ptr) fhandler_socket (ptr); fhandler_socket *fh = new (ptr) fhandler_socket (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -658,7 +658,7 @@ public:
virtual fhandler_base_overlapped *clone () virtual fhandler_base_overlapped *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_base_overlapped)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_base_overlapped));
fhandler_base_overlapped *fh = new (ptr) fhandler_base_overlapped (ptr); fhandler_base_overlapped *fh = new (ptr) fhandler_base_overlapped (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -704,7 +704,7 @@ public:
fhandler_pipe *clone () fhandler_pipe *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_pipe)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_pipe));
fhandler_pipe *fh = new (ptr) fhandler_pipe (ptr); fhandler_pipe *fh = new (ptr) fhandler_pipe (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -754,7 +754,7 @@ public:
fhandler_fifo *clone () fhandler_fifo *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_fifo)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_fifo));
fhandler_fifo *fh = new (ptr) fhandler_fifo (ptr); fhandler_fifo *fh = new (ptr) fhandler_fifo (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -783,7 +783,7 @@ class fhandler_mailslot : public fhandler_base_overlapped
fhandler_mailslot *clone () fhandler_mailslot *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_mailslot)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_mailslot));
fhandler_mailslot *fh = new (ptr) fhandler_mailslot (ptr); fhandler_mailslot *fh = new (ptr) fhandler_mailslot (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -832,7 +832,7 @@ class fhandler_dev_raw: public fhandler_base
fhandler_dev_raw *clone () fhandler_dev_raw *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_dev_raw)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_dev_raw));
fhandler_dev_raw *fh = new (ptr) fhandler_dev_raw (ptr); fhandler_dev_raw *fh = new (ptr) fhandler_dev_raw (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -892,7 +892,7 @@ class fhandler_dev_floppy: public fhandler_dev_raw
fhandler_dev_floppy *clone () fhandler_dev_floppy *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_dev_floppy)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_dev_floppy));
fhandler_dev_floppy *fh = new (ptr) fhandler_dev_floppy (ptr); fhandler_dev_floppy *fh = new (ptr) fhandler_dev_floppy (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -940,7 +940,7 @@ class fhandler_dev_tape: public fhandler_dev_raw
fhandler_dev_tape *clone () fhandler_dev_tape *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_dev_tape)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_dev_tape));
fhandler_dev_tape *fh = new (ptr) fhandler_dev_tape (ptr); fhandler_dev_tape *fh = new (ptr) fhandler_dev_tape (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -1006,7 +1006,7 @@ class fhandler_disk_file: public fhandler_base
fhandler_disk_file *clone () fhandler_disk_file *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_disk_file)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_disk_file));
fhandler_disk_file *fh = new (ptr) fhandler_disk_file (ptr); fhandler_disk_file *fh = new (ptr) fhandler_disk_file (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -1044,7 +1044,7 @@ class fhandler_cygdrive: public fhandler_disk_file
fhandler_cygdrive *clone () fhandler_cygdrive *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_cygdrive)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_cygdrive));
fhandler_cygdrive *fh = new (ptr) fhandler_cygdrive (ptr); fhandler_cygdrive *fh = new (ptr) fhandler_cygdrive (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -1108,7 +1108,7 @@ class fhandler_serial: public fhandler_base
fhandler_serial *clone () fhandler_serial *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_serial)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_serial));
fhandler_serial *fh = new (ptr) fhandler_serial (ptr); fhandler_serial *fh = new (ptr) fhandler_serial (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -1134,18 +1134,11 @@ class fhandler_termios: public fhandler_base
tty_min *_tc; tty_min *_tc;
tty *get_ttyp () {return (tty *) tc ();} tty *get_ttyp () {return (tty *) tc ();}
public: public:
static fhandler_termios *last;
tty_min*& tc () {return _tc;} tty_min*& tc () {return _tc;}
fhandler_termios () : fhandler_termios () :
fhandler_base () fhandler_base ()
{ {
need_fork_fixup (true); need_fork_fixup (true);
last = this;
}
~fhandler_termios ()
{
if (this == last)
last = NULL;
} }
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&);
@ -1173,7 +1166,7 @@ class fhandler_termios: public fhandler_base
virtual fhandler_termios *clone () virtual fhandler_termios *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_termios)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_termios));
fhandler_termios *fh = new (ptr) fhandler_termios (ptr); fhandler_termios *fh = new (ptr) fhandler_termios (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -1372,7 +1365,7 @@ private:
fhandler_console *clone () fhandler_console *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_console)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_console));
fhandler_console *fh = new (ptr) fhandler_console (ptr); fhandler_console *fh = new (ptr) fhandler_console (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -1415,7 +1408,7 @@ class fhandler_pty_common: public fhandler_termios
virtual fhandler_pty_common *clone () virtual fhandler_pty_common *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_pty_common)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_pty_common));
fhandler_pty_common *fh = new (ptr) fhandler_pty_common (ptr); fhandler_pty_common *fh = new (ptr) fhandler_pty_common (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -1469,7 +1462,7 @@ class fhandler_pty_slave: public fhandler_pty_common
fhandler_pty_slave *clone () fhandler_pty_slave *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_pty_slave)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_pty_slave));
fhandler_pty_slave *fh = new (ptr) fhandler_pty_slave (ptr); fhandler_pty_slave *fh = new (ptr) fhandler_pty_slave (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -1527,7 +1520,7 @@ public:
fhandler_pty_master *clone () fhandler_pty_master *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_pty_master)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_pty_master));
fhandler_pty_master *fh = new (ptr) fhandler_pty_master (ptr); fhandler_pty_master *fh = new (ptr) fhandler_pty_master (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -1554,7 +1547,7 @@ class fhandler_dev_null: public fhandler_base
fhandler_dev_null *clone () fhandler_dev_null *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_dev_null)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_dev_null));
fhandler_dev_null *fh = new (ptr) fhandler_dev_null (ptr); fhandler_dev_null *fh = new (ptr) fhandler_dev_null (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -1589,7 +1582,7 @@ class fhandler_dev_zero: public fhandler_base
fhandler_dev_zero *clone () fhandler_dev_zero *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_dev_zero)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_dev_zero));
fhandler_dev_zero *fh = new (ptr) fhandler_dev_zero (ptr); fhandler_dev_zero *fh = new (ptr) fhandler_dev_zero (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -1627,7 +1620,7 @@ class fhandler_dev_random: public fhandler_base
fhandler_dev_random *clone () fhandler_dev_random *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_dev_random)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_dev_random));
fhandler_dev_random *fh = new (ptr) fhandler_dev_random (ptr); fhandler_dev_random *fh = new (ptr) fhandler_dev_random (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -1667,7 +1660,7 @@ class fhandler_dev_mem: public fhandler_base
fhandler_dev_mem *clone () fhandler_dev_mem *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_dev_mem)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_dev_mem));
fhandler_dev_mem *fh = new (ptr) fhandler_dev_mem (ptr); fhandler_dev_mem *fh = new (ptr) fhandler_dev_mem (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -1703,7 +1696,7 @@ class fhandler_dev_clipboard: public fhandler_base
fhandler_dev_clipboard *clone () fhandler_dev_clipboard *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_dev_clipboard)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_dev_clipboard));
fhandler_dev_clipboard *fh = new (ptr) fhandler_dev_clipboard (ptr); fhandler_dev_clipboard *fh = new (ptr) fhandler_dev_clipboard (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -1742,7 +1735,7 @@ class fhandler_windows: public fhandler_base
fhandler_windows *clone () fhandler_windows *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_windows)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_windows));
fhandler_windows *fh = new (ptr) fhandler_windows (ptr); fhandler_windows *fh = new (ptr) fhandler_windows (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -1789,7 +1782,7 @@ class fhandler_dev_dsp: public fhandler_base
fhandler_dev_dsp *clone () fhandler_dev_dsp *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_dev_dsp)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_dev_dsp));
fhandler_dev_dsp *fh = new (ptr) fhandler_dev_dsp (ptr); fhandler_dev_dsp *fh = new (ptr) fhandler_dev_dsp (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -1840,7 +1833,7 @@ class fhandler_virtual : public fhandler_base
virtual fhandler_virtual *clone () virtual fhandler_virtual *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_virtual)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_virtual));
fhandler_virtual *fh = new (ptr) fhandler_virtual (ptr); fhandler_virtual *fh = new (ptr) fhandler_virtual (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -1872,7 +1865,7 @@ class fhandler_proc: public fhandler_virtual
virtual fhandler_proc *clone () virtual fhandler_proc *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_proc)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_proc));
fhandler_proc *fh = new (ptr) fhandler_proc (ptr); fhandler_proc *fh = new (ptr) fhandler_proc (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -1908,7 +1901,7 @@ class fhandler_procsys: public fhandler_virtual
fhandler_procsys *clone () fhandler_procsys *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_procsys)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_procsys));
fhandler_procsys *fh = new (ptr) fhandler_procsys (ptr); fhandler_procsys *fh = new (ptr) fhandler_procsys (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -1937,7 +1930,7 @@ class fhandler_procsysvipc: public fhandler_proc
fhandler_procsysvipc *clone () fhandler_procsysvipc *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_procsysvipc)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_procsysvipc));
fhandler_procsysvipc *fh = new (ptr) fhandler_procsysvipc (ptr); fhandler_procsysvipc *fh = new (ptr) fhandler_procsysvipc (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -1967,7 +1960,7 @@ class fhandler_netdrive: public fhandler_virtual
fhandler_netdrive *clone () fhandler_netdrive *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_netdrive)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_netdrive));
fhandler_netdrive *fh = new (ptr) fhandler_netdrive (ptr); fhandler_netdrive *fh = new (ptr) fhandler_netdrive (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -2007,7 +2000,7 @@ class fhandler_registry: public fhandler_proc
fhandler_registry *clone () fhandler_registry *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_registry)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_registry));
fhandler_registry *fh = new (ptr) fhandler_registry (ptr); fhandler_registry *fh = new (ptr) fhandler_registry (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -2039,7 +2032,7 @@ class fhandler_process: public fhandler_proc
fhandler_process *clone () fhandler_process *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_process)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_process));
fhandler_process *fh = new (ptr) fhandler_process (ptr); fhandler_process *fh = new (ptr) fhandler_process (ptr);
copyto (fh); copyto (fh);
return fh; return fh;
@ -2068,7 +2061,7 @@ class fhandler_procnet: public fhandler_proc
fhandler_procnet *clone () fhandler_procnet *clone ()
{ {
void *ptr = (void *) cmalloc (HEAP_FHANDLER, sizeof (fhandler_procnet)); void *ptr = (void *) ccalloc (HEAP_FHANDLER, 1, sizeof (fhandler_procnet));
fhandler_procnet *fh = new (ptr) fhandler_procnet (ptr); fhandler_procnet *fh = new (ptr) fhandler_procnet (ptr);
copyto (fh); copyto (fh);
return fh; return fh;

View File

@ -784,7 +784,7 @@ fhandler_console::open (int flags, mode_t)
/* Open the input handle as handle_ */ /* Open the input handle as handle_ */
h = CreateFile ("CONIN$", GENERIC_READ | GENERIC_WRITE, h = CreateFile ("CONIN$", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, sec_none_cloexec (flags), FILE_SHARE_READ | FILE_SHARE_WRITE, &sec_none,
OPEN_EXISTING, 0, 0); OPEN_EXISTING, 0, 0);
if (h == INVALID_HANDLE_VALUE) if (h == INVALID_HANDLE_VALUE)
@ -795,7 +795,7 @@ fhandler_console::open (int flags, mode_t)
set_io_handle (h); set_io_handle (h);
h = CreateFile ("CONOUT$", GENERIC_READ | GENERIC_WRITE, h = CreateFile ("CONOUT$", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, sec_none_cloexec (flags), FILE_SHARE_READ | FILE_SHARE_WRITE, &sec_none,
OPEN_EXISTING, 0, 0); OPEN_EXISTING, 0, 0);
if (h == INVALID_HANDLE_VALUE) if (h == INVALID_HANDLE_VALUE)
@ -2197,8 +2197,6 @@ fhandler_console::init (HANDLE h, DWORD a, mode_t bin)
if (a == (GENERIC_READ | GENERIC_WRITE)) if (a == (GENERIC_READ | GENERIC_WRITE))
flags = O_RDWR; flags = O_RDWR;
open_with_arch (flags | O_BINARY | (h ? 0 : O_NOCTTY)); open_with_arch (flags | O_BINARY | (h ? 0 : O_NOCTTY));
if (h && h != INVALID_HANDLE_VALUE)
CloseHandle (h); /* Reopened by open */
return !tcsetattr (0, &get_ttyp ()->ti); return !tcsetattr (0, &get_ttyp ()->ti);
} }

View File

@ -21,8 +21,6 @@ details. */
#include "cygtls.h" #include "cygtls.h"
#include "ntdll.h" #include "ntdll.h"
fhandler_termios *fhandler_termios::last;
/* Common functions shared by tty/console */ /* Common functions shared by tty/console */
void void

View File

@ -16,6 +16,7 @@ details. */
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <fcntl.h> #include <fcntl.h>
#include <alloca.h>
inline bool inline bool
has_attribute (DWORD attributes, DWORD attribs_to_test) has_attribute (DWORD attributes, DWORD attribs_to_test)
@ -294,11 +295,12 @@ class path_conv
cfree_and_null (normalized_path); cfree_and_null (normalized_path);
cfree_and_null (wide_path); cfree_and_null (wide_path);
} }
path_conv &operator =(const path_conv& pc) path_conv& eq_worker (const path_conv& pc, const char *in_path,
const char *in_normalized_path)
{ {
free_strings (); free_strings ();
memcpy (this, &pc, sizeof pc); memcpy (this, &pc, sizeof pc);
path = cstrdup (pc.path); path = cstrdup (in_path);
conv_handle.dup (pc.conv_handle); conv_handle.dup (pc.conv_handle);
normalized_path = cstrdup(pc.normalized_path); normalized_path = cstrdup(pc.normalized_path);
if (pc.wide_path) if (pc.wide_path)
@ -310,6 +312,32 @@ class path_conv
} }
return *this; return *this;
} }
path_conv &operator << (const path_conv& pc)
{
const char *save_path;
const char *save_normalized_path;
if (!path)
save_path = pc.path;
else
{
save_path = (char *) alloca (strlen (path) + 1);
strcpy ((char *) save_path, path);
}
if (!normalized_path)
save_normalized_path = pc.normalized_path;
else
{
save_normalized_path = (char *) alloca (strlen (normalized_path) + 1);
strcpy ((char *) save_normalized_path, path);
}
return eq_worker (pc, save_path, save_normalized_path);
}
path_conv &operator =(const path_conv& pc)
{
return eq_worker (pc, pc.path, pc.normalized_path);
}
DWORD get_devn () {return (DWORD) dev;} DWORD get_devn () {return (DWORD) dev;}
short get_unitn () const {return dev.get_minor ();} short get_unitn () const {return dev.get_minor ();}
DWORD file_attributes () const {return fileattr;} DWORD file_attributes () const {return fileattr;}

View File

@ -375,6 +375,9 @@ _pinfo::_ctty (char *buf)
bool bool
_pinfo::set_ctty (fhandler_termios *fh, int flags) _pinfo::set_ctty (fhandler_termios *fh, int flags)
{ {
debug_printf ("fh %p", fh);
debug_printf ("tc %p", fh->tc ());
if (!this || !fh->tc ()) try_to_debug ();
tty_min& tc = *fh->tc (); tty_min& tc = *fh->tc ();
debug_printf ("old %s, ctty device number %p, tc.ntty device number %p flags & O_NOCTTY %p", __ctty (), ctty, tc.ntty, flags & O_NOCTTY); debug_printf ("old %s, ctty device number %p, tc.ntty device number %p flags & O_NOCTTY %p", __ctty (), ctty, tc.ntty, flags & O_NOCTTY);
if (fh && &tc && (ctty <= 0 || ctty == tc.ntty) && !(flags & O_NOCTTY)) if (fh && &tc && (ctty <= 0 || ctty == tc.ntty) && !(flags & O_NOCTTY))

View File

@ -33,8 +33,6 @@ details. */
#define no_signals_available(x) (!my_sendsig || ((x) && myself->exitcode & EXITCODE_SET) || (&_my_tls == _sig_tls)) #define no_signals_available(x) (!my_sendsig || ((x) && myself->exitcode & EXITCODE_SET) || (&_my_tls == _sig_tls))
#define NPROCS 256
/* /*
* Global variables * Global variables
*/ */