Deleted Added
full compact
linux_socket.c (276512) linux_socket.c (283413)
1/*-
2 * Copyright (c) 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

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

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
29#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 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

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

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
29#include <sys/cdefs.h>
30__FBSDID("$FreeBSD: head/sys/compat/linux/linux_socket.c 276512 2015-01-01 20:53:38Z dchagin $");
30__FBSDID("$FreeBSD: head/sys/compat/linux/linux_socket.c 283413 2015-05-24 15:41:27Z dchagin $");
31
32/* XXX we use functions that might not exist. */
33#include "opt_compat.h"
34#include "opt_inet6.h"
35
36#include <sys/param.h>
37#include <sys/proc.h>
38#include <sys/systm.h>

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

580 error = kern_getsockopt(td, s, IPPROTO_IP, IP_HDRINCL,
581 &optval, UIO_SYSSPACE, &size_val);
582 if (error)
583 return (error);
584
585 return (optval == 0);
586}
587
31
32/* XXX we use functions that might not exist. */
33#include "opt_compat.h"
34#include "opt_inet6.h"
35
36#include <sys/param.h>
37#include <sys/proc.h>
38#include <sys/systm.h>

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

580 error = kern_getsockopt(td, s, IPPROTO_IP, IP_HDRINCL,
581 &optval, UIO_SYSSPACE, &size_val);
582 if (error)
583 return (error);
584
585 return (optval == 0);
586}
587
588struct linux_sendto_args {
589 int s;
590 l_uintptr_t msg;
591 int len;
592 int flags;
593 l_uintptr_t to;
594 int tolen;
595};
596
597/*
598 * Updated sendto() when IP_HDRINCL is set:
599 * tweak endian-dependent fields in the IP packet.
600 */
601static int
602linux_sendto_hdrincl(struct thread *td, struct linux_sendto_args *linux_args)
603{
604/*

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

640 aiov[0].iov_len = linux_args->len;
641 error = linux_sendit(td, linux_args->s, &msg, linux_args->flags,
642 NULL, UIO_SYSSPACE);
643goout:
644 free(packet, M_TEMP);
645 return (error);
646}
647
588/*
589 * Updated sendto() when IP_HDRINCL is set:
590 * tweak endian-dependent fields in the IP packet.
591 */
592static int
593linux_sendto_hdrincl(struct thread *td, struct linux_sendto_args *linux_args)
594{
595/*

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

631 aiov[0].iov_len = linux_args->len;
632 error = linux_sendit(td, linux_args->s, &msg, linux_args->flags,
633 NULL, UIO_SYSSPACE);
634goout:
635 free(packet, M_TEMP);
636 return (error);
637}
638
648struct linux_socket_args {
649 int domain;
650 int type;
651 int protocol;
652};
653
654static int
639int
655linux_socket(struct thread *td, struct linux_socket_args *args)
656{
657 struct socket_args /* {
658 int domain;
659 int type;
660 int protocol;
661 } */ bsd_args;
662 int retval_socket, socket_flags;

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

710 &v6only, UIO_SYSSPACE, sizeof(v6only));
711 }
712#endif
713
714out:
715 return (retval_socket);
716}
717
640linux_socket(struct thread *td, struct linux_socket_args *args)
641{
642 struct socket_args /* {
643 int domain;
644 int type;
645 int protocol;
646 } */ bsd_args;
647 int retval_socket, socket_flags;

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

695 &v6only, UIO_SYSSPACE, sizeof(v6only));
696 }
697#endif
698
699out:
700 return (retval_socket);
701}
702
718struct linux_bind_args {
719 int s;
720 l_uintptr_t name;
721 int namelen;
722};
723
724static int
703int
725linux_bind(struct thread *td, struct linux_bind_args *args)
726{
727 struct sockaddr *sa;
728 int error;
729
730 error = linux_getsockaddr(&sa, PTRIN(args->name),
731 args->namelen);
732 if (error)
733 return (error);
734
735 error = kern_bindat(td, AT_FDCWD, args->s, sa);
736 free(sa, M_SONAME);
737 if (error == EADDRNOTAVAIL && args->namelen != sizeof(struct sockaddr_in))
738 return (EINVAL);
739 return (error);
740}
741
704linux_bind(struct thread *td, struct linux_bind_args *args)
705{
706 struct sockaddr *sa;
707 int error;
708
709 error = linux_getsockaddr(&sa, PTRIN(args->name),
710 args->namelen);
711 if (error)
712 return (error);
713
714 error = kern_bindat(td, AT_FDCWD, args->s, sa);
715 free(sa, M_SONAME);
716 if (error == EADDRNOTAVAIL && args->namelen != sizeof(struct sockaddr_in))
717 return (EINVAL);
718 return (error);
719}
720
742struct linux_connect_args {
743 int s;
744 l_uintptr_t name;
745 int namelen;
746};
747int linux_connect(struct thread *, struct linux_connect_args *);
748
749int
750linux_connect(struct thread *td, struct linux_connect_args *args)
751{
752 cap_rights_t rights;
753 struct socket *so;
754 struct sockaddr *sa;
755 u_int fflag;
756 int error;

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

785 so->so_emuldata = (void *)1;
786 SOCK_UNLOCK(so);
787 }
788 fputsock(so);
789 }
790 return (error);
791}
792
721int
722linux_connect(struct thread *td, struct linux_connect_args *args)
723{
724 cap_rights_t rights;
725 struct socket *so;
726 struct sockaddr *sa;
727 u_int fflag;
728 int error;

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

757 so->so_emuldata = (void *)1;
758 SOCK_UNLOCK(so);
759 }
760 fputsock(so);
761 }
762 return (error);
763}
764
793struct linux_listen_args {
794 int s;
795 int backlog;
796};
797
798static int
765int
799linux_listen(struct thread *td, struct linux_listen_args *args)
800{
801 struct listen_args /* {
802 int s;
803 int backlog;
804 } */ bsd_args;
805
806 bsd_args.s = args->s;

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

851out:
852 if (error) {
853 (void)kern_close(td, td->td_retval[0]);
854 td->td_retval[0] = 0;
855 }
856 return (error);
857}
858
766linux_listen(struct thread *td, struct linux_listen_args *args)
767{
768 struct listen_args /* {
769 int s;
770 int backlog;
771 } */ bsd_args;
772
773 bsd_args.s = args->s;

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

818out:
819 if (error) {
820 (void)kern_close(td, td->td_retval[0]);
821 td->td_retval[0] = 0;
822 }
823 return (error);
824}
825
859struct linux_accept_args {
860 int s;
861 l_uintptr_t addr;
862 l_uintptr_t namelen;
863};
864
865static int
826int
866linux_accept(struct thread *td, struct linux_accept_args *args)
867{
868
869 return (linux_accept_common(td, args->s, args->addr,
870 args->namelen, 0));
871}
872
827linux_accept(struct thread *td, struct linux_accept_args *args)
828{
829
830 return (linux_accept_common(td, args->s, args->addr,
831 args->namelen, 0));
832}
833
873struct linux_accept4_args {
874 int s;
875 l_uintptr_t addr;
876 l_uintptr_t namelen;
877 int flags;
878};
879
880static int
834int
881linux_accept4(struct thread *td, struct linux_accept4_args *args)
882{
883
884 return (linux_accept_common(td, args->s, args->addr,
885 args->namelen, args->flags));
886}
887
835linux_accept4(struct thread *td, struct linux_accept4_args *args)
836{
837
838 return (linux_accept_common(td, args->s, args->addr,
839 args->namelen, args->flags));
840}
841
888struct linux_getsockname_args {
889 int s;
890 l_uintptr_t addr;
891 l_uintptr_t namelen;
892};
893
894static int
842int
895linux_getsockname(struct thread *td, struct linux_getsockname_args *args)
896{
897 struct getsockname_args /* {
898 int fdes;
899 struct sockaddr * __restrict asa;
900 socklen_t * __restrict alen;
901 } */ bsd_args;
902 int error;

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

910 if (error)
911 return (error);
912 error = linux_sa_put(PTRIN(args->addr));
913 if (error)
914 return (error);
915 return (0);
916}
917
843linux_getsockname(struct thread *td, struct linux_getsockname_args *args)
844{
845 struct getsockname_args /* {
846 int fdes;
847 struct sockaddr * __restrict asa;
848 socklen_t * __restrict alen;
849 } */ bsd_args;
850 int error;

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

858 if (error)
859 return (error);
860 error = linux_sa_put(PTRIN(args->addr));
861 if (error)
862 return (error);
863 return (0);
864}
865
918struct linux_getpeername_args {
919 int s;
920 l_uintptr_t addr;
921 l_uintptr_t namelen;
922};
923
924static int
866int
925linux_getpeername(struct thread *td, struct linux_getpeername_args *args)
926{
927 struct getpeername_args /* {
928 int fdes;
929 caddr_t asa;
930 int *alen;
931 } */ bsd_args;
932 int error;

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

939 if (error)
940 return (error);
941 error = linux_sa_put(PTRIN(args->addr));
942 if (error)
943 return (error);
944 return (0);
945}
946
867linux_getpeername(struct thread *td, struct linux_getpeername_args *args)
868{
869 struct getpeername_args /* {
870 int fdes;
871 caddr_t asa;
872 int *alen;
873 } */ bsd_args;
874 int error;

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

881 if (error)
882 return (error);
883 error = linux_sa_put(PTRIN(args->addr));
884 if (error)
885 return (error);
886 return (0);
887}
888
947struct linux_socketpair_args {
948 int domain;
949 int type;
950 int protocol;
951 l_uintptr_t rsv;
952};
953
954static int
889int
955linux_socketpair(struct thread *td, struct linux_socketpair_args *args)
956{
957 struct socketpair_args /* {
958 int domain;
959 int type;
960 int protocol;
961 int *rsv;
962 } */ bsd_args;

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

1002out:
1003 if (error) {
1004 (void)kern_close(td, sv[0]);
1005 (void)kern_close(td, sv[1]);
1006 }
1007 return (error);
1008}
1009
890linux_socketpair(struct thread *td, struct linux_socketpair_args *args)
891{
892 struct socketpair_args /* {
893 int domain;
894 int type;
895 int protocol;
896 int *rsv;
897 } */ bsd_args;

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

937out:
938 if (error) {
939 (void)kern_close(td, sv[0]);
940 (void)kern_close(td, sv[1]);
941 }
942 return (error);
943}
944
945#if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32))
1010struct linux_send_args {
1011 int s;
1012 l_uintptr_t msg;
1013 int len;
1014 int flags;
1015};
1016
1017static int

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

1057 bsd_args.s = args->s;
1058 bsd_args.buf = (caddr_t)PTRIN(args->msg);
1059 bsd_args.len = args->len;
1060 bsd_args.flags = linux_to_bsd_msg_flags(args->flags);
1061 bsd_args.from = NULL;
1062 bsd_args.fromlenaddr = 0;
1063 return (sys_recvfrom(td, &bsd_args));
1064}
946struct linux_send_args {
947 int s;
948 l_uintptr_t msg;
949 int len;
950 int flags;
951};
952
953static int

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

993 bsd_args.s = args->s;
994 bsd_args.buf = (caddr_t)PTRIN(args->msg);
995 bsd_args.len = args->len;
996 bsd_args.flags = linux_to_bsd_msg_flags(args->flags);
997 bsd_args.from = NULL;
998 bsd_args.fromlenaddr = 0;
999 return (sys_recvfrom(td, &bsd_args));
1000}
1001#endif /* __i386__ || (__amd64__ && COMPAT_LINUX32) */
1065
1002
1066static int
1003int
1067linux_sendto(struct thread *td, struct linux_sendto_args *args)
1068{
1069 struct msghdr msg;
1070 struct iovec aiov;
1071 int error;
1072
1073 if (linux_check_hdrincl(td, args->s) == 0)
1074 /* IP_HDRINCL set, tweak the packet before sending */

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

1082 msg.msg_flags = 0;
1083 aiov.iov_base = PTRIN(args->msg);
1084 aiov.iov_len = args->len;
1085 error = linux_sendit(td, args->s, &msg, args->flags, NULL,
1086 UIO_USERSPACE);
1087 return (error);
1088}
1089
1004linux_sendto(struct thread *td, struct linux_sendto_args *args)
1005{
1006 struct msghdr msg;
1007 struct iovec aiov;
1008 int error;
1009
1010 if (linux_check_hdrincl(td, args->s) == 0)
1011 /* IP_HDRINCL set, tweak the packet before sending */

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

1019 msg.msg_flags = 0;
1020 aiov.iov_base = PTRIN(args->msg);
1021 aiov.iov_len = args->len;
1022 error = linux_sendit(td, args->s, &msg, args->flags, NULL,
1023 UIO_USERSPACE);
1024 return (error);
1025}
1026
1090struct linux_recvfrom_args {
1091 int s;
1092 l_uintptr_t buf;
1093 int len;
1094 int flags;
1095 l_uintptr_t from;
1096 l_uintptr_t fromlen;
1097};
1098
1099static int
1027int
1100linux_recvfrom(struct thread *td, struct linux_recvfrom_args *args)
1101{
1102 struct recvfrom_args /* {
1103 int s;
1104 caddr_t buf;
1105 size_t len;
1106 int flags;
1107 struct sockaddr * __restrict from;

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

1131 error = linux_sa_put((struct osockaddr *)
1132 PTRIN(args->from));
1133 if (error)
1134 return (error);
1135 }
1136 return (0);
1137}
1138
1028linux_recvfrom(struct thread *td, struct linux_recvfrom_args *args)
1029{
1030 struct recvfrom_args /* {
1031 int s;
1032 caddr_t buf;
1033 size_t len;
1034 int flags;
1035 struct sockaddr * __restrict from;

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

1059 error = linux_sa_put((struct osockaddr *)
1060 PTRIN(args->from));
1061 if (error)
1062 return (error);
1063 }
1064 return (0);
1065}
1066
1139struct linux_sendmsg_args {
1140 int s;
1141 l_uintptr_t msg;
1142 int flags;
1143};
1144
1145static int
1067int
1146linux_sendmsg(struct thread *td, struct linux_sendmsg_args *args)
1147{
1148 struct cmsghdr *cmsg;
1149 struct cmsgcred cmcred;
1150 struct mbuf *control;
1151 struct msghdr msg;
1152 struct l_cmsghdr linux_cmsg;
1153 struct l_cmsghdr *ptr_cmsg;

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

1274
1275bad:
1276 free(iov, M_IOV);
1277 if (cmsg)
1278 free(cmsg, M_TEMP);
1279 return (error);
1280}
1281
1068linux_sendmsg(struct thread *td, struct linux_sendmsg_args *args)
1069{
1070 struct cmsghdr *cmsg;
1071 struct cmsgcred cmcred;
1072 struct mbuf *control;
1073 struct msghdr msg;
1074 struct l_cmsghdr linux_cmsg;
1075 struct l_cmsghdr *ptr_cmsg;

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

1196
1197bad:
1198 free(iov, M_IOV);
1199 if (cmsg)
1200 free(cmsg, M_TEMP);
1201 return (error);
1202}
1203
1282struct linux_recvmsg_args {
1283 int s;
1284 l_uintptr_t msg;
1285 int flags;
1286};
1287
1288static int
1204int
1289linux_recvmsg(struct thread *td, struct linux_recvmsg_args *args)
1290{
1291 struct cmsghdr *cm;
1292 struct cmsgcred *cmcred;
1293 struct msghdr msg;
1294 struct l_cmsghdr *linux_cmsg = NULL;
1295 struct l_ucred linux_ucred;
1296 socklen_t datalen, outlen;

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

1447bad:
1448 free(iov, M_IOV);
1449 m_freem(control);
1450 free(linux_cmsg, M_TEMP);
1451
1452 return (error);
1453}
1454
1205linux_recvmsg(struct thread *td, struct linux_recvmsg_args *args)
1206{
1207 struct cmsghdr *cm;
1208 struct cmsgcred *cmcred;
1209 struct msghdr msg;
1210 struct l_cmsghdr *linux_cmsg = NULL;
1211 struct l_ucred linux_ucred;
1212 socklen_t datalen, outlen;

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

1363bad:
1364 free(iov, M_IOV);
1365 m_freem(control);
1366 free(linux_cmsg, M_TEMP);
1367
1368 return (error);
1369}
1370
1455struct linux_shutdown_args {
1456 int s;
1457 int how;
1458};
1459
1460static int
1371int
1461linux_shutdown(struct thread *td, struct linux_shutdown_args *args)
1462{
1463 struct shutdown_args /* {
1464 int s;
1465 int how;
1466 } */ bsd_args;
1467
1468 bsd_args.s = args->s;
1469 bsd_args.how = args->how;
1470 return (sys_shutdown(td, &bsd_args));
1471}
1472
1372linux_shutdown(struct thread *td, struct linux_shutdown_args *args)
1373{
1374 struct shutdown_args /* {
1375 int s;
1376 int how;
1377 } */ bsd_args;
1378
1379 bsd_args.s = args->s;
1380 bsd_args.how = args->how;
1381 return (sys_shutdown(td, &bsd_args));
1382}
1383
1473struct linux_setsockopt_args {
1474 int s;
1475 int level;
1476 int optname;
1477 l_uintptr_t optval;
1478 int optlen;
1479};
1480
1481static int
1384int
1482linux_setsockopt(struct thread *td, struct linux_setsockopt_args *args)
1483{
1484 struct setsockopt_args /* {
1485 int s;
1486 int level;
1487 int name;
1488 caddr_t val;
1489 int valsize;

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

1538 error = sys_setsockopt(td, &bsd_args);
1539 bsd_to_linux_sockaddr((struct sockaddr *)bsd_args.val);
1540 } else
1541 error = sys_setsockopt(td, &bsd_args);
1542
1543 return (error);
1544}
1545
1385linux_setsockopt(struct thread *td, struct linux_setsockopt_args *args)
1386{
1387 struct setsockopt_args /* {
1388 int s;
1389 int level;
1390 int name;
1391 caddr_t val;
1392 int valsize;

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

1441 error = sys_setsockopt(td, &bsd_args);
1442 bsd_to_linux_sockaddr((struct sockaddr *)bsd_args.val);
1443 } else
1444 error = sys_setsockopt(td, &bsd_args);
1445
1446 return (error);
1447}
1448
1546struct linux_getsockopt_args {
1547 int s;
1548 int level;
1549 int optname;
1550 l_uintptr_t optval;
1551 l_uintptr_t optlen;
1552};
1553
1554static int
1449int
1555linux_getsockopt(struct thread *td, struct linux_getsockopt_args *args)
1556{
1557 struct getsockopt_args /* {
1558 int s;
1559 int level;
1560 int name;
1561 caddr_t val;
1562 int *avalsize;

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

1649 LINUX_AL(6) /* recvfrom */, LINUX_AL(2) /* shutdown */,
1650 LINUX_AL(5) /* setsockopt */, LINUX_AL(5) /* getsockopt */,
1651 LINUX_AL(3) /* sendmsg */, LINUX_AL(3) /* recvmsg */,
1652 LINUX_AL(4) /* accept4 */
1653};
1654
1655#define LINUX_AL_SIZE sizeof(lxs_args) / sizeof(lxs_args[0]) - 1
1656
1450linux_getsockopt(struct thread *td, struct linux_getsockopt_args *args)
1451{
1452 struct getsockopt_args /* {
1453 int s;
1454 int level;
1455 int name;
1456 caddr_t val;
1457 int *avalsize;

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

1544 LINUX_AL(6) /* recvfrom */, LINUX_AL(2) /* shutdown */,
1545 LINUX_AL(5) /* setsockopt */, LINUX_AL(5) /* getsockopt */,
1546 LINUX_AL(3) /* sendmsg */, LINUX_AL(3) /* recvmsg */,
1547 LINUX_AL(4) /* accept4 */
1548};
1549
1550#define LINUX_AL_SIZE sizeof(lxs_args) / sizeof(lxs_args[0]) - 1
1551
1552#if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32))
1657int
1658linux_socketcall(struct thread *td, struct linux_socketcall_args *args)
1659{
1660 l_ulong a[6];
1661 void *arg;
1662 int error;
1663
1664 if (args->what < LINUX_SOCKET || args->what > LINUX_AL_SIZE)

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

1705 return (linux_recvmsg(td, arg));
1706 case LINUX_ACCEPT4:
1707 return (linux_accept4(td, arg));
1708 }
1709
1710 uprintf("LINUX: 'socket' typ=%d not implemented\n", args->what);
1711 return (ENOSYS);
1712}
1553int
1554linux_socketcall(struct thread *td, struct linux_socketcall_args *args)
1555{
1556 l_ulong a[6];
1557 void *arg;
1558 int error;
1559
1560 if (args->what < LINUX_SOCKET || args->what > LINUX_AL_SIZE)

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

1601 return (linux_recvmsg(td, arg));
1602 case LINUX_ACCEPT4:
1603 return (linux_accept4(td, arg));
1604 }
1605
1606 uprintf("LINUX: 'socket' typ=%d not implemented\n", args->what);
1607 return (ENOSYS);
1608}
1609#endif /* __i386__ || (__amd64__ && COMPAT_LINUX32) */