int sockinfo::ioctl(unsigned long int __request, unsigned long int __arg) throw (vma_error) { int *p_arg = (int *)__arg; switch (__request) { case FIONBIO: { si_logdbg("request=FIONBIO, arg=%d", *p_arg); if (*p_arg) set_blocking(false); else set_blocking(true); } break; default: char buf[128]; snprintf(buf, sizeof(buf), "unimplemented ioctl request=%#x, flags=%#x", (unsigned)__request, (unsigned)__arg); buf[ sizeof(buf)-1 ] = '\0'; VLOG_PRINTF_INFO(safe_mce_sys().exception_handling.get_log_severity(), "%s", buf); int rc = handle_exception_flow(); switch (rc) { case -1: return rc; case -2: vma_throw_object_with_msg(vma_unsupported_api, buf); } break; } si_logdbg("going to OS for ioctl request=%d, flags=%x", __request, __arg); return orig_os_api.ioctl(m_fd, __request, __arg); }
int sockinfo::fcntl(int __cmd, unsigned long int __arg) { switch (__cmd) { case F_SETFL: { si_logdbg("cmd=F_SETFL, arg=%#x", __arg); if (__arg & O_NONBLOCK) set_blocking(false); else set_blocking(true); } break; case F_GETFL: /* Get file status flags. */ si_logfunc("cmd=F_GETFL, arg=%#x", __arg); break; case F_GETFD: /* Get file descriptor flags. */ si_logfunc("cmd=F_GETFD, arg=%#x", __arg); break; case F_SETFD: /* Set file descriptor flags. */ si_logfunc("cmd=F_SETFD, arg=%#x", __arg); break; default: char buf[128]; snprintf(buf, sizeof(buf), "unimplemented fcntl cmd=%#x, arg=%#x", (unsigned)__cmd, (unsigned)__arg); buf[ sizeof(buf)-1 ] = '\0'; VLOG_PRINTF_INFO(safe_mce_sys().exception_handling.get_log_severity(), "%s", buf); int rc = handle_exception_flow(); switch (rc) { case -1: return rc; case -2: vma_throw_object_with_msg(vma_unsupported_api, buf); } break; } si_logdbg("going to OS for fcntl cmd=%d, arg=%#x", __cmd, __arg); return orig_os_api.fcntl(m_fd, __cmd, __arg); }