From 428e1889bc97f711eacc344ee3e17a8bfc05176d Mon Sep 17 00:00:00 2001 From: Geoffrey Keating Date: Mon, 15 Jan 2001 23:24:30 +0000 Subject: * emul_netbsd.c (do_open): Translate the flag parameter to the open syscall to the numbers supported by the host. --- sim/ppc/ChangeLog | 5 +++++ sim/ppc/emul_netbsd.c | 20 +++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/sim/ppc/ChangeLog b/sim/ppc/ChangeLog index 52e6685..c299d54 100644 --- a/sim/ppc/ChangeLog +++ b/sim/ppc/ChangeLog @@ -1,3 +1,8 @@ +2001-01-15 Geoffrey Keating + + * emul_netbsd.c (do_open): Translate the flag parameter to the + open syscall to the numbers supported by the host. + 2000-12-12 Geoffrey Keating * sim-endian.h: Don't have parameters on macro definitions which diff --git a/sim/ppc/emul_netbsd.c b/sim/ppc/emul_netbsd.c index e2064a4..777c364 100644 --- a/sim/ppc/emul_netbsd.c +++ b/sim/ppc/emul_netbsd.c @@ -386,6 +386,7 @@ do_open(os_emul_data *emul, char *path = emul_read_string(path_buf, path_addr, PATH_MAX, processor, cia); int flags = (int)cpu_registers(processor)->gpr[arg0+1]; int mode = (int)cpu_registers(processor)->gpr[arg0+2]; + int hostflags; int status; if (WITH_TRACE && ppc_trace[trace_os_emul]) @@ -393,8 +394,25 @@ do_open(os_emul_data *emul, SYS(open); + /* Do some translation on 'flags' to match it to the host's version. */ + /* These flag values were taken from the NetBSD 1.4 header files. */ + if ((flags & 3) == 0) + hostflags = O_RDONLY; + else if ((flags & 3) == 1) + hostflags = O_WRONLY; + else + hostflags = O_RDWR; + if (flags & 0x00000008) + hostflags |= O_APPEND; + if (flags & 0x00000200) + hostflags |= O_CREAT; + if (flags & 0x00000400) + hostflags |= O_TRUNC; + if (flags & 0x00000800) + hostflags |= O_EXCL; + /* Can't combine these statements, cuz open sets errno. */ - status = open(path, flags, mode); + status = open(path, hostflags, mode); emul_write_status(processor, status, errno); } -- cgit v1.1