Author: trasz
Date: Mon Feb 10 13:24:14 2020
New Revision: 357727
URL: https://svnweb.freebsd.org/changeset/base/357727

Log:
  Make linux(4) use kern_socketpair(9) instead of going through
  sys_socketpair().  It's a cleanup; no functional changes.
  
  Reviewed by:  kib
  MFC after:    2 weeks
  Sponsored by: The FreeBSD Foundation
  Differential Revision:        https://reviews.freebsd.org/D22814

Modified:
  head/sys/compat/linux/linux_socket.c

Modified: head/sys/compat/linux/linux_socket.c
==============================================================================
--- head/sys/compat/linux/linux_socket.c        Mon Feb 10 11:09:56 2020        
(r357726)
+++ head/sys/compat/linux/linux_socket.c        Mon Feb 10 13:24:14 2020        
(r357727)
@@ -753,25 +753,19 @@ linux_getpeername(struct thread *td, struct linux_getp
 int
 linux_socketpair(struct thread *td, struct linux_socketpair_args *args)
 {
-       struct socketpair_args /* {
-               int domain;
-               int type;
-               int protocol;
-               int *rsv;
-       } */ bsd_args;
-       int error;
+       int domain, error, sv[2], type;
 
-       bsd_args.domain = linux_to_bsd_domain(args->domain);
-       if (bsd_args.domain != PF_LOCAL)
+       domain = linux_to_bsd_domain(args->domain);
+       if (domain != PF_LOCAL)
                return (EAFNOSUPPORT);
-       bsd_args.type = args->type & LINUX_SOCK_TYPE_MASK;
-       if (bsd_args.type < 0 || bsd_args.type > LINUX_SOCK_MAX)
+       type = args->type & LINUX_SOCK_TYPE_MASK;
+       if (type < 0 || type > LINUX_SOCK_MAX)
                return (EINVAL);
        error = linux_set_socket_flags(args->type & ~LINUX_SOCK_TYPE_MASK,
-               &bsd_args.type);
+           &type);
        if (error != 0)
                return (error);
-       if (args->protocol != 0 && args->protocol != PF_UNIX)
+       if (args->protocol != 0 && args->protocol != PF_UNIX) {
 
                /*
                 * Use of PF_UNIX as protocol argument is not right,
@@ -780,10 +774,16 @@ linux_socketpair(struct thread *td, struct linux_socke
                 * to FreeBSD one.
                 */
                return (EPROTONOSUPPORT);
-       else
-               bsd_args.protocol = 0;
-       bsd_args.rsv = (int *)PTRIN(args->rsv);
-       return (sys_socketpair(td, &bsd_args));
+       }
+       error = kern_socketpair(td, domain, type, 0, sv);
+       if (error != 0)
+                return (error);
+        error = copyout(sv, PTRIN(args->rsv), 2 * sizeof(int));
+        if (error != 0) {
+                (void)kern_close(td, sv[0]);
+                (void)kern_close(td, sv[1]);
+        }
+       return (error);
 }
 
 #if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32))
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to