bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 1/2] term: fix receiver lookups in the tioctl server function


From: Samuel Thibault
Subject: Re: [PATCH 1/2] term: fix receiver lookups in the tioctl server functions
Date: Fri, 28 Feb 2014 15:02:25 -0500
User-agent: Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30)

Justus Winter, le Fri 28 Feb 2014 20:12:24 +0100, a écrit :
> * term/mig-mutate.h: New file.
> * term/Makefile: Set tioctl-MIGSFLAGS.
> * term/ptyio.c: Fix receiver lookups in the tioctl server functions.
> * term/users.c: Likewise.

Ack.

> ---
>  term/Makefile     |   2 +
>  term/mig-mutate.h |  24 ++++++
>  term/ptyio.c      |  48 +++++-------
>  term/users.c      | 225 
> ++++++++++++++++++++----------------------------------
>  4 files changed, 130 insertions(+), 169 deletions(-)
>  create mode 100644 term/mig-mutate.h
> 
> diff --git a/term/Makefile b/term/Makefile
> index 025a9b3..9537c60 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 0000000..7cc13aa
> --- /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 2da7d6c..211e70a 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 eacd150..3f55839 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;
>  }
>  
> -- 
> 1.8.5.3
> 

-- 
Samuel
<erno> hm. I've lost a machine.. literally _lost_. it responds to ping, it 
works completely, I just can't figure out where in my apartment it is.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]