Commit 43f238d7b6f75244b8c47409896a9725655e52ab

Authored by ths
1 parent 4dbb0f50

Support fcntl F_GETLK64, F_SETLK64, F_SETLKW64, by Kirill A. Shutemov.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2298 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 21 additions and 2 deletions
linux-user/syscall.c
... ... @@ -1727,6 +1727,8 @@ static long do_fcntl(int fd, int cmd, target_ulong arg)
1727 1727 {
1728 1728 struct flock fl;
1729 1729 struct target_flock *target_fl;
  1730 + struct flock64 fl64;
  1731 + struct target_flock64 *target_fl64;
1730 1732 long ret;
1731 1733  
1732 1734 switch(cmd) {
... ... @@ -1756,10 +1758,27 @@ static long do_fcntl(int fd, int cmd, target_ulong arg)
1756 1758 break;
1757 1759  
1758 1760 case TARGET_F_GETLK64:
  1761 + ret = fcntl(fd, cmd >> 1, &fl64);
  1762 + if (ret == 0) {
  1763 + lock_user_struct(target_fl64, arg, 0);
  1764 + target_fl64->l_type = tswap16(fl64.l_type) >> 1;
  1765 + target_fl64->l_whence = tswap16(fl64.l_whence);
  1766 + target_fl64->l_start = tswapl(fl64.l_start);
  1767 + target_fl64->l_len = tswapl(fl64.l_len);
  1768 + target_fl64->l_pid = tswapl(fl64.l_pid);
  1769 + unlock_user_struct(target_fl64, arg, 1);
  1770 + }
  1771 + break;
1759 1772 case TARGET_F_SETLK64:
1760 1773 case TARGET_F_SETLKW64:
1761   - ret = -1;
1762   - errno = EINVAL;
  1774 + lock_user_struct(target_fl64, arg, 1);
  1775 + fl64.l_type = tswap16(target_fl64->l_type) >> 1;
  1776 + fl64.l_whence = tswap16(target_fl64->l_whence);
  1777 + fl64.l_start = tswapl(target_fl64->l_start);
  1778 + fl64.l_len = tswapl(target_fl64->l_len);
  1779 + fl64.l_pid = tswap16(target_fl64->l_pid);
  1780 + unlock_user_struct(target_fl64, arg, 0);
  1781 + ret = fcntl(fd, cmd >> 1, &fl64);
1763 1782 break;
1764 1783  
1765 1784 case F_GETFL:
... ...