status_t _user_writev_port_etc(port_id port, int32 messageCode, const iovec *userVecs, size_t vecCount, size_t bufferSize, uint32 flags, bigtime_t timeout) { syscall_restart_handle_timeout_pre(flags, timeout); if (userVecs == NULL && bufferSize != 0) return B_BAD_VALUE; if (userVecs != NULL && !IS_USER_ADDRESS(userVecs)) return B_BAD_ADDRESS; iovec *vecs = NULL; if (userVecs && vecCount != 0) { vecs = (iovec*)malloc(sizeof(iovec) * vecCount); if (vecs == NULL) return B_NO_MEMORY; if (user_memcpy(vecs, userVecs, sizeof(iovec) * vecCount) < B_OK) { free(vecs); return B_BAD_ADDRESS; } } status_t status = writev_port_etc(port, messageCode, vecs, vecCount, bufferSize, flags | PORT_FLAG_USE_USER_MEMCPY | B_CAN_INTERRUPT, timeout); free(vecs); return syscall_restart_handle_timeout_post(status, timeout); }
ssize_t _user_port_buffer_size_etc(port_id port, uint32 flags, bigtime_t timeout) { syscall_restart_handle_timeout_pre(flags, timeout); status_t status = port_buffer_size_etc(port, flags | B_CAN_INTERRUPT, timeout); return syscall_restart_handle_timeout_post(status, timeout); }
status_t _user_acquire_sem_etc(sem_id id, int32 count, uint32 flags, bigtime_t timeout) { syscall_restart_handle_timeout_pre(flags, timeout); status_t error = switch_sem_etc(-1, id, count, flags | B_CAN_INTERRUPT | B_CHECK_PERMISSION, timeout); return syscall_restart_handle_timeout_post(error, timeout); }
status_t _user_mutex_lock(int32* mutex, const char* name, uint32 flags, bigtime_t timeout) { if (mutex == NULL || !IS_USER_ADDRESS(mutex) || (addr_t)mutex % 4 != 0) return B_BAD_ADDRESS; syscall_restart_handle_timeout_pre(flags, timeout); status_t error = user_mutex_lock(mutex, name, flags | B_CAN_INTERRUPT, timeout); return syscall_restart_handle_timeout_post(error, timeout); }
status_t _user_switch_sem_etc(sem_id releaseSem, sem_id id, int32 count, uint32 flags, bigtime_t timeout) { if (releaseSem < 0) syscall_restart_handle_timeout_pre(flags, timeout); status_t error = switch_sem_etc(releaseSem, id, count, flags | B_CAN_INTERRUPT | B_CHECK_PERMISSION, timeout); if (releaseSem < 0) return syscall_restart_handle_timeout_post(error, timeout); return error; }
status_t _user_write_port_etc(port_id port, int32 messageCode, const void *userBuffer, size_t bufferSize, uint32 flags, bigtime_t timeout) { iovec vec = { (void *)userBuffer, bufferSize }; syscall_restart_handle_timeout_pre(flags, timeout); if (userBuffer == NULL && bufferSize != 0) return B_BAD_VALUE; if (userBuffer != NULL && !IS_USER_ADDRESS(userBuffer)) return B_BAD_ADDRESS; status_t status = writev_port_etc(port, messageCode, &vec, 1, bufferSize, flags | PORT_FLAG_USE_USER_MEMCPY | B_CAN_INTERRUPT, timeout); return syscall_restart_handle_timeout_post(status, timeout); }
status_t _user_get_port_message_info_etc(port_id port, port_message_info *userInfo, size_t infoSize, uint32 flags, bigtime_t timeout) { if (userInfo == NULL || infoSize != sizeof(port_message_info)) return B_BAD_VALUE; syscall_restart_handle_timeout_pre(flags, timeout); port_message_info info; status_t error = _get_port_message_info_etc(port, &info, sizeof(info), flags | B_CAN_INTERRUPT, timeout); // copy info to userland if (error == B_OK && (!IS_USER_ADDRESS(userInfo) || user_memcpy(userInfo, &info, sizeof(info)) != B_OK)) { error = B_BAD_ADDRESS; } return syscall_restart_handle_timeout_post(error, timeout); }
ssize_t _user_read_port_etc(port_id port, int32 *userCode, void *userBuffer, size_t bufferSize, uint32 flags, bigtime_t timeout) { int32 messageCode; ssize_t bytesRead; syscall_restart_handle_timeout_pre(flags, timeout); if (userBuffer == NULL && bufferSize != 0) return B_BAD_VALUE; if ((userCode != NULL && !IS_USER_ADDRESS(userCode)) || (userBuffer != NULL && !IS_USER_ADDRESS(userBuffer))) return B_BAD_ADDRESS; bytesRead = read_port_etc(port, &messageCode, userBuffer, bufferSize, flags | PORT_FLAG_USE_USER_MEMCPY | B_CAN_INTERRUPT, timeout); if (bytesRead >= 0 && userCode != NULL && user_memcpy(userCode, &messageCode, sizeof(int32)) < B_OK) return B_BAD_ADDRESS; return syscall_restart_handle_timeout_post(bytesRead, timeout); }