Exemplo n.º 1
0
int
linux_sys_openat(struct lwp *l, const struct linux_sys_openat_args *uap, register_t *retval)
{
	/* {
		syscallarg(int) fd;
		syscallarg(const char *) path;
		syscallarg(int) flags;
		syscallarg(linux_umode_t) mode;
	} */
	int error, fl;
	struct sys_openat_args boa;

	fl = linux_to_bsd_ioflags(SCARG(uap, flags));

	SCARG(&boa, fd) = SCARG(uap, fd);
	SCARG(&boa, path) = SCARG(uap, path);
	SCARG(&boa, oflags) = fl;
	SCARG(&boa, mode) = SCARG(uap, mode);

	if ((error = sys_openat(l, &boa, retval)))
		return (error == EFTYPE) ? ELOOP : error;

	linux_open_ctty(l, fl, *retval);
	return 0;
}
Exemplo n.º 2
0
int openat(int dirfd, const char* path, int flags, ...)
{
	mode_t mode = 0;
	if ( flags & O_CREAT )
	{
		va_list ap;
		va_start(ap, flags);
		mode = va_arg(ap, mode_t);
		va_end(ap);
	}
	return sys_openat(dirfd, path, flags, mode);
}
Exemplo n.º 3
0
uint32_t translate_sys_openat(const struct sys_state *sys, uint32_t *args)
{
	int dirfd = args[0];
	const char *pathname = sys->mem_base + args[1];
	int flags, flags_ok;
	mode_t mode = args[3];

	flags = f2b_open_flags(args[2], &flags_ok);
	if (!flags_ok) {
		debug("Unrecognised open flags 0x%x\n", args[2]);
		return -FRONT_EINVAL;
	}

	return sys_openat(dirfd, pathname, flags, mode);
}
Exemplo n.º 4
0
int handle_frontend_syscall(HTIFState *htifstate, uint64_t payload) {

    uint64_t mm[8];
    int i;
    void * base = htifstate->main_mem_ram_ptr + (uintptr_t)payload;
    for (i = 0; i < 8; i++) {
        mm[i] = ldq_p((void*)(base + i*8));
    }

    #ifdef DEBUG_FRONTEND_RISCV
    for (i = 0; i < 8; i++) {
        fprintf(stderr, "elem %d, val 0x%016lx\n", i, mm[i]);
    }
    #endif

    uint64_t retval = -1;
    switch(mm[0]) {
        case RV_FSYSCALL_sys_openat:
            retval = sys_openat(htifstate, mm[1], mm[2], mm[3], mm[4], mm[5]);
            break;
        case RV_FSYSCALL_sys_close:
            retval = sys_close(htifstate, mm[1]);
            break;
        case RV_FSYSCALL_sys_write:
            retval = sys_write(htifstate, mm[1], mm[2], mm[3]);
            break;
        case RV_FSYSCALL_sys_pread:
            retval = sys_pread(htifstate, mm[1], mm[2], mm[3], mm[4]);
            break;
        case RV_FSYSCALL_sys_exit:
            retval = sys_exit(htifstate, mm[1]);
            break;
        case RV_FSYSCALL_sys_getmainvars:
            retval = sys_getmainvars(htifstate, mm[1], mm[2]);
            break;
        default:
            fprintf(stderr, "FRONTEND SYSCALL %ld NOT IMPLEMENTED\n", mm[0]);
            exit(1);
    }

    // write retval to mm
    stq_p((void*)base, retval);
    return 1;
}
Exemplo n.º 5
0
int sys_open(const char* name, int flags, int mode)
{
  return sys_openat(AT_FDCWD, name, flags, mode);
}