diff options
Diffstat (limited to 'hurd')
-rw-r--r-- | hurd/hurdioctl.c | 44 |
1 files changed, 25 insertions, 19 deletions
diff --git a/hurd/hurdioctl.c b/hurd/hurdioctl.c index 7c68984..1da8c05 100644 --- a/hurd/hurdioctl.c +++ b/hurd/hurdioctl.c @@ -1,5 +1,5 @@ /* ioctl commands which must be done in the C library. - Copyright (C) 1994,95,96,97,99,2001,2002,2009 + Copyright (C) 1994,95,96,97,99,2001,2002,2009,2010 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -239,34 +239,40 @@ _hurd_setcttyid (mach_port_t cttyid) } -/* Make FD be the controlling terminal. - This function is called for `ioctl (fd, TCIOSCTTY)'. */ - -static int -tiocsctty (int fd, - int request) /* Always TIOCSCTTY. */ +static inline error_t +do_tiocsctty (io_t port, io_t ctty) { mach_port_t cttyid; error_t err; - /* Get FD's cttyid port, unless it is already ours. */ - err = HURD_DPORT_USE (fd, ctty != MACH_PORT_NULL ? EADDRINUSE : - __term_getctty (port, &cttyid)); - if (err == EADDRINUSE) - /* FD is already the ctty. Nothing to do. */ + if (ctty != MACH_PORT_NULL) + /* PORT is already the ctty. Nothing to do. */ return 0; - else if (err) - return __hurd_fail (err); + + /* Get PORT's cttyid port. */ + err = __term_getctty (port, &cttyid); + if (err) + return err; /* Change the terminal's pgrp to ours. */ - err = HURD_DPORT_USE (fd, __tioctl_tiocspgrp (port, _hurd_pgrp)); + err = __tioctl_tiocspgrp (port, _hurd_pgrp); if (err) - return __hurd_fail (err); + __mach_port_deallocate (__mach_task_self (), cttyid); + else + /* Make it our own. */ + install_ctty (cttyid); - /* Make it our own. */ - install_ctty (cttyid); + return err; +} - return 0; +/* Make FD be the controlling terminal. + This function is called for `ioctl (fd, TCIOSCTTY)'. */ + +static int +tiocsctty (int fd, + int request) /* Always TIOCSCTTY. */ +{ + return __hurd_fail (HURD_DPORT_USE (fd, tiocsctty_port (port, ctty))); } _HURD_HANDLE_IOCTL (tiocsctty, TIOCSCTTY); |