Commit 43f238d7b6f75244b8c47409896a9725655e52ab
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: | ... | ... |