linux_socket.c (73353) | linux_socket.c (83221) |
---|---|
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 --- 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) 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_socket.c 73353 2001-03-02 19:29:53Z jlemon $ | 28 * $FreeBSD: head/sys/compat/linux/linux_socket.c 83221 2001-09-08 19:07:04Z marcel $ |
29 */ 30 31/* XXX we use functions that might not exist. */ 32#include "opt_compat.h" 33 34#ifndef COMPAT_43 35#error "Unable to compile Linux-emulator due to missing COMPAT_43 option!" 36#endif --- 381 unchanged lines hidden (view full) --- 418 * error getsockopt(SOL_SOCKET, SO_ERROR) would return on BSD. 419 */ 420 error = holdsock(p->p_fd, linux_args.s, &fp); 421 if (error) 422 return (error); 423 error = EISCONN; 424 if (fp->f_flag & FNONBLOCK) { 425 so = (struct socket *)fp->f_data; | 29 */ 30 31/* XXX we use functions that might not exist. */ 32#include "opt_compat.h" 33 34#ifndef COMPAT_43 35#error "Unable to compile Linux-emulator due to missing COMPAT_43 option!" 36#endif --- 381 unchanged lines hidden (view full) --- 418 * error getsockopt(SOL_SOCKET, SO_ERROR) would return on BSD. 419 */ 420 error = holdsock(p->p_fd, linux_args.s, &fp); 421 if (error) 422 return (error); 423 error = EISCONN; 424 if (fp->f_flag & FNONBLOCK) { 425 so = (struct socket *)fp->f_data; |
426 if ((u_int)so->so_emuldata == 0) | 426 if (so->so_emuldata == 0) |
427 error = so->so_error; 428 so->so_emuldata = (void *)1; 429 } 430 fdrop(fp, p); 431 return (error); 432} 433 434#ifndef __alpha__ --- 430 unchanged lines hidden (view full) --- 865 bsd_args.val = linux_args.optval; 866 bsd_args.avalsize = linux_args.optlen; 867 return (getsockopt(p, &bsd_args)); 868} 869 870int 871linux_socketcall(struct proc *p, struct linux_socketcall_args *args) 872{ | 427 error = so->so_error; 428 so->so_emuldata = (void *)1; 429 } 430 fdrop(fp, p); 431 return (error); 432} 433 434#ifndef __alpha__ --- 430 unchanged lines hidden (view full) --- 865 bsd_args.val = linux_args.optval; 866 bsd_args.avalsize = linux_args.optlen; 867 return (getsockopt(p, &bsd_args)); 868} 869 870int 871linux_socketcall(struct proc *p, struct linux_socketcall_args *args) 872{ |
873 void *arg = (void *)args->args; |
|
873 874 switch (args->what) { 875 case LINUX_SOCKET: | 874 875 switch (args->what) { 876 case LINUX_SOCKET: |
876 return (linux_socket(p, args->args)); | 877 return (linux_socket(p, arg)); |
877 case LINUX_BIND: | 878 case LINUX_BIND: |
878 return (linux_bind(p, args->args)); | 879 return (linux_bind(p, arg)); |
879 case LINUX_CONNECT: | 880 case LINUX_CONNECT: |
880 return (linux_connect(p, args->args)); | 881 return (linux_connect(p, arg)); |
881 case LINUX_LISTEN: | 882 case LINUX_LISTEN: |
882 return (linux_listen(p, args->args)); | 883 return (linux_listen(p, arg)); |
883 case LINUX_ACCEPT: | 884 case LINUX_ACCEPT: |
884 return (linux_accept(p, args->args)); | 885 return (linux_accept(p, arg)); |
885 case LINUX_GETSOCKNAME: | 886 case LINUX_GETSOCKNAME: |
886 return (linux_getsockname(p, args->args)); | 887 return (linux_getsockname(p, arg)); |
887 case LINUX_GETPEERNAME: | 888 case LINUX_GETPEERNAME: |
888 return (linux_getpeername(p, args->args)); | 889 return (linux_getpeername(p, arg)); |
889 case LINUX_SOCKETPAIR: | 890 case LINUX_SOCKETPAIR: |
890 return (linux_socketpair(p, args->args)); | 891 return (linux_socketpair(p, arg)); |
891 case LINUX_SEND: | 892 case LINUX_SEND: |
892 return (linux_send(p, args->args)); | 893 return (linux_send(p, arg)); |
893 case LINUX_RECV: | 894 case LINUX_RECV: |
894 return (linux_recv(p, args->args)); | 895 return (linux_recv(p, arg)); |
895 case LINUX_SENDTO: | 896 case LINUX_SENDTO: |
896 return (linux_sendto(p, args->args)); | 897 return (linux_sendto(p, arg)); |
897 case LINUX_RECVFROM: | 898 case LINUX_RECVFROM: |
898 return (linux_recvfrom(p, args->args)); | 899 return (linux_recvfrom(p, arg)); |
899 case LINUX_SHUTDOWN: | 900 case LINUX_SHUTDOWN: |
900 return (linux_shutdown(p, args->args)); | 901 return (linux_shutdown(p, arg)); |
901 case LINUX_SETSOCKOPT: | 902 case LINUX_SETSOCKOPT: |
902 return (linux_setsockopt(p, args->args)); | 903 return (linux_setsockopt(p, arg)); |
903 case LINUX_GETSOCKOPT: | 904 case LINUX_GETSOCKOPT: |
904 return (linux_getsockopt(p, args->args)); | 905 return (linux_getsockopt(p, arg)); |
905 case LINUX_SENDMSG: 906 do { 907 int error; 908 int level; 909 caddr_t control; 910 struct { 911 int s; 912 const struct msghdr *msg; 913 int flags; | 906 case LINUX_SENDMSG: 907 do { 908 int error; 909 int level; 910 caddr_t control; 911 struct { 912 int s; 913 const struct msghdr *msg; 914 int flags; |
914 } *uap = args->args; | 915 } *uap = arg; |
915 916 error = copyin(&uap->msg->msg_control, &control, 917 sizeof(caddr_t)); 918 if (error) 919 return (error); 920 921 if (control == NULL) 922 goto done; --- 11 unchanged lines hidden (view full) --- 934 level = SOL_SOCKET; 935 error = copyout(&level, 936 &((struct cmsghdr *)control)->cmsg_level, 937 sizeof(int)); 938 if (error) 939 return (error); 940 } 941 done: | 916 917 error = copyin(&uap->msg->msg_control, &control, 918 sizeof(caddr_t)); 919 if (error) 920 return (error); 921 922 if (control == NULL) 923 goto done; --- 11 unchanged lines hidden (view full) --- 935 level = SOL_SOCKET; 936 error = copyout(&level, 937 &((struct cmsghdr *)control)->cmsg_level, 938 sizeof(int)); 939 if (error) 940 return (error); 941 } 942 done: |
942 return (sendmsg(p, args->args)); | 943 return (sendmsg(p, arg)); |
943 } while (0); 944 case LINUX_RECVMSG: | 944 } while (0); 945 case LINUX_RECVMSG: |
945 return (linux_recvmsg(p, args->args)); | 946 return (linux_recvmsg(p, arg)); |
946 } 947 948 uprintf("LINUX: 'socket' typ=%d not implemented\n", args->what); 949 return (ENOSYS); 950} 951#endif /*!__alpha__*/ | 947 } 948 949 uprintf("LINUX: 'socket' typ=%d not implemented\n", args->what); 950 return (ENOSYS); 951} 952#endif /*!__alpha__*/ |