xnu-2782.40.9.tar.gz
[apple/xnu.git] / bsd / kern / tty_subr.c
index f35c1ba79993ae5b04780c59eb37182c3c1fad5c..89bc09fe04fcaabf91e9eba0c871e84cce8ab8b4 100644 (file)
@@ -1,23 +1,29 @@
 /*
 /*
- * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved.
  *
  *
- * @APPLE_LICENSE_HEADER_START@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
  * 
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License").  You may not use this file except in compliance with the
- * License.  Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
+ * 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.
  * 
  * 
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * 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,
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
- * License for the specific language governing rights and limitations
- * under the License.
+ * 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_HEADER_END@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
 /* Copyright (c) 1997 Apple Computer, Inc. All Rights Reserved */
 /*
  */
 /* Copyright (c) 1997 Apple Computer, Inc. All Rights Reserved */
 /*
@@ -48,7 +54,6 @@
  *
  */
 
  *
  */
 
-#ifdef NeXT
 /*
  * We use the NetBSD based clist system, it is much more efficient than the
  * old style clist stuff used by free bsd.
 /*
  * We use the NetBSD based clist system, it is much more efficient than the
  * old style clist stuff used by free bsd.
 
 #include <sys/param.h>
 #include <sys/systm.h>
 
 #include <sys/param.h>
 #include <sys/systm.h>
-#include <sys/buf.h>
 #include <sys/ioctl.h>
 #include <sys/tty.h>
 #include <sys/malloc.h>
 
 #include <sys/ioctl.h>
 #include <sys/tty.h>
 #include <sys/malloc.h>
 
-#include <machine/spl.h>
 
 /*
  * At compile time, choose:
 
 /*
  * At compile time, choose:
@@ -89,7 +92,7 @@
  * Initialize clists.
  */
 void
  * Initialize clists.
  */
 void
-cinit()
+cinit(void)
 {
 }
 
 {
 }
 
@@ -98,21 +101,17 @@ cinit()
  * of the specified length, with/without quoting support.
  */
 int
  * of the specified length, with/without quoting support.
  */
 int
-clalloc(clp, size, quot)
-       struct clist *clp;
-       int size;
-       int quot;
+clalloc(struct clist *clp, int size, int quot)
 {
 {
-
-       MALLOC(clp->c_cs, u_char *, size, M_TTYS, M_WAITOK);
+       MALLOC_ZONE(clp->c_cs, u_char *, size, M_TTYS, M_WAITOK);
        if (!clp->c_cs)
                return (-1);
        bzero(clp->c_cs, size);
 
        if(quot) {
        if (!clp->c_cs)
                return (-1);
        bzero(clp->c_cs, size);
 
        if(quot) {
-               MALLOC(clp->c_cq, u_char *, QMEM(size), M_TTYS, M_WAITOK);
+               MALLOC_ZONE(clp->c_cq, u_char *, QMEM(size), M_TTYS, M_WAITOK);
                if (!clp->c_cq) {
                if (!clp->c_cq) {
-                       FREE(clp->c_cs, M_TTYS);
+                       FREE_ZONE(clp->c_cs, size, M_TTYS);
                        return (-1);
                }
                bzero(clp->c_cs, QMEM(size));
                        return (-1);
                }
                bzero(clp->c_cs, QMEM(size));
@@ -127,13 +126,12 @@ clalloc(clp, size, quot)
 }
 
 void
 }
 
 void
-clfree(clp)
-       struct clist *clp;
+clfree(struct clist *clp)
 {
        if(clp->c_cs)
 {
        if(clp->c_cs)
-               FREE(clp->c_cs, M_TTYS);
+               FREE_ZONE(clp->c_cs, clp->c_cn, M_TTYS);
        if(clp->c_cq)
        if(clp->c_cq)
-               FREE(clp->c_cq, M_TTYS);
+               FREE_ZONE(clp->c_cq, QMEM(clp->c_cn), M_TTYS);
        clp->c_cs = clp->c_cq = (u_char *)0;
 }
 
        clp->c_cs = clp->c_cq = (u_char *)0;
 }
 
@@ -142,13 +140,10 @@ clfree(clp)
  * Get a character from a clist.
  */
 int
  * Get a character from a clist.
  */
 int
-getc(clp)
-       struct clist *clp;
+getc(struct clist *clp)
 {
 {
-       register int c = -1;
-       int s;
+       int c = -1;
 
 
-       s = spltty();
        if (clp->c_cc == 0)
                goto out;
 
        if (clp->c_cc == 0)
                goto out;
 
@@ -167,7 +162,6 @@ getc(clp)
        if (--clp->c_cc == 0)
                clp->c_cf = clp->c_cl = (u_char *)0;
 out:
        if (--clp->c_cc == 0)
                clp->c_cf = clp->c_cl = (u_char *)0;
 out:
-       splx(s);
        return c;
 }
 
        return c;
 }
 
@@ -176,16 +170,11 @@ out:
  * Return number of bytes moved.
  */
 int
  * Return number of bytes moved.
  */
 int
-q_to_b(clp, cp, count)
-       struct clist *clp;
-       u_char *cp;
-       int count;
+q_to_b(struct clist *clp, u_char *cp, int count)
 {
 {
-       register int cc;
+       int cc;
        u_char *p = cp;
        u_char *p = cp;
-       int s;
 
 
-       s = spltty();
        /* optimize this while loop */
        while (count > 0 && clp->c_cc > 0) {
                cc = clp->c_cl - clp->c_cf;
        /* optimize this while loop */
        while (count > 0 && clp->c_cc > 0) {
                cc = clp->c_cl - clp->c_cf;
@@ -203,7 +192,6 @@ q_to_b(clp, cp, count)
        }
        if (clp->c_cc == 0)
                clp->c_cf = clp->c_cl = (u_char *)0;
        }
        if (clp->c_cc == 0)
                clp->c_cf = clp->c_cl = (u_char *)0;
-       splx(s);
        return p - cp;
 }
 
        return p - cp;
 }
 
@@ -212,16 +200,12 @@ q_to_b(clp, cp, count)
  * Stop counting if flag&character is non-null.
  */
 int
  * Stop counting if flag&character is non-null.
  */
 int
-ndqb(clp, flag)
-       struct clist *clp;
-       int flag;
+ndqb(struct clist *clp, int flag)
 {
        int count = 0;
        register int i;
        register int cc;
 {
        int count = 0;
        register int i;
        register int cc;
-       int s;
 
 
-       s = spltty();
        if ((cc = clp->c_cc) == 0)
                goto out;
 
        if ((cc = clp->c_cc) == 0)
                goto out;
 
@@ -248,7 +232,6 @@ ndqb(clp, flag)
                }
        }
 out:
                }
        }
 out:
-       splx(s);
        return count;
 }
 
        return count;
 }
 
@@ -256,18 +239,14 @@ out:
  * Flush count bytes from clist.
  */
 void
  * Flush count bytes from clist.
  */
 void
-ndflush(clp, count)
-       struct clist *clp;
-       int count;
+ndflush(struct clist *clp, int count)
 {
 {
-       register int cc;
-       int s;
+       int cc;
 
 
-       s = spltty();
        if (count == clp->c_cc) {
                clp->c_cc = 0;
                clp->c_cf = clp->c_cl = (u_char *)0;
        if (count == clp->c_cc) {
                clp->c_cc = 0;
                clp->c_cf = clp->c_cl = (u_char *)0;
-               goto out;
+               return;
        }
        /* optimize this while loop */
        while (count > 0 && clp->c_cc > 0) {
        }
        /* optimize this while loop */
        while (count > 0 && clp->c_cc > 0) {
@@ -284,22 +263,16 @@ ndflush(clp, count)
        }
        if (clp->c_cc == 0)
                clp->c_cf = clp->c_cl = (u_char *)0;
        }
        if (clp->c_cc == 0)
                clp->c_cf = clp->c_cl = (u_char *)0;
-out:
-       splx(s);
 }
 
 /*
  * Put a character into the output queue.
  */
 int
 }
 
 /*
  * Put a character into the output queue.
  */
 int
-putc(c, clp)
-       int c;
-       struct clist *clp;
+putc(int c, struct clist *clp)
 {
        register int i;
 {
        register int i;
-       int s;
 
 
-       s = spltty();
        if (clp->c_cc == 0) {
                if (!clp->c_cs) {
 #if DIAGNOSTIC
        if (clp->c_cc == 0) {
                if (!clp->c_cs) {
 #if DIAGNOSTIC
@@ -307,7 +280,6 @@ putc(c, clp)
 #endif
                        if(clalloc(clp, 1024, 1)) {
 out:
 #endif
                        if(clalloc(clp, 1024, 1)) {
 out:
-                               splx(s);
                                return -1;
                        }
                }
                                return -1;
                        }
                }
@@ -334,7 +306,6 @@ out:
        clp->c_cl++;
        if (clp->c_cl == clp->c_ce)
                clp->c_cl = clp->c_cs;
        clp->c_cl++;
        if (clp->c_cl == clp->c_ce)
                clp->c_cl = clp->c_cs;
-       splx(s);
        return 0;
 }
 
        return 0;
 }
 
@@ -346,10 +317,7 @@ out:
  *     clrbit(cp, off + len);
  */
 void
  *     clrbit(cp, off + len);
  */
 void
-clrbits(cp, off, len)
-       u_char *cp;
-       int off;
-       int len;
+clrbits(u_char *cp, int off, int len)
 {
        int sby, sbi, eby, ebi;
        register int i;
 {
        int sby, sbi, eby, ebi;
        register int i;
@@ -372,7 +340,9 @@ clrbits(cp, off, len)
                cp[sby++] &= mask;
 
                mask = (1<<ebi) - 1;
                cp[sby++] &= mask;
 
                mask = (1<<ebi) - 1;
-               cp[eby] &= ~mask;
+               /* handle remainder bits, if any, for a non-0 ebi value */
+               if (mask)
+                       cp[eby] &= ~mask;
 
                for (i = sby; i < eby; i++)
                        cp[i] = 0x00;
 
                for (i = sby; i < eby; i++)
                        cp[i] = 0x00;
@@ -385,19 +355,14 @@ clrbits(cp, off, len)
  * Return number of bytes not transfered.
  */
 int
  * Return number of bytes not transfered.
  */
 int
-b_to_q(cp, count, clp)
-       u_char *cp;
-       int count;
-       struct clist *clp;
+b_to_q(const u_char *cp, int count, struct clist *clp)
 {
 {
-       register int cc;
-       register u_char *p = cp;
-       int s;
+       int cc;
+       const u_char *p = cp;
 
        if (count <= 0)
                return 0;
 
 
        if (count <= 0)
                return 0;
 
-       s = spltty();
 
        if (clp->c_cc == 0) {
                if (!clp->c_cs) {
 
        if (clp->c_cc == 0) {
                if (!clp->c_cs) {
@@ -436,7 +401,6 @@ b_to_q(cp, count, clp)
                        clp->c_cl = clp->c_cs;
        }
 out:
                        clp->c_cl = clp->c_cs;
        }
 out:
-       splx(s);
        return count;
 }
 
        return count;
 }
 
@@ -451,12 +415,8 @@ static int cc;
  * masked.
  */
 u_char *
  * masked.
  */
 u_char *
-nextc(clp, cp, c)
-       struct clist *clp;
-       register u_char *cp;
-       int *c;
+nextc(struct clist *clp, u_char *cp, int *c)
 {
 {
-
        if (clp->c_cf == cp) {
                /*
                 * First time initialization.
        if (clp->c_cf == cp) {
                /*
                 * First time initialization.
@@ -493,11 +453,9 @@ nextc(clp, cp, c)
  * *c is set to the NEXT character
  */
 u_char *
  * *c is set to the NEXT character
  */
 u_char *
-firstc(clp, c)
-       struct clist *clp;
-       int *c;
+firstc(struct clist *clp, int *c)
 {
 {
-       register u_char *cp;
+       u_char *cp;
 
        cc = clp->c_cc;
        if (cc == 0)
 
        cc = clp->c_cc;
        if (cc == 0)
@@ -520,13 +478,10 @@ firstc(clp, c)
  * Remove the last character in the clist and return it.
  */
 int
  * Remove the last character in the clist and return it.
  */
 int
-unputc(clp)
-       struct clist *clp;
+unputc(struct clist *clp)
 {
        unsigned int c = -1;
 {
        unsigned int c = -1;
-       int s;
 
 
-       s = spltty();
        if (clp->c_cc == 0)
                goto out;
 
        if (clp->c_cc == 0)
                goto out;
 
@@ -549,7 +504,6 @@ unputc(clp)
        if (clp->c_cc == 0)
                clp->c_cf = clp->c_cl = (u_char *)0;
 out:
        if (clp->c_cc == 0)
                clp->c_cf = clp->c_cl = (u_char *)0;
 out:
-       splx(s);
        return c;
 }
 
        return c;
 }
 
@@ -557,13 +511,10 @@ out:
  * Put the chars in the from queue on the end of the to queue.
  */
 void
  * Put the chars in the from queue on the end of the to queue.
  */
 void
-catq(from, to)
-       struct clist *from, *to;
+catq(struct clist *from, struct clist *to)
 {
        int c;
 
        while ((c = getc(from)) != -1)
                putc(c, to);
 }
 {
        int c;
 
        while ((c = getc(from)) != -1)
                putc(c, to);
 }
-
-#endif /* NeXT */