qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] add target to host SO_* translation to getsocketopt


From: Gabriele Gorla
Subject: [Qemu-devel] [PATCH] add target to host SO_* translation to getsocketopt
Date: Tue, 1 Sep 2009 20:58:03 -0700 (PDT)
User-agent: SquirrelMail/1.4.15

getsockopt will fail when the define for the socket options differ between
target and host.

This patch extracts the trnalsation code from setsockopt into a new
function and uses the function in both setsockopt and getsockopt.

Signed-off-by: Gabriele Gorla <address@hidden>
---
diff -r -U 5 qemu-0.10.6_orig/linux-user/syscall.c
qemu-0.10.6/linux-user/syscall.c
--- qemu-0.10.6_orig/linux-user/syscall.c       2009-07-16 17:56:24 -0700
+++ qemu-0.10.6/linux-user/syscall.c    2009-09-01 20:44:37 -0700
@@ -831,10 +831,77 @@
  the_end:
     target_msgh->msg_controllen = tswapl(space);
     return 0;
 }

+static int so_target_to_host(int optname)
+{
+    switch (optname) {
+    /* Options with 'int' argument.  */
+    case TARGET_SO_DEBUG:
+       optname = SO_DEBUG;
+       break;
+    case TARGET_SO_REUSEADDR:
+       optname = SO_REUSEADDR;
+       break;
+    case TARGET_SO_TYPE:
+       optname = SO_TYPE;
+       break;
+    case TARGET_SO_ERROR:
+       optname = SO_ERROR;
+       break;
+    case TARGET_SO_DONTROUTE:
+       optname = SO_DONTROUTE;
+       break;
+    case TARGET_SO_BROADCAST:
+       optname = SO_BROADCAST;
+       break;
+    case TARGET_SO_SNDBUF:
+       optname = SO_SNDBUF;
+       break;
+    case TARGET_SO_RCVBUF:
+       optname = SO_RCVBUF;
+       break;
+    case TARGET_SO_KEEPALIVE:
+       optname = SO_KEEPALIVE;
+       break;
+    case TARGET_SO_OOBINLINE:
+       optname = SO_OOBINLINE;
+       break;
+    case TARGET_SO_NO_CHECK:
+       optname = SO_NO_CHECK;
+       break;
+    case TARGET_SO_PRIORITY:
+       optname = SO_PRIORITY;
+       break;
+#ifdef SO_BSDCOMPAT
+    case TARGET_SO_BSDCOMPAT:
+       optname = SO_BSDCOMPAT;
+       break;
+#endif
+    case TARGET_SO_PASSCRED:
+       optname = SO_PASSCRED;
+       break;
+    case TARGET_SO_TIMESTAMP:
+       optname = SO_TIMESTAMP;
+       break;
+    case TARGET_SO_RCVLOWAT:
+       optname = SO_RCVLOWAT;
+       break;
+    case TARGET_SO_RCVTIMEO:
+       optname = SO_RCVTIMEO;
+       break;
+    case TARGET_SO_SNDTIMEO:
+       optname = SO_SNDTIMEO;
+       break;
+        break;
+    default:
+        optname=0;
+    }
+    return optname;
+}
+
 /* do_setsockopt() Must return target values and target errnos. */
 static abi_long do_setsockopt(int sockfd, int level, int optname,
                               abi_ulong optval_addr, socklen_t optlen)
 {
     abi_long ret;
@@ -880,72 +947,12 @@
         default:
             goto unimplemented;
         }
         break;
     case TARGET_SOL_SOCKET:
-        switch (optname) {
-            /* Options with 'int' argument.  */
-        case TARGET_SO_DEBUG:
-               optname = SO_DEBUG;
-               break;
-        case TARGET_SO_REUSEADDR:
-               optname = SO_REUSEADDR;
-               break;
-        case TARGET_SO_TYPE:
-               optname = SO_TYPE;
-               break;
-        case TARGET_SO_ERROR:
-               optname = SO_ERROR;
-               break;
-        case TARGET_SO_DONTROUTE:
-               optname = SO_DONTROUTE;
-               break;
-        case TARGET_SO_BROADCAST:
-               optname = SO_BROADCAST;
-               break;
-        case TARGET_SO_SNDBUF:
-               optname = SO_SNDBUF;
-               break;
-        case TARGET_SO_RCVBUF:
-               optname = SO_RCVBUF;
-               break;
-        case TARGET_SO_KEEPALIVE:
-               optname = SO_KEEPALIVE;
-               break;
-        case TARGET_SO_OOBINLINE:
-               optname = SO_OOBINLINE;
-               break;
-        case TARGET_SO_NO_CHECK:
-               optname = SO_NO_CHECK;
-               break;
-        case TARGET_SO_PRIORITY:
-               optname = SO_PRIORITY;
-               break;
-#ifdef SO_BSDCOMPAT
-        case TARGET_SO_BSDCOMPAT:
-               optname = SO_BSDCOMPAT;
-               break;
-#endif
-        case TARGET_SO_PASSCRED:
-               optname = SO_PASSCRED;
-               break;
-        case TARGET_SO_TIMESTAMP:
-               optname = SO_TIMESTAMP;
-               break;
-        case TARGET_SO_RCVLOWAT:
-               optname = SO_RCVLOWAT;
-               break;
-        case TARGET_SO_RCVTIMEO:
-               optname = SO_RCVTIMEO;
-               break;
-        case TARGET_SO_SNDTIMEO:
-               optname = SO_SNDTIMEO;
-               break;
-            break;
-        default:
-            goto unimplemented;
-        }
+        optname=so_target_to_host(optname);
+        if(optname==0) goto unimplemented;
        if (optlen < sizeof(uint32_t))
             return -TARGET_EINVAL;

        if (get_user_u32(val, optval_addr))
             return -TARGET_EFAULT;
@@ -983,10 +990,12 @@
         }
         break;
     case SOL_TCP:
         /* TCP options all take an 'int' value.  */
     int_case:
+        optname=so_target_to_host(optname);
+        if(optname==0) goto unimplemented;
         if (get_user_u32(len, optlen))
             return -TARGET_EFAULT;
         if (len < 0)
             return -TARGET_EINVAL;
         lv = sizeof(int);






reply via email to

[Prev in Thread] Current Thread [Next in Thread]