/* -*- 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/. */
/* $Id: unix_err.c,v 1.9 2012/04/25 14:50:12 gerv%gerv.net Exp $ */

#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);
}
