This source file includes following definitions.
- stios2btios
- btios2stios
- stios2stio
- stio2stios
- ultrix_sys_ioctl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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/audioio.h>
41 #include <net/if.h>
42
43 #include <sys/mount.h>
44
45 #include <compat/ultrix/ultrix_syscallargs.h>
46 #include <sys/syscallargs.h>
47
48 #include <compat/sunos/sunos.h>
49
50 #include "ultrix_tty.h"
51
52 #define emul_termio ultrix_termio
53 #define emul_termios ultrix_termios
54
55
56
57
58
59
60
61 static const struct speedtab sptab[] = {
62 { 0, 0 },
63 { 50, 1 },
64 { 75, 2 },
65 { 110, 3 },
66 { 134, 4 },
67 { 135, 4 },
68 { 150, 5 },
69 { 200, 6 },
70 { 300, 7 },
71 { 600, 8 },
72 { 1200, 9 },
73 { 1800, 10 },
74 { 2400, 11 },
75 { 4800, 12 },
76 { 9600, 13 },
77 { 19200, 14 },
78 { 38400, 15 },
79 { -1, -1 }
80 };
81
82 static const u_long s2btab[] = {
83 0,
84 50,
85 75,
86 110,
87 134,
88 150,
89 200,
90 300,
91 600,
92 1200,
93 1800,
94 2400,
95 4800,
96 9600,
97 19200,
98 38400,
99 };
100
101
102
103
104
105
106
107 #define NATIVE_TO_EMUL_CC(bsd_cc) \
108 (((bsd_cc) != _POSIX_VDISABLE) ? (bsd_cc) : 0)
109
110 #define EMUL_TO_NATIVE_CC(emul_cc) \
111 (emul_cc) ? (emul_cc) : _POSIX_VDISABLE;
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131 static void
132 stios2btios(st, bt)
133 struct emul_termios *st;
134 struct termios *bt;
135 {
136 register u_long l, r;
137
138 l = st->c_iflag;
139 r = ((l & 0x00000001) ? IGNBRK : 0);
140 r |= ((l & 0x00000002) ? BRKINT : 0);
141 r |= ((l & 0x00000004) ? IGNPAR : 0);
142 r |= ((l & 0x00000008) ? PARMRK : 0);
143 r |= ((l & 0x00000010) ? INPCK : 0);
144 r |= ((l & 0x00000020) ? ISTRIP : 0);
145 r |= ((l & 0x00000040) ? INLCR : 0);
146 r |= ((l & 0x00000080) ? IGNCR : 0);
147 r |= ((l & 0x00000100) ? ICRNL : 0);
148
149 r |= ((l & 0x00000400) ? IXON : 0);
150 r |= ((l & 0x00000800) ? IXANY : 0);
151 r |= ((l & 0x00001000) ? IXOFF : 0);
152 r |= ((l & 0x00002000) ? IMAXBEL : 0);
153 bt->c_iflag = r;
154
155 l = st->c_oflag;
156 r = ((l & 0x00000001) ? OPOST : 0);
157
158 r |= ((l & 0x00000004) ? ONLCR : 0);
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173 r |= ((l & 0x00001800) ? OXTABS : 0);
174
175
176
177
178
179
180
181
182 bt->c_oflag = r;
183
184 l = st->c_cflag;
185 switch (l & 0x00000030) {
186 case 0:
187 r = CS5;
188 break;
189 case 0x00000010:
190 r = CS6;
191 break;
192 case 0x00000020:
193 r = CS7;
194 break;
195 case 0x00000030:
196 r = CS8;
197 break;
198 }
199 r |= ((l & 0x00000040) ? CSTOPB : 0);
200 r |= ((l & 0x00000080) ? CREAD : 0);
201 r |= ((l & 0x00000100) ? PARENB : 0);
202 r |= ((l & 0x00000200) ? PARODD : 0);
203 r |= ((l & 0x00000400) ? HUPCL : 0);
204 r |= ((l & 0x00000800) ? CLOCAL : 0);
205
206 r |= ((l & 0x80000000) ? (CRTS_IFLOW|CCTS_OFLOW) : 0);
207 bt->c_cflag = r;
208
209 bt->c_ispeed = bt->c_ospeed = s2btab[l & 0x0000000f];
210
211 l = st->c_lflag;
212 r = ((l & 0x00000001) ? ISIG : 0);
213 r |= ((l & 0x00000002) ? ICANON : 0);
214
215 r |= ((l & 0x00000008) ? ECHO : 0);
216 r |= ((l & 0x00000010) ? ECHOE : 0);
217 r |= ((l & 0x00000020) ? ECHOK : 0);
218 r |= ((l & 0x00000040) ? ECHONL : 0);
219 r |= ((l & 0x00000080) ? NOFLSH : 0);
220 r |= ((l & 0x00000100) ? TOSTOP : 0);
221 r |= ((l & 0x00000200) ? ECHOCTL : 0);
222 r |= ((l & 0x00000400) ? ECHOPRT : 0);
223 r |= ((l & 0x00000800) ? ECHOKE : 0);
224
225 r |= ((l & 0x00002000) ? FLUSHO : 0);
226 r |= ((l & 0x00004000) ? PENDIN : 0);
227 bt->c_lflag = r;
228
229 bt->c_cc[VINTR] = EMUL_TO_NATIVE_CC(st->c_cc[0]);
230 bt->c_cc[VQUIT] = EMUL_TO_NATIVE_CC(st->c_cc[1]);
231 bt->c_cc[VERASE] = EMUL_TO_NATIVE_CC(st->c_cc[2]);
232 bt->c_cc[VKILL] = EMUL_TO_NATIVE_CC(st->c_cc[3]);
233 bt->c_cc[VEOF] = EMUL_TO_NATIVE_CC(st->c_cc[4]);
234 bt->c_cc[VEOL] = EMUL_TO_NATIVE_CC(st->c_cc[5]);
235 bt->c_cc[VEOL2] = EMUL_TO_NATIVE_CC(st->c_cc[6]);
236
237
238 bt->c_cc[VSTART] = EMUL_TO_NATIVE_CC(st->c_cc[10]);
239 bt->c_cc[VSTOP] = EMUL_TO_NATIVE_CC(st->c_cc[11]);
240 bt->c_cc[VSUSP] = EMUL_TO_NATIVE_CC(st->c_cc[12]);
241 bt->c_cc[VDSUSP] = EMUL_TO_NATIVE_CC(st->c_cc[13]);
242 bt->c_cc[VREPRINT] = EMUL_TO_NATIVE_CC(st->c_cc[14]);
243 bt->c_cc[VDISCARD] = EMUL_TO_NATIVE_CC(st->c_cc[15]);
244 bt->c_cc[VWERASE] = EMUL_TO_NATIVE_CC(st->c_cc[16]);
245 bt->c_cc[VLNEXT] = EMUL_TO_NATIVE_CC(st->c_cc[17]);
246 bt->c_cc[VSTATUS] = EMUL_TO_NATIVE_CC(st->c_cc[18]);
247
248 #ifdef COMPAT_ULTRIX
249
250 bt->c_cc[VMIN] = EMUL_TO_NATIVE_CC(st->c_cc[8]);
251 bt->c_cc[VTIME] = EMUL_TO_NATIVE_CC(st->c_cc[9]);
252 #else
253
254 bt->c_cc[VMIN] = (bt->c_lflag & ICANON) ? 1 : bt->c_cc[VEOF];
255 bt->c_cc[VTIME] = (bt->c_lflag & ICANON) ? 1 : bt->c_cc[VEOL];
256 #endif
257
258 }
259
260
261
262
263 static void
264 btios2stios(bt, st)
265 struct termios *bt;
266 struct emul_termios *st;
267 {
268 register u_long l, r;
269
270 l = bt->c_iflag;
271 r = ((l & IGNBRK) ? 0x00000001 : 0);
272 r |= ((l & BRKINT) ? 0x00000002 : 0);
273 r |= ((l & IGNPAR) ? 0x00000004 : 0);
274 r |= ((l & PARMRK) ? 0x00000008 : 0);
275 r |= ((l & INPCK) ? 0x00000010 : 0);
276 r |= ((l & ISTRIP) ? 0x00000020 : 0);
277 r |= ((l & INLCR) ? 0x00000040 : 0);
278 r |= ((l & IGNCR) ? 0x00000080 : 0);
279 r |= ((l & ICRNL) ? 0x00000100 : 0);
280
281 r |= ((l & IXON) ? 0x00000400 : 0);
282 r |= ((l & IXANY) ? 0x00000800 : 0);
283 r |= ((l & IXOFF) ? 0x00001000 : 0);
284 r |= ((l & IMAXBEL) ? 0x00002000 : 0);
285 st->c_iflag = r;
286
287 l = bt->c_oflag;
288 r = ((l & OPOST) ? 0x00000001 : 0);
289
290 r |= ((l & ONLCR) ? 0x00000004 : 0);
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305 r |= ((l & OXTABS) ? 0x00001800 : 0);
306
307
308
309
310
311
312
313
314 st->c_oflag = r;
315
316 l = bt->c_cflag;
317 switch (l & CSIZE) {
318 case CS5:
319 r = 0;
320 break;
321 case CS6:
322 r = 0x00000010;
323 break;
324 case CS7:
325 r = 0x00000020;
326 break;
327 case CS8:
328 r = 0x00000030;
329 break;
330 }
331 r |= ((l & CSTOPB) ? 0x00000040 : 0);
332 r |= ((l & CREAD) ? 0x00000080 : 0);
333 r |= ((l & PARENB) ? 0x00000100 : 0);
334 r |= ((l & PARODD) ? 0x00000200 : 0);
335 r |= ((l & HUPCL) ? 0x00000400 : 0);
336 r |= ((l & CLOCAL) ? 0x00000800 : 0);
337
338 r |= ((l & (CRTS_IFLOW|CCTS_OFLOW)) ? 0x80000000 : 0);
339 st->c_cflag = r;
340
341 l = bt->c_lflag;
342 r = ((l & ISIG) ? 0x00000001 : 0);
343 r |= ((l & ICANON) ? 0x00000002 : 0);
344
345 r |= ((l & ECHO) ? 0x00000008 : 0);
346 r |= ((l & ECHOE) ? 0x00000010 : 0);
347 r |= ((l & ECHOK) ? 0x00000020 : 0);
348 r |= ((l & ECHONL) ? 0x00000040 : 0);
349 r |= ((l & NOFLSH) ? 0x00000080 : 0);
350 r |= ((l & TOSTOP) ? 0x00000100 : 0);
351 r |= ((l & ECHOCTL) ? 0x00000200 : 0);
352 r |= ((l & ECHOPRT) ? 0x00000400 : 0);
353 r |= ((l & ECHOKE) ? 0x00000800 : 0);
354
355 r |= ((l & FLUSHO) ? 0x00002000 : 0);
356 r |= ((l & PENDIN) ? 0x00004000 : 0);
357 st->c_lflag = r;
358
359 l = ttspeedtab(bt->c_ospeed, sptab);
360 if (l >= 0)
361 st->c_cflag |= l;
362
363 st->c_cc[0] = NATIVE_TO_EMUL_CC(bt->c_cc[VINTR]);
364 st->c_cc[1] = NATIVE_TO_EMUL_CC(bt->c_cc[VQUIT]);
365 st->c_cc[2] = NATIVE_TO_EMUL_CC(bt->c_cc[VERASE]);
366 st->c_cc[3] = NATIVE_TO_EMUL_CC(bt->c_cc[VKILL]);
367 st->c_cc[4] = NATIVE_TO_EMUL_CC(bt->c_cc[VEOF]);
368 st->c_cc[5] = NATIVE_TO_EMUL_CC(bt->c_cc[VEOL]);
369 st->c_cc[6] = NATIVE_TO_EMUL_CC(bt->c_cc[VEOL2]);
370
371
372
373 #ifndef COMPAT_ULTRIX
374 st->c_cc[7] = NATIVE_TO_EMUL_CC(bt->c_cc[VSWTCH]);
375 #else
376 st->c_cc[7] = 0;
377 #endif
378 st->c_cc[10] = NATIVE_TO_EMUL_CC(bt->c_cc[VSTART]);
379 st->c_cc[11] = NATIVE_TO_EMUL_CC(bt->c_cc[VSTOP]);
380 st->c_cc[12]= NATIVE_TO_EMUL_CC(bt->c_cc[VSUSP]);
381 st->c_cc[13]= NATIVE_TO_EMUL_CC(bt->c_cc[VDSUSP]);
382 st->c_cc[14]= NATIVE_TO_EMUL_CC(bt->c_cc[VREPRINT]);
383 st->c_cc[15]= NATIVE_TO_EMUL_CC(bt->c_cc[VDISCARD]);
384 st->c_cc[16]= NATIVE_TO_EMUL_CC(bt->c_cc[VWERASE]);
385 st->c_cc[17]= NATIVE_TO_EMUL_CC(bt->c_cc[VLNEXT]);
386 st->c_cc[18]= NATIVE_TO_EMUL_CC(bt->c_cc[VSTATUS]);
387
388 #ifdef COMPAT_ULTRIX
389 st->c_cc[8]= NATIVE_TO_EMUL_CC(bt->c_cc[VMIN]);
390 st->c_cc[9]= NATIVE_TO_EMUL_CC(bt->c_cc[VTIME]);
391 #else
392 if (!(bt->c_lflag & ICANON)) {
393
394 st->c_cc[4] = bt->c_cc[VMIN];
395 st->c_cc[5] = bt->c_cc[VTIME];
396 }
397 #endif
398
399 #ifdef COMPAT_SUNOS
400 st->c_line = 0;
401 #else
402 st->c_line = 2;
403 #endif
404 }
405
406 #define TERMIO_NCC 10
407
408
409
410
411 static void
412 stios2stio(ts, t)
413 struct emul_termios *ts;
414 struct emul_termio *t;
415 {
416 t->c_iflag = ts->c_iflag;
417 t->c_oflag = ts->c_oflag;
418 t->c_cflag = ts->c_cflag;
419 t->c_lflag = ts->c_lflag;
420 t->c_line = ts->c_line;
421 bcopy(ts->c_cc, t->c_cc, TERMIO_NCC);
422 }
423
424
425
426
427 static void
428 stio2stios(t, ts)
429 struct emul_termio *t;
430 struct emul_termios *ts;
431 {
432 ts->c_iflag = t->c_iflag;
433 ts->c_oflag = t->c_oflag;
434 ts->c_cflag = t->c_cflag;
435 ts->c_lflag = t->c_lflag;
436 ts->c_line = t->c_line;
437 bcopy(t->c_cc, ts->c_cc, TERMIO_NCC);
438 }
439
440 int
441 ultrix_sys_ioctl(p, v, retval)
442 register struct proc *p;
443 void *v;
444 register_t *retval;
445 {
446 struct ultrix_sys_ioctl_args *uap = v;
447 struct filedesc *fdp = p->p_fd;
448 struct file *fp;
449 register int (*ctl)();
450 int error;
451
452 if ((fp = fd_getfile(fdp, SCARG(uap, fd))) == NULL)
453 return EBADF;
454 FREF(fp);
455
456 if ((fp->f_flag & (FREAD|FWRITE)) == 0) {
457 error = EBADF;
458 goto out;
459 }
460
461 ctl = fp->f_ops->fo_ioctl;
462
463 switch (SCARG(uap, com)) {
464 case _IOR('t', 0, int):
465 SCARG(uap, com) = TIOCGETD;
466 break;
467 case _IOW('t', 1, int):
468 {
469 int disc;
470
471 if ((error = copyin(SCARG(uap, data), (caddr_t)&disc,
472 sizeof disc)) != 0)
473 goto out;
474
475
476 if (disc == 2)
477 disc = 0;
478
479 if (disc) {
480 error = ENXIO;
481 goto out;
482 }
483
484 error = (*ctl)(fp, TIOCSETD, (caddr_t)&disc, p);
485 goto out;
486 }
487 case _IOW('t', 101, int):
488 {
489 int x;
490
491 error = copyin((caddr_t)&x, SCARG(uap, data), sizeof x);
492 goto out;
493 }
494 case _IOR('t', 100, int):
495 {
496 int x = 0;
497
498 error = copyout((caddr_t)&x, SCARG(uap, data), sizeof x);
499 goto out;
500 }
501 case _IO('t', 36):
502 {
503 int on = 1;
504 error = (*ctl)(fp, TIOCCONS, (caddr_t)&on, p);
505 goto out;
506 }
507 case _IOW('t', 37, struct sunos_ttysize):
508 {
509 struct winsize ws;
510 struct sunos_ttysize ss;
511
512 if ((error = (*ctl)(fp, TIOCGWINSZ, (caddr_t)&ws, p)) != 0)
513 goto out;
514
515 if ((error = copyin (SCARG(uap, data), &ss, sizeof (ss))) != 0)
516 goto out;
517
518 ws.ws_row = ss.ts_row;
519 ws.ws_col = ss.ts_col;
520
521 error = ((*ctl)(fp, TIOCSWINSZ, (caddr_t)&ws, p));
522 goto out;
523 }
524 case _IOW('t', 38, struct sunos_ttysize):
525 {
526 struct winsize ws;
527 struct sunos_ttysize ss;
528
529 if ((error = (*ctl)(fp, TIOCGWINSZ, (caddr_t)&ws, p)) != 0)
530 goto out;
531
532 ss.ts_row = ws.ws_row;
533 ss.ts_col = ws.ws_col;
534
535 error = copyout ((caddr_t)&ss, SCARG(uap, data), sizeof (ss));
536 goto out;
537 }
538 case _IOW('t', 130, int):
539 SCARG(uap, com) = TIOCSPGRP;
540 break;
541 case _IOR('t', 131, int):
542 SCARG(uap, com) = TIOCGPGRP;
543 break;
544 case _IO('t', 132):
545 SCARG(uap, com) = TIOCSCTTY;
546 break;
547
548 case ULTRIX_TCGETA:
549 case ULTRIX_TCGETS:
550 {
551 struct termios bts;
552 struct ultrix_termios sts;
553 struct ultrix_termio st;
554
555 if ((error = (*ctl)(fp, TIOCGETA, (caddr_t)&bts, p)) != 0)
556 goto out;
557
558 btios2stios (&bts, &sts);
559 if (SCARG(uap, com) == ULTRIX_TCGETA) {
560 stios2stio (&sts, &st);
561 error = copyout((caddr_t)&st, SCARG(uap, data),
562 sizeof (st));
563 goto out;
564 } else {
565 error = copyout((caddr_t)&sts, SCARG(uap, data),
566 sizeof (sts));
567 goto out;
568 }
569
570 }
571
572 case ULTRIX_TCSETA:
573 case ULTRIX_TCSETAW:
574 case ULTRIX_TCSETAF:
575 {
576 struct termios bts;
577 struct ultrix_termios sts;
578 struct ultrix_termio st;
579
580 if ((error = copyin(SCARG(uap, data), (caddr_t)&st,
581 sizeof (st))) != 0)
582 goto out;
583
584
585 if ((error = (*ctl)(fp, TIOCGETA, (caddr_t)&bts, p)) != 0)
586 goto out;
587
588
589
590
591
592 btios2stios(&bts, &sts);
593 stio2stios(&st, &sts);
594 stios2btios(&sts, &bts);
595
596
597
598
599 error = (*ctl)(fp, ULTRIX_TCSETA - SCARG(uap, com) + TIOCSETA,
600 (caddr_t)&bts, p);
601 printf("ultrix TCSETA %lx returns %d\n",
602 ULTRIX_TCSETA - SCARG(uap, com), error);
603 goto out;
604 }
605
606 case ULTRIX_TCSETS:
607 case ULTRIX_TCSETSW:
608 case ULTRIX_TCSETSF:
609 {
610 struct termios bts;
611 struct ultrix_termios sts;
612
613 if ((error = copyin (SCARG(uap, data), (caddr_t)&sts,
614 sizeof (sts))) != 0)
615 goto out;
616 stios2btios (&sts, &bts);
617 error = (*ctl)(fp, ULTRIX_TCSETS - SCARG(uap, com) + TIOCSETA,
618 (caddr_t)&bts, p);
619 goto out;
620 }
621
622
623
624 case _IOW('t', 32, int): {
625 int error, on;
626
627 error = copyin (SCARG(uap, data), (caddr_t)&on, sizeof (on));
628 if (error != 0)
629 goto out;
630 error = (*ctl)(fp, TIOCUCNTL, (caddr_t)&on, p);
631 goto out;
632 }
633 case _IOW('t', 33, int): {
634 int error, sig;
635
636 error = copyin (SCARG(uap, data), (caddr_t)&sig, sizeof (sig));
637 if (error != 0)
638 goto out;
639 error = (*ctl)(fp, TIOCSIG, (caddr_t)&sig, p);
640 goto out;
641 }
642
643
644
645
646 #define IN_TYPE(a, type_t) { \
647 type_t localbuf; \
648 if ((error = copyin (SCARG(uap, data), \
649 (caddr_t)&localbuf, sizeof (type_t))) != 0) \
650 goto out; \
651 error = (*ctl)(fp, a, (caddr_t)&localbuf, p); \
652 goto out; \
653 }
654
655 #define INOUT_TYPE(a, type_t) { \
656 type_t localbuf; \
657 if ((error = copyin (SCARG(uap, data), (caddr_t)&localbuf, \
658 sizeof (type_t))) != 0) \
659 goto out; \
660 if ((error = (*ctl)(fp, a, (caddr_t)&localbuf, p)) != 0) \
661 goto out; \
662 error = copyout ((caddr_t)&localbuf, SCARG(uap, data), sizeof (type_t)); \
663 goto out; \
664 }
665
666
667 #define IFREQ_IN(a) { \
668 struct ifreq ifreq; \
669 if ((error = copyin (SCARG(uap, data), (caddr_t)&ifreq, sizeof (ifreq))) != 0) \
670 goto out; \
671 error = (*ctl)(fp, a, (caddr_t)&ifreq, p); \
672 goto out; \
673 }
674
675 #define IFREQ_INOUT(a) { \
676 struct ifreq ifreq; \
677 if ((error = copyin (SCARG(uap, data), (caddr_t)&ifreq, sizeof (ifreq))) != 0) \
678 goto out; \
679 if ((error = (*ctl)(fp, a, (caddr_t)&ifreq, p)) != 0) \
680 goto out; \
681 error = copyout ((caddr_t)&ifreq, SCARG(uap, data), sizeof (ifreq)); \
682 goto out; \
683 }
684
685 case _IOW('i', 12, struct ifreq):
686
687 break;
688
689 case _IOWR('i', 13, struct ifreq):
690 IFREQ_INOUT(OSIOCGIFADDR);
691
692 case _IOW('i', 14, struct ifreq):
693
694 break;
695
696 case _IOWR('i', 15, struct ifreq):
697 IFREQ_INOUT(OSIOCGIFDSTADDR);
698
699 case _IOW('i', 16, struct ifreq):
700
701 break;
702
703 case _IOWR('i', 17, struct ifreq):
704
705 break;
706
707 case _IOW('i', 21, struct ifreq):
708 IFREQ_IN(SIOCSIFMTU);
709
710 case _IOWR('i', 22, struct ifreq):
711 IFREQ_INOUT(SIOCGIFMTU);
712
713 case _IOWR('i', 23, struct ifreq):
714 IFREQ_INOUT(SIOCGIFBRDADDR);
715
716 case _IOW('i', 24, struct ifreq):
717 IFREQ_IN(SIOCSIFBRDADDR);
718
719 case _IOWR('i', 25, struct ifreq):
720 IFREQ_INOUT(OSIOCGIFNETMASK);
721
722 case _IOW('i', 26, struct ifreq):
723 IFREQ_IN(SIOCSIFNETMASK);
724
725 case _IOWR('i', 27, struct ifreq):
726 IFREQ_INOUT(SIOCGIFMETRIC);
727
728 case _IOWR('i', 28, struct ifreq):
729 IFREQ_IN(SIOCSIFMETRIC);
730
731 case _IOW('i', 30, struct arpreq):
732
733 break;
734
735 case _IOWR('i', 31, struct arpreq):
736
737 break;
738
739 case _IOW('i', 32, struct arpreq):
740
741 break;
742
743 case _IOW('i', 18, struct ifreq):
744 case _IOWR('i', 19, struct ifreq):
745 case _IOW('i', 40, struct ifreq):
746 case _IOW('i', 41, struct ifreq):
747 case _IOW('i', 44, struct ifreq):
748 case _IOWR('i', 45, struct ifreq):
749 case _IOWR('i', 46, struct ifreq):
750 case _IOWR('i', 47, struct ifreq):
751 case _IOW('i', 48, int):
752 case _IOW('i', 49, struct ifreq):
753 case _IOW('i', 50, struct ifreq):
754 error = EOPNOTSUPP;
755 goto out;
756
757 case _IOWR('i', 20, struct ifconf):
758 {
759 struct ifconf ifconf;
760
761
762
763
764
765
766 if ((error = copyin (SCARG(uap, data), (caddr_t)&ifconf,
767 sizeof (ifconf))) != 0)
768 goto out;
769 if ((error = (*ctl)(fp, OSIOCGIFCONF,
770 * (caddr_t)&ifconf, p)) !=0 )
771 goto out;
772 error = copyout ((caddr_t)&ifconf, SCARG(uap, data),
773 sizeof (ifconf));
774 goto out;
775 }
776
777 }
778 error = (sys_ioctl(p, uap, retval));
779
780 out:
781 FRELE(fp);
782 return (error);
783 }