static void do_stat(os_emul_data *emul, unsigned call, const int arg0, cpu *processor, unsigned_word cia) { char path_buf[PATH_MAX]; unsigned_word path_addr = cpu_registers(processor)->gpr[arg0]; unsigned_word stat_buf_addr = cpu_registers(processor)->gpr[arg0+1]; char *path = emul_read_string(path_buf, path_addr, PATH_MAX, processor, cia); struct stat buf; int status; SYS(stat); status = stat(path, &buf); emul_write_status(processor, status, errno); if (status == 0) write_stat(stat_buf_addr, buf, processor, cia); }
static void do_lstat(os_emul_data *emul, unsigned call, const int arg0, cpu *processor, unsigned_word cia) { char path_buf[PATH_MAX]; unsigned_word path_addr = cpu_registers(processor)->gpr[arg0]; char *path = emul_read_string(path_buf, path_addr, PATH_MAX, processor, cia); unsigned_word stat_buf_addr = cpu_registers(processor)->gpr[arg0+1]; struct stat buf; int status; SYS(lstat); /* Can't combine these statements, cuz lstat sets errno. */ status = lstat(path, &buf); emul_write_status(processor, status, errno); write_stat(stat_buf_addr, buf, processor, cia); }
static void do_open(os_emul_data *emul, unsigned call, const int arg0, cpu *processor, unsigned_word cia) { unsigned_word path_addr = cpu_registers(processor)->gpr[arg0]; char path_buf[PATH_MAX]; 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]) printf_filtered ("0x%lx [%s], 0x%x, 0x%x", (long)path_addr, path, flags, mode); 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, hostflags, mode); emul_write_status(processor, status, errno); }
static void do_open(os_emul_data *emul, unsigned call, const int arg0, cpu *processor, unsigned_word cia) { unsigned_word path_addr = cpu_registers(processor)->gpr[arg0]; char path_buf[PATH_MAX]; 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 status; if (WITH_TRACE && ppc_trace[trace_os_emul]) printf_filtered ("0x%lx [%s], 0x%x, 0x%x", (long)path_addr, path, flags, mode); SYS(open); /* Can't combine these statements, cuz open sets errno. */ status = open(path, flags, mode); emul_write_status(processor, status, errno); }