]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/sys/tty.h
xnu-2422.90.20.tar.gz
[apple/xnu.git] / bsd / sys / tty.h
index 379e0a1bb728d1fda25405afb5475fbd56766ad4..28ee788a5c650f6e92bdc46b8672bc27a14f1eff 100644 (file)
@@ -1,16 +1,19 @@
 /*
  * Copyright (c) 2000-2002 Apple Computer, Inc. All rights reserved.
  *
- * @APPLE_LICENSE_HEADER_START@
- * 
- * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved.
+ * @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. Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this
- * file.
+ * 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
@@ -20,7 +23,7 @@
  * Please see the License for the specific language governing rights and
  * limitations under the License.
  * 
- * @APPLE_LICENSE_HEADER_END@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
 /* Copyright (c) 1997 Apple Computer, Inc. All Rights Reserved */
 /*-
 #include <sys/termios.h>
 #include <sys/select.h>                /* For struct selinfo. */
 
-#ifdef __APPLE_API_UNSTABLE
 
-#ifndef __APPLE__
-/*
- * Clists are character lists, which is a variable length linked list
- * of cblocks, with a count of the number of characters in the list.
- */
-struct clist {
-       int     c_cc;           /* Number of characters in the clist. */
-       int     c_cbcount;      /* Number of cblocks. */
-       int     c_cbmax;        /* Max # cblocks allowed for this clist. */
-       int     c_cbreserved;   /* # cblocks reserved for this clist. */
-       char    *c_cf;          /* Pointer to the first cblock. */
-       char    *c_cl;          /* Pointer to the last cblock. */
-};
-#else /* __APPLE__ */
+#ifdef KERNEL
+
+__BEGIN_DECLS
+#include <kern/locks.h>
+__END_DECLS
+
 /*
  * NetBSD Clists are actually ring buffers. The c_cc, c_cf, c_cl fields have
  * exactly the same behaviour as in true clists.
@@ -109,7 +103,6 @@ struct clist {
 #define TTYCLSIZE 1024
 #endif
 
-#endif /* __APPLE__ */
 
 /*
  * Per-tty structure.
@@ -119,6 +112,8 @@ struct clist {
  * (low, high, timeout).
  */
 struct tty {
+       lck_mtx_t       t_lock;         /* Per tty lock */
+
        struct  clist t_rawq;           /* Device raw input queue. */
        long    t_rawcc;                /* Raw input queue statistics. */
        struct  clist t_canq;           /* Device canonical queue. */
@@ -137,19 +132,23 @@ struct tty {
        struct  termios t_termios;      /* Termios state. */
        struct  winsize t_winsize;      /* Window size. */
                                        /* Start output. */
-       void    (*t_oproc) __P((struct tty *));
+       void    (*t_oproc)(struct tty *);
                                        /* Stop output. */
-       void    (*t_stop) __P((struct tty *, int));
+       void    (*t_stop)(struct tty *, int);
                                        /* Set hardware state. */
-       int     (*t_param) __P((struct tty *, struct termios *));
+       int     (*t_param)(struct tty *, struct termios *);
        void    *t_sc;                  /* XXX: net/if_sl.c:sl_softc. */
        int     t_column;               /* Tty output column. */
        int     t_rocount, t_rocol;     /* Tty. */
        int     t_hiwat;                /* High water mark. */
        int     t_lowat;                /* Low water mark. */
        int     t_gen;                  /* Generation number. */
+       void    *t_iokit;               /* IOKit management */
+       int     t_refcnt;               /* reference count */
 };
 
+#define TTY_NULL (struct tty *)0
+
 #define        t_cc            t_termios.c_cc
 #define        t_cflag         t_termios.c_cflag
 #define        t_iflag         t_termios.c_iflag
@@ -176,11 +175,13 @@ struct tty {
 #define        TTYHOG  1024
 #endif
 
-#ifdef KERNEL
 #define        TTMAXHIWAT      roundup(2048, CBSIZE)
 #define        TTMINHIWAT      roundup(100, CBSIZE)
 #define        TTMAXLOWAT      256
 #define        TTMINLOWAT      32
+#else
+struct tty;
+struct clist;
 #endif /* KERNEL */
 
 /* These flags are kept in t_state. */
@@ -220,6 +221,8 @@ struct tty {
 #define        TS_DSR_OFLOW    0x800000        /* For CDSR_OFLOW. */
 #endif
 
+#define        TS_IOCTL_NOT_OK 0x1000000       /* Workaround <rdar://....> */
+
 
 /* Character type information. */
 #define        ORDINARY        0
@@ -250,13 +253,7 @@ struct speedtab {
 #define        TTY_OE          0x04000000      /* Overrun error */
 #define        TTY_BI          0x08000000      /* Break condition */
 
-/* Is tp controlling terminal for p? */
-#define        isctty(p, tp)                                                   \
-       ((p)->p_session == (tp)->t_session && (p)->p_flag & P_CONTROLT)
-
-/* Is p in background of tp? */
-#define        isbackground(p, tp)                                             \
-       (isctty((p), (tp)) && (p)->p_pgrp != (tp)->t_pgrp)
+#ifdef KERNEL
 
 /* Unique sleep addresses. */
 #define        TSA_CARR_ON(tp)         ((void *)&(tp)->t_rawq)
@@ -268,87 +265,72 @@ struct speedtab {
 #define        TSA_PTS_READ(tp)        ((void *)&(tp)->t_canq)
 
 
-#ifdef KERNEL
 __BEGIN_DECLS
 
-#ifndef __APPLE__
-extern struct tty *constty;    /* Temporary virtual console. */
-
-int     b_to_q __P((char *cp, int cc, struct clist *q));
-void    catq __P((struct clist *from, struct clist *to));
-void    clist_alloc_cblocks __P((struct clist *q, int ccmax, int ccres));
-void    clist_free_cblocks __P((struct clist *q));
-/* void         clist_init __P((void)); */ /* defined in systm.h for main() */
-int     getc __P((struct clist *q));
-void    ndflush __P((struct clist *q, int cc));
-int     ndqb __P((struct clist *q, int flag));
-char   *nextc __P((struct clist *q, char *cp, int *c));
-int     putc __P((int c, struct clist *q));
-int     q_to_b __P((struct clist *q, char *cp, int cc));
-int     unputc __P((struct clist *q));
-
-int    ttcompat __P((struct tty *tp, int com, caddr_t data, int flag));
-int     ttsetcompat __P((struct tty *tp, int *com, caddr_t data, struct termios *term));
-#else /* __APPLE__ */
-int     b_to_q __P((u_char *cp, int cc, struct clist *q));
-void    catq __P((struct clist *from, struct clist *to));
-void    clist_init __P((void));
-int     getc __P((struct clist *q));
-void    ndflush __P((struct clist *q, int cc));
-int     ndqb __P((struct clist *q, int flag));
-u_char *firstc           __P((struct clist *clp, int *c));
-u_char *nextc __P((struct clist *q, u_char *cp, int *c));
-int     putc __P((int c, struct clist *q));
-int     q_to_b __P((struct clist *q, u_char *cp, int cc));
-int     unputc __P((struct clist *q));
-int     clalloc __P((struct clist *clp, int size, int quot));
-void    clfree __P((struct clist *clp));
+int     b_to_q(const u_char *cp, int cc, struct clist *q);
+void    catq(struct clist *from, struct clist *to);
+void    clist_init(void);
+int     getc(struct clist *q);
+void    ndflush(struct clist *q, int cc);
+int     ndqb(struct clist *q, int flag);
+u_char *firstc          (struct clist *clp, int *c);
+u_char *nextc(struct clist *q, u_char *cp, int *c);
+int     putc(int c, struct clist *q);
+int     q_to_b(struct clist *q, u_char *cp, int cc);
+int     unputc(struct clist *q);
+int     clalloc(struct clist *clp, int size, int quot);
+void    clfree(struct clist *clp);
+void   cinit(void);
+void   clrbits(u_char *cp, int off, int len);
 
 #ifdef KERNEL_PRIVATE
-int    ttcompat __P((struct tty *tp, u_long com, caddr_t data, int flag,
-           struct proc *p));
-int    ttsetcompat __P((struct tty *tp, u_long *com, caddr_t data, struct termios *term));
+void   tty_init(void);
+/*
+ * The locked version of this function is used from routines which hold
+ * the tty_lock(), such as ttcompat() in tty_compat.c
+ */
+int    ttioctl_locked(struct tty *tp, u_long com, caddr_t data, int flag,
+           struct proc *p);
+
+int    ttcompat(struct tty *tp, u_long com, caddr_t data, int flag,
+           struct proc *p);
 #endif /* KERNEL_PRIVATE */
-#endif /* __APPLE__ */
 
-void    termioschars __P((struct termios *t));
-int     tputchar __P((int c, struct tty *tp));
-#ifndef __APPLE__
-int     ttioctl __P((struct tty *tp, int com, void *data, int flag));
-#else
-int     ttioctl __P((struct tty *tp, u_long com, caddr_t data, int flag,
-           struct proc *p));
-#endif
-int     ttread __P((struct tty *tp, struct uio *uio, int flag));
-void    ttrstrt __P((void *tp));
-int     ttyselect __P((struct tty *tp, int rw, void * wql, struct proc *p));
-int     ttselect __P((dev_t dev, int rw, void * wql, struct proc *p));
-void    ttsetwater __P((struct tty *tp));
-int     ttspeedtab __P((int speed, struct speedtab *table));
-int     ttstart __P((struct tty *tp));
-void    ttwakeup __P((struct tty *tp));
-int     ttwrite __P((struct tty *tp, struct uio *uio, int flag));
-void    ttwwakeup __P((struct tty *tp));
-void    ttyblock __P((struct tty *tp));
-void    ttychars __P((struct tty *tp));
-int     ttycheckoutq __P((struct tty *tp, int wait));
-int     ttyclose __P((struct tty *tp));
-void    ttyflush __P((struct tty *tp, int rw));
-void    ttyinfo __P((struct tty *tp));
-int     ttyinput __P((int c, struct tty *tp));
-int     ttylclose __P((struct tty *tp, int flag));
-int     ttymodem __P((struct tty *tp, int flag));
-int     ttyopen __P((dev_t device, struct tty *tp));
-int     ttysleep __P((struct tty *tp,
-           void *chan, int pri, char *wmesg, int timeout));
-int     ttywait __P((struct tty *tp));
-struct tty *ttymalloc __P((void));
-void     ttyfree __P((struct tty *));
+void tty_lock(struct tty *tp);
+void tty_unlock(struct tty *tp);
+
+void    termioschars(struct termios *t);
+int     tputchar(int c, struct tty *tp);
+int     ttioctl(struct tty *tp, u_long com, caddr_t data, int flag,
+           struct proc *p);
+int     ttread(struct tty *tp, struct uio *uio, int flag);
+int     ttyselect(struct tty *tp, int rw, void * wql, struct proc *p);
+int     ttselect(dev_t dev, int rw, void * wql, struct proc *p);
+void    ttsetwater(struct tty *tp);
+int     ttspeedtab(int speed, struct speedtab *table);
+int     ttstart(struct tty *tp);
+void    ttwakeup(struct tty *tp);
+int     ttwrite(struct tty *tp, struct uio *uio, int flag);
+void    ttwwakeup(struct tty *tp);
+void    ttyblock(struct tty *tp);
+int     ttycheckoutq(struct tty *tp, int wait);
+int     ttyclose(struct tty *tp);      /* LEGACY: avoid using */
+void    ttyflush(struct tty *tp, int rw);
+void    ttyinfo(struct tty *tp);
+void    ttyinfo_locked(struct tty *tp);
+int     ttyinput(int c, struct tty *tp);
+int     ttylclose(struct tty *tp, int flag);
+int     ttymodem(struct tty *tp, int flag);
+int     ttyopen(dev_t device, struct tty *tp);
+int     ttysleep(struct tty *tp,
+           void *chan, int pri, const char *wmesg, int timeout);
+int     ttywait(struct tty *tp);
+struct tty *ttymalloc(void);
+void     ttyfree(struct tty *);
 
 __END_DECLS
 
 #endif /* KERNEL */
 
-#endif /* __APPLE_API_UNSTABLE */
 
 #endif /* !_SYS_TTY_H_ */