diff options
Diffstat (limited to 'term')
-rw-r--r-- | term/Makefile | 2 | ||||
-rw-r--r-- | term/mig-mutate.h | 24 | ||||
-rw-r--r-- | term/ptyio.c | 48 | ||||
-rw-r--r-- | term/users.c | 225 |
4 files changed, 130 insertions, 169 deletions
diff --git a/term/Makefile b/term/Makefile index 025a9b39..9537c601 100644 --- a/term/Makefile +++ b/term/Makefile @@ -32,3 +32,5 @@ OBJS = $(subst .c,.o,$(SRCS)) termServer.o device_replyServer.o tioctlServer.o o include ../Makeconf device_replyServer-CPPFLAGS = -DTypeCheck=0 -Wno-unused # XXX + +tioctl-MIGSFLAGS = -imacros $(srcdir)/mig-mutate.h diff --git a/term/mig-mutate.h b/term/mig-mutate.h new file mode 100644 index 00000000..7cc13aaa --- /dev/null +++ b/term/mig-mutate.h @@ -0,0 +1,24 @@ +/* + Copyright (C) 2014 Free Software Foundation, Inc. + Written by Justus Winter. + + This file is part of the GNU Hurd. + + The GNU Hurd is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2, or (at + your option) any later version. + + The GNU Hurd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the GNU Hurd. If not, see <http://www.gnu.org/licenses/>. */ + +/* Only CPP macro definitions should go in this file. */ + +#define IO_INTRAN trivfs_protid_t trivfs_begin_using_protid (io_t) +#define IO_DESTRUCTOR trivfs_end_using_protid (trivfs_protid_t) +#define TIOCTL_IMPORTS import "../libtrivfs/mig-decls.h"; diff --git a/term/ptyio.c b/term/ptyio.c index 2da7d6c8..211e70a8 100644 --- a/term/ptyio.c +++ b/term/ptyio.c @@ -512,12 +512,12 @@ pty_io_select (struct trivfs_protid *cred, mach_port_t reply, } error_t -S_tioctl_tiocsig (io_t port, +S_tioctl_tiocsig (struct trivfs_protid *cred, int sig) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, - port, pty_class); - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket + || cred->pi.class != pty_class) return EOPNOTSUPP; pthread_mutex_lock (&global_lock); @@ -529,20 +529,18 @@ S_tioctl_tiocsig (io_t port, send_signal (sig); pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return 0; } error_t -S_tioctl_tiocpkt (io_t port, +S_tioctl_tiocpkt (struct trivfs_protid *cred, int mode) { error_t err; - - struct trivfs_protid *cred = ports_lookup_port (term_bucket, - port, pty_class); - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket + || cred->pi.class != pty_class) return EOPNOTSUPP; pthread_mutex_lock (&global_lock); @@ -559,20 +557,18 @@ S_tioctl_tiocpkt (io_t port, } pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return err; } error_t -S_tioctl_tiocucntl (io_t port, +S_tioctl_tiocucntl (struct trivfs_protid *cred, int mode) { error_t err; - - struct trivfs_protid *cred = ports_lookup_port (term_bucket, - port, pty_class); - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket + || cred->pi.class != pty_class) return EOPNOTSUPP; pthread_mutex_lock (&global_lock); @@ -589,19 +585,17 @@ S_tioctl_tiocucntl (io_t port, } pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return err; } error_t -S_tioctl_tiocremote (io_t port, +S_tioctl_tiocremote (struct trivfs_protid *cred, int how) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, - port, pty_class); - - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket + || cred->pi.class != pty_class) return EOPNOTSUPP; pthread_mutex_lock (&global_lock); @@ -611,17 +605,16 @@ S_tioctl_tiocremote (io_t port, clear_queue (rawq); ptyio_notice_input_flushed (); pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return 0; } error_t -S_tioctl_tiocext (io_t port, +S_tioctl_tiocext (struct trivfs_protid *cred, int mode) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, - port, pty_class); - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket + || cred->pi.class != pty_class) return EOPNOTSUPP; pthread_mutex_lock (&global_lock); @@ -646,6 +639,5 @@ S_tioctl_tiocext (io_t port, termstate.c_lflag &= ~EXTPROC; } pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return 0; } diff --git a/term/users.c b/term/users.c index eacd150a..3f558390 100644 --- a/term/users.c +++ b/term/users.c @@ -902,19 +902,18 @@ trivfs_S_io_revoke (struct trivfs_protid *cred, /* TIOCMODG ioctl -- Get modem state */ kern_return_t -S_tioctl_tiocmodg (io_t port, +S_tioctl_tiocmodg (struct trivfs_protid *cred, int *state) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t err = 0; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -922,24 +921,22 @@ S_tioctl_tiocmodg (io_t port, err = (*bottom->mdmstate) (state); pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return err; } /* TIOCMODS ioctl -- Set modem state */ kern_return_t -S_tioctl_tiocmods (io_t port, +S_tioctl_tiocmods (struct trivfs_protid *cred, int state) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t err; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -952,23 +949,21 @@ S_tioctl_tiocmods (io_t port, pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return err; } /* TIOCEXCL ioctl -- Set exclusive use */ kern_return_t -S_tioctl_tiocexcl (io_t port) +S_tioctl_tiocexcl (struct trivfs_protid *cred) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t err; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -983,24 +978,22 @@ S_tioctl_tiocexcl (io_t port) } pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return err; } /* TIOCNXCL ioctl -- Clear exclusive use */ kern_return_t -S_tioctl_tiocnxcl (io_t port) +S_tioctl_tiocnxcl (struct trivfs_protid *cred) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t err; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -1014,25 +1007,23 @@ S_tioctl_tiocnxcl (io_t port) } pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return err; } /* TIOCFLUSH ioctl -- Flush input, output, or both */ kern_return_t -S_tioctl_tiocflush (io_t port, +S_tioctl_tiocflush (struct trivfs_protid *cred, int flags) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t err = 0; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -1056,26 +1047,23 @@ S_tioctl_tiocflush (io_t port, } pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return err; } /* TIOCGETA ioctl -- Get termios state */ kern_return_t -S_tioctl_tiocgeta (io_t port, +S_tioctl_tiocgeta (struct trivfs_protid *cred, tcflag_t *modes, cc_t *ccs, speed_t *speeds) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); - - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -1089,30 +1077,28 @@ S_tioctl_tiocgeta (io_t port, speeds[1] = termstate.__ospeed; pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return 0; } /* Common code for the varios TIOCSET* commands. */ static error_t -set_state (io_t port, +set_state (struct trivfs_protid *cred, tcflag_t *modes, cc_t *ccs, speed_t *speeds, int draino, int flushi) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t err; struct termios state; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -1181,80 +1167,75 @@ set_state (io_t port, leave: pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return err; } /* TIOCSETA -- Set termios state */ kern_return_t -S_tioctl_tiocseta (io_t port, +S_tioctl_tiocseta (struct trivfs_protid *cred, tcflag_t *modes, cc_t *ccs, speed_t *speeds) { - return set_state (port, modes, ccs, speeds, 0, 0); + return set_state (cred, modes, ccs, speeds, 0, 0); } /* Drain output, then set term state. */ kern_return_t -S_tioctl_tiocsetaw (io_t port, +S_tioctl_tiocsetaw (struct trivfs_protid *cred, tcflag_t *modes, cc_t *ccs, speed_t *speeds) { - return set_state (port, modes, ccs, speeds, 1, 0); + return set_state (cred, modes, ccs, speeds, 1, 0); } /* Flush input, drain output, then set term state. */ kern_return_t -S_tioctl_tiocsetaf (io_t port, +S_tioctl_tiocsetaf (struct trivfs_protid *cred, tcflag_t *modes, cc_t *ccs, speed_t *speeds) { - return set_state (port, modes, ccs, speeds, 1, 1); + return set_state (cred, modes, ccs, speeds, 1, 1); } /* TIOCGETD -- Return line discipline */ kern_return_t -S_tioctl_tiocgetd (io_t port, +S_tioctl_tiocgetd (struct trivfs_protid *cred, int *disc) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); - - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } *disc = 0; - ports_port_deref (cred); return 0; } /* TIOCSETD -- Set line discipline */ kern_return_t -S_tioctl_tiocsetd (io_t port, +S_tioctl_tiocsetd (struct trivfs_protid *cred, int disc) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t err; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -1268,24 +1249,22 @@ S_tioctl_tiocsetd (io_t port, else err = 0; - ports_port_deref (cred); return err; } /* TIOCDRAIN -- Wait for output to drain */ kern_return_t -S_tioctl_tiocdrain (io_t port) +S_tioctl_tiocdrain (struct trivfs_protid *cred) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t err; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -1293,31 +1272,28 @@ S_tioctl_tiocdrain (io_t port) if (!(cred->po->openmodes & O_WRITE)) { pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return EBADF; } err = drain_output (); pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return err; } /* TIOCSWINSZ -- Set window size */ kern_return_t -S_tioctl_tiocswinsz (io_t port, +S_tioctl_tiocswinsz (struct trivfs_protid *cred, struct winsize size) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t err; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -1328,8 +1304,6 @@ S_tioctl_tiocswinsz (io_t port, else err = 0; - ports_port_deref (cred); - if (! err && (size.ws_row != window_size.ws_row || size.ws_col != window_size.ws_col @@ -1348,18 +1322,16 @@ S_tioctl_tiocswinsz (io_t port, /* TIOCGWINSZ -- Fetch window size */ kern_return_t -S_tioctl_tiocgwinsz (io_t port, +S_tioctl_tiocgwinsz (struct trivfs_protid *cred, struct winsize *size) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); - - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -1367,25 +1339,23 @@ S_tioctl_tiocgwinsz (io_t port, *size = window_size; pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return 0; } /* TIOCMGET -- Fetch all modem bits */ kern_return_t -S_tioctl_tiocmget (io_t port, +S_tioctl_tiocmget (struct trivfs_protid *cred, int *bits) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t err = 0; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -1393,25 +1363,23 @@ S_tioctl_tiocmget (io_t port, err = (*bottom->mdmstate) (bits); pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return err; } /* TIOCMSET -- Set all modem bits */ kern_return_t -S_tioctl_tiocmset (io_t port, +S_tioctl_tiocmset (struct trivfs_protid *cred, int bits) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t err; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -1422,25 +1390,23 @@ S_tioctl_tiocmset (io_t port, err = (*bottom->mdmctl) (MDMCTL_SET, bits); pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return err; } /* TIOCMBIC -- Clear some modem bits */ kern_return_t -S_tioctl_tiocmbic (io_t port, +S_tioctl_tiocmbic (struct trivfs_protid *cred, int bits) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t err; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -1451,25 +1417,23 @@ S_tioctl_tiocmbic (io_t port, err = (*bottom->mdmctl) (MDMCTL_BIC, bits); pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return err; } /* TIOCMBIS -- Set some modem bits */ kern_return_t -S_tioctl_tiocmbis (io_t port, +S_tioctl_tiocmbis (struct trivfs_protid *cred, int bits) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t err; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -1480,24 +1444,22 @@ S_tioctl_tiocmbis (io_t port, else err = (*bottom->mdmctl) (MDMCTL_BIS, bits); pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return err; } /* TIOCSTART -- start output as if VSTART were typed */ kern_return_t -S_tioctl_tiocstart (io_t port) +S_tioctl_tiocstart (struct trivfs_protid *cred) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t err; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -1516,24 +1478,22 @@ S_tioctl_tiocstart (io_t port) } pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return err; } /* TIOCSTOP -- stop output as if VSTOP were typed */ kern_return_t -S_tioctl_tiocstop (io_t port) +S_tioctl_tiocstop (struct trivfs_protid *cred) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t err; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } pthread_mutex_lock (&global_lock); @@ -1550,25 +1510,23 @@ S_tioctl_tiocstop (io_t port) } pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return err; } /* TIOCSTI -- Simulate terminal input */ kern_return_t -S_tioctl_tiocsti (io_t port, +S_tioctl_tiocsti (struct trivfs_protid *cred, char c) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t err; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -1587,25 +1545,23 @@ S_tioctl_tiocsti (io_t port, } pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return err; } /* TIOCOUTQ -- return output queue size */ kern_return_t -S_tioctl_tiocoutq (io_t port, +S_tioctl_tiocoutq (struct trivfs_protid *cred, int *queue_size) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t err; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -1620,25 +1576,23 @@ S_tioctl_tiocoutq (io_t port, } pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return err; } /* TIOCSPGRP -- set pgrp of terminal */ kern_return_t -S_tioctl_tiocspgrp (io_t port, +S_tioctl_tiocspgrp (struct trivfs_protid *cred, int pgrp) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t err; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -1653,25 +1607,23 @@ S_tioctl_tiocspgrp (io_t port, } pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return err; } /* TIOCGPGRP --- fetch pgrp of terminal */ kern_return_t -S_tioctl_tiocgpgrp (io_t port, +S_tioctl_tiocgpgrp (struct trivfs_protid *cred, int *pgrp) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t ret; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -1685,24 +1637,22 @@ S_tioctl_tiocgpgrp (io_t port, } pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return ret; } /* TIOCCDTR -- clear DTR */ kern_return_t -S_tioctl_tioccdtr (io_t port) +S_tioctl_tioccdtr (struct trivfs_protid *cred) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t err; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -1713,24 +1663,22 @@ S_tioctl_tioccdtr (io_t port) err = (*bottom->mdmctl) (MDMCTL_BIC, TIOCM_DTR); pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return err; } /* TIOCSDTR -- set DTR */ kern_return_t -S_tioctl_tiocsdtr (io_t port) +S_tioctl_tiocsdtr (struct trivfs_protid *cred) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t err; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -1741,24 +1689,22 @@ S_tioctl_tiocsdtr (io_t port) err = (*bottom->mdmctl) (MDMCTL_BIS, TIOCM_DTR); pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return err; } /* TIOCCBRK -- Clear break condition */ kern_return_t -S_tioctl_tioccbrk (io_t port) +S_tioctl_tioccbrk (struct trivfs_protid *cred) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t err; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -1769,24 +1715,22 @@ S_tioctl_tioccbrk (io_t port) err = (*bottom->clear_break) (); pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return err; } /* TIOCSBRK -- Set break condition */ kern_return_t -S_tioctl_tiocsbrk (io_t port) +S_tioctl_tiocsbrk (struct trivfs_protid *cred) { - struct trivfs_protid *cred = ports_lookup_port (term_bucket, port, 0); error_t err; - if (!cred) + if (!cred + || cred->pi.bucket != term_bucket) return EOPNOTSUPP; if (cred->pi.class != pty_class && cred->pi.class != tty_class) { - ports_port_deref (cred); return EOPNOTSUPP; } @@ -1797,7 +1741,6 @@ S_tioctl_tiocsbrk (io_t port) err = (*bottom->set_break) (); pthread_mutex_unlock (&global_lock); - ports_port_deref (cred); return err; } |