1a90cf9f2SGordon Ross /* 2a90cf9f2SGordon Ross * CDDL HEADER START 3a90cf9f2SGordon Ross * 4a90cf9f2SGordon Ross * The contents of this file are subject to the terms of the 5a90cf9f2SGordon Ross * Common Development and Distribution License (the "License"). 6a90cf9f2SGordon Ross * You may not use this file except in compliance with the License. 7a90cf9f2SGordon Ross * 8a90cf9f2SGordon Ross * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9a90cf9f2SGordon Ross * or http://www.opensolaris.org/os/licensing. 10a90cf9f2SGordon Ross * See the License for the specific language governing permissions 11a90cf9f2SGordon Ross * and limitations under the License. 12a90cf9f2SGordon Ross * 13a90cf9f2SGordon Ross * When distributing Covered Code, include this CDDL HEADER in each 14a90cf9f2SGordon Ross * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15a90cf9f2SGordon Ross * If applicable, add the following below this CDDL HEADER, with the 16a90cf9f2SGordon Ross * fields enclosed by brackets "[]" replaced with your own identifying 17a90cf9f2SGordon Ross * information: Portions Copyright [yyyy] [name of copyright owner] 18a90cf9f2SGordon Ross * 19a90cf9f2SGordon Ross * CDDL HEADER END 20a90cf9f2SGordon Ross */ 21a90cf9f2SGordon Ross 22a90cf9f2SGordon Ross /* 23a90cf9f2SGordon Ross * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. 24*d2488fe8SGordon Ross * Copyright 2017 Nexenta Systems, Inc. All rights reserved. 25a90cf9f2SGordon Ross */ 26a90cf9f2SGordon Ross 27a90cf9f2SGordon Ross /* 28a90cf9f2SGordon Ross * Translate Unix errno values to NT status, and NT status to 29a90cf9f2SGordon Ross * DOS-style error class+code (for SMB1) 30a90cf9f2SGordon Ross */ 31a90cf9f2SGordon Ross 32a90cf9f2SGordon Ross #include <smbsrv/smb_kproto.h> 33a90cf9f2SGordon Ross #include <smbsrv/smb_kstat.h> 34a90cf9f2SGordon Ross 35a90cf9f2SGordon Ross #include "smbclnt/smb_status2winerr.h" 36a90cf9f2SGordon Ross 37a90cf9f2SGordon Ross 38a90cf9f2SGordon Ross /* 39a90cf9f2SGordon Ross * Map Unix errno values to NT status values. 40a90cf9f2SGordon Ross */ 41a90cf9f2SGordon Ross 42a90cf9f2SGordon Ross struct errno2status { 43a90cf9f2SGordon Ross int errnum; 44a90cf9f2SGordon Ross uint_t status; 45a90cf9f2SGordon Ross }; 46a90cf9f2SGordon Ross 47a90cf9f2SGordon Ross static const struct errno2status 48a90cf9f2SGordon Ross smb_errno2status_map[] = { 49a90cf9f2SGordon Ross { EPERM, NT_STATUS_ACCESS_DENIED }, 50*d2488fe8SGordon Ross { ENOENT, NT_STATUS_OBJECT_NAME_NOT_FOUND }, 51*d2488fe8SGordon Ross /* NB: ESRCH is used in rename and stream ops. */ 52*d2488fe8SGordon Ross { ESRCH, NT_STATUS_NO_SUCH_FILE }, 53a90cf9f2SGordon Ross { EINTR, NT_STATUS_CANCELLED }, 54a90cf9f2SGordon Ross { EIO, NT_STATUS_IO_DEVICE_ERROR }, 55a90cf9f2SGordon Ross { ENXIO, NT_STATUS_BAD_DEVICE_TYPE }, 56a90cf9f2SGordon Ross /* E2BIG, ENOEXEC */ 57a90cf9f2SGordon Ross { EBADF, NT_STATUS_INVALID_HANDLE }, 58a90cf9f2SGordon Ross /* ECHILD, EAGAIN */ 59a90cf9f2SGordon Ross { ENOMEM, NT_STATUS_NO_MEMORY }, 60a90cf9f2SGordon Ross { EACCES, NT_STATUS_ACCESS_DENIED }, 61a90cf9f2SGordon Ross /* EFAULT, ENOTBLK, EBUSY */ 62a90cf9f2SGordon Ross { EEXIST, NT_STATUS_OBJECT_NAME_COLLISION }, 63a90cf9f2SGordon Ross { EXDEV, NT_STATUS_NOT_SAME_DEVICE }, 64a90cf9f2SGordon Ross { ENODEV, NT_STATUS_NO_SUCH_DEVICE }, 65a90cf9f2SGordon Ross { ENOTDIR, NT_STATUS_OBJECT_PATH_NOT_FOUND }, 66a90cf9f2SGordon Ross { EISDIR, NT_STATUS_FILE_IS_A_DIRECTORY }, 67a90cf9f2SGordon Ross { EINVAL, NT_STATUS_INVALID_PARAMETER }, 68a90cf9f2SGordon Ross { ENFILE, NT_STATUS_TOO_MANY_OPENED_FILES }, 69a90cf9f2SGordon Ross { EMFILE, NT_STATUS_TOO_MANY_OPENED_FILES }, 70a90cf9f2SGordon Ross { ENOTTY, NT_STATUS_INVALID_DEVICE_REQUEST }, 71a90cf9f2SGordon Ross /* ENOTTY, ETXTBSY, EFBIG */ 72a90cf9f2SGordon Ross { ENOSPC, NT_STATUS_DISK_FULL }, 73a90cf9f2SGordon Ross /* ESPIPE */ 74a90cf9f2SGordon Ross { EROFS, NT_STATUS_ACCESS_DENIED }, 75a90cf9f2SGordon Ross { EMLINK, NT_STATUS_TOO_MANY_LINKS }, 76a90cf9f2SGordon Ross { EPIPE, NT_STATUS_PIPE_BROKEN }, 77a90cf9f2SGordon Ross /* EDOM */ 78a90cf9f2SGordon Ross /* NB: ERANGE is used to represent lock range I/O conflicts. */ 79a90cf9f2SGordon Ross { ERANGE, NT_STATUS_FILE_LOCK_CONFLICT }, 80a90cf9f2SGordon Ross /* ENOMSG, EIDRM, ... */ 81a90cf9f2SGordon Ross { ENOTSUP, NT_STATUS_NOT_SUPPORTED }, 82a90cf9f2SGordon Ross { EDQUOT, NT_STATUS_DISK_FULL }, 83a90cf9f2SGordon Ross { EREMOTE, NT_STATUS_PATH_NOT_COVERED}, 84a90cf9f2SGordon Ross { ENAMETOOLONG, NT_STATUS_OBJECT_NAME_INVALID }, 85a90cf9f2SGordon Ross { EILSEQ, NT_STATUS_OBJECT_NAME_INVALID }, 86a90cf9f2SGordon Ross { ENOTEMPTY, NT_STATUS_DIRECTORY_NOT_EMPTY }, 87a90cf9f2SGordon Ross { ENOTSOCK, NT_STATUS_INVALID_HANDLE }, 88a90cf9f2SGordon Ross { ESTALE, NT_STATUS_INVALID_HANDLE }, 89a90cf9f2SGordon Ross { 0, 0 } 90a90cf9f2SGordon Ross }; 91a90cf9f2SGordon Ross 92a90cf9f2SGordon Ross uint_t 93a90cf9f2SGordon Ross smb_errno2status(int errnum) 94a90cf9f2SGordon Ross { 95a90cf9f2SGordon Ross const struct errno2status *es; 96a90cf9f2SGordon Ross 97a90cf9f2SGordon Ross if (errnum == 0) 98a90cf9f2SGordon Ross return (0); 99a90cf9f2SGordon Ross 100a90cf9f2SGordon Ross for (es = smb_errno2status_map; es->errnum != 0; es++) 101a90cf9f2SGordon Ross if (es->errnum == errnum) 102a90cf9f2SGordon Ross return (es->status); 103a90cf9f2SGordon Ross 104a90cf9f2SGordon Ross return (NT_STATUS_INTERNAL_ERROR); 105a90cf9f2SGordon Ross } 106a90cf9f2SGordon Ross 107a90cf9f2SGordon Ross /* 108a90cf9f2SGordon Ross * Map NT Status codes to Win32 API error numbers. 109a90cf9f2SGordon Ross * But note: we only want the ones below 0xFFFF, 110a90cf9f2SGordon Ross * which can be returned in SMB with class=DOSERR. 111a90cf9f2SGordon Ross */ 112a90cf9f2SGordon Ross uint16_t 113a90cf9f2SGordon Ross smb_status2doserr(uint_t status) 114a90cf9f2SGordon Ross { 115a90cf9f2SGordon Ross const struct status2winerr *sw; 116a90cf9f2SGordon Ross 117a90cf9f2SGordon Ross if (status == 0) 118a90cf9f2SGordon Ross return (0); 119a90cf9f2SGordon Ross 120a90cf9f2SGordon Ross for (sw = smb_status2winerr_map; sw->status != 0; sw++) 121a90cf9f2SGordon Ross if (sw->status == status && (sw->winerr < 0xFFFF)) 122a90cf9f2SGordon Ross return ((uint16_t)sw->winerr); 123a90cf9f2SGordon Ross 124a90cf9f2SGordon Ross return (ERROR_GEN_FAILURE); 125a90cf9f2SGordon Ross } 126