Commit 77e4672d8d3f0cca922b5d288ef227023777caf1
1 parent
d34720fd
flock support
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@101 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
49 additions
and
2 deletions
linux-user/syscall.c
| ... | ... | @@ -1414,16 +1414,42 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, |
| 1414 | 1414 | ret = do_ioctl(arg1, arg2, arg3); |
| 1415 | 1415 | break; |
| 1416 | 1416 | case TARGET_NR_fcntl: |
| 1417 | + { | |
| 1418 | + struct flock fl; | |
| 1419 | + struct target_flock *target_fl = (void *)arg3; | |
| 1420 | + | |
| 1417 | 1421 | switch(arg2) { |
| 1418 | 1422 | case F_GETLK: |
| 1423 | + ret = get_errno(fcntl(arg1, arg2, &fl)); | |
| 1424 | + if (ret == 0) { | |
| 1425 | + target_fl->l_type = tswap16(fl.l_type); | |
| 1426 | + target_fl->l_whence = tswap16(fl.l_whence); | |
| 1427 | + target_fl->l_start = tswapl(fl.l_start); | |
| 1428 | + target_fl->l_len = tswapl(fl.l_len); | |
| 1429 | + target_fl->l_pid = tswapl(fl.l_pid); | |
| 1430 | + } | |
| 1431 | + break; | |
| 1432 | + | |
| 1419 | 1433 | case F_SETLK: |
| 1420 | 1434 | case F_SETLKW: |
| 1435 | + fl.l_type = tswap16(target_fl->l_type); | |
| 1436 | + fl.l_whence = tswap16(target_fl->l_whence); | |
| 1437 | + fl.l_start = tswapl(target_fl->l_start); | |
| 1438 | + fl.l_len = tswapl(target_fl->l_len); | |
| 1439 | + fl.l_pid = tswapl(target_fl->l_pid); | |
| 1440 | + ret = get_errno(fcntl(arg1, arg2, &fl)); | |
| 1441 | + break; | |
| 1442 | + | |
| 1443 | + case F_GETLK64: | |
| 1444 | + case F_SETLK64: | |
| 1445 | + case F_SETLKW64: | |
| 1421 | 1446 | goto unimplemented; |
| 1422 | 1447 | default: |
| 1423 | 1448 | ret = get_errno(fcntl(arg1, arg2, arg3)); |
| 1424 | 1449 | break; |
| 1425 | 1450 | } |
| 1426 | 1451 | break; |
| 1452 | + } | |
| 1427 | 1453 | case TARGET_NR_mpx: |
| 1428 | 1454 | goto unimplemented; |
| 1429 | 1455 | case TARGET_NR_setpgid: |
| ... | ... | @@ -2356,16 +2382,37 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, |
| 2356 | 2382 | goto unimplemented; |
| 2357 | 2383 | #if TARGET_LONG_BITS == 32 |
| 2358 | 2384 | case TARGET_NR_fcntl64: |
| 2385 | + { | |
| 2386 | + struct flock64 fl; | |
| 2387 | + struct target_flock64 *target_fl = (void *)arg3; | |
| 2388 | + | |
| 2359 | 2389 | switch(arg2) { |
| 2360 | 2390 | case F_GETLK64: |
| 2391 | + ret = get_errno(fcntl(arg1, arg2, &fl)); | |
| 2392 | + if (ret == 0) { | |
| 2393 | + target_fl->l_type = tswap16(fl.l_type); | |
| 2394 | + target_fl->l_whence = tswap16(fl.l_whence); | |
| 2395 | + target_fl->l_start = tswap64(fl.l_start); | |
| 2396 | + target_fl->l_len = tswap64(fl.l_len); | |
| 2397 | + target_fl->l_pid = tswapl(fl.l_pid); | |
| 2398 | + } | |
| 2399 | + break; | |
| 2400 | + | |
| 2361 | 2401 | case F_SETLK64: |
| 2362 | 2402 | case F_SETLKW64: |
| 2363 | - goto unimplemented; | |
| 2403 | + fl.l_type = tswap16(target_fl->l_type); | |
| 2404 | + fl.l_whence = tswap16(target_fl->l_whence); | |
| 2405 | + fl.l_start = tswap64(target_fl->l_start); | |
| 2406 | + fl.l_len = tswap64(target_fl->l_len); | |
| 2407 | + fl.l_pid = tswapl(target_fl->l_pid); | |
| 2408 | + ret = get_errno(fcntl(arg1, arg2, &fl)); | |
| 2409 | + break; | |
| 2364 | 2410 | default: |
| 2365 | 2411 | ret = get_errno(fcntl(arg1, arg2, arg3)); |
| 2366 | 2412 | break; |
| 2367 | 2413 | } |
| 2368 | - break; | |
| 2414 | + break; | |
| 2415 | + } | |
| 2369 | 2416 | #endif |
| 2370 | 2417 | case TARGET_NR_security: |
| 2371 | 2418 | goto unimplemented; | ... | ... |