[BACK]Return to ibcs2_ioctl.c CVS log [TXT][DIR] Up to [local] / sys / compat / ibcs2

Annotation of sys/compat/ibcs2/ibcs2_ioctl.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: ibcs2_ioctl.c,v 1.12 2004/09/19 21:34:42 mickey Exp $ */
        !             2: /*     $NetBSD: ibcs2_ioctl.c,v 1.12 1996/08/10 09:08:26 mycroft Exp $ */
        !             3:
        !             4: /*
        !             5:  * Copyright (c) 1994, 1995 Scott Bartram
        !             6:  * All rights reserved.
        !             7:  *
        !             8:  * based on compat/sunos/sun_ioctl.c
        !             9:  *
        !            10:  * Redistribution and use in source and binary forms, with or without
        !            11:  * modification, are permitted provided that the following conditions
        !            12:  * are met:
        !            13:  * 1. Redistributions of source code must retain the above copyright
        !            14:  *    notice, this list of conditions and the following disclaimer.
        !            15:  * 2. The name of the author may not be used to endorse or promote products
        !            16:  *    derived from this software without specific prior written permission
        !            17:  *
        !            18:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            19:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
        !            20:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
        !            21:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
        !            22:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
        !            23:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        !            24:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        !            25:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        !            26:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
        !            27:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            28:  */
        !            29:
        !            30: #include <sys/param.h>
        !            31: #include <sys/systm.h>
        !            32: #include <sys/namei.h>
        !            33: #include <sys/dirent.h>
        !            34: #include <sys/proc.h>
        !            35: #include <sys/file.h>
        !            36: #include <sys/stat.h>
        !            37: #include <sys/filedesc.h>
        !            38: #include <sys/ioctl.h>
        !            39: #include <sys/kernel.h>
        !            40: #include <sys/malloc.h>
        !            41: #include <sys/mbuf.h>
        !            42: #include <sys/mman.h>
        !            43: #include <sys/mount.h>
        !            44: #include <sys/reboot.h>
        !            45: #include <sys/resource.h>
        !            46: #include <sys/resourcevar.h>
        !            47: #include <sys/signal.h>
        !            48: #include <sys/signalvar.h>
        !            49: #include <sys/socket.h>
        !            50: #include <sys/termios.h>
        !            51: #include <sys/time.h>
        !            52: #include <sys/times.h>
        !            53: #include <sys/tty.h>
        !            54: #include <sys/vnode.h>
        !            55: #include <sys/uio.h>
        !            56: #include <sys/wait.h>
        !            57: #include <sys/utsname.h>
        !            58: #include <sys/unistd.h>
        !            59:
        !            60: #include <net/if.h>
        !            61: #include <sys/syscallargs.h>
        !            62:
        !            63: #include <compat/ibcs2/ibcs2_types.h>
        !            64: #include <compat/ibcs2/ibcs2_signal.h>
        !            65: #include <compat/ibcs2/ibcs2_socksys.h>
        !            66: #include <compat/ibcs2/ibcs2_stropts.h>
        !            67: #include <compat/ibcs2/ibcs2_syscallargs.h>
        !            68: #include <compat/ibcs2/ibcs2_termios.h>
        !            69: #include <compat/ibcs2/ibcs2_util.h>
        !            70:
        !            71: /*
        !            72:  * iBCS2 ioctl calls.
        !            73:  */
        !            74:
        !            75: static const struct speedtab sptab[] = {
        !            76:        { 0, 0 },
        !            77:        { 50, 1 },
        !            78:        { 75, 2 },
        !            79:        { 110, 3 },
        !            80:        { 134, 4 },
        !            81:        { 135, 4 },
        !            82:        { 150, 5 },
        !            83:        { 200, 6 },
        !            84:        { 300, 7 },
        !            85:        { 600, 8 },
        !            86:        { 1200, 9 },
        !            87:        { 1800, 10 },
        !            88:        { 2400, 11 },
        !            89:        { 4800, 12 },
        !            90:        { 9600, 13 },
        !            91:        { 19200, 14 },
        !            92:        { 38400, 15 },
        !            93:        { -1, -1 }
        !            94: };
        !            95:
        !            96: static const u_long s2btab[] = {
        !            97:        0,
        !            98:        50,
        !            99:        75,
        !           100:        110,
        !           101:        134,
        !           102:        150,
        !           103:        200,
        !           104:        300,
        !           105:        600,
        !           106:        1200,
        !           107:        1800,
        !           108:        2400,
        !           109:        4800,
        !           110:        9600,
        !           111:        19200,
        !           112:        38400,
        !           113: };
        !           114:
        !           115: static void stios2btios(struct ibcs2_termios *, struct termios *);
        !           116: static void btios2stios(struct termios *, struct ibcs2_termios *);
        !           117: static void stios2stio(struct ibcs2_termios *, struct ibcs2_termio *);
        !           118: static void stio2stios(struct ibcs2_termio *, struct ibcs2_termios *);
        !           119:
        !           120: static void
        !           121: stios2btios(st, bt)
        !           122:        struct ibcs2_termios *st;
        !           123:        struct termios *bt;
        !           124: {
        !           125:        register u_long l, r;
        !           126:
        !           127:        l = st->c_iflag;        r = 0;
        !           128:        if (l & IBCS2_IGNBRK)   r |= IGNBRK;
        !           129:        if (l & IBCS2_BRKINT)   r |= BRKINT;
        !           130:        if (l & IBCS2_IGNPAR)   r |= IGNPAR;
        !           131:        if (l & IBCS2_PARMRK)   r |= PARMRK;
        !           132:        if (l & IBCS2_INPCK)    r |= INPCK;
        !           133:        if (l & IBCS2_ISTRIP)   r |= ISTRIP;
        !           134:        if (l & IBCS2_INLCR)    r |= INLCR;
        !           135:        if (l & IBCS2_IGNCR)    r |= IGNCR;
        !           136:        if (l & IBCS2_ICRNL)    r |= ICRNL;
        !           137:        if (l & IBCS2_IXON)     r |= IXON;
        !           138:        if (l & IBCS2_IXANY)    r |= IXANY;
        !           139:        if (l & IBCS2_IXOFF)    r |= IXOFF;
        !           140:        if (l & IBCS2_IMAXBEL)  r |= IMAXBEL;
        !           141:        bt->c_iflag = r;
        !           142:
        !           143:        l = st->c_oflag;        r = 0;
        !           144:        if (l & IBCS2_OPOST)    r |= OPOST;
        !           145:        if (l & IBCS2_ONLCR)    r |= ONLCR;
        !           146:        if (l & IBCS2_TAB3)     r |= OXTABS;
        !           147:        bt->c_oflag = r;
        !           148:
        !           149:        l = st->c_cflag;        r = 0;
        !           150:        switch (l & IBCS2_CSIZE) {
        !           151:        case IBCS2_CS5:         r |= CS5; break;
        !           152:        case IBCS2_CS6:         r |= CS6; break;
        !           153:        case IBCS2_CS7:         r |= CS7; break;
        !           154:        case IBCS2_CS8:         r |= CS8; break;
        !           155:        }
        !           156:        if (l & IBCS2_CSTOPB)   r |= CSTOPB;
        !           157:        if (l & IBCS2_CREAD)    r |= CREAD;
        !           158:        if (l & IBCS2_PARENB)   r |= PARENB;
        !           159:        if (l & IBCS2_PARODD)   r |= PARODD;
        !           160:        if (l & IBCS2_HUPCL)    r |= HUPCL;
        !           161:        if (l & IBCS2_CLOCAL)   r |= CLOCAL;
        !           162:        bt->c_cflag = r;
        !           163:
        !           164:        l = st->c_lflag;        r = 0;
        !           165:        if (l & IBCS2_ISIG)     r |= ISIG;
        !           166:        if (l & IBCS2_ICANON)   r |= ICANON;
        !           167:        if (l & IBCS2_ECHO)     r |= ECHO;
        !           168:        if (l & IBCS2_ECHOE)    r |= ECHOE;
        !           169:        if (l & IBCS2_ECHOK)    r |= ECHOK;
        !           170:        if (l & IBCS2_ECHONL)   r |= ECHONL;
        !           171:        if (l & IBCS2_NOFLSH)   r |= NOFLSH;
        !           172:        if (l & IBCS2_TOSTOP)   r |= TOSTOP;
        !           173:        bt->c_lflag = r;
        !           174:
        !           175:        bt->c_ispeed = bt->c_ospeed = s2btab[l & 0x0000000f];
        !           176:
        !           177:        bt->c_cc[VINTR] =
        !           178:            st->c_cc[IBCS2_VINTR]  ? st->c_cc[IBCS2_VINTR]  : _POSIX_VDISABLE;
        !           179:        bt->c_cc[VQUIT] =
        !           180:            st->c_cc[IBCS2_VQUIT]  ? st->c_cc[IBCS2_VQUIT]  : _POSIX_VDISABLE;
        !           181:        bt->c_cc[VERASE] =
        !           182:            st->c_cc[IBCS2_VERASE] ? st->c_cc[IBCS2_VERASE] : _POSIX_VDISABLE;
        !           183:        bt->c_cc[VKILL] =
        !           184:            st->c_cc[IBCS2_VKILL]  ? st->c_cc[IBCS2_VKILL]  : _POSIX_VDISABLE;
        !           185:        if (bt->c_lflag & ICANON) {
        !           186:                bt->c_cc[VEOF] =
        !           187:                    st->c_cc[IBCS2_VEOF] ? st->c_cc[IBCS2_VEOF] : _POSIX_VDISABLE;
        !           188:                bt->c_cc[VEOL] =
        !           189:                    st->c_cc[IBCS2_VEOL] ? st->c_cc[IBCS2_VEOL] : _POSIX_VDISABLE;
        !           190:        } else {
        !           191:                bt->c_cc[VMIN]  = st->c_cc[IBCS2_VMIN];
        !           192:                bt->c_cc[VTIME] = st->c_cc[IBCS2_VTIME];
        !           193:        }
        !           194:        bt->c_cc[VEOL2] =
        !           195:            st->c_cc[IBCS2_VEOL2]  ? st->c_cc[IBCS2_VEOL2]  : _POSIX_VDISABLE;
        !           196: #if 0
        !           197:        bt->c_cc[VSWTCH] =
        !           198:            st->c_cc[IBCS2_VSWTCH] ? st->c_cc[IBCS2_VSWTCH] : _POSIX_VDISABLE;
        !           199: #endif
        !           200:        bt->c_cc[VSTART] =
        !           201:            st->c_cc[IBCS2_VSTART] ? st->c_cc[IBCS2_VSTART] : _POSIX_VDISABLE;
        !           202:        bt->c_cc[VSTOP] =
        !           203:            st->c_cc[IBCS2_VSTOP]  ? st->c_cc[IBCS2_VSTOP]  : _POSIX_VDISABLE;
        !           204:        bt->c_cc[VSUSP] =
        !           205:            st->c_cc[IBCS2_VSUSP]  ? st->c_cc[IBCS2_VSUSP]  : _POSIX_VDISABLE;
        !           206:        bt->c_cc[VDSUSP]   = _POSIX_VDISABLE;
        !           207:        bt->c_cc[VREPRINT] = _POSIX_VDISABLE;
        !           208:        bt->c_cc[VDISCARD] = _POSIX_VDISABLE;
        !           209:        bt->c_cc[VWERASE]  = _POSIX_VDISABLE;
        !           210:        bt->c_cc[VLNEXT]   = _POSIX_VDISABLE;
        !           211:        bt->c_cc[VSTATUS]  = _POSIX_VDISABLE;
        !           212: }
        !           213:
        !           214: static void
        !           215: btios2stios(bt, st)
        !           216:        struct termios *bt;
        !           217:        struct ibcs2_termios *st;
        !           218: {
        !           219:        register u_long l, r;
        !           220:
        !           221:        l = bt->c_iflag;        r = 0;
        !           222:        if (l & IGNBRK)         r |= IBCS2_IGNBRK;
        !           223:        if (l & BRKINT)         r |= IBCS2_BRKINT;
        !           224:        if (l & IGNPAR)         r |= IBCS2_IGNPAR;
        !           225:        if (l & PARMRK)         r |= IBCS2_PARMRK;
        !           226:        if (l & INPCK)          r |= IBCS2_INPCK;
        !           227:        if (l & ISTRIP)         r |= IBCS2_ISTRIP;
        !           228:        if (l & INLCR)          r |= IBCS2_INLCR;
        !           229:        if (l & IGNCR)          r |= IBCS2_IGNCR;
        !           230:        if (l & ICRNL)          r |= IBCS2_ICRNL;
        !           231:        if (l & IXON)           r |= IBCS2_IXON;
        !           232:        if (l & IXANY)          r |= IBCS2_IXANY;
        !           233:        if (l & IXOFF)          r |= IBCS2_IXOFF;
        !           234:        if (l & IMAXBEL)        r |= IBCS2_IMAXBEL;
        !           235:        st->c_iflag = r;
        !           236:
        !           237:        l = bt->c_oflag;        r = 0;
        !           238:        if (l & OPOST)          r |= IBCS2_OPOST;
        !           239:        if (l & ONLCR)          r |= IBCS2_ONLCR;
        !           240:        if (l & OXTABS)         r |= IBCS2_TAB3;
        !           241:        st->c_oflag = r;
        !           242:
        !           243:        l = bt->c_cflag;        r = 0;
        !           244:        switch (l & CSIZE) {
        !           245:        case CS5:               r |= IBCS2_CS5; break;
        !           246:        case CS6:               r |= IBCS2_CS6; break;
        !           247:        case CS7:               r |= IBCS2_CS7; break;
        !           248:        case CS8:               r |= IBCS2_CS8; break;
        !           249:        }
        !           250:        if (l & CSTOPB)         r |= IBCS2_CSTOPB;
        !           251:        if (l & CREAD)          r |= IBCS2_CREAD;
        !           252:        if (l & PARENB)         r |= IBCS2_PARENB;
        !           253:        if (l & PARODD)         r |= IBCS2_PARODD;
        !           254:        if (l & HUPCL)          r |= IBCS2_HUPCL;
        !           255:        if (l & CLOCAL)         r |= IBCS2_CLOCAL;
        !           256:        st->c_cflag = r;
        !           257:
        !           258:        l = bt->c_lflag;        r = 0;
        !           259:        if (l & ISIG)           r |= IBCS2_ISIG;
        !           260:        if (l & ICANON)         r |= IBCS2_ICANON;
        !           261:        if (l & ECHO)           r |= IBCS2_ECHO;
        !           262:        if (l & ECHOE)          r |= IBCS2_ECHOE;
        !           263:        if (l & ECHOK)          r |= IBCS2_ECHOK;
        !           264:        if (l & ECHONL)         r |= IBCS2_ECHONL;
        !           265:        if (l & NOFLSH)         r |= IBCS2_NOFLSH;
        !           266:        if (l & TOSTOP)         r |= IBCS2_TOSTOP;
        !           267:        st->c_lflag = r;
        !           268:
        !           269:        l = ttspeedtab(bt->c_ospeed, sptab);
        !           270:        if (l >= 0)
        !           271:                st->c_cflag |= l;
        !           272:
        !           273:        st->c_cc[IBCS2_VINTR] =
        !           274:            bt->c_cc[VINTR]  != _POSIX_VDISABLE ? bt->c_cc[VINTR]  : 0;
        !           275:        st->c_cc[IBCS2_VQUIT] =
        !           276:            bt->c_cc[VQUIT]  != _POSIX_VDISABLE ? bt->c_cc[VQUIT]  : 0;
        !           277:        st->c_cc[IBCS2_VERASE] =
        !           278:            bt->c_cc[VERASE] != _POSIX_VDISABLE ? bt->c_cc[VERASE] : 0;
        !           279:        st->c_cc[IBCS2_VKILL] =
        !           280:            bt->c_cc[VKILL]  != _POSIX_VDISABLE ? bt->c_cc[VKILL]  : 0;
        !           281:        if (bt->c_lflag & ICANON) {
        !           282:                st->c_cc[IBCS2_VEOF] =
        !           283:                    bt->c_cc[VEOF] != _POSIX_VDISABLE ? bt->c_cc[VEOF] : 0;
        !           284:                st->c_cc[IBCS2_VEOL] =
        !           285:                    bt->c_cc[VEOL] != _POSIX_VDISABLE ? bt->c_cc[VEOL] : 0;
        !           286:        } else {
        !           287:                st->c_cc[IBCS2_VMIN]  = bt->c_cc[VMIN];
        !           288:                st->c_cc[IBCS2_VTIME] = bt->c_cc[VTIME];
        !           289:        }
        !           290:        st->c_cc[IBCS2_VEOL2] =
        !           291:            bt->c_cc[VEOL2]  != _POSIX_VDISABLE ? bt->c_cc[VEOL2]  : 0;
        !           292:        st->c_cc[IBCS2_VSWTCH] =
        !           293:            0;
        !           294:        st->c_cc[IBCS2_VSUSP] =
        !           295:            bt->c_cc[VSUSP]  != _POSIX_VDISABLE ? bt->c_cc[VSUSP]  : 0;
        !           296:        st->c_cc[IBCS2_VSTART] =
        !           297:            bt->c_cc[VSTART] != _POSIX_VDISABLE ? bt->c_cc[VSTART] : 0;
        !           298:        st->c_cc[IBCS2_VSTOP] =
        !           299:            bt->c_cc[VSTOP]  != _POSIX_VDISABLE ? bt->c_cc[VSTOP]  : 0;
        !           300:
        !           301:        st->c_line = 0;
        !           302: }
        !           303:
        !           304: static void
        !           305: stios2stio(ts, t)
        !           306:        struct ibcs2_termios *ts;
        !           307:        struct ibcs2_termio *t;
        !           308: {
        !           309:
        !           310:        t->c_iflag = ts->c_iflag;
        !           311:        t->c_oflag = ts->c_oflag;
        !           312:        t->c_cflag = ts->c_cflag;
        !           313:        t->c_lflag = ts->c_lflag;
        !           314:        t->c_line  = ts->c_line;
        !           315:        bcopy(ts->c_cc, t->c_cc, IBCS2_NCC);
        !           316: }
        !           317:
        !           318: static void
        !           319: stio2stios(t, ts)
        !           320:        struct ibcs2_termio *t;
        !           321:        struct ibcs2_termios *ts;
        !           322: {
        !           323:
        !           324:        ts->c_iflag = t->c_iflag;
        !           325:        ts->c_oflag = t->c_oflag;
        !           326:        ts->c_cflag = t->c_cflag;
        !           327:        ts->c_lflag = t->c_lflag;
        !           328:        ts->c_line  = t->c_line;
        !           329:        bcopy(t->c_cc, ts->c_cc, IBCS2_NCC);
        !           330: }
        !           331:
        !           332: int
        !           333: ibcs2_sys_ioctl(p, v, retval)
        !           334:        struct proc *p;
        !           335:        void *v;
        !           336:        register_t *retval;
        !           337: {
        !           338:        struct ibcs2_sys_ioctl_args /* {
        !           339:                syscallarg(int) fd;
        !           340:                syscallarg(int) cmd;
        !           341:                syscallarg(caddr_t) data;
        !           342:        } */ *uap = v;
        !           343:        struct filedesc *fdp = p->p_fd;
        !           344:        struct file *fp;
        !           345:        int (*ctl)(struct file *, u_long, caddr_t, struct proc *);
        !           346:        int error;
        !           347:
        !           348:        if ((fp = fd_getfile(fdp, SCARG(uap, fd))) == NULL)
        !           349:                return (EBADF);
        !           350:        FREF(fp);
        !           351:
        !           352:        if ((fp->f_flag & (FREAD|FWRITE)) == 0) {
        !           353:                DPRINTF(("ibcs2_ioctl(%d): bad fp flag ", p->p_pid));
        !           354:                error = EBADF;
        !           355:                goto out;
        !           356:        }
        !           357:
        !           358:        ctl = fp->f_ops->fo_ioctl;
        !           359:
        !           360:        switch (SCARG(uap, cmd)) {
        !           361:        case IBCS2_TCGETA:
        !           362:        case IBCS2_XCGETA:
        !           363:        case IBCS2_OXCGETA:
        !           364:            {
        !           365:                struct termios bts;
        !           366:                struct ibcs2_termios sts;
        !           367:                struct ibcs2_termio st;
        !           368:
        !           369:                if ((error = (*ctl)(fp, TIOCGETA, (caddr_t)&bts, p)) != 0)
        !           370:                        goto out;
        !           371:
        !           372:                btios2stios (&bts, &sts);
        !           373:                if (SCARG(uap, cmd) == IBCS2_TCGETA) {
        !           374:                        stios2stio (&sts, &st);
        !           375:                        error = copyout((caddr_t)&st, SCARG(uap, data),
        !           376:                                        sizeof (st));
        !           377:                        if (error)
        !           378:                                DPRINTF(("ibcs2_ioctl(%d): copyout failed ",
        !           379:                                         p->p_pid));
        !           380:                        goto out;
        !           381:                } else {
        !           382:                        error = copyout((caddr_t)&sts, SCARG(uap, data),
        !           383:                                        sizeof (sts));
        !           384:                        goto out;
        !           385:                }
        !           386:                /*NOTREACHED*/
        !           387:            }
        !           388:
        !           389:        case IBCS2_TCSETA:
        !           390:        case IBCS2_TCSETAW:
        !           391:        case IBCS2_TCSETAF:
        !           392:            {
        !           393:                struct termios bts;
        !           394:                struct ibcs2_termios sts;
        !           395:                struct ibcs2_termio st;
        !           396:
        !           397:                if ((error = copyin(SCARG(uap, data), (caddr_t)&st,
        !           398:                                    sizeof(st))) != 0) {
        !           399:                        DPRINTF(("ibcs2_ioctl(%d): TCSET copyin failed ",
        !           400:                                 p->p_pid));
        !           401:                        goto out;
        !           402:                }
        !           403:
        !           404:                /* get full BSD termios so we don't lose information */
        !           405:                if ((error = (*ctl)(fp, TIOCGETA, (caddr_t)&bts, p)) != 0) {
        !           406:                        DPRINTF(("ibcs2_ioctl(%d): TCSET ctl failed fd %d ",
        !           407:                                 p->p_pid, SCARG(uap, fd)));
        !           408:                        goto out;
        !           409:                }
        !           410:
        !           411:                /*
        !           412:                 * convert to iBCS2 termios, copy in information from
        !           413:                 * termio, and convert back, then set new values.
        !           414:                 */
        !           415:                btios2stios(&bts, &sts);
        !           416:                stio2stios(&st, &sts);
        !           417:                stios2btios(&sts, &bts);
        !           418:
        !           419:                error = (*ctl)(fp, SCARG(uap, cmd) - IBCS2_TCSETA + TIOCSETA,
        !           420:                              (caddr_t)&bts, p);
        !           421:                goto out;
        !           422:            }
        !           423:
        !           424:        case IBCS2_XCSETA:
        !           425:        case IBCS2_XCSETAW:
        !           426:        case IBCS2_XCSETAF:
        !           427:            {
        !           428:                struct termios bts;
        !           429:                struct ibcs2_termios sts;
        !           430:
        !           431:                if ((error = copyin(SCARG(uap, data), (caddr_t)&sts,
        !           432:                                    sizeof (sts))) != 0) {
        !           433:                        goto out;
        !           434:                }
        !           435:                stios2btios (&sts, &bts);
        !           436:                error = (*ctl)(fp, SCARG(uap, cmd) - IBCS2_XCSETA + TIOCSETA,
        !           437:                              (caddr_t)&bts, p);
        !           438:                goto out;
        !           439:            }
        !           440:
        !           441:        case IBCS2_OXCSETA:
        !           442:        case IBCS2_OXCSETAW:
        !           443:        case IBCS2_OXCSETAF:
        !           444:            {
        !           445:                struct termios bts;
        !           446:                struct ibcs2_termios sts;
        !           447:
        !           448:                if ((error = copyin(SCARG(uap, data), (caddr_t)&sts,
        !           449:                                    sizeof (sts))) != 0) {
        !           450:                        goto out;
        !           451:                }
        !           452:                stios2btios (&sts, &bts);
        !           453:                error = (*ctl)(fp, SCARG(uap, cmd) - IBCS2_OXCSETA + TIOCSETA,
        !           454:                              (caddr_t)&bts, p);
        !           455:                goto out;
        !           456:            }
        !           457:
        !           458:        case IBCS2_TCSBRK:
        !           459:                DPRINTF(("ibcs2_ioctl(%d): TCSBRK ", p->p_pid));
        !           460:                error = ENOSYS;
        !           461:                goto out;
        !           462:
        !           463:        case IBCS2_TCXONC:
        !           464:            {
        !           465:                switch ((int)SCARG(uap, data)) {
        !           466:                case 0:
        !           467:                case 1:
        !           468:                        DPRINTF(("ibcs2_ioctl(%d): TCXONC ", p->p_pid));
        !           469:                        error = ENOSYS;
        !           470:                        goto out;
        !           471:                case 2:
        !           472:                        error = (*ctl)(fp, TIOCSTOP, (caddr_t)0, p);
        !           473:                        goto out;
        !           474:                case 3:
        !           475:                        error = (*ctl)(fp, TIOCSTART, (caddr_t)1, p);
        !           476:                        goto out;
        !           477:                default:
        !           478:                        error = EINVAL;
        !           479:                        goto out;
        !           480:                }
        !           481:            }
        !           482:
        !           483:        case IBCS2_TCFLSH:
        !           484:            {
        !           485:                int arg;
        !           486:
        !           487:                switch ((int)SCARG(uap, data)) {
        !           488:                case 0:
        !           489:                        arg = FREAD;
        !           490:                        break;
        !           491:                case 1:
        !           492:                        arg = FWRITE;
        !           493:                        break;
        !           494:                case 2:
        !           495:                        arg = FREAD | FWRITE;
        !           496:                        break;
        !           497:                default:
        !           498:                        error = EINVAL;
        !           499:                        goto out;
        !           500:                }
        !           501:                error = (*ctl)(fp, TIOCFLUSH, (caddr_t)&arg, p);
        !           502:                goto out;
        !           503:            }
        !           504:
        !           505:        case IBCS2_TIOCGWINSZ:
        !           506:                SCARG(uap, cmd) = TIOCGWINSZ;
        !           507:                error = sys_ioctl(p, uap, retval);
        !           508:                goto out;
        !           509:
        !           510:        case IBCS2_TIOCSWINSZ:
        !           511:                SCARG(uap, cmd) = TIOCSWINSZ;
        !           512:                error = sys_ioctl(p, uap, retval);
        !           513:                goto out;
        !           514:
        !           515:        case IBCS2_TIOCGPGRP:
        !           516:                error = copyout((caddr_t)&p->p_pgrp->pg_id, SCARG(uap, data),
        !           517:                                sizeof(p->p_pgrp->pg_id));
        !           518:                goto out;
        !           519:
        !           520:        case IBCS2_TIOCSPGRP:   /* XXX - is uap->data a pointer to pgid? */
        !           521:            {
        !           522:                struct sys_setpgid_args sa;
        !           523:
        !           524:                SCARG(&sa, pid) = 0;
        !           525:                SCARG(&sa, pgid) = (int)SCARG(uap, data);
        !           526:                if ((error = sys_setpgid(p, &sa, retval)) != 0)
        !           527:                        goto out;
        !           528:                error = 0;
        !           529:                goto out;
        !           530:            }
        !           531:
        !           532:        case IBCS2_TCGETSC:     /* SCO console - get scancode flags */
        !           533:                error = ENOSYS;
        !           534:                goto out;
        !           535:
        !           536:        case IBCS2_TCSETSC:     /* SCO console - set scancode flags */
        !           537:                error = ENOSYS;
        !           538:                goto out;
        !           539:
        !           540:        case IBCS2_SIOCSOCKSYS:
        !           541:                error = ibcs2_socksys(p, uap, retval);
        !           542:                goto out;
        !           543:
        !           544:        case IBCS2_FIONBIO:
        !           545:                {
        !           546:                        int arg;
        !           547:
        !           548:                        if ((error = copyin(SCARG(uap, data), &arg,
        !           549:                            sizeof(arg))) != 0)
        !           550:                                goto out;
        !           551:
        !           552:                        error = (*ctl)(fp, FIONBIO, (caddr_t)&arg, p);
        !           553:                        goto out;
        !           554:                }
        !           555:        case IBCS2_FIONREAD:
        !           556:        case IBCS2_I_NREAD:     /* STREAMS */
        !           557:                SCARG(uap, cmd) = FIONREAD;
        !           558:                error = sys_ioctl(p, uap, retval);
        !           559:                goto out;
        !           560:
        !           561:        default:
        !           562:                DPRINTF(("ibcs2_ioctl(%d): unknown cmd 0x%lx ",
        !           563:                         p->p_pid, SCARG(uap, cmd)));
        !           564:                error = ENOSYS;
        !           565:                goto out;
        !           566:        }
        !           567:        error = ENOSYS;
        !           568:
        !           569: out:
        !           570:        FRELE(fp);
        !           571:        return (error);
        !           572: }
        !           573:

CVSweb