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