Commit b1e341eb authored by Thiemo Seufer's avatar Thiemo Seufer
Browse files

fcntl64 fix, by Kirill A. Shutemov.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2517 c046a42c-6fe2-441c-8c8c-71466251a162
parent dc3c9d21
Loading
Loading
Loading
Loading
+18 −6
Original line number Diff line number Diff line
@@ -3872,6 +3872,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
#if TARGET_LONG_BITS == 32
    case TARGET_NR_fcntl64:
    {
	int cmd;
	struct flock64 fl;
	struct target_flock64 *target_fl;
#ifdef TARGET_ARM
@@ -3879,8 +3880,19 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
#endif

        switch(arg2){
        case F_GETLK64:
            ret = get_errno(fcntl(arg1, arg2, &fl));
        case TARGET_F_GETLK64:
            cmd = F_GETLK64;
        case TARGET_F_SETLK64:
            cmd = F_SETLK64;
        case TARGET_F_SETLKW64:
            cmd = F_SETLK64;
        default:
            cmd = arg2;
        }

        switch(arg2) {
        case TARGET_F_GETLK64:
            ret = get_errno(fcntl(arg1, cmd, &fl));
	    if (ret == 0) {
#ifdef TARGET_ARM
                if (((CPUARMState *)cpu_env)->eabi) {
@@ -3905,8 +3917,8 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
	    }
	    break;

        case F_SETLK64:
        case F_SETLKW64:
        case TARGET_F_SETLK64:
        case TARGET_F_SETLKW64:
#ifdef TARGET_ARM
            if (((CPUARMState *)cpu_env)->eabi) {
                lock_user_struct(target_efl, arg3, 1);
@@ -3927,10 +3939,10 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
                fl.l_pid = tswapl(target_fl->l_pid);
                unlock_user_struct(target_fl, arg3, 0);
            }
            ret = get_errno(fcntl(arg1, arg2, &fl));
            ret = get_errno(fcntl(arg1, cmd, &fl));
	    break;
        default:
            ret = get_errno(do_fcntl(arg1, arg2, arg3));
            ret = get_errno(do_fcntl(arg1, cmd, arg3));
            break;
        }
	break;