Commit 7775e9ecc264eb3780901a10d786391b5ae955b7
1 parent
03d843dd
added do_fcntl()
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@171 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
45 additions
and
36 deletions
linux-user/syscall.c
| ... | ... | @@ -1103,6 +1103,49 @@ int do_fork(CPUX86State *env, unsigned int flags, unsigned long newsp) |
| 1103 | 1103 | |
| 1104 | 1104 | #endif |
| 1105 | 1105 | |
| 1106 | +static long do_fcntl(int fd, int cmd, unsigned long arg) | |
| 1107 | +{ | |
| 1108 | + struct flock fl; | |
| 1109 | + struct target_flock *target_fl = (void *)arg; | |
| 1110 | + long ret; | |
| 1111 | + | |
| 1112 | + switch(cmd) { | |
| 1113 | + case TARGET_F_GETLK: | |
| 1114 | + ret = fcntl(fd, cmd, &fl); | |
| 1115 | + if (ret == 0) { | |
| 1116 | + target_fl->l_type = tswap16(fl.l_type); | |
| 1117 | + target_fl->l_whence = tswap16(fl.l_whence); | |
| 1118 | + target_fl->l_start = tswapl(fl.l_start); | |
| 1119 | + target_fl->l_len = tswapl(fl.l_len); | |
| 1120 | + target_fl->l_pid = tswapl(fl.l_pid); | |
| 1121 | + } | |
| 1122 | + break; | |
| 1123 | + | |
| 1124 | + case TARGET_F_SETLK: | |
| 1125 | + case TARGET_F_SETLKW: | |
| 1126 | + fl.l_type = tswap16(target_fl->l_type); | |
| 1127 | + fl.l_whence = tswap16(target_fl->l_whence); | |
| 1128 | + fl.l_start = tswapl(target_fl->l_start); | |
| 1129 | + fl.l_len = tswapl(target_fl->l_len); | |
| 1130 | + fl.l_pid = tswapl(target_fl->l_pid); | |
| 1131 | + ret = fcntl(fd, cmd, &fl); | |
| 1132 | + break; | |
| 1133 | + | |
| 1134 | + case TARGET_F_GETLK64: | |
| 1135 | + case TARGET_F_SETLK64: | |
| 1136 | + case TARGET_F_SETLKW64: | |
| 1137 | + ret = -1; | |
| 1138 | + errno = EINVAL; | |
| 1139 | + break; | |
| 1140 | + | |
| 1141 | + default: | |
| 1142 | + ret = fcntl(fd, cmd, arg); | |
| 1143 | + break; | |
| 1144 | + } | |
| 1145 | + return ret; | |
| 1146 | +} | |
| 1147 | + | |
| 1148 | + | |
| 1106 | 1149 | #define high2lowuid(x) (x) |
| 1107 | 1150 | #define high2lowgid(x) (x) |
| 1108 | 1151 | #define low2highuid(x) (x) |
| ... | ... | @@ -1343,42 +1386,8 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, |
| 1343 | 1386 | ret = do_ioctl(arg1, arg2, arg3); |
| 1344 | 1387 | break; |
| 1345 | 1388 | case TARGET_NR_fcntl: |
| 1346 | - { | |
| 1347 | - struct flock fl; | |
| 1348 | - struct target_flock *target_fl = (void *)arg3; | |
| 1349 | - | |
| 1350 | - switch(arg2) { | |
| 1351 | - case TARGET_F_GETLK: | |
| 1352 | - ret = get_errno(fcntl(arg1, arg2, &fl)); | |
| 1353 | - if (ret == 0) { | |
| 1354 | - target_fl->l_type = tswap16(fl.l_type); | |
| 1355 | - target_fl->l_whence = tswap16(fl.l_whence); | |
| 1356 | - target_fl->l_start = tswapl(fl.l_start); | |
| 1357 | - target_fl->l_len = tswapl(fl.l_len); | |
| 1358 | - target_fl->l_pid = tswapl(fl.l_pid); | |
| 1359 | - } | |
| 1360 | - break; | |
| 1361 | - | |
| 1362 | - case TARGET_F_SETLK: | |
| 1363 | - case TARGET_F_SETLKW: | |
| 1364 | - fl.l_type = tswap16(target_fl->l_type); | |
| 1365 | - fl.l_whence = tswap16(target_fl->l_whence); | |
| 1366 | - fl.l_start = tswapl(target_fl->l_start); | |
| 1367 | - fl.l_len = tswapl(target_fl->l_len); | |
| 1368 | - fl.l_pid = tswapl(target_fl->l_pid); | |
| 1369 | - ret = get_errno(fcntl(arg1, arg2, &fl)); | |
| 1370 | - break; | |
| 1371 | - | |
| 1372 | - case TARGET_F_GETLK64: | |
| 1373 | - case TARGET_F_SETLK64: | |
| 1374 | - case TARGET_F_SETLKW64: | |
| 1375 | - goto unimplemented; | |
| 1376 | - default: | |
| 1377 | - ret = get_errno(fcntl(arg1, arg2, arg3)); | |
| 1378 | - break; | |
| 1379 | - } | |
| 1389 | + ret = get_errno(do_fcntl(arg1, arg2, arg3)); | |
| 1380 | 1390 | break; |
| 1381 | - } | |
| 1382 | 1391 | case TARGET_NR_mpx: |
| 1383 | 1392 | goto unimplemented; |
| 1384 | 1393 | case TARGET_NR_setpgid: |
| ... | ... | @@ -2373,7 +2382,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, |
| 2373 | 2382 | ret = get_errno(fcntl(arg1, arg2, &fl)); |
| 2374 | 2383 | break; |
| 2375 | 2384 | default: |
| 2376 | - ret = get_errno(fcntl(arg1, arg2, arg3)); | |
| 2385 | + ret = get_errno(do_fcntl(arg1, arg2, arg3)); | |
| 2377 | 2386 | break; |
| 2378 | 2387 | } |
| 2379 | 2388 | break; | ... | ... |