Commit 77e4672d8d3f0cca922b5d288ef227023777caf1

Authored by bellard
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;
... ...