/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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/. */

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

void _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 ECONNABORTED:
            prError = PR_CONNECT_ABORTED_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 EHOSTUNREACH:
        case EHOSTDOWN:
            prError = PR_HOST_UNREACHABLE_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;
        /*
         * On SCO OpenServer 5, ENOBUFS is defined as ENOSR.
         */
#if defined(ENOBUFS) && (ENOBUFS != ENOSR)
        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 ENOSYS:
            prError = PR_NOT_IMPLEMENTED_ERROR;
            break;
        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);
}

void _MD_unix_map_opendir_error(int err)
{
    _MD_unix_map_default_error(err);
}

void _MD_unix_map_closedir_error(int err)
{
    PRErrorCode prError;

    switch (err) {
        case EINVAL:
            prError = PR_BAD_DESCRIPTOR_ERROR;
            break;
        default:
            _MD_unix_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _MD_unix_readdir_error(int err)
{
    PRErrorCode prError;

    switch (err) {
        case 0:
        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:
            _MD_unix_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _MD_unix_map_unlink_error(int err)
{
    PRErrorCode prError;

    switch (err) {
        case EPERM:
            prError = PR_IS_DIRECTORY_ERROR;
            break;
        default:
            _MD_unix_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _MD_unix_map_stat_error(int err)
{
    PRErrorCode prError;

    switch (err) {
        case ETIMEDOUT:
            prError = PR_REMOTE_FILE_ERROR;
            break;
        default:
            _MD_unix_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _MD_unix_map_fstat_error(int err)
{
    PRErrorCode prError;

    switch (err) {
        case ETIMEDOUT:
            prError = PR_REMOTE_FILE_ERROR;
            break;
        default:
            _MD_unix_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _MD_unix_map_rename_error(int err)
{
    PRErrorCode prError;

    switch (err) {
        case EEXIST:
            prError = PR_DIRECTORY_NOT_EMPTY_ERROR;
            break;
        default:
            _MD_unix_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _MD_unix_map_access_error(int err)
{
    PRErrorCode prError;

    switch (err) {
        case ETIMEDOUT:
            prError = PR_REMOTE_FILE_ERROR;
            break;
        default:
            _MD_unix_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _MD_unix_map_mkdir_error(int err)
{
    _MD_unix_map_default_error(err);
}

void _MD_unix_map_rmdir_error(int err)
{
    PRErrorCode prError;

    switch (err) {
        /*
         * On AIX 4.3, ENOTEMPTY is defined as EEXIST.
         */
#if ENOTEMPTY != EEXIST
        case ENOTEMPTY:
            prError = PR_DIRECTORY_NOT_EMPTY_ERROR;
            break;
#endif
        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:
            _MD_unix_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _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:
            _MD_unix_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _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:
            _MD_unix_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _MD_unix_map_lseek_error(int err)
{
    _MD_unix_map_default_error(err);
}

void _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:
            _MD_unix_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _MD_unix_map_close_error(int err)
{
    PRErrorCode prError;

    switch (err) {
        case ETIMEDOUT:
            prError = PR_REMOTE_FILE_ERROR;
            break;
        default:
            _MD_unix_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _MD_unix_map_socket_error(int err)
{
    PRErrorCode prError;

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

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

void _MD_unix_map_recv_error(int err)
{
    _MD_unix_map_default_error(err);
}

void _MD_unix_map_recvfrom_error(int err)
{
    _MD_unix_map_default_error(err);
}

void _MD_unix_map_send_error(int err)
{
    _MD_unix_map_default_error(err);
}

void _MD_unix_map_sendto_error(int err)
{
    _MD_unix_map_default_error(err);
}

void _MD_unix_map_writev_error(int err)
{
    _MD_unix_map_default_error(err);
}

void _MD_unix_map_accept_error(int err)
{
    PRErrorCode prError;

    switch (err) {
        case ENODEV:
            prError = PR_NOT_TCP_SOCKET_ERROR;
            break;
        default:
            _MD_unix_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _MD_unix_map_connect_error(int err)
{
    PRErrorCode prError;

    switch (err) {
#if defined(UNIXWARE)
        /*
         * 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 ENXIO:
            prError = PR_IO_ERROR;
            break;
        default:
            _MD_unix_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _MD_unix_map_bind_error(int err)
{
    PRErrorCode prError;

    switch (err) {
        case EINVAL:
            prError = PR_SOCKET_ADDRESS_IS_BOUND_ERROR;
            break;
        default:
            _MD_unix_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _MD_unix_map_listen_error(int err)
{
    _MD_unix_map_default_error(err);
}

void _MD_unix_map_shutdown_error(int err)
{
    _MD_unix_map_default_error(err);
}

void _MD_unix_map_socketpair_error(int err)
{
    PRErrorCode prError;

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

void _MD_unix_map_getsockname_error(int err)
{
    PRErrorCode prError;

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

void _MD_unix_map_getpeername_error(int err)
{
    PRErrorCode prError;

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

void _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:
            _MD_unix_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _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:
            _MD_unix_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _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;
#ifdef EOVERFLOW
        case EOVERFLOW:
            prError = PR_FILE_TOO_BIG_ERROR;
            break;
#endif
        case ETIMEDOUT:
            prError = PR_REMOTE_FILE_ERROR;
            break;
        default:
            _MD_unix_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _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:
            _MD_unix_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _MD_unix_map_gethostname_error(int err)
{
    _MD_unix_map_default_error(err);
}

void _MD_unix_map_select_error(int err)
{
    _MD_unix_map_default_error(err);
}

#if defined(_PR_POLL_AVAILABLE) || defined(_PR_NEED_FAKE_POLL)
void _MD_unix_map_poll_error(int err)
{
    PRErrorCode prError;

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

void _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 || _PR_NEED_FAKE_POLL */


void _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:
            _MD_unix_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

void _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:
            _MD_unix_map_default_error(err);
            return;
    }
    PR_SetError(prError, err);
}

#ifdef AIX
void _MD_aix_map_sendfile_error(int err)
{
    _MD_unix_map_default_error(err);
}
#endif /* AIX */

#ifdef HPUX11
void _MD_hpux_map_sendfile_error(int err)
{
    _MD_unix_map_default_error(err);
}
#endif /* HPUX11 */

#ifdef SOLARIS
void _MD_solaris_map_sendfile_error(int err)
{
    PRErrorCode prError;

    switch (err) {
        /*
         * Solaris defines a 0 return value for sendfile to mean end-of-file.
         */
        case 0:
            prError = PR_END_OF_FILE_ERROR;
            break;

        default:
            _MD_unix_map_default_error(err) ;
            return;
    }
    PR_SetError(prError, err);
}
#endif /* SOLARIS */

#ifdef LINUX
void _MD_linux_map_sendfile_error(int err)
{
    _MD_unix_map_default_error(err) ;
}
#endif /* LINUX */
