Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/ChangeLog18
-rw-r--r--winsup/cygwin/fhandler.h2
-rw-r--r--winsup/cygwin/fhandler_console.cc2
-rw-r--r--winsup/cygwin/fhandler_termios.cc8
-rw-r--r--winsup/cygwin/fhandler_tty.cc63
-rw-r--r--winsup/cygwin/include/sys/termios.h2
6 files changed, 68 insertions, 27 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 73e7134a8..e9ee7c864 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,21 @@
+2010-10-23 Christopher Faylor <me+cygwin@cgf.cx>
+
+ * fhandler.h (fhandler_termios::tcinit): Make second argument
+ non-optional.
+ * fhandler_console.cc (fhandler_console::open): Specify second argument
+ to tcinit.
+ * fhandler_termios.cc (fhandler_termios::tcinit): Rename second
+ argument. Set pgid to 0 if this is a pty master.
+ (fhandler_termios::tcgetpgrp): Just return value of pgid. It will be
+ zero if not initialized.
+ * fhandler_tty.cc (fhandler_tty_slave::open): Specify second argument
+ to tcinit.
+ (fhandler_tty_slave::ioctl): Implement TIOCGPRP/TIOCSPGRP. Fix switch
+ indentation.
+ (fhandler_tty_master::ioctl): Implement TIOCGPRP/TIOCSPGRP.
+ * include/sys/termios.h (TIOCGPGRP): Define similarly to Linux.
+ (TIOCSPGRP): Ditto.
+
2010-10-18 Marco Atzeri <marco_atzeri@yahoo.it>
* winsup/cygwin/cygwin.din: Add llround and llroundf.
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index 42a0f2407..66ebc1198 100644
--- a/winsup/cygwin/fhandler.h
+++ b/winsup/cygwin/fhandler.h
@@ -885,7 +885,7 @@ class fhandler_termios: public fhandler_base
HANDLE& get_output_handle () { return output_handle; }
line_edit_status line_edit (const char *rptr, int nread, termios&);
void set_output_handle (HANDLE h) { output_handle = h; }
- void tcinit (tty_min *this_tc, bool force = false);
+ void tcinit (tty_min *this_tc, bool force);
bool is_tty () const { return true; }
int tcgetpgrp ();
int tcsetpgrp (int pid);
diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc
index 05a0310a5..3cac714d1 100644
--- a/winsup/cygwin/fhandler_console.cc
+++ b/winsup/cygwin/fhandler_console.cc
@@ -695,7 +695,7 @@ fhandler_console::open (int flags, mode_t)
{
HANDLE h;
- tcinit (get_tty_stuff (flags));
+ tcinit (get_tty_stuff (flags), false);
set_io_handle (NULL);
set_output_handle (NULL);
diff --git a/winsup/cygwin/fhandler_termios.cc b/winsup/cygwin/fhandler_termios.cc
index 0f27a9838..6e0ad6777 100644
--- a/winsup/cygwin/fhandler_termios.cc
+++ b/winsup/cygwin/fhandler_termios.cc
@@ -23,13 +23,13 @@ details. */
/* Common functions shared by tty/console */
void
-fhandler_termios::tcinit (tty_min *this_tc, bool force)
+fhandler_termios::tcinit (tty_min *this_tc, bool is_pty_master)
{
/* Initial termios values */
tc = this_tc;
- if (force || !tc->initialized ())
+ if (is_pty_master || !tc->initialized ())
{
tc->ti.c_iflag = BRKINT | ICRNL | IXON;
tc->ti.c_oflag = OPOST | ONLCR;
@@ -55,7 +55,7 @@ fhandler_termios::tcinit (tty_min *this_tc, bool force)
tc->ti.c_cc[VWERASE] = CWERASE;
tc->ti.c_ispeed = tc->ti.c_ospeed = B38400;
- tc->pgid = myself->pgid;
+ tc->pgid = is_pty_master ? 0 : myself->pgid;
tc->initialized (true);
}
}
@@ -108,7 +108,7 @@ fhandler_termios::tcgetpgrp ()
int
fhandler_pty_master::tcgetpgrp ()
{
- return myself->ctty != -1 && myself->ctty == tc->ntty ? tc->pgid : 0;
+ return tc->pgid;
}
void
diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index 59c7345e8..898469750 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -484,7 +484,7 @@ fhandler_tty_slave::open (int flags, mode_t)
goto out;
}
- tcinit (cygwin_shared->tty[get_unit ()]);
+ tcinit (cygwin_shared->tty[get_unit ()], false);
cygwin_shared->tty.attach (get_unit ());
@@ -1065,6 +1065,21 @@ fhandler_tty_slave::ioctl (unsigned int cmd, void *arg)
set_nonblocking (*(int *) arg);
retval = 0;
goto out;
+ case TIOCGPGRP:
+ {
+ pid_t pid = this->tcgetpgrp ();
+ if (pid < 0)
+ retval = -1;
+ else
+ {
+ *((pid_t *) arg) = pid;
+ retval = 0;
+ }
+ }
+ goto out;
+ case TIOCSPGRP:
+ retval = this->tcsetpgrp ((pid_t) arg);
+ goto out;
default:
set_errno (EINVAL);
return -1;
@@ -1349,6 +1364,7 @@ fhandler_pty_master::open (int flags, mode_t)
//
// FIXME: Do this better someday
fhandler_pty_master *arch = (fhandler_tty_master *) cmalloc_abort (HEAP_ARCHETYPES, sizeof (*this));
+small_printf ("tty%d myself->sid %d myself->pid %d this->tcgetpgrp %d\n", get_unit (), myself->sid, myself->pid, this->tcgetpgrp ());
*((fhandler_pty_master **) cygheap->fdtab.add_archetype ()) = arch;
archetype = arch;
*arch = *this;
@@ -1510,26 +1526,31 @@ fhandler_pty_master::ioctl (unsigned int cmd, void *arg)
{
switch (cmd)
{
- case TIOCPKT:
- pktmode = *(int *) arg;
- break;
- case TIOCGWINSZ:
- *(struct winsize *) arg = get_ttyp ()->winsize;
- break;
- case TIOCSWINSZ:
- if (get_ttyp ()->winsize.ws_row != ((struct winsize *) arg)->ws_row
- || get_ttyp ()->winsize.ws_col != ((struct winsize *) arg)->ws_col)
- {
- get_ttyp ()->winsize = *(struct winsize *) arg;
- killsys (-get_ttyp ()->getpgid (), SIGWINCH);
- }
- break;
- case FIONBIO:
- set_nonblocking (*(int *) arg);
- break;
- default:
- set_errno (EINVAL);
- return -1;
+ case TIOCPKT:
+ pktmode = *(int *) arg;
+ break;
+ case TIOCGWINSZ:
+ *(struct winsize *) arg = get_ttyp ()->winsize;
+ break;
+ case TIOCSWINSZ:
+ if (get_ttyp ()->winsize.ws_row != ((struct winsize *) arg)->ws_row
+ || get_ttyp ()->winsize.ws_col != ((struct winsize *) arg)->ws_col)
+ {
+ get_ttyp ()->winsize = *(struct winsize *) arg;
+ killsys (-get_ttyp ()->getpgid (), SIGWINCH);
+ }
+ break;
+ case TIOCGPGRP:
+ *((pid_t *) arg) = this->tcgetpgrp ();
+ break;
+ case TIOCSPGRP:
+ return this->tcsetpgrp ((pid_t) arg);
+ case FIONBIO:
+ set_nonblocking (*(int *) arg);
+ break;
+ default:
+ set_errno (EINVAL);
+ return -1;
}
return 0;
}
diff --git a/winsup/cygwin/include/sys/termios.h b/winsup/cygwin/include/sys/termios.h
index c81d820ac..974a67404 100644
--- a/winsup/cygwin/include/sys/termios.h
+++ b/winsup/cygwin/include/sys/termios.h
@@ -348,5 +348,7 @@ struct winsize
#define TIOCGWINSZ (('T' << 8) | 1)
#define TIOCSWINSZ (('T' << 8) | 2)
#define TIOCLINUX (('T' << 8) | 3)
+#define TIOCGPGRP (('T' << 8) | 0xf)
+#define TIOCSPGRP (('T' << 8) | 0x10)
#endif /* _SYS_TERMIOS_H */