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; | ... | ... |