/*
 * 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/. */

/*  NSPR doesn't make these functions public, so we have to duplicate
**  them in NSS.
*/

//HCT  Based on Win32err.h
extern void nss_MD_os2_map_accept_error(PRInt32 err);
extern void nss_MD_os2_map_acceptex_error(PRInt32 err);
extern void nss_MD_os2_map_access_error(PRInt32 err);
extern void nss_MD_os2_map_bind_error(PRInt32 err);
extern void nss_MD_os2_map_close_error(PRInt32 err);
extern void nss_MD_os2_map_closedir_error(PRInt32 err);
extern void nss_MD_os2_map_connect_error(PRInt32 err);
extern void nss_MD_os2_map_default_error(PRInt32 err);
extern void nss_MD_os2_map_delete_error(PRInt32 err);
extern void nss_MD_os2_map_fstat_error(PRInt32 err);
extern void nss_MD_os2_map_fsync_error(PRInt32 err);
extern void nss_MD_os2_map_gethostname_error(PRInt32 err);
extern void nss_MD_os2_map_getpeername_error(PRInt32 err);
extern void nss_MD_os2_map_getsockname_error(PRInt32 err);
extern void nss_MD_os2_map_getsockopt_error(PRInt32 err);
extern void nss_MD_os2_map_listen_error(PRInt32 err);
extern void nss_MD_os2_map_lockf_error(PRInt32 err);
extern void nss_MD_os2_map_lseek_error(PRInt32 err);
extern void nss_MD_os2_map_mkdir_error(PRInt32 err);
extern void nss_MD_os2_map_open_error(PRInt32 err);
extern void nss_MD_os2_map_opendir_error(PRInt32 err);
extern void nss_MD_os2_map_read_error(PRInt32 err);
extern void nss_MD_os2_map_readdir_error(PRInt32 err);
extern void nss_MD_os2_map_recv_error(PRInt32 err);
extern void nss_MD_os2_map_recvfrom_error(PRInt32 err);
extern void nss_MD_os2_map_rename_error(PRInt32 err);
extern void nss_MD_os2_map_rmdir_error(PRInt32 err);
extern void nss_MD_os2_map_select_error(PRInt32 err);
extern void nss_MD_os2_map_send_error(PRInt32 err);
extern void nss_MD_os2_map_sendto_error(PRInt32 err);
extern void nss_MD_os2_map_setsockopt_error(PRInt32 err);
extern void nss_MD_os2_map_shutdown_error(PRInt32 err);
extern void nss_MD_os2_map_socket_error(PRInt32 err);
extern void nss_MD_os2_map_stat_error(PRInt32 err);
extern void nss_MD_os2_map_transmitfile_error(PRInt32 err);
extern void nss_MD_os2_map_write_error(PRInt32 err);
