#ifdef AVMFEATURE_ALCHEMY_POSIX #ifdef __APPLE__ #define _DARWIN_NO_64_BIT_INODE #endif /* __APPLE__ */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "avmshell.h" #include "ShellPosixGlue.h" #ifdef VMCFG_ALCHEMY_SDK_BUILD #include "SetAlchemySDKLocation.c" #endif #ifdef __CYGWIN__ #define st_atimespec st_atim #define st_mtimespec st_mtim #define st_ctimespec st_ctim #endif /* __CYGWIN__ */ namespace avmplus { static void *domainMemoryPtr(ScriptObject *obj, int offset) { DomainEnv *env = obj->core()->codeContext()->domainEnv(); ByteArrayObject *domainMemory = env->get_globalMemory(); return &(domainMemory->GetByteArray()[offset]); } static Atom twoInts(ScriptObject *obj, unsigned int high, unsigned int low) { Atom highatom = obj->core()->uintToAtom(high); Atom lowatom = obj->core()->uintToAtom(low); ArrayObject *ret = obj->toplevel()->arrayClass()->newArray(2); ret->setUintProperty(0, highatom); ret->setUintProperty(1, lowatom); return ret->atom(); } ShellPosixObject::ShellPosixObject(VTable *vtable, ScriptObject *delegate) : ScriptObject(vtable, delegate) {} int ShellPosixObject::fork(int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::fork(); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::read(int A_fd, int A_buf, int A_nbyte, int errnoPtr) { void *A_buf_ptr = domainMemoryPtr(this, A_buf); int saved_err = errno; errno = 0; int ret = ::read(A_fd, A_buf_ptr, A_nbyte); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::write(int A_fd, int A_buf, int A_nbyte, int errnoPtr) { void *A_buf_ptr = domainMemoryPtr(this, A_buf); int saved_err = errno; errno = 0; int ret = ::write(A_fd, A_buf_ptr, A_nbyte); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::open(int A_path, int A_flags, int A_mode, int errnoPtr) { char *A_path_ptr = (char *) domainMemoryPtr(this, A_path); int saved_err = errno; errno = 0; int ret = ::open(A_path_ptr, A_flags, A_mode); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::close(int A_fd, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::close(A_fd); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::wait4(int A_pid, int A_status, int A_options, int A_rusage, int errnoPtr) { int *A_status_ptr = (int *) domainMemoryPtr(this, A_status); char *A_rusage_ptr = (char *) domainMemoryPtr(this, A_rusage); struct rusage A_rusage_struct; int saved_err = errno; errno = 0; int ret = ::wait4(A_pid, A_status_ptr, A_options, &A_rusage_struct); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; *(uint32_t *) (A_rusage_ptr + 0) = (uint32_t) A_rusage_struct.ru_utime.tv_sec; *(uint32_t *) (A_rusage_ptr + 4) = (uint32_t) A_rusage_struct.ru_utime.tv_usec; *(uint32_t *) (A_rusage_ptr + 8) = (uint32_t) A_rusage_struct.ru_stime.tv_sec; *(uint32_t *) (A_rusage_ptr + 12) = (uint32_t) A_rusage_struct.ru_stime.tv_usec; return ret; } int ShellPosixObject::link(int A_path, int A_linkpath, int errnoPtr) { char *A_path_ptr = (char *) domainMemoryPtr(this, A_path); char *A_linkpath_ptr = (char *) domainMemoryPtr(this, A_linkpath); int saved_err = errno; errno = 0; int ret = ::link(A_path_ptr, A_linkpath_ptr); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::unlink(int A_path, int errnoPtr) { char *A_path_ptr = (char *) domainMemoryPtr(this, A_path); int saved_err = errno; errno = 0; int ret = ::unlink(A_path_ptr); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::chdir(int A_path, int errnoPtr) { char *A_path_ptr = (char *) domainMemoryPtr(this, A_path); int saved_err = errno; errno = 0; int ret = ::chdir(A_path_ptr); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::fchdir(int A_fd, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::fchdir(A_fd); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::chmod(int A_path, int A_mode, int errnoPtr) { char *A_path_ptr = (char *) domainMemoryPtr(this, A_path); int saved_err = errno; errno = 0; int ret = ::chmod(A_path_ptr, A_mode); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::chown(int A_path, int A_uid, int A_gid, int errnoPtr) { char *A_path_ptr = (char *) domainMemoryPtr(this, A_path); int saved_err = errno; errno = 0; int ret = ::chown(A_path_ptr, A_uid, A_gid); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } Atom ShellPosixObject::lseek(int A_fd, int A_offset_high, int A_offset_low, int A_whence, int errnoPtr) { off_t A_offset = A_offset_high; A_offset = A_offset << 32; A_offset |= A_offset_low; int saved_err = errno; errno = 0; off_t ret = ::lseek(A_fd, A_offset, A_whence); unsigned int ret_high = ret >> 32; unsigned int ret_low = ret & 0xffffffff; if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return twoInts(this, ret_high, ret_low); } int ShellPosixObject::getpid(int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::getpid(); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::setuid(int A_uid, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::setuid(A_uid); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::getuid(int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::getuid(); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::geteuid(int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::geteuid(); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::access(int A_path, int A_flags, int errnoPtr) { char *A_path_ptr = (char *) domainMemoryPtr(this, A_path); int saved_err = errno; errno = 0; int ret = ::access(A_path_ptr, A_flags); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } void ShellPosixObject::sync(int errnoPtr) { int saved_err = errno; errno = 0; ::sync(); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; } int ShellPosixObject::kill(int A_pid, int A_signum, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::kill(A_pid, A_signum); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::getppid(int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::getppid(); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::dup(int A_fd, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::dup(A_fd); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::pipe(int A_fildes, int errnoPtr) { int *A_fildes_ptr = (int *) domainMemoryPtr(this, A_fildes); int saved_err = errno; errno = 0; int ret = ::pipe(A_fildes_ptr); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::getegid(int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::getegid(); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::getgid(int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::getgid(); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::ioctl(int A_fd, int A_com, int A_data, int errnoPtr) { caddr_t A_data_ptr = (caddr_t) domainMemoryPtr(this, A_data); int saved_err = errno; errno = 0; int ret = ::ioctl(A_fd, A_com, A_data_ptr); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::revoke(int A_path, int errnoPtr) { char *A_path_ptr = (char *) domainMemoryPtr(this, A_path); int saved_err = errno; errno = 0; int ret = ::revoke(A_path_ptr); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::symlink(int A_path, int A_link, int errnoPtr) { char *A_path_ptr = (char *) domainMemoryPtr(this, A_path); char *A_link_ptr = (char *) domainMemoryPtr(this, A_link); int saved_err = errno; errno = 0; int ret = ::symlink(A_path_ptr, A_link_ptr); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::umask(int A_newmask, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::umask(A_newmask); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::chroot(int A_path, int errnoPtr) { char *A_path_ptr = (char *) domainMemoryPtr(this, A_path); int saved_err = errno; errno = 0; int ret = ::chroot(A_path_ptr); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::msync(int A_addr, int A_len, int A_flags, int errnoPtr) { void *A_addr_ptr = domainMemoryPtr(this, A_addr); int saved_err = errno; errno = 0; int ret = ::msync(A_addr_ptr, A_len, A_flags); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::vfork(int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::vfork(); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::getgroups(int A_gidsetsize, int A_gidset, int errnoPtr) { gid_t *A_gidset_ptr = (gid_t *) domainMemoryPtr(this, A_gidset); int saved_err = errno; errno = 0; int ret = ::getgroups(A_gidsetsize, A_gidset_ptr); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::setgroups(int A_gidsetsize, int A_gidset, int errnoPtr) { gid_t *A_gidset_ptr = (gid_t *) domainMemoryPtr(this, A_gidset); int saved_err = errno; errno = 0; int ret = ::setgroups(A_gidsetsize, A_gidset_ptr); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::getpgrp(int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::getpgrp(); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::setpgid(int A_pid, int A_pgid, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::setpgid(A_pid, A_pgid); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::getdtablesize(int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::getdtablesize(); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::dup2(int A_from, int A_to, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::dup2(A_from, A_to); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::fcntl(int A_fd, int A_cmd, int A_arg, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::fcntl(A_fd, A_cmd, A_arg); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::fsync(int A_fd, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::fsync(A_fd); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::setpriority(int A_which, int A_who, int A_prio, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::setpriority(A_which, A_who, A_prio); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::socket(int A_domain, int A_type, int A_protocol, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::socket(A_domain, A_type, A_protocol); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::getpriority(int A_which, int A_who, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::getpriority(A_which, A_who); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::setsockopt(int A_s, int A_level, int A_name, int A_val, int A_valsize, int errnoPtr) { void *A_val_ptr = domainMemoryPtr(this, A_val); int saved_err = errno; errno = 0; int ret = ::setsockopt(A_s, A_level, A_name, A_val_ptr, A_valsize); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::listen(int A_s, int A_backlog, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::listen(A_s, A_backlog); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::sigsuspend(int A_mask, int errnoPtr) { sigset_t *A_mask_ptr = (sigset_t *) domainMemoryPtr(this, A_mask); int saved_err = errno; errno = 0; int ret = ::sigsuspend(A_mask_ptr); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::getrusage(int A_who, int A_rusage, int errnoPtr) { char *A_rusage_ptr = (char *) domainMemoryPtr(this, A_rusage); struct rusage A_rusage_struct; int saved_err = errno; errno = 0; int ret = ::getrusage(A_who, &A_rusage_struct); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; *(uint32_t *) (A_rusage_ptr + 0) = (uint32_t) A_rusage_struct.ru_utime.tv_sec; *(uint32_t *) (A_rusage_ptr + 4) = (uint32_t) A_rusage_struct.ru_utime.tv_usec; *(uint32_t *) (A_rusage_ptr + 8) = (uint32_t) A_rusage_struct.ru_stime.tv_sec; *(uint32_t *) (A_rusage_ptr + 12) = (uint32_t) A_rusage_struct.ru_stime.tv_usec; return ret; } int ShellPosixObject::getsockopt(int A_s, int A_level, int A_name, int A_val, int A_avalsize, int errnoPtr) { void *A_val_ptr = domainMemoryPtr(this, A_val); socklen_t *A_avalsize_ptr = (socklen_t *) domainMemoryPtr(this, A_avalsize); int saved_err = errno; errno = 0; int ret = ::getsockopt(A_s, A_level, A_name, A_val_ptr, A_avalsize_ptr); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::readv(int A_fd, int A_iovp, int A_iovcnt, int errnoPtr) { char *A_iovp_ptr = (char *) domainMemoryPtr(this, A_iovp); struct iovec A_iovp_tmp; memmove(&A_iovp_tmp, A_iovp_ptr, sizeof(struct iovec)); int saved_err = errno; errno = 0; int i; struct iovec tmp_iovec[A_iovcnt]; char *vecp = (char *)domainMemoryPtr(this, A_iovp); for (i = 0; i < A_iovcnt; i++) { int nbytes = *(vecp + (i * 8) + 4); char *tmp = (char *)malloc(nbytes); tmp_iovec[i].iov_base = tmp; tmp_iovec[i].iov_len = nbytes; } int ret = ::readv(A_fd, tmp_iovec, A_iovcnt); for (i = 0; i < A_iovcnt; i++) { int offset = *((int *) (vecp + (i * 8))); void *datap = domainMemoryPtr(this, offset); memmove(datap, tmp_iovec[i].iov_base, tmp_iovec[i].iov_len); free(tmp_iovec[i].iov_base); } if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::writev(int A_fd, int A_iovp, int A_iovcnt, int errnoPtr) { char *A_iovp_ptr = (char *) domainMemoryPtr(this, A_iovp); struct iovec A_iovp_tmp; memmove(&A_iovp_tmp, A_iovp_ptr, sizeof(struct iovec)); int saved_err = errno; errno = 0; int i; struct iovec tmp_iovec[A_iovcnt]; char *vecp = (char *)domainMemoryPtr(this, A_iovp); for (i = 0; i < A_iovcnt; i++) { int nbytes = *(vecp + (i * 8) + 4); char *tmp = (char *)malloc(nbytes); int offset = *((int *) (vecp + (i * 8))); void *datap = domainMemoryPtr(this, offset); memmove(tmp, (void *) datap, nbytes); tmp_iovec[i].iov_base = tmp; tmp_iovec[i].iov_len = nbytes; } int ret = ::writev(A_fd, tmp_iovec, A_iovcnt); for (i = 0; i < A_iovcnt; i++) { free(tmp_iovec[i].iov_base); } if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::fchown(int A_fd, int A_uid, int A_gid, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::fchown(A_fd, A_uid, A_gid); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::fchmod(int A_fd, int A_mode, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::fchmod(A_fd, A_mode); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::setreuid(int A_ruid, int A_euid, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::setreuid(A_ruid, A_euid); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::setregid(int A_rgid, int A_egid, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::setregid(A_rgid, A_egid); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::rename(int A_from, int A_to, int errnoPtr) { char *A_from_ptr = (char *) domainMemoryPtr(this, A_from); char *A_to_ptr = (char *) domainMemoryPtr(this, A_to); int saved_err = errno; errno = 0; int ret = ::rename(A_from_ptr, A_to_ptr); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::mkfifo(int A_path, int A_mode, int errnoPtr) { char *A_path_ptr = (char *) domainMemoryPtr(this, A_path); int saved_err = errno; errno = 0; int ret = ::mkfifo(A_path_ptr, A_mode); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::shutdown(int A_s, int A_how, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::shutdown(A_s, A_how); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::socketpair(int A_domain, int A_type, int A_protocol, int A_rsv, int errnoPtr) { int *A_rsv_ptr = (int *) domainMemoryPtr(this, A_rsv); int saved_err = errno; errno = 0; int ret = ::socketpair(A_domain, A_type, A_protocol, A_rsv_ptr); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::mkdir(int A_path, int A_mode, int errnoPtr) { char *A_path_ptr = (char *) domainMemoryPtr(this, A_path); int saved_err = errno; errno = 0; int ret = ::mkdir(A_path_ptr, A_mode); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::rmdir(int A_path, int errnoPtr) { char *A_path_ptr = (char *) domainMemoryPtr(this, A_path); int saved_err = errno; errno = 0; int ret = ::rmdir(A_path_ptr); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::setsid(int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::setsid(); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::getdirentries(int A_fd, int A_buf, int A_count, int A_basep, int errnoPtr) { #ifdef __APPLE__ char *A_buf_ptr = (char *) domainMemoryPtr(this, A_buf); long *A_basep_ptr = (long *) domainMemoryPtr(this, A_basep); int saved_err = errno; errno = 0; int ret = ::getdirentries(A_fd, A_buf_ptr, A_count, A_basep_ptr); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; #else (void)A_fd; (void)A_buf; (void)A_count; (void)A_basep; (void)errnoPtr; return -1; #endif /* __APPLE__ */ } int ShellPosixObject::setgid(int A_gid, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::setgid(A_gid); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::setegid(int A_egid, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::setegid(A_egid); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::seteuid(int A_euid, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::seteuid(A_euid); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::stat(int A_path, int A_ub, int errnoPtr) { char *A_path_ptr = (char *) domainMemoryPtr(this, A_path); char *A_ub_ptr = (char *) domainMemoryPtr(this, A_ub); struct stat A_ub_struct; int saved_err = errno; errno = 0; int ret = ::stat(A_path_ptr, &A_ub_struct); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; *(uint32_t *) (A_ub_ptr + 0) = (uint32_t) A_ub_struct.st_dev; *(uint16_t *) (A_ub_ptr + 8) = (uint16_t) A_ub_struct.st_mode; *(uint16_t *) (A_ub_ptr + 10) = (uint16_t) A_ub_struct.st_nlink; *(uint32_t *) (A_ub_ptr + 12) = (uint32_t) A_ub_struct.st_uid; *(uint32_t *) (A_ub_ptr + 16) = (uint32_t) A_ub_struct.st_gid; *(uint32_t *) (A_ub_ptr + 20) = (uint32_t) A_ub_struct.st_rdev; *(uint64_t *) (A_ub_ptr + 48) = (uint64_t) A_ub_struct.st_size; *(uint64_t *) (A_ub_ptr + 56) = (uint64_t) A_ub_struct.st_blocks; *(uint32_t *) (A_ub_ptr + 64) = (uint32_t) A_ub_struct.st_blksize; *(uint32_t *) (A_ub_ptr + 24) = (uint32_t) A_ub_struct.st_atimespec.tv_sec; *(uint32_t *) (A_ub_ptr + 28) = (uint32_t) A_ub_struct.st_atimespec.tv_nsec; *(uint32_t *) (A_ub_ptr + 32) = (uint32_t) A_ub_struct.st_mtimespec.tv_sec; *(uint32_t *) (A_ub_ptr + 36) = (uint32_t) A_ub_struct.st_mtimespec.tv_nsec; *(uint32_t *) (A_ub_ptr + 40) = (uint32_t) A_ub_struct.st_ctimespec.tv_sec; *(uint32_t *) (A_ub_ptr + 44) = (uint32_t) A_ub_struct.st_ctimespec.tv_nsec; return ret; } int ShellPosixObject::fstat(int A_fd, int A_sb, int errnoPtr) { char *A_sb_ptr = (char *) domainMemoryPtr(this, A_sb); struct stat A_sb_struct; int saved_err = errno; errno = 0; int ret = ::fstat(A_fd, &A_sb_struct); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; *(uint32_t *) (A_sb_ptr + 0) = (uint32_t) A_sb_struct.st_dev; *(uint16_t *) (A_sb_ptr + 8) = (uint16_t) A_sb_struct.st_mode; *(uint16_t *) (A_sb_ptr + 10) = (uint16_t) A_sb_struct.st_nlink; *(uint32_t *) (A_sb_ptr + 12) = (uint32_t) A_sb_struct.st_uid; *(uint32_t *) (A_sb_ptr + 16) = (uint32_t) A_sb_struct.st_gid; *(uint32_t *) (A_sb_ptr + 20) = (uint32_t) A_sb_struct.st_rdev; *(uint64_t *) (A_sb_ptr + 48) = (uint64_t) A_sb_struct.st_size; *(uint64_t *) (A_sb_ptr + 56) = (uint64_t) A_sb_struct.st_blocks; *(uint32_t *) (A_sb_ptr + 64) = (uint32_t) A_sb_struct.st_blksize; *(uint32_t *) (A_sb_ptr + 24) = (uint32_t) A_sb_struct.st_atimespec.tv_sec; *(uint32_t *) (A_sb_ptr + 28) = (uint32_t) A_sb_struct.st_atimespec.tv_nsec; *(uint32_t *) (A_sb_ptr + 32) = (uint32_t) A_sb_struct.st_mtimespec.tv_sec; *(uint32_t *) (A_sb_ptr + 36) = (uint32_t) A_sb_struct.st_mtimespec.tv_nsec; *(uint32_t *) (A_sb_ptr + 40) = (uint32_t) A_sb_struct.st_ctimespec.tv_sec; *(uint32_t *) (A_sb_ptr + 44) = (uint32_t) A_sb_struct.st_ctimespec.tv_nsec; return ret; } int ShellPosixObject::lstat(int A_path, int A_ub, int errnoPtr) { char *A_path_ptr = (char *) domainMemoryPtr(this, A_path); char *A_ub_ptr = (char *) domainMemoryPtr(this, A_ub); struct stat A_ub_struct; int saved_err = errno; errno = 0; int ret = ::lstat(A_path_ptr, &A_ub_struct); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; *(uint32_t *) (A_ub_ptr + 0) = (uint32_t) A_ub_struct.st_dev; *(uint16_t *) (A_ub_ptr + 8) = (uint16_t) A_ub_struct.st_mode; *(uint16_t *) (A_ub_ptr + 10) = (uint16_t) A_ub_struct.st_nlink; *(uint32_t *) (A_ub_ptr + 12) = (uint32_t) A_ub_struct.st_uid; *(uint32_t *) (A_ub_ptr + 16) = (uint32_t) A_ub_struct.st_gid; *(uint32_t *) (A_ub_ptr + 20) = (uint32_t) A_ub_struct.st_rdev; *(uint64_t *) (A_ub_ptr + 48) = (uint64_t) A_ub_struct.st_size; *(uint64_t *) (A_ub_ptr + 56) = (uint64_t) A_ub_struct.st_blocks; *(uint32_t *) (A_ub_ptr + 64) = (uint32_t) A_ub_struct.st_blksize; *(uint32_t *) (A_ub_ptr + 24) = (uint32_t) A_ub_struct.st_atimespec.tv_sec; *(uint32_t *) (A_ub_ptr + 28) = (uint32_t) A_ub_struct.st_atimespec.tv_nsec; *(uint32_t *) (A_ub_ptr + 32) = (uint32_t) A_ub_struct.st_mtimespec.tv_sec; *(uint32_t *) (A_ub_ptr + 36) = (uint32_t) A_ub_struct.st_mtimespec.tv_nsec; *(uint32_t *) (A_ub_ptr + 40) = (uint32_t) A_ub_struct.st_ctimespec.tv_sec; *(uint32_t *) (A_ub_ptr + 44) = (uint32_t) A_ub_struct.st_ctimespec.tv_nsec; return ret; } int ShellPosixObject::pathconf(int A_path, int A_name, int errnoPtr) { char *A_path_ptr = (char *) domainMemoryPtr(this, A_path); int saved_err = errno; errno = 0; int ret = ::pathconf(A_path_ptr, A_name); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::fpathconf(int A_fd, int A_name, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::fpathconf(A_fd, A_name); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::getpgid(int A_pid, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::getpgid(A_pid); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::semget(int A_key, int A_nsems, int A_semflg, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::semget(A_key, A_nsems, A_semflg); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::msgget(int A_key, int A_msgflg, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::msgget(A_key, A_msgflg); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::msgsnd(int A_msqid, int A_msgp, int A_msgsz, int A_msgflg, int errnoPtr) { void *A_msgp_ptr = domainMemoryPtr(this, A_msgp); int saved_err = errno; errno = 0; int ret = ::msgsnd(A_msqid, A_msgp_ptr, A_msgsz, A_msgflg); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::msgrcv(int A_msqid, int A_msgp, int A_msgsz, int A_msgtyp, int A_msgflg, int errnoPtr) { void *A_msgp_ptr = domainMemoryPtr(this, A_msgp); int saved_err = errno; errno = 0; int ret = ::msgrcv(A_msqid, A_msgp_ptr, A_msgsz, A_msgtyp, A_msgflg); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::shmdt(int A_shmaddr, int errnoPtr) { void *A_shmaddr_ptr = domainMemoryPtr(this, A_shmaddr); int saved_err = errno; errno = 0; int ret = ::shmdt(A_shmaddr_ptr); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::shmget(int A_key, int A_size, int A_shmflg, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::shmget(A_key, A_size, A_shmflg); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::clock_gettime(int A_clock_id, int A_tp, int errnoPtr) { char *A_tp_ptr = (char *) domainMemoryPtr(this, A_tp); struct timespec A_tp_struct; int saved_err = errno; errno = 0; #ifdef __APPLE__ (void)A_clock_id; int ret = ::gettimeofday((struct timeval *) &A_tp_struct, NULL); A_tp_struct.tv_nsec /= 1000; #else int ret = ::clock_gettime(A_clock_id, &A_tp_struct); #endif /* __APPLE__ */ if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; *(uint32_t *) (A_tp_ptr + 0) = (uint32_t) A_tp_struct.tv_sec; *(uint32_t *) (A_tp_ptr + 4) = (uint32_t) A_tp_struct.tv_nsec; return ret; } int ShellPosixObject::nanosleep(int A_rqtp, int A_rmtp, int errnoPtr) { char *A_rqtp_ptr = (char *) domainMemoryPtr(this, A_rqtp); struct timespec A_rqtp_tmp; memmove(&A_rqtp_tmp, A_rqtp_ptr, sizeof(struct timespec)); char *A_rmtp_ptr = (char *) domainMemoryPtr(this, A_rmtp); struct timespec A_rmtp_struct; int saved_err = errno; errno = 0; int ret = ::nanosleep(&A_rqtp_tmp, &A_rmtp_struct); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; *(uint32_t *) (A_rmtp_ptr + 0) = (uint32_t) A_rmtp_struct.tv_sec; *(uint32_t *) (A_rmtp_ptr + 4) = (uint32_t) A_rmtp_struct.tv_nsec; return ret; } int ShellPosixObject::lchown(int A_path, int A_uid, int A_gid, int errnoPtr) { char *A_path_ptr = (char *) domainMemoryPtr(this, A_path); int saved_err = errno; errno = 0; int ret = ::lchown(A_path_ptr, A_uid, A_gid); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::getsid(int A_pid, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::getsid(A_pid); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::sched_yield(int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::sched_yield(); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::sched_get_priority_max(int A_policy, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::sched_get_priority_max(A_policy); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::sched_get_priority_min(int A_policy, int errnoPtr) { int saved_err = errno; errno = 0; int ret = ::sched_get_priority_min(A_policy); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::sigprocmask(int A_how, int A_set, int A_oset, int errnoPtr) { sigset_t *A_set_ptr = (sigset_t *) domainMemoryPtr(this, A_set); sigset_t *A_oset_ptr = (sigset_t *) domainMemoryPtr(this, A_oset); int saved_err = errno; errno = 0; int ret = ::sigprocmask(A_how, A_set_ptr, A_oset_ptr); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::sigpending(int A_set, int errnoPtr) { sigset_t *A_set_ptr = (sigset_t *) domainMemoryPtr(this, A_set); int saved_err = errno; errno = 0; int ret = ::sigpending(A_set_ptr); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::sigwait(int A_set, int A_sig, int errnoPtr) { sigset_t *A_set_ptr = (sigset_t *) domainMemoryPtr(this, A_set); int *A_sig_ptr = (int *) domainMemoryPtr(this, A_sig); int saved_err = errno; errno = 0; int ret = ::sigwait(A_set_ptr, A_sig_ptr); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::shm_unlink(int A_path, int errnoPtr) { char *A_path_ptr = (char *) domainMemoryPtr(this, A_path); int saved_err = errno; errno = 0; int ret = ::shm_unlink(A_path_ptr); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::pselect(int A_nd, int A_in, int A_ou, int A_ex, int A_ts, int A_sm, int errnoPtr) { fd_set *A_in_ptr = (fd_set *) domainMemoryPtr(this, A_in); fd_set *A_ou_ptr = (fd_set *) domainMemoryPtr(this, A_ou); fd_set *A_ex_ptr = (fd_set *) domainMemoryPtr(this, A_ex); char *A_ts_ptr = (char *) domainMemoryPtr(this, A_ts); struct timespec A_ts_tmp; memmove(&A_ts_tmp, A_ts_ptr, sizeof(struct timespec)); sigset_t *A_sm_ptr = (sigset_t *) domainMemoryPtr(this, A_sm); int saved_err = errno; errno = 0; int ret = ::pselect(A_nd, A_in_ptr, A_ou_ptr, A_ex_ptr, &A_ts_tmp, A_sm_ptr); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::__getcwd(int A_buf, int A_buflen, int errnoPtr) { char *A_buf_ptr = (char *) domainMemoryPtr(this, A_buf); int saved_err = errno; errno = 0; int ret = 0; ::getcwd(A_buf_ptr, A_buflen); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; } int ShellPosixObject::issetugid(int errnoPtr) { #ifdef __APPLE__ int saved_err = errno; errno = 0; int ret = ::issetugid(); if (errno) { int *alc_errno = (int *) domainMemoryPtr(this, errnoPtr); *alc_errno = errno; } errno = saved_err; return ret; #else (void)errnoPtr; return -1; #endif /* __APPLE__ */ } ShellPosixClass::ShellPosixClass(VTable *vtable) : ClassClosure(vtable) {} Stringp ShellPosixClass::getAppPath() { #if VMCFG_ALCHEMY_SDK_BUILD char path[PATH_MAX]; unsigned int sz = PATH_MAX; GetAppPath(&path[0], &sz); return core()->newStringLatin1(&path[0], sz); #else return core()->kEmptyString; #endif } } #endif // VMCFG_ALCHEMY_POSIX