Deleted Added
full compact
linux_ioctl.c (98878) linux_ioctl.c (102003)
1/*
2 * Copyright (c) 1994-1995 S�ren Schmidt
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
1/*
2 * Copyright (c) 1994-1995 S�ren Schmidt
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * $FreeBSD: head/sys/compat/linux/linux_ioctl.c 98878 2002-06-26 15:53:11Z arr $
28 * $FreeBSD: head/sys/compat/linux/linux_ioctl.c 102003 2002-08-17 02:36:16Z rwatson $
29 */
30
31#include <sys/param.h>
32#include <sys/systm.h>
33#include <sys/sysproto.h>
34#include <sys/cdio.h>
35#include <sys/dvdio.h>
36#include <sys/consio.h>

--- 71 unchanged lines hidden (view full) ---

108 struct file *fp;
109 int error;
110 struct disklabel dl;
111
112 if ((error = fget(td, args->fd, &fp)) != 0)
113 return (error);
114 switch (args->cmd & 0xffff) {
115 case LINUX_BLKGETSIZE:
29 */
30
31#include <sys/param.h>
32#include <sys/systm.h>
33#include <sys/sysproto.h>
34#include <sys/cdio.h>
35#include <sys/dvdio.h>
36#include <sys/consio.h>

--- 71 unchanged lines hidden (view full) ---

108 struct file *fp;
109 int error;
110 struct disklabel dl;
111
112 if ((error = fget(td, args->fd, &fp)) != 0)
113 return (error);
114 switch (args->cmd & 0xffff) {
115 case LINUX_BLKGETSIZE:
116 error = fo_ioctl(fp, DIOCGDINFO, (caddr_t)&dl, td);
116 error = fo_ioctl(fp, DIOCGDINFO, (caddr_t)&dl, td->td_ucred,
117 td);
117 fdrop(fp, td);
118 if (error)
119 return (error);
120 return (copyout(&(dl.d_secperunit), (caddr_t)args->arg,
121 sizeof(dl.d_secperunit)));
122 }
123 fdrop(fp, td);
124 return (ENOIOCTL);

--- 430 unchanged lines hidden (view full) ---

555 int error;
556
557 if ((error = fget(td, args->fd, &fp)) != 0)
558 return (error);
559
560 switch (args->cmd & 0xffff) {
561
562 case LINUX_TCGETS:
118 fdrop(fp, td);
119 if (error)
120 return (error);
121 return (copyout(&(dl.d_secperunit), (caddr_t)args->arg,
122 sizeof(dl.d_secperunit)));
123 }
124 fdrop(fp, td);
125 return (ENOIOCTL);

--- 430 unchanged lines hidden (view full) ---

556 int error;
557
558 if ((error = fget(td, args->fd, &fp)) != 0)
559 return (error);
560
561 switch (args->cmd & 0xffff) {
562
563 case LINUX_TCGETS:
563 error = fo_ioctl(fp, TIOCGETA, (caddr_t)&bios, td);
564 error = fo_ioctl(fp, TIOCGETA, (caddr_t)&bios, td->td_ucred,
565 td);
564 if (error)
565 break;
566 bsd_to_linux_termios(&bios, &lios);
567 error = copyout(&lios, (caddr_t)args->arg, sizeof(lios));
568 break;
569
570 case LINUX_TCSETS:
571 error = copyin((caddr_t)args->arg, &lios, sizeof(lios));
572 if (error)
573 break;
574 linux_to_bsd_termios(&lios, &bios);
566 if (error)
567 break;
568 bsd_to_linux_termios(&bios, &lios);
569 error = copyout(&lios, (caddr_t)args->arg, sizeof(lios));
570 break;
571
572 case LINUX_TCSETS:
573 error = copyin((caddr_t)args->arg, &lios, sizeof(lios));
574 if (error)
575 break;
576 linux_to_bsd_termios(&lios, &bios);
575 error = (fo_ioctl(fp, TIOCSETA, (caddr_t)&bios, td));
577 error = (fo_ioctl(fp, TIOCSETA, (caddr_t)&bios, td->td_ucred,
578 td));
576 break;
577
578 case LINUX_TCSETSW:
579 error = copyin((caddr_t)args->arg, &lios, sizeof(lios));
580 if (error)
581 break;
582 linux_to_bsd_termios(&lios, &bios);
579 break;
580
581 case LINUX_TCSETSW:
582 error = copyin((caddr_t)args->arg, &lios, sizeof(lios));
583 if (error)
584 break;
585 linux_to_bsd_termios(&lios, &bios);
583 error = (fo_ioctl(fp, TIOCSETAW, (caddr_t)&bios, td));
586 error = (fo_ioctl(fp, TIOCSETAW, (caddr_t)&bios, td->td_ucred,
587 td));
584 break;
585
586 case LINUX_TCSETSF:
587 error = copyin((caddr_t)args->arg, &lios, sizeof(lios));
588 if (error)
589 break;
590 linux_to_bsd_termios(&lios, &bios);
588 break;
589
590 case LINUX_TCSETSF:
591 error = copyin((caddr_t)args->arg, &lios, sizeof(lios));
592 if (error)
593 break;
594 linux_to_bsd_termios(&lios, &bios);
591 error = (fo_ioctl(fp, TIOCSETAF, (caddr_t)&bios, td));
595 error = (fo_ioctl(fp, TIOCSETAF, (caddr_t)&bios, td->td_ucred,
596 td));
592 break;
593
594 case LINUX_TCGETA:
597 break;
598
599 case LINUX_TCGETA:
595 error = fo_ioctl(fp, TIOCGETA, (caddr_t)&bios, td);
600 error = fo_ioctl(fp, TIOCGETA, (caddr_t)&bios, td->td_ucred,
601 td);
596 if (error)
597 break;
598 bsd_to_linux_termio(&bios, &lio);
599 error = (copyout(&lio, (caddr_t)args->arg, sizeof(lio)));
600 break;
601
602 case LINUX_TCSETA:
603 error = copyin((caddr_t)args->arg, &lio, sizeof(lio));
604 if (error)
605 break;
606 linux_to_bsd_termio(&lio, &bios);
602 if (error)
603 break;
604 bsd_to_linux_termio(&bios, &lio);
605 error = (copyout(&lio, (caddr_t)args->arg, sizeof(lio)));
606 break;
607
608 case LINUX_TCSETA:
609 error = copyin((caddr_t)args->arg, &lio, sizeof(lio));
610 if (error)
611 break;
612 linux_to_bsd_termio(&lio, &bios);
607 error = (fo_ioctl(fp, TIOCSETA, (caddr_t)&bios, td));
613 error = (fo_ioctl(fp, TIOCSETA, (caddr_t)&bios, td->td_ucred,
614 td));
608 break;
609
610 case LINUX_TCSETAW:
611 error = copyin((caddr_t)args->arg, &lio, sizeof(lio));
612 if (error)
613 break;
614 linux_to_bsd_termio(&lio, &bios);
615 break;
616
617 case LINUX_TCSETAW:
618 error = copyin((caddr_t)args->arg, &lio, sizeof(lio));
619 if (error)
620 break;
621 linux_to_bsd_termio(&lio, &bios);
615 error = (fo_ioctl(fp, TIOCSETAW, (caddr_t)&bios, td));
622 error = (fo_ioctl(fp, TIOCSETAW, (caddr_t)&bios, td->td_ucred,
623 td));
616 break;
617
618 case LINUX_TCSETAF:
619 error = copyin((caddr_t)args->arg, &lio, sizeof(lio));
620 if (error)
621 break;
622 linux_to_bsd_termio(&lio, &bios);
624 break;
625
626 case LINUX_TCSETAF:
627 error = copyin((caddr_t)args->arg, &lio, sizeof(lio));
628 if (error)
629 break;
630 linux_to_bsd_termio(&lio, &bios);
623 error = (fo_ioctl(fp, TIOCSETAF, (caddr_t)&bios, td));
631 error = (fo_ioctl(fp, TIOCSETAF, (caddr_t)&bios, td->td_ucred,
632 td));
624 break;
625
626 /* LINUX_TCSBRK */
627
628 case LINUX_TCXONC: {
629 switch (args->arg) {
630 case LINUX_TCOOFF:
631 args->cmd = TIOCSTOP;
632 break;
633 case LINUX_TCOON:
634 args->cmd = TIOCSTART;
635 break;
636 case LINUX_TCIOFF:
637 case LINUX_TCION: {
638 int c;
639 struct write_args wr;
633 break;
634
635 /* LINUX_TCSBRK */
636
637 case LINUX_TCXONC: {
638 switch (args->arg) {
639 case LINUX_TCOOFF:
640 args->cmd = TIOCSTOP;
641 break;
642 case LINUX_TCOON:
643 args->cmd = TIOCSTART;
644 break;
645 case LINUX_TCIOFF:
646 case LINUX_TCION: {
647 int c;
648 struct write_args wr;
640 error = fo_ioctl(fp, TIOCGETA, (caddr_t)&bios, td);
649 error = fo_ioctl(fp, TIOCGETA, (caddr_t)&bios,
650 td->td_ucred, td);
641 if (error)
642 break;
643 fdrop(fp, td);
644 c = (args->arg == LINUX_TCIOFF) ? VSTOP : VSTART;
645 c = bios.c_cc[c];
646 if (c != _POSIX_VDISABLE) {
647 wr.fd = args->fd;
648 wr.buf = &c;

--- 145 unchanged lines hidden (view full) ---

794 break;
795 case LINUX_N_PPP:
796 line = PPPDISC;
797 break;
798 default:
799 fdrop(fp, td);
800 return (EINVAL);
801 }
651 if (error)
652 break;
653 fdrop(fp, td);
654 c = (args->arg == LINUX_TCIOFF) ? VSTOP : VSTART;
655 c = bios.c_cc[c];
656 if (c != _POSIX_VDISABLE) {
657 wr.fd = args->fd;
658 wr.buf = &c;

--- 145 unchanged lines hidden (view full) ---

804 break;
805 case LINUX_N_PPP:
806 line = PPPDISC;
807 break;
808 default:
809 fdrop(fp, td);
810 return (EINVAL);
811 }
802 error = (fo_ioctl(fp, TIOCSETD, (caddr_t)&line, td));
812 error = (fo_ioctl(fp, TIOCSETD, (caddr_t)&line, td->td_ucred,
813 td));
803 break;
804 }
805
806 case LINUX_TIOCGETD: {
807 int linux_line;
808 int bsd_line = TTYDISC;
814 break;
815 }
816
817 case LINUX_TIOCGETD: {
818 int linux_line;
819 int bsd_line = TTYDISC;
809 error = fo_ioctl(fp, TIOCGETD, (caddr_t)&bsd_line, td);
820 error = fo_ioctl(fp, TIOCGETD, (caddr_t)&bsd_line,
821 td->td_ucred, td);
810 if (error)
811 return (error);
812 switch (bsd_line) {
813 case TTYDISC:
814 linux_line = LINUX_N_TTY;
815 break;
816 case SLIPDISC:
817 linux_line = LINUX_N_SLIP;

--- 452 unchanged lines hidden (view full) ---

1270 case LINUX_CDROMPLAYTRKIND:
1271 args->cmd = CDIOCPLAYTRACKS;
1272 error = (ioctl(td, (struct ioctl_args *)args));
1273 break;
1274
1275 case LINUX_CDROMREADTOCHDR: {
1276 struct ioc_toc_header th;
1277 struct linux_cdrom_tochdr lth;
822 if (error)
823 return (error);
824 switch (bsd_line) {
825 case TTYDISC:
826 linux_line = LINUX_N_TTY;
827 break;
828 case SLIPDISC:
829 linux_line = LINUX_N_SLIP;

--- 452 unchanged lines hidden (view full) ---

1282 case LINUX_CDROMPLAYTRKIND:
1283 args->cmd = CDIOCPLAYTRACKS;
1284 error = (ioctl(td, (struct ioctl_args *)args));
1285 break;
1286
1287 case LINUX_CDROMREADTOCHDR: {
1288 struct ioc_toc_header th;
1289 struct linux_cdrom_tochdr lth;
1278 error = fo_ioctl(fp, CDIOREADTOCHEADER, (caddr_t)&th, td);
1290 error = fo_ioctl(fp, CDIOREADTOCHEADER, (caddr_t)&th,
1291 td->td_ucred, td);
1279 if (!error) {
1280 lth.cdth_trk0 = th.starting_track;
1281 lth.cdth_trk1 = th.ending_track;
1282 copyout(&lth, (caddr_t)args->arg, sizeof(lth));
1283 }
1284 break;
1285 }
1286
1287 case LINUX_CDROMREADTOCENTRY: {
1288 struct linux_cdrom_tocentry lte, *ltep =
1289 (struct linux_cdrom_tocentry *)args->arg;
1290 struct ioc_read_toc_single_entry irtse;
1291 irtse.address_format = ltep->cdte_format;
1292 irtse.track = ltep->cdte_track;
1292 if (!error) {
1293 lth.cdth_trk0 = th.starting_track;
1294 lth.cdth_trk1 = th.ending_track;
1295 copyout(&lth, (caddr_t)args->arg, sizeof(lth));
1296 }
1297 break;
1298 }
1299
1300 case LINUX_CDROMREADTOCENTRY: {
1301 struct linux_cdrom_tocentry lte, *ltep =
1302 (struct linux_cdrom_tocentry *)args->arg;
1303 struct ioc_read_toc_single_entry irtse;
1304 irtse.address_format = ltep->cdte_format;
1305 irtse.track = ltep->cdte_track;
1293 error = fo_ioctl(fp, CDIOREADTOCENTRY, (caddr_t)&irtse, td);
1306 error = fo_ioctl(fp, CDIOREADTOCENTRY, (caddr_t)&irtse,
1307 td->td_ucred, td);
1294 if (!error) {
1295 lte = *ltep;
1296 lte.cdte_ctrl = irtse.entry.control;
1297 lte.cdte_adr = irtse.entry.addr_type;
1298 bsd_to_linux_msf_lba(irtse.address_format,
1299 &irtse.entry.addr, &lte.cdte_addr);
1300 copyout(&lte, (caddr_t)args->arg, sizeof(lte));
1301 }

--- 24 unchanged lines hidden (view full) ---

1326 caddr_t sg = stackgap_init();
1327 bsdinfo = (struct cd_sub_channel_info*)stackgap_alloc(&sg,
1328 sizeof(struct cd_sub_channel_info));
1329 bsdsc.address_format = CD_LBA_FORMAT;
1330 bsdsc.data_format = CD_CURRENT_POSITION;
1331 bsdsc.track = 0;
1332 bsdsc.data_len = sizeof(struct cd_sub_channel_info);
1333 bsdsc.data = bsdinfo;
1308 if (!error) {
1309 lte = *ltep;
1310 lte.cdte_ctrl = irtse.entry.control;
1311 lte.cdte_adr = irtse.entry.addr_type;
1312 bsd_to_linux_msf_lba(irtse.address_format,
1313 &irtse.entry.addr, &lte.cdte_addr);
1314 copyout(&lte, (caddr_t)args->arg, sizeof(lte));
1315 }

--- 24 unchanged lines hidden (view full) ---

1340 caddr_t sg = stackgap_init();
1341 bsdinfo = (struct cd_sub_channel_info*)stackgap_alloc(&sg,
1342 sizeof(struct cd_sub_channel_info));
1343 bsdsc.address_format = CD_LBA_FORMAT;
1344 bsdsc.data_format = CD_CURRENT_POSITION;
1345 bsdsc.track = 0;
1346 bsdsc.data_len = sizeof(struct cd_sub_channel_info);
1347 bsdsc.data = bsdinfo;
1334 error = fo_ioctl(fp, CDIOCREADSUBCHANNEL, (caddr_t)&bsdsc, td);
1348 error = fo_ioctl(fp, CDIOCREADSUBCHANNEL, (caddr_t)&bsdsc,
1349 td->td_ucred, td);
1335 if (error)
1336 break;
1337 error = copyin((caddr_t)args->arg, &sc,
1338 sizeof(struct linux_cdrom_subchnl));
1339 if (error)
1340 break;
1341 sc.cdsc_audiostatus = bsdinfo->header.audio_status;
1342 sc.cdsc_adr = bsdinfo->what.position.addr_type;

--- 49 unchanged lines hidden (view full) ---

1392 struct dvd_struct bds;
1393
1394 error = copyin((caddr_t)args->arg, &lds, sizeof(l_dvd_struct));
1395 if (error)
1396 break;
1397 error = linux_to_bsd_dvd_struct(&lds, &bds);
1398 if (error)
1399 break;
1350 if (error)
1351 break;
1352 error = copyin((caddr_t)args->arg, &sc,
1353 sizeof(struct linux_cdrom_subchnl));
1354 if (error)
1355 break;
1356 sc.cdsc_audiostatus = bsdinfo->header.audio_status;
1357 sc.cdsc_adr = bsdinfo->what.position.addr_type;

--- 49 unchanged lines hidden (view full) ---

1407 struct dvd_struct bds;
1408
1409 error = copyin((caddr_t)args->arg, &lds, sizeof(l_dvd_struct));
1410 if (error)
1411 break;
1412 error = linux_to_bsd_dvd_struct(&lds, &bds);
1413 if (error)
1414 break;
1400 error = fo_ioctl(fp, DVDIOCREADSTRUCTURE, (caddr_t)&bds, td);
1415 error = fo_ioctl(fp, DVDIOCREADSTRUCTURE, (caddr_t)&bds,
1416 td->td_ucred, td);
1401 if (error)
1402 break;
1403 error = bsd_to_linux_dvd_struct(&bds, &lds);
1404 if (error)
1405 break;
1406 error = copyout(&lds, (caddr_t)args->arg,
1407 sizeof(l_dvd_struct));
1408 break;

--- 8 unchanged lines hidden (view full) ---

1417
1418 error = copyin((caddr_t)args->arg, &lda,
1419 sizeof(l_dvd_authinfo));
1420 if (error)
1421 break;
1422 error = linux_to_bsd_dvd_authinfo(&lda, &bcode, &bda);
1423 if (error)
1424 break;
1417 if (error)
1418 break;
1419 error = bsd_to_linux_dvd_struct(&bds, &lds);
1420 if (error)
1421 break;
1422 error = copyout(&lds, (caddr_t)args->arg,
1423 sizeof(l_dvd_struct));
1424 break;

--- 8 unchanged lines hidden (view full) ---

1433
1434 error = copyin((caddr_t)args->arg, &lda,
1435 sizeof(l_dvd_authinfo));
1436 if (error)
1437 break;
1438 error = linux_to_bsd_dvd_authinfo(&lda, &bcode, &bda);
1439 if (error)
1440 break;
1425 error = fo_ioctl(fp, bcode, (caddr_t)&bda, td);
1441 error = fo_ioctl(fp, bcode, (caddr_t)&bda, td->td_ucred,
1442 td);
1426 if (error) {
1427 if (lda.type == LINUX_DVD_HOST_SEND_KEY2) {
1428 lda.type = LINUX_DVD_AUTH_FAILURE;
1429 copyout(&lda, (caddr_t)args->arg,
1430 sizeof(l_dvd_authinfo));
1431 }
1432 break;
1433 }

--- 320 unchanged lines hidden (view full) ---

1754 break;
1755 case LINUX_KBD_MEDIUMRAW:
1756 kbdmode = K_RAW;
1757 break;
1758 default:
1759 fdrop(fp, td);
1760 return (EINVAL);
1761 }
1443 if (error) {
1444 if (lda.type == LINUX_DVD_HOST_SEND_KEY2) {
1445 lda.type = LINUX_DVD_AUTH_FAILURE;
1446 copyout(&lda, (caddr_t)args->arg,
1447 sizeof(l_dvd_authinfo));
1448 }
1449 break;
1450 }

--- 320 unchanged lines hidden (view full) ---

1771 break;
1772 case LINUX_KBD_MEDIUMRAW:
1773 kbdmode = K_RAW;
1774 break;
1775 default:
1776 fdrop(fp, td);
1777 return (EINVAL);
1778 }
1762 error = (fo_ioctl(fp, KDSKBMODE, (caddr_t)&kbdmode, td));
1779 error = (fo_ioctl(fp, KDSKBMODE, (caddr_t)&kbdmode,
1780 td->td_ucred, td));
1763 break;
1764 }
1765
1766 case LINUX_VT_OPENQRY:
1767 args->cmd = VT_OPENQRY;
1768 error = (ioctl(td, (struct ioctl_args *)args));
1769 break;
1770

--- 609 unchanged lines hidden ---
1781 break;
1782 }
1783
1784 case LINUX_VT_OPENQRY:
1785 args->cmd = VT_OPENQRY;
1786 error = (ioctl(td, (struct ioctl_args *)args));
1787 break;
1788

--- 609 unchanged lines hidden ---