Annotation of sys/compat/svr4/svr4_ttold.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: svr4_ttold.c,v 1.7 2002/03/14 01:26:51 millert Exp $ */
! 2: /* $NetBSD: svr4_ttold.c,v 1.9 1996/04/11 12:54:45 christos Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1994 Christos Zoulas
! 6: * All rights reserved.
! 7: *
! 8: * Redistribution and use in source and binary forms, with or without
! 9: * modification, are permitted provided that the following conditions
! 10: * are met:
! 11: * 1. Redistributions of source code must retain the above copyright
! 12: * notice, this list of conditions and the following disclaimer.
! 13: * 2. Redistributions in binary form must reproduce the above copyright
! 14: * notice, this list of conditions and the following disclaimer in the
! 15: * documentation and/or other materials provided with the distribution.
! 16: * 3. The name of the author may not be used to endorse or promote products
! 17: * derived from this software without specific prior written permission
! 18: *
! 19: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 20: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 21: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 22: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
! 23: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
! 24: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
! 25: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
! 26: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! 27: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
! 28: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 29: */
! 30:
! 31: #include <sys/param.h>
! 32: #include <sys/proc.h>
! 33: #include <sys/systm.h>
! 34: #include <sys/file.h>
! 35: #include <sys/filedesc.h>
! 36: #include <sys/ioctl.h>
! 37: #include <sys/termios.h>
! 38: #include <sys/tty.h>
! 39: #include <sys/socket.h>
! 40: #include <sys/mount.h>
! 41: #include <net/if.h>
! 42: #include <sys/malloc.h>
! 43:
! 44: #include <sys/syscallargs.h>
! 45:
! 46: #include <compat/svr4/svr4_types.h>
! 47: #include <compat/svr4/svr4_util.h>
! 48: #include <compat/svr4/svr4_signal.h>
! 49: #include <compat/svr4/svr4_syscallargs.h>
! 50: #include <compat/svr4/svr4_stropts.h>
! 51: #include <compat/svr4/svr4_ttold.h>
! 52: #include <compat/svr4/svr4_ioctl.h>
! 53:
! 54: static void svr4_tchars_to_bsd_tchars(const struct svr4_tchars *st,
! 55: struct tchars *bt);
! 56: static void bsd_tchars_to_svr4_tchars(const struct tchars *bt,
! 57: struct svr4_tchars *st);
! 58: static void svr4_sgttyb_to_bsd_sgttyb(const struct svr4_sgttyb *ss,
! 59: struct sgttyb *bs);
! 60: static void bsd_sgttyb_to_svr4_sgttyb(const struct sgttyb *bs,
! 61: struct svr4_sgttyb *ss);
! 62: static void svr4_ltchars_to_bsd_ltchars(const struct svr4_ltchars *sl,
! 63: struct ltchars *bl);
! 64: static void bsd_ltchars_to_svr4_ltchars(const struct ltchars *bl,
! 65: struct svr4_ltchars *sl);
! 66:
! 67: #ifdef DEBUG_SVR4
! 68: static void print_svr4_sgttyb(const char *, struct svr4_sgttyb *);
! 69: static void print_svr4_tchars(const char *, struct svr4_tchars *);
! 70: static void print_svr4_ltchars(const char *, struct svr4_ltchars *);
! 71:
! 72: static void
! 73: print_svr4_sgttyb(str, ss)
! 74: const char *str;
! 75: struct svr4_sgttyb *ss;
! 76: {
! 77: uprintf("%s\nispeed=%o ospeed=%o ", str, ss->sg_ispeed, ss->sg_ospeed);
! 78: uprintf("erase=%o kill=%o flags=%o\n", ss->sg_erase, ss->sg_kill,
! 79: ss->sg_flags);
! 80: }
! 81:
! 82: static void
! 83: print_svr4_tchars(str, st)
! 84: const char *str;
! 85: struct svr4_tchars *st;
! 86: {
! 87: uprintf("%s\nintrc=%o quitc=%o ", str, st->t_intrc, st->t_quitc);
! 88: uprintf("startc=%o stopc=%o eofc=%o brkc=%o\n", st->t_startc,
! 89: st->t_stopc, st->t_eofc, st->t_brkc);
! 90: }
! 91:
! 92: static void
! 93: print_svr4_ltchars(str, sl)
! 94: const char *str;
! 95: struct svr4_ltchars *sl;
! 96: {
! 97: uprintf("%s\nsuspc=%o dsuspc=%o ", str, sl->t_suspc, sl->t_dsuspc);
! 98: uprintf("rprntc=%o flushc=%o werasc=%o lnextc=%o\n", sl->t_rprntc,
! 99: sl->t_flushc, sl->t_werasc, sl->t_lnextc);
! 100: }
! 101: #endif /* DEBUG_SVR4 */
! 102:
! 103: static void
! 104: svr4_tchars_to_bsd_tchars(st, bt)
! 105: const struct svr4_tchars *st;
! 106: struct tchars *bt;
! 107: {
! 108: bt->t_intrc = st->t_intrc;
! 109: bt->t_quitc = st->t_quitc;
! 110: bt->t_startc = st->t_startc;
! 111: bt->t_stopc = st->t_stopc;
! 112: bt->t_eofc = st->t_eofc;
! 113: bt->t_brkc = st->t_brkc;
! 114: }
! 115:
! 116:
! 117: static void
! 118: bsd_tchars_to_svr4_tchars(bt, st)
! 119: const struct tchars *bt;
! 120: struct svr4_tchars *st;
! 121: {
! 122: st->t_intrc = bt->t_intrc;
! 123: st->t_quitc = bt->t_quitc;
! 124: st->t_startc = bt->t_startc;
! 125: st->t_stopc = bt->t_stopc;
! 126: st->t_eofc = bt->t_eofc;
! 127: st->t_brkc = bt->t_brkc;
! 128: }
! 129:
! 130:
! 131: static void
! 132: svr4_sgttyb_to_bsd_sgttyb(ss, bs)
! 133: const struct svr4_sgttyb *ss;
! 134: struct sgttyb *bs;
! 135: {
! 136: bs->sg_ispeed = ss->sg_ispeed;
! 137: bs->sg_ospeed = ss->sg_ospeed;
! 138: bs->sg_erase = ss->sg_erase;
! 139: bs->sg_kill = ss->sg_kill;
! 140: bs->sg_flags = ss->sg_flags;
! 141: };
! 142:
! 143:
! 144: static void
! 145: bsd_sgttyb_to_svr4_sgttyb(bs, ss)
! 146: const struct sgttyb *bs;
! 147: struct svr4_sgttyb *ss;
! 148: {
! 149: ss->sg_ispeed = bs->sg_ispeed;
! 150: ss->sg_ospeed = bs->sg_ospeed;
! 151: ss->sg_erase = bs->sg_erase;
! 152: ss->sg_kill = bs->sg_kill;
! 153: ss->sg_flags = bs->sg_flags;
! 154: }
! 155:
! 156:
! 157: static void
! 158: svr4_ltchars_to_bsd_ltchars(sl, bl)
! 159: const struct svr4_ltchars *sl;
! 160: struct ltchars *bl;
! 161: {
! 162: bl->t_suspc = sl->t_suspc;
! 163: bl->t_dsuspc = sl->t_dsuspc;
! 164: bl->t_rprntc = sl->t_rprntc;
! 165: bl->t_flushc = sl->t_flushc;
! 166: bl->t_werasc = sl->t_werasc;
! 167: bl->t_lnextc = sl->t_lnextc;
! 168: }
! 169:
! 170:
! 171: static void
! 172: bsd_ltchars_to_svr4_ltchars(bl, sl)
! 173: const struct ltchars *bl;
! 174: struct svr4_ltchars *sl;
! 175: {
! 176: sl->t_suspc = bl->t_suspc;
! 177: sl->t_dsuspc = bl->t_dsuspc;
! 178: sl->t_rprntc = bl->t_rprntc;
! 179: sl->t_flushc = bl->t_flushc;
! 180: sl->t_werasc = bl->t_werasc;
! 181: sl->t_lnextc = bl->t_lnextc;
! 182: }
! 183:
! 184:
! 185: int
! 186: svr4_ttold_ioctl(fp, p, retval, fd, cmd, data)
! 187: struct file *fp;
! 188: struct proc *p;
! 189: register_t *retval;
! 190: int fd;
! 191: u_long cmd;
! 192: caddr_t data;
! 193: {
! 194: int error;
! 195: int (*ctl)(struct file *, u_long, caddr_t, struct proc *) =
! 196: fp->f_ops->fo_ioctl;
! 197:
! 198: *retval = 0;
! 199:
! 200: switch (cmd) {
! 201: case SVR4_TIOCGPGRP:
! 202: {
! 203: pid_t pid;
! 204:
! 205: if ((error = (*ctl)(fp, TIOCGPGRP,
! 206: (caddr_t) &pid, p)) != 0)
! 207: return error;
! 208:
! 209: DPRINTF(("TIOCGPGRP %d\n", pid));
! 210:
! 211: if ((error = copyout(&pid, data, sizeof(pid))) != 0)
! 212: return error;
! 213:
! 214: }
! 215:
! 216: case SVR4_TIOCSPGRP:
! 217: {
! 218: pid_t pid;
! 219:
! 220: if ((error = copyin(data, &pid, sizeof(pid))) != 0)
! 221: return error;
! 222:
! 223: DPRINTF(("TIOCSPGRP %d\n", pid));
! 224:
! 225: return (*ctl)(fp, TIOCSPGRP, (caddr_t) &pid, p);
! 226: }
! 227:
! 228: case SVR4_TIOCGSID:
! 229: {
! 230: pid_t pid;
! 231:
! 232: if ((error = (*ctl)(fp, TIOCGSID,
! 233: (caddr_t) &pid, p)) != 0)
! 234: return error;
! 235:
! 236: DPRINTF(("TIOCGSID %d\n", pid));
! 237:
! 238: return copyout(&pid, data, sizeof(pid));
! 239: }
! 240:
! 241: case SVR4_TIOCGETP:
! 242: {
! 243: struct sgttyb bs;
! 244: struct svr4_sgttyb ss;
! 245:
! 246: error = (*ctl)(fp, TIOCGETP, (caddr_t) &bs, p);
! 247: if (error)
! 248: return error;
! 249:
! 250: bsd_sgttyb_to_svr4_sgttyb(&bs, &ss);
! 251: #ifdef DEBUG_SVR4
! 252: print_svr4_sgttyb("SVR4_TIOCGETP", &ss);
! 253: #endif /* DEBUG_SVR4 */
! 254: return copyout(&ss, data, sizeof(ss));
! 255: }
! 256:
! 257: case SVR4_TIOCSETP:
! 258: case SVR4_TIOCSETN:
! 259: {
! 260: struct sgttyb bs;
! 261: struct svr4_sgttyb ss;
! 262:
! 263: if ((error = copyin(data, &ss, sizeof(ss))) != 0)
! 264: return error;
! 265:
! 266: svr4_sgttyb_to_bsd_sgttyb(&ss, &bs);
! 267: #ifdef DEBUG_SVR4
! 268: print_svr4_sgttyb("SVR4_TIOCSET{P,N}", &ss);
! 269: #endif /* DEBUG_SVR4 */
! 270: cmd = (cmd == SVR4_TIOCSETP) ? TIOCSETP : TIOCSETN;
! 271: return (*ctl)(fp, cmd, (caddr_t) &bs, p);
! 272: }
! 273:
! 274: case SVR4_TIOCGETC:
! 275: {
! 276: struct tchars bt;
! 277: struct svr4_tchars st;
! 278:
! 279: error = (*ctl)(fp, TIOCGETC, (caddr_t) &bt, p);
! 280: if (error)
! 281: return error;
! 282:
! 283: bsd_tchars_to_svr4_tchars(&bt, &st);
! 284: #ifdef DEBUG_SVR4
! 285: print_svr4_tchars("SVR4_TIOCGETC", &st);
! 286: #endif /* DEBUG_SVR4 */
! 287: return copyout(&st, data, sizeof(st));
! 288: }
! 289:
! 290: case SVR4_TIOCSETC:
! 291: {
! 292: struct tchars bt;
! 293: struct svr4_tchars st;
! 294:
! 295: if ((error = copyin(data, &st, sizeof(st))) != 0)
! 296: return error;
! 297:
! 298: svr4_tchars_to_bsd_tchars(&st, &bt);
! 299: #ifdef DEBUG_SVR4
! 300: print_svr4_tchars("SVR4_TIOCSETC", &st);
! 301: #endif /* DEBUG_SVR4 */
! 302: return (*ctl)(fp, TIOCSETC, (caddr_t) &bt, p);
! 303: }
! 304:
! 305: case SVR4_TIOCGLTC:
! 306: {
! 307: struct ltchars bl;
! 308: struct svr4_ltchars sl;
! 309:
! 310: error = (*ctl)(fp, TIOCGLTC, (caddr_t) &bl, p);
! 311: if (error)
! 312: return error;
! 313:
! 314: bsd_ltchars_to_svr4_ltchars(&bl, &sl);
! 315: #ifdef DEBUG_SVR4
! 316: print_svr4_ltchars("SVR4_TIOCGLTC", &sl);
! 317: #endif /* DEBUG_SVR4 */
! 318: return copyout(&sl, data, sizeof(sl));
! 319: }
! 320:
! 321: case SVR4_TIOCSLTC:
! 322: {
! 323: struct ltchars bl;
! 324: struct svr4_ltchars sl;
! 325:
! 326: if ((error = copyin(data, &sl, sizeof(sl))) != 0)
! 327: return error;
! 328:
! 329: svr4_ltchars_to_bsd_ltchars(&sl, &bl);
! 330: #ifdef DEBUG_SVR4
! 331: print_svr4_ltchars("SVR4_TIOCSLTC", &sl);
! 332: #endif /* DEBUG_SVR4 */
! 333: return (*ctl)(fp, TIOCSLTC, (caddr_t) &bl, p);
! 334: }
! 335:
! 336: case SVR4_TIOCLGET:
! 337: {
! 338: int flags;
! 339: if ((error = (*ctl)(fp, cmd, (caddr_t) &flags, p)) !=
! 340: 0)
! 341: return error;
! 342: DPRINTF(("SVR4_TIOCLGET %o\n", flags));
! 343: return copyout(&flags, data, sizeof(flags));
! 344: }
! 345:
! 346: case SVR4_TIOCLSET:
! 347: case SVR4_TIOCLBIS:
! 348: case SVR4_TIOCLBIC:
! 349: {
! 350: int flags;
! 351:
! 352: if ((error = copyin(data, &flags, sizeof(flags))) != 0)
! 353: return error;
! 354:
! 355: switch (cmd) {
! 356: case SVR4_TIOCLSET:
! 357: cmd = TIOCLSET;
! 358: break;
! 359: case SVR4_TIOCLBIS:
! 360: cmd = TIOCLBIS;
! 361: break;
! 362: case SVR4_TIOCLBIC:
! 363: cmd = TIOCLBIC;
! 364: break;
! 365: }
! 366:
! 367: DPRINTF(("SVR4_TIOCL{SET,BIS,BIC} %o\n", flags));
! 368: return (*ctl)(fp, cmd, (caddr_t) &flags, p);
! 369: }
! 370:
! 371: default:
! 372: DPRINTF(("Unknown svr4 ttold %lx\n", cmd));
! 373: return 0; /* ENOSYS really */
! 374: }
! 375: }
CVSweb