/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/*
 * This file essentially replicates NSPR's source for the functions that
 * map system-specific error codes to NSPR error codes.  We would use 
 * NSPR's functions, instead of duplicating them, but they're private.
 * As long as SSL's server session cache code must do platform native I/O
 * to accomplish its job, and NSPR's error mapping functions remain private,
 * this code will continue to need to be replicated.
 * 
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#if 0
#include "primpl.h"
#else
#define _PR_POLL_AVAILABLE 1
#include "prerror.h"
#endif

#if defined (__bsdi__) || defined(NTO) || defined(DARWIN) || defined(BEOS)
#undef _PR_POLL_AVAILABLE
#endif

#if defined(_PR_POLL_AVAILABLE)
#include <poll.h>
#endif
#include <errno.h>

/* forward declarations. */
void nss_MD_unix_map_default_error(int err);

void nss_MD_unix_map_opendir_error(int err)
{
    nss_MD_unix_map_default_error(err);
}

void nss_MD_unix_map_closedir_error(int err)
{
    PRErrorCode prError;
    switch (err) {
    case EINVAL:	prError = PR_BAD_DESCRIPTOR_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_readdir_error(int err)
{
    PRErrorCode prError;

    switch (err) {
    case ENOENT:	prError = PR_NO_MORE_FILES_ERROR; break;
#ifdef EOVERFLOW
    case EOVERFLOW:	prError = PR_IO_ERROR; break;
#endif
    case EINVAL:	prError = PR_IO_ERROR; break;
    case ENXIO:		prError = PR_IO_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_unlink_error(int err)
{
    PRErrorCode prError;
    switch (err) {
    case EPERM:		prError = PR_IS_DIRECTORY_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_stat_error(int err)
{
    PRErrorCode prError;
    switch (err) {
    case ETIMEDOUT:	prError = PR_REMOTE_FILE_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_fstat_error(int err)
{
    PRErrorCode prError;
    switch (err) {
    case ETIMEDOUT:	prError = PR_REMOTE_FILE_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_rename_error(int err)
{
    PRErrorCode prError;
    switch (err) {
    case EEXIST:	prError = PR_DIRECTORY_NOT_EMPTY_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_access_error(int err)
{
    PRErrorCode prError;
    switch (err) {
    case ETIMEDOUT:	prError = PR_REMOTE_FILE_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_mkdir_error(int err)
{
    nss_MD_unix_map_default_error(err);
}

void nss_MD_unix_map_rmdir_error(int err)
{
    PRErrorCode prError;

    switch (err) {
    case EEXIST:	prError = PR_DIRECTORY_NOT_EMPTY_ERROR; break;
    case EINVAL:	prError = PR_DIRECTORY_NOT_EMPTY_ERROR; break;
    case ETIMEDOUT:	prError = PR_REMOTE_FILE_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_read_error(int err)
{
    PRErrorCode prError;
    switch (err) {
    case EINVAL:	prError = PR_INVALID_METHOD_ERROR; break;
    case ENXIO:		prError = PR_INVALID_ARGUMENT_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_write_error(int err)
{
    PRErrorCode prError;
    switch (err) {
    case EINVAL:	prError = PR_INVALID_METHOD_ERROR; break;
    case ENXIO:		prError = PR_INVALID_METHOD_ERROR; break;
    case ETIMEDOUT:	prError = PR_REMOTE_FILE_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_lseek_error(int err)
{
    nss_MD_unix_map_default_error(err);
}

void nss_MD_unix_map_fsync_error(int err)
{
    PRErrorCode prError;
    switch (err) {
    case ETIMEDOUT:	prError = PR_REMOTE_FILE_ERROR; break;
    case EINVAL:	prError = PR_INVALID_METHOD_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_close_error(int err)
{
    PRErrorCode prError;
    switch (err) {
    case ETIMEDOUT:	prError = PR_REMOTE_FILE_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_socket_error(int err)
{
    PRErrorCode prError;
    switch (err) {
    case ENOMEM:	prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_socketavailable_error(int err)
{
    PR_SetError(PR_BAD_DESCRIPTOR_ERROR, err);
}

void nss_MD_unix_map_recv_error(int err)
{
    nss_MD_unix_map_default_error(err);
}

void nss_MD_unix_map_recvfrom_error(int err)
{
    nss_MD_unix_map_default_error(err);
}

void nss_MD_unix_map_send_error(int err)
{
    nss_MD_unix_map_default_error(err);
}

void nss_MD_unix_map_sendto_error(int err)
{
    nss_MD_unix_map_default_error(err);
}

void nss_MD_unix_map_writev_error(int err)
{
    nss_MD_unix_map_default_error(err);
}

void nss_MD_unix_map_accept_error(int err)
{
    PRErrorCode prError;
    switch (err) {
    case ENODEV:	prError = PR_NOT_TCP_SOCKET_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_connect_error(int err)
{
    PRErrorCode prError;
    switch (err) {
    case EACCES:	prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break;
#if defined(UNIXWARE) || defined(SNI) || defined(NEC)
    /*
     * On some platforms, if we connect to a port on the local host 
     * (the loopback address) that no process is listening on, we get 
     * EIO instead of ECONNREFUSED.
     */
    case EIO:		prError = PR_CONNECT_REFUSED_ERROR; break;
#endif
    case ELOOP:		prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break;
    case ENOENT:	prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break;
    case ENXIO:		prError = PR_IO_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_bind_error(int err)
{
    PRErrorCode prError;
    switch (err) {
    case EINVAL:	prError = PR_SOCKET_ADDRESS_IS_BOUND_ERROR; break;
        /*
         * UNIX domain sockets are not supported in NSPR
         */
    case EIO:		prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break;
    case EISDIR:	prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break;
    case ELOOP:		prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break;
    case ENOENT:	prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break;
    case ENOTDIR:	prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break;
    case EROFS:		prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_listen_error(int err)
{
    nss_MD_unix_map_default_error(err);
}

void nss_MD_unix_map_shutdown_error(int err)
{
    nss_MD_unix_map_default_error(err);
}

void nss_MD_unix_map_socketpair_error(int err)
{
    PRErrorCode prError;
    switch (err) {
    case ENOMEM:	prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_getsockname_error(int err)
{
    PRErrorCode prError;
    switch (err) {
    case ENOMEM:	prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_getpeername_error(int err)
{
    PRErrorCode prError;

    switch (err) {
    case ENOMEM:	prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_getsockopt_error(int err)
{
    PRErrorCode prError;
    switch (err) {
    case EINVAL:	prError = PR_BUFFER_OVERFLOW_ERROR; break;
    case ENOMEM:	prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_setsockopt_error(int err)
{
    PRErrorCode prError;
    switch (err) {
    case EINVAL:	prError = PR_BUFFER_OVERFLOW_ERROR; break;
    case ENOMEM:	prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_open_error(int err)
{
    PRErrorCode prError;
    switch (err) {
    case EAGAIN:	prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
    case EBUSY:		prError = PR_IO_ERROR; break;
    case ENODEV:	prError = PR_FILE_NOT_FOUND_ERROR; break;
    case ENOMEM:	prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
    case ETIMEDOUT:	prError = PR_REMOTE_FILE_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_mmap_error(int err)
{
    PRErrorCode prError;
    switch (err) {
    case EAGAIN:	prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
    case EMFILE:	prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
    case ENODEV:	prError = PR_OPERATION_NOT_SUPPORTED_ERROR; break;
    case ENXIO:		prError = PR_INVALID_ARGUMENT_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_gethostname_error(int err)
{
    nss_MD_unix_map_default_error(err);
}

void nss_MD_unix_map_select_error(int err)
{
    nss_MD_unix_map_default_error(err);
}

#ifdef _PR_POLL_AVAILABLE
void nss_MD_unix_map_poll_error(int err)
{
    PRErrorCode prError;

    switch (err) {
    case EAGAIN:	prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_poll_revents_error(int err)
{
    if (err & POLLNVAL)
        PR_SetError(PR_BAD_DESCRIPTOR_ERROR, EBADF);
    else if (err & POLLHUP)
        PR_SetError(PR_CONNECT_RESET_ERROR, EPIPE);
    else if (err & POLLERR)
        PR_SetError(PR_IO_ERROR, EIO);
    else
        PR_SetError(PR_UNKNOWN_ERROR, err);
}
#endif /* _PR_POLL_AVAILABLE */


void nss_MD_unix_map_flock_error(int err)
{
    PRErrorCode prError;
    switch (err) {
    case EINVAL:	prError = PR_BAD_DESCRIPTOR_ERROR; break;
    case EWOULDBLOCK:	prError = PR_FILE_IS_LOCKED_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

void nss_MD_unix_map_lockf_error(int err)
{
    PRErrorCode prError;
    switch (err) {
    case EACCES:	prError = PR_FILE_IS_LOCKED_ERROR; break;
    case EDEADLK:	prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
    default:		nss_MD_unix_map_default_error(err); return;
    }
    PR_SetError(prError, err);
}

#ifdef HPUX11
void nss_MD_hpux_map_sendfile_error(int err)
{
    nss_MD_unix_map_default_error(err);
}
#endif /* HPUX11 */


void nss_MD_unix_map_default_error(int err)
{
    PRErrorCode prError;
    switch (err ) {
    case EACCES:	prError = PR_NO_ACCESS_RIGHTS_ERROR; break;
    case EADDRINUSE:	prError = PR_ADDRESS_IN_USE_ERROR; break;
    case EADDRNOTAVAIL:	prError = PR_ADDRESS_NOT_AVAILABLE_ERROR; break;
    case EAFNOSUPPORT:	prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break;
    case EAGAIN:	prError = PR_WOULD_BLOCK_ERROR; break;
    /*
     * On QNX and Neutrino, EALREADY is defined as EBUSY.
     */
#if EALREADY != EBUSY
    case EALREADY:	prError = PR_ALREADY_INITIATED_ERROR; break;
#endif
    case EBADF:		prError = PR_BAD_DESCRIPTOR_ERROR; break;
#ifdef EBADMSG
    case EBADMSG:	prError = PR_IO_ERROR; break;
#endif
    case EBUSY:		prError = PR_FILESYSTEM_MOUNTED_ERROR; break;
    case ECONNREFUSED:	prError = PR_CONNECT_REFUSED_ERROR; break;
    case ECONNRESET:	prError = PR_CONNECT_RESET_ERROR; break;
    case EDEADLK:	prError = PR_DEADLOCK_ERROR; break;
#ifdef EDIRCORRUPTED
    case EDIRCORRUPTED:	prError = PR_DIRECTORY_CORRUPTED_ERROR; break;
#endif
#ifdef EDQUOT
    case EDQUOT:	prError = PR_NO_DEVICE_SPACE_ERROR; break;
#endif
    case EEXIST:	prError = PR_FILE_EXISTS_ERROR; break;
    case EFAULT:	prError = PR_ACCESS_FAULT_ERROR; break;
    case EFBIG:		prError = PR_FILE_TOO_BIG_ERROR; break;
    case EINPROGRESS:	prError = PR_IN_PROGRESS_ERROR; break;
    case EINTR:		prError = PR_PENDING_INTERRUPT_ERROR; break;
    case EINVAL:	prError = PR_INVALID_ARGUMENT_ERROR; break;
    case EIO:		prError = PR_IO_ERROR; break;
    case EISCONN:	prError = PR_IS_CONNECTED_ERROR; break;
    case EISDIR:	prError = PR_IS_DIRECTORY_ERROR; break;
    case ELOOP:		prError = PR_LOOP_ERROR; break;
    case EMFILE:	prError = PR_PROC_DESC_TABLE_FULL_ERROR; break;
    case EMLINK:	prError = PR_MAX_DIRECTORY_ENTRIES_ERROR; break;
    case EMSGSIZE:	prError = PR_INVALID_ARGUMENT_ERROR; break;
#ifdef EMULTIHOP
    case EMULTIHOP:	prError = PR_REMOTE_FILE_ERROR; break;
#endif
    case ENAMETOOLONG:	prError = PR_NAME_TOO_LONG_ERROR; break;
    case ENETUNREACH:	prError = PR_NETWORK_UNREACHABLE_ERROR; break;
    case ENFILE:	prError = PR_SYS_DESC_TABLE_FULL_ERROR; break;
#if !defined(SCO)
    case ENOBUFS:	prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
#endif
    case ENODEV:	prError = PR_FILE_NOT_FOUND_ERROR; break;
    case ENOENT:	prError = PR_FILE_NOT_FOUND_ERROR; break;
    case ENOLCK:	prError = PR_FILE_IS_LOCKED_ERROR; break;
#ifdef ENOLINK 
    case ENOLINK:	prError = PR_REMOTE_FILE_ERROR; break;
#endif
    case ENOMEM:	prError = PR_OUT_OF_MEMORY_ERROR; break;
    case ENOPROTOOPT:	prError = PR_INVALID_ARGUMENT_ERROR; break;
    case ENOSPC:	prError = PR_NO_DEVICE_SPACE_ERROR; break;
#ifdef ENOSR 
    case ENOSR:		prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
#endif
    case ENOTCONN:	prError = PR_NOT_CONNECTED_ERROR; break;
    case ENOTDIR:	prError = PR_NOT_DIRECTORY_ERROR; break;
    case ENOTSOCK:	prError = PR_NOT_SOCKET_ERROR; break;
    case ENXIO:		prError = PR_FILE_NOT_FOUND_ERROR; break;
    case EOPNOTSUPP:	prError = PR_NOT_TCP_SOCKET_ERROR; break;
#ifdef EOVERFLOW
    case EOVERFLOW:	prError = PR_BUFFER_OVERFLOW_ERROR; break;
#endif
    case EPERM:		prError = PR_NO_ACCESS_RIGHTS_ERROR; break;
    case EPIPE:		prError = PR_CONNECT_RESET_ERROR; break;
#ifdef EPROTO
    case EPROTO:	prError = PR_IO_ERROR; break;
#endif
    case EPROTONOSUPPORT: prError = PR_PROTOCOL_NOT_SUPPORTED_ERROR; break;
    case EPROTOTYPE:	prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break;
    case ERANGE:	prError = PR_INVALID_METHOD_ERROR; break;
    case EROFS:		prError = PR_READ_ONLY_FILESYSTEM_ERROR; break;
    case ESPIPE:	prError = PR_INVALID_METHOD_ERROR; break;
    case ETIMEDOUT:	prError = PR_IO_TIMEOUT_ERROR; break;
#if EWOULDBLOCK != EAGAIN
    case EWOULDBLOCK:	prError = PR_WOULD_BLOCK_ERROR; break;
#endif
    case EXDEV:		prError = PR_NOT_SAME_DEVICE_ERROR; break;

    default:		prError = PR_UNKNOWN_ERROR; break;
    }
    PR_SetError(prError, err);
}
