#include <smbsrv/smb_kproto.h>
#include <smbsrv/smb_kstat.h>
#include "smbclnt/smb_status2winerr.h"
struct errno2status {
int errnum;
uint_t status;
};
static const struct errno2status
smb_errno2status_map[] = {
{ EPERM, NT_STATUS_ACCESS_DENIED },
{ ENOENT, NT_STATUS_OBJECT_NAME_NOT_FOUND },
{ ESRCH, NT_STATUS_NO_SUCH_FILE },
{ EINTR, NT_STATUS_CANCELLED },
{ EIO, NT_STATUS_IO_DEVICE_ERROR },
{ ENXIO, NT_STATUS_BAD_DEVICE_TYPE },
{ EBADF, NT_STATUS_INVALID_HANDLE },
{ ENOMEM, NT_STATUS_NO_MEMORY },
{ EACCES, NT_STATUS_ACCESS_DENIED },
{ EEXIST, NT_STATUS_OBJECT_NAME_COLLISION },
{ EXDEV, NT_STATUS_NOT_SAME_DEVICE },
{ ENODEV, NT_STATUS_NO_SUCH_DEVICE },
{ ENOTDIR, NT_STATUS_OBJECT_PATH_NOT_FOUND },
{ EISDIR, NT_STATUS_FILE_IS_A_DIRECTORY },
{ EINVAL, NT_STATUS_INVALID_PARAMETER },
{ ENFILE, NT_STATUS_TOO_MANY_OPENED_FILES },
{ EMFILE, NT_STATUS_TOO_MANY_OPENED_FILES },
{ ENOTTY, NT_STATUS_INVALID_DEVICE_REQUEST },
{ ENOSPC, NT_STATUS_DISK_FULL },
{ EROFS, NT_STATUS_ACCESS_DENIED },
{ EMLINK, NT_STATUS_TOO_MANY_LINKS },
{ EPIPE, NT_STATUS_PIPE_BROKEN },
{ ERANGE, NT_STATUS_FILE_LOCK_CONFLICT },
{ ENOTSUP, NT_STATUS_NOT_SUPPORTED },
{ EDQUOT, NT_STATUS_DISK_FULL },
{ EREMOTE, NT_STATUS_PATH_NOT_COVERED},
{ ENAMETOOLONG, NT_STATUS_NAME_TOO_LONG },
{ EILSEQ, NT_STATUS_OBJECT_NAME_INVALID },
{ ENOTEMPTY, NT_STATUS_DIRECTORY_NOT_EMPTY },
{ ENOTSOCK, NT_STATUS_INVALID_HANDLE },
{ ESTALE, NT_STATUS_INVALID_HANDLE },
{ 0, 0 }
};
uint_t
smb_errno2status(int errnum)
{
const struct errno2status *es;
if (errnum == 0)
return (0);
for (es = smb_errno2status_map; es->errnum != 0; es++)
if (es->errnum == errnum)
return (es->status);
return (NT_STATUS_INTERNAL_ERROR);
}
uint16_t
smb_status2doserr(uint_t status)
{
const struct status2winerr *sw;
if (status == 0)
return (0);
for (sw = smb_status2winerr_map; sw->status != 0; sw++)
if (sw->status == status && (sw->winerr < 0xFFFF))
return ((uint16_t)sw->winerr);
return (ERROR_GEN_FAILURE);
}