/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is the Netscape Portable Runtime (NSPR).
 *
 * The Initial Developer of the Original Code is
 * Netscape Communications Corporation.
 * Portions created by the Initial Developer are Copyright (C) 1998-2000
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */

#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:
            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) {
        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:
            _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;
        /*
         * UNIX domain sockets are not supported in NSPR
         */
        case EIO:
        case EISDIR:
        case ELOOP:
        case ENOENT:
        case ENOTDIR:
        case EROFS:
            prError = PR_ADDRESS_NOT_SUPPORTED_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 */
