[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH] flock support
From: |
Rusty Russell |
Subject: |
[Qemu-devel] [PATCH] flock support |
Date: |
Wed, 23 Apr 2003 16:35:54 +1000 |
I thought about using thunk stuff, but if glibc plays games with
struct flock, that'll break badly, so I opencoded it.
Cheers!
Rusty.
diff -urpN --exclude TAGS -X /home/rusty/current-dontdiff --minimal
qemu-0.1.6-debug/syscall-i386.h qemu-0.1.6-fcntl/syscall-i386.h
--- qemu-0.1.6-debug/syscall-i386.h 2003-04-11 16:13:59.000000000 +1000
+++ qemu-0.1.6-fcntl/syscall-i386.h 2003-04-11 16:40:47.000000000 +1000
@@ -935,6 +935,22 @@ union target_semun {
unsigned int __pad; /* really void* */
};
+struct target_flock {
+ short l_type;
+ short l_whence;
+ target_ulong l_start;
+ target_ulong l_len;
+ int l_pid;
+};
+
+struct target_flock64 {
+ short l_type;
+ short l_whence;
+ unsigned long long l_start;
+ unsigned long long l_len;
+ int l_pid;
+};
+
/* soundcard defines (XXX: move them to generic file syscall_defs.h) */
#define TARGET_SNDCTL_COPR_HALT 0xc0144307
diff -urpN --exclude TAGS -X /home/rusty/current-dontdiff --minimal
qemu-0.1.6-debug/syscall.c qemu-0.1.6-fcntl/syscall.c
--- qemu-0.1.6-debug/syscall.c 2003-04-11 16:14:51.000000000 +1000
+++ qemu-0.1.6-fcntl/syscall.c 2003-04-11 17:47:27.000000000 +1000
@@ -1414,16 +1414,42 @@ long do_syscall(void *cpu_env, int num,
ret = do_ioctl(arg1, arg2, arg3);
break;
case TARGET_NR_fcntl:
+ {
+ struct flock fl;
+ struct target_flock *target_fl = (void *)arg3;
+
switch(arg2) {
case F_GETLK:
+ ret = get_errno(fcntl(arg1, arg2, &fl));
+ if (ret == 0) {
+ target_fl->l_type = tswap16(fl.l_type);
+ target_fl->l_whence = tswap16(fl.l_whence);
+ target_fl->l_start = tswapl(fl.l_start);
+ target_fl->l_len = tswapl(fl.l_len);
+ target_fl->l_pid = tswapl(fl.l_pid);
+ }
+ break;
+
case F_SETLK:
case F_SETLKW:
+ fl.l_type = tswap16(target_fl->l_type);
+ fl.l_whence = tswap16(target_fl->l_whence);
+ fl.l_start = tswapl(target_fl->l_start);
+ fl.l_len = tswapl(target_fl->l_len);
+ fl.l_pid = tswapl(target_fl->l_pid);
+ ret = get_errno(fcntl(arg1, arg2, &fl));
+ break;
+
+ case F_GETLK64:
+ case F_SETLK64:
+ case F_SETLKW64:
goto unimplemented;
default:
ret = get_errno(fcntl(arg1, arg2, arg3));
break;
}
break;
+ }
case TARGET_NR_mpx:
goto unimplemented;
case TARGET_NR_setpgid:
@@ -2356,16 +2382,37 @@ long do_syscall(void *cpu_env, int num,
goto unimplemented;
#if TARGET_LONG_BITS == 32
case TARGET_NR_fcntl64:
+ {
+ struct flock64 fl;
+ struct target_flock64 *target_fl = (void *)arg3;
+
switch(arg2) {
case F_GETLK64:
+ ret = get_errno(fcntl(arg1, arg2, &fl));
+ if (ret == 0) {
+ target_fl->l_type = tswap16(fl.l_type);
+ target_fl->l_whence = tswap16(fl.l_whence);
+ target_fl->l_start = tswap64(fl.l_start);
+ target_fl->l_len = tswap64(fl.l_len);
+ target_fl->l_pid = tswapl(fl.l_pid);
+ }
+ break;
+
case F_SETLK64:
case F_SETLKW64:
- goto unimplemented;
+ fl.l_type = tswap16(target_fl->l_type);
+ fl.l_whence = tswap16(target_fl->l_whence);
+ fl.l_start = tswap64(target_fl->l_start);
+ fl.l_len = tswap64(target_fl->l_len);
+ fl.l_pid = tswapl(target_fl->l_pid);
+ ret = get_errno(fcntl(arg1, arg2, &fl));
+ break;
default:
ret = get_errno(fcntl(arg1, arg2, arg3));
break;
}
- break;
+ break;
+ }
#endif
case TARGET_NR_security:
goto unimplemented;
--
Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemu-devel] [PATCH] flock support,
Rusty Russell <=