/*
* Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
*
- * @APPLE_LICENSE_OSREFERENCE_HEADER_START@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
- * This file contains Original Code and/or Modifications of Original Code
- * as defined in and that are subject to the Apple Public Source License
- * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. The rights granted to you under the
- * License may not be used to create, or enable the creation or
- * redistribution of, unlawful or unlicensed copies of an Apple operating
- * system, or to circumvent, violate, or enable the circumvention or
- * violation of, any terms of an Apple operating system software license
- * agreement.
- *
- * Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
- *
- * The Original Code and all software distributed under the License are
- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- * Please see the License for the specific language governing rights and
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. The rights granted to you under the License
+ * may not be used to create, or enable the creation or redistribution of,
+ * unlawful or unlicensed copies of an Apple operating system, or to
+ * circumvent, violate, or enable the circumvention or violation of, any
+ * terms of an Apple operating system software license agreement.
+ *
+ * Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this file.
+ *
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
* limitations under the License.
- *
- * @APPLE_LICENSE_OSREFERENCE_HEADER_END@
+ *
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
*/
/* Copyright (c) 1997 Apple Computer, Inc. All Rights Reserved */
/*-
*/
/*
- * mapping routines for old line discipline (yuck)
+ * Compatibility routines for BSD 4.3 tty ioctl() commands
+ *
+ * The only function externalized from this file is ttcompat() and it is
+ * externalized as private extern to prevent exporting of the symbol when
+ * KEXTs link against the kernel.
+ *
+ * Locks: All functions in this file assume that the tty_lock()
+ * is held on the tty structure before these functions are
+ * called.
*/
#include <sys/param.h>
#include <sys/sysctl.h>
#include <sys/syslog.h>
-/* NeXT Move define down here cause COMPAT_43_TTY not valid earlier */
-#if COMPAT_43_TTY || defined(COMPAT_SUNOS)
-
static int ttcompatgetflags(struct tty *tp);
static void ttcompatsetflags(struct tty *tp, struct termios *t);
static void ttcompatsetlflags(struct tty *tp, struct termios *t);
return (1); /* 50, min and not hangup */
}
+
/*
* ttsetcompat
*
* TIOCLSET -> TIOCSETA
*
* The converted command argument and potentially modified 'term'
- * argument are returned to the caller, which will then call ttioctl(),
- * if this function returns successfully.
+ * argument are returned to ttcompat(), which will then call
+ * ttioctl_locked(), if this function returns successfully.
*
* Parameters struct tty *tp The tty on which the operation is
* being performed.
* TIOCLBIC, or TIOCLSET.
*
* All other tp fields will remain unmodifed, since the struct
- * termious is a local stack copy from ttcompat(), and not the
- * real thing. A subsequent call to ttioctl() in ttcompat(),
- * however, may result in subsequent changes.
+ * termios is a local stack copy from ttcompat(), and not the
+ * real thing. A subsequent call to ttioctl_locked() in
+ * ttcompat(), however, may result in subsequent changes.
+ *
+ * WARNING: This compatibility code is not 6/432 clean; it will only
+ * work for 32 bit processes on 32 bit kernels or 64 bit
+ * processes on 64 bit kernels. We are not addressing this
+ * due to <rdar://6904053>.
*/
-__private_extern__ int
+static int
ttsetcompat(struct tty *tp, u_long *com, caddr_t data, struct termios *term)
{
switch (*com) {
* pending input is not discarded.
*/
{
- register struct sgttyb *sg = (struct sgttyb *)data;
+ struct sgttyb *sg = (struct sgttyb *)data;
int speed;
if ((speed = sg->sg_ispeed) > MAX_SPEED || speed < 0)
*/
{
struct tchars *tc = (struct tchars *)data;
- register cc_t *cc;
+ cc_t *cc;
cc = term->c_cc;
cc[VINTR] = tc->t_intrc;
*/
{
struct ltchars *ltc = (struct ltchars *)data;
- register cc_t *cc;
+ cc_t *cc;
cc = term->c_cc;
cc[VSUSP] = ltc->t_suspc;
* ttcompat
*
* Description: For 'set' commands, convert the command and arguments as
- * necessary, and call ttioctl(), returning the result as
- * our result; for 'get' commands, obtain the requested data
+ * necessary, and call ttioctl_locked(), returning the result
+ * as our result; for 'get' commands, obtain the requested data
* from the appropriate source, and return it in the expected
* format. If the command is not recognized, return EINVAL.
*
* terminal with no associated session,
* or for which there is a session, but
* no session leader.
- * EIOCTL If the command cannot be handled at
+ * ENOTTY If the command cannot be handled at
* this layer, this will be returned.
- * * Any value returned by ttioctl(), if a
- * set command is requested.
+ * * Any value returned by ttioctl_locked(),
+ * if a set command is requested.
*
- * NOTES: The process pointer may be a proxy on whose behalf we are
+ * Notes: The process pointer may be a proxy on whose behalf we are
* operating, so it is not safe to simply use current_process()
* instead.
*/
term = tp->t_termios;
if ((error = ttsetcompat(tp, &com, data, &term)) != 0)
return error;
- return ttioctl(tp, com, (caddr_t) &term, flag, p);
+ return ttioctl_locked(tp, com, (caddr_t) &term, flag, p);
}
case TIOCGETP:
/*
* flags, into the structure pointed to by 'data'.
*/
{
- register struct sgttyb *sg = (struct sgttyb *)data;
- register cc_t *cc = tp->t_cc;
+ struct sgttyb *sg = (struct sgttyb *)data;
+ cc_t *cc = tp->t_cc;
sg->sg_ospeed = ttcompatspeedtab(tp->t_ospeed, compatspeeds);
if (tp->t_ispeed == 0)
*/
{
struct tchars *tc = (struct tchars *)data;
- register cc_t *cc = tp->t_cc;
+ cc_t *cc = tp->t_cc;
tc->t_intrc = cc[VINTR];
tc->t_quitc = cc[VQUIT];
*/
{
struct ltchars *ltc = (struct ltchars *)data;
- register cc_t *cc = tp->t_cc;
+ cc_t *cc = tp->t_cc;
ltc->t_suspc = cc[VSUSP];
ltc->t_dsuspc = cc[VDSUSP];
{
int ldisczero = 0;
- return (ttioctl(tp, TIOCSETD,
+ return (ttioctl_locked(tp, TIOCSETD,
*(int *)data == 2 ? (caddr_t)&ldisczero : data, flag, p));
}
* Become the console device.
*/
*(int *)data = 1;
- return (ttioctl(tp, TIOCCONS, data, flag, p));
+ return (ttioctl_locked(tp, TIOCCONS, data, flag, p));
case TIOCGSID:
/*
static int
ttcompatgetflags(struct tty *tp)
{
- register tcflag_t iflag = tp->t_iflag;
- register tcflag_t lflag = tp->t_lflag;
- register tcflag_t oflag = tp->t_oflag;
- register tcflag_t cflag = tp->t_cflag;
- register int flags = 0;
+ tcflag_t iflag = tp->t_iflag;
+ tcflag_t lflag = tp->t_lflag;
+ tcflag_t oflag = tp->t_oflag;
+ tcflag_t cflag = tp->t_cflag;
+ int flags = 0;
if (iflag&IXOFF)
flags |= TANDEM;
static void
ttcompatsetflags(struct tty *tp, struct termios *t)
{
- register int flags = tp->t_flags;
- register tcflag_t iflag = t->c_iflag;
- register tcflag_t oflag = t->c_oflag;
- register tcflag_t lflag = t->c_lflag;
- register tcflag_t cflag = t->c_cflag;
+ int flags = tp->t_flags;
+ tcflag_t iflag = t->c_iflag;
+ tcflag_t oflag = t->c_oflag;
+ tcflag_t lflag = t->c_lflag;
+ tcflag_t cflag = t->c_cflag;
if (flags & RAW) {
iflag = IGNBRK;
static void
ttcompatsetlflags(struct tty *tp, struct termios *t)
{
- register int flags = tp->t_flags;
- register tcflag_t iflag = t->c_iflag;
- register tcflag_t oflag = t->c_oflag;
- register tcflag_t lflag = t->c_lflag;
- register tcflag_t cflag = t->c_cflag;
+ int flags = tp->t_flags;
+ tcflag_t iflag = t->c_iflag;
+ tcflag_t oflag = t->c_oflag;
+ tcflag_t lflag = t->c_lflag;
+ tcflag_t cflag = t->c_cflag;
iflag &= ~(PARMRK|IGNPAR|IGNCR|INLCR);
if (flags&CRTERA)
t->c_lflag = lflag;
t->c_cflag = cflag;
}
-#endif /* COMPAT_43_TTY || COMPAT_SUNOS */