]> git.proxmox.com Git - mirror_qemu.git/commitdiff
Support fcntl F_GETLK64, F_SETLK64, F_SETLKW64, by Kirill A. Shutemov.
authorths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>
Fri, 5 Jan 2007 20:55:49 +0000 (20:55 +0000)
committerths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>
Fri, 5 Jan 2007 20:55:49 +0000 (20:55 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2298 c046a42c-6fe2-441c-8c8c-71466251a162

linux-user/syscall.c

index 1c312181865fe4a747b605845cf971330601d42e..21f559ebc6e8cc0034354f3053a39356b304ee95 100644 (file)
@@ -1727,6 +1727,8 @@ static long do_fcntl(int fd, int cmd, target_ulong arg)
 {
     struct flock fl;
     struct target_flock *target_fl;
+    struct flock64 fl64;
+    struct target_flock64 *target_fl64;
     long ret;
 
     switch(cmd) {
@@ -1756,10 +1758,27 @@ static long do_fcntl(int fd, int cmd, target_ulong arg)
         break;
         
     case TARGET_F_GETLK64:
+        ret = fcntl(fd, cmd >> 1, &fl64);
+        if (ret == 0) {
+            lock_user_struct(target_fl64, arg, 0);
+            target_fl64->l_type = tswap16(fl64.l_type) >> 1;
+            target_fl64->l_whence = tswap16(fl64.l_whence);
+            target_fl64->l_start = tswapl(fl64.l_start);
+            target_fl64->l_len = tswapl(fl64.l_len);
+            target_fl64->l_pid = tswapl(fl64.l_pid);
+            unlock_user_struct(target_fl64, arg, 1);
+        }
+               break;
     case TARGET_F_SETLK64:
     case TARGET_F_SETLKW64:
-        ret = -1;
-        errno = EINVAL;
+        lock_user_struct(target_fl64, arg, 1);
+        fl64.l_type = tswap16(target_fl64->l_type) >> 1;
+        fl64.l_whence = tswap16(target_fl64->l_whence);
+        fl64.l_start = tswapl(target_fl64->l_start);
+        fl64.l_len = tswapl(target_fl64->l_len);
+        fl64.l_pid = tswap16(target_fl64->l_pid);
+        unlock_user_struct(target_fl64, arg, 0);
+               ret = fcntl(fd, cmd >> 1, &fl64);
         break;
 
     case F_GETFL: