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(<h, (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(<h, (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, <e.cdte_addr); 1300 copyout(<e, (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, <e.cdte_addr); 1314 copyout(<e, (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 --- |