unix_err.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:16k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  2. /*
  3.  * This file essentially replicates NSPR's source for the functions that
  4.  * map system-specific error codes to NSPR error codes.  We would use 
  5.  * NSPR's functions, instead of duplicating them, but they're private.
  6.  * As long as SSL's server session cache code must do platform native I/O
  7.  * to accomplish its job, and NSPR's error mapping functions remain private,
  8.  * this code will continue to need to be replicated.
  9.  * 
  10.  * The contents of this file are subject to the Mozilla Public
  11.  * License Version 1.1 (the "License"); you may not use this file
  12.  * except in compliance with the License. You may obtain a copy of
  13.  * the License at http://www.mozilla.org/MPL/
  14.  * 
  15.  * Software distributed under the License is distributed on an "AS
  16.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  17.  * implied. See the License for the specific language governing
  18.  * rights and limitations under the License.
  19.  * 
  20.  * The Original Code is the Netscape security libraries.
  21.  * 
  22.  * The Initial Developer of the Original Code is Netscape
  23.  * Communications Corporation.  Portions created by Netscape are 
  24.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  25.  * Rights Reserved.
  26.  * 
  27.  * Contributor(s):
  28.  * 
  29.  * Alternatively, the contents of this file may be used under the
  30.  * terms of the GNU General Public License Version 2 or later (the
  31.  * "GPL"), in which case the provisions of the GPL are applicable 
  32.  * instead of those above.  If you wish to allow use of your 
  33.  * version of this file only under the terms of the GPL and not to
  34.  * allow others to use your version of this file under the MPL,
  35.  * indicate your decision by deleting the provisions above and
  36.  * replace them with the notice and other provisions required by
  37.  * the GPL.  If you do not delete the provisions above, a recipient
  38.  * may use your version of this file under either the MPL or the
  39.  * GPL.
  40.  *
  41.  * $Id: unix_err.c,v 1.2 2000/09/18 19:53:59 nelsonb%netscape.com Exp $
  42.  */
  43. #if 0
  44. #include "primpl.h"
  45. #else
  46. #define _PR_POLL_AVAILABLE 1
  47. #include "prerror.h"
  48. #endif
  49. #if defined(_PR_POLL_AVAILABLE)
  50. #include <poll.h>
  51. #endif
  52. #include <errno.h>
  53. /* forward declarations. */
  54. void nss_MD_unix_map_default_error(int err);
  55. void nss_MD_unix_map_opendir_error(int err)
  56. {
  57.     nss_MD_unix_map_default_error(err);
  58. }
  59. void nss_MD_unix_map_closedir_error(int err)
  60. {
  61.     PRErrorCode prError;
  62.     switch (err) {
  63.     case EINVAL: prError = PR_BAD_DESCRIPTOR_ERROR; break;
  64.     default: nss_MD_unix_map_default_error(err); return;
  65.     }
  66.     PR_SetError(prError, err);
  67. }
  68. void nss_MD_unix_readdir_error(int err)
  69. {
  70.     PRErrorCode prError;
  71.     switch (err) {
  72.     case ENOENT: prError = PR_NO_MORE_FILES_ERROR; break;
  73. #ifdef EOVERFLOW
  74.     case EOVERFLOW: prError = PR_IO_ERROR; break;
  75. #endif
  76.     case EINVAL: prError = PR_IO_ERROR; break;
  77.     case ENXIO: prError = PR_IO_ERROR; break;
  78.     default: nss_MD_unix_map_default_error(err); return;
  79.     }
  80.     PR_SetError(prError, err);
  81. }
  82. void nss_MD_unix_map_unlink_error(int err)
  83. {
  84.     PRErrorCode prError;
  85.     switch (err) {
  86.     case EPERM: prError = PR_IS_DIRECTORY_ERROR; break;
  87.     default: nss_MD_unix_map_default_error(err); return;
  88.     }
  89.     PR_SetError(prError, err);
  90. }
  91. void nss_MD_unix_map_stat_error(int err)
  92. {
  93.     PRErrorCode prError;
  94.     switch (err) {
  95.     case ETIMEDOUT: prError = PR_REMOTE_FILE_ERROR; break;
  96.     default: nss_MD_unix_map_default_error(err); return;
  97.     }
  98.     PR_SetError(prError, err);
  99. }
  100. void nss_MD_unix_map_fstat_error(int err)
  101. {
  102.     PRErrorCode prError;
  103.     switch (err) {
  104.     case ETIMEDOUT: prError = PR_REMOTE_FILE_ERROR; break;
  105.     default: nss_MD_unix_map_default_error(err); return;
  106.     }
  107.     PR_SetError(prError, err);
  108. }
  109. void nss_MD_unix_map_rename_error(int err)
  110. {
  111.     PRErrorCode prError;
  112.     switch (err) {
  113.     case EEXIST: prError = PR_DIRECTORY_NOT_EMPTY_ERROR; break;
  114.     default: nss_MD_unix_map_default_error(err); return;
  115.     }
  116.     PR_SetError(prError, err);
  117. }
  118. void nss_MD_unix_map_access_error(int err)
  119. {
  120.     PRErrorCode prError;
  121.     switch (err) {
  122.     case ETIMEDOUT: prError = PR_REMOTE_FILE_ERROR; break;
  123.     default: nss_MD_unix_map_default_error(err); return;
  124.     }
  125.     PR_SetError(prError, err);
  126. }
  127. void nss_MD_unix_map_mkdir_error(int err)
  128. {
  129.     nss_MD_unix_map_default_error(err);
  130. }
  131. void nss_MD_unix_map_rmdir_error(int err)
  132. {
  133.     PRErrorCode prError;
  134.     switch (err) {
  135.     case EEXIST: prError = PR_DIRECTORY_NOT_EMPTY_ERROR; break;
  136.     case EINVAL: prError = PR_DIRECTORY_NOT_EMPTY_ERROR; break;
  137.     case ETIMEDOUT: prError = PR_REMOTE_FILE_ERROR; break;
  138.     default: nss_MD_unix_map_default_error(err); return;
  139.     }
  140.     PR_SetError(prError, err);
  141. }
  142. void nss_MD_unix_map_read_error(int err)
  143. {
  144.     PRErrorCode prError;
  145.     switch (err) {
  146.     case EINVAL: prError = PR_INVALID_METHOD_ERROR; break;
  147.     case ENXIO: prError = PR_INVALID_ARGUMENT_ERROR; break;
  148.     default: nss_MD_unix_map_default_error(err); return;
  149.     }
  150.     PR_SetError(prError, err);
  151. }
  152. void nss_MD_unix_map_write_error(int err)
  153. {
  154.     PRErrorCode prError;
  155.     switch (err) {
  156.     case EINVAL: prError = PR_INVALID_METHOD_ERROR; break;
  157.     case ENXIO: prError = PR_INVALID_METHOD_ERROR; break;
  158.     case ETIMEDOUT: prError = PR_REMOTE_FILE_ERROR; break;
  159.     default: nss_MD_unix_map_default_error(err); return;
  160.     }
  161.     PR_SetError(prError, err);
  162. }
  163. void nss_MD_unix_map_lseek_error(int err)
  164. {
  165.     nss_MD_unix_map_default_error(err);
  166. }
  167. void nss_MD_unix_map_fsync_error(int err)
  168. {
  169.     PRErrorCode prError;
  170.     switch (err) {
  171.     case ETIMEDOUT: prError = PR_REMOTE_FILE_ERROR; break;
  172.     case EINVAL: prError = PR_INVALID_METHOD_ERROR; break;
  173.     default: nss_MD_unix_map_default_error(err); return;
  174.     }
  175.     PR_SetError(prError, err);
  176. }
  177. void nss_MD_unix_map_close_error(int err)
  178. {
  179.     PRErrorCode prError;
  180.     switch (err) {
  181.     case ETIMEDOUT: prError = PR_REMOTE_FILE_ERROR; break;
  182.     default: nss_MD_unix_map_default_error(err); return;
  183.     }
  184.     PR_SetError(prError, err);
  185. }
  186. void nss_MD_unix_map_socket_error(int err)
  187. {
  188.     PRErrorCode prError;
  189.     switch (err) {
  190.     case ENOMEM: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
  191.     default: nss_MD_unix_map_default_error(err); return;
  192.     }
  193.     PR_SetError(prError, err);
  194. }
  195. void nss_MD_unix_map_socketavailable_error(int err)
  196. {
  197.     PR_SetError(PR_BAD_DESCRIPTOR_ERROR, err);
  198. }
  199. void nss_MD_unix_map_recv_error(int err)
  200. {
  201.     nss_MD_unix_map_default_error(err);
  202. }
  203. void nss_MD_unix_map_recvfrom_error(int err)
  204. {
  205.     nss_MD_unix_map_default_error(err);
  206. }
  207. void nss_MD_unix_map_send_error(int err)
  208. {
  209.     nss_MD_unix_map_default_error(err);
  210. }
  211. void nss_MD_unix_map_sendto_error(int err)
  212. {
  213.     nss_MD_unix_map_default_error(err);
  214. }
  215. void nss_MD_unix_map_writev_error(int err)
  216. {
  217.     nss_MD_unix_map_default_error(err);
  218. }
  219. void nss_MD_unix_map_accept_error(int err)
  220. {
  221.     PRErrorCode prError;
  222.     switch (err) {
  223.     case ENODEV: prError = PR_NOT_TCP_SOCKET_ERROR; break;
  224.     default: nss_MD_unix_map_default_error(err); return;
  225.     }
  226.     PR_SetError(prError, err);
  227. }
  228. void nss_MD_unix_map_connect_error(int err)
  229. {
  230.     PRErrorCode prError;
  231.     switch (err) {
  232.     case EACCES: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break;
  233. #if defined(UNIXWARE) || defined(SNI) || defined(NEC)
  234.     /*
  235.      * On some platforms, if we connect to a port on the local host 
  236.      * (the loopback address) that no process is listening on, we get 
  237.      * EIO instead of ECONNREFUSED.
  238.      */
  239.     case EIO: prError = PR_CONNECT_REFUSED_ERROR; break;
  240. #endif
  241.     case ELOOP: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break;
  242.     case ENOENT: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break;
  243.     case ENXIO: prError = PR_IO_ERROR; break;
  244.     default: nss_MD_unix_map_default_error(err); return;
  245.     }
  246.     PR_SetError(prError, err);
  247. }
  248. void nss_MD_unix_map_bind_error(int err)
  249. {
  250.     PRErrorCode prError;
  251.     switch (err) {
  252.     case EINVAL: prError = PR_SOCKET_ADDRESS_IS_BOUND_ERROR; break;
  253.         /*
  254.          * UNIX domain sockets are not supported in NSPR
  255.          */
  256.     case EIO: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break;
  257.     case EISDIR: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break;
  258.     case ELOOP: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break;
  259.     case ENOENT: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break;
  260.     case ENOTDIR: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break;
  261.     case EROFS: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break;
  262.     default: nss_MD_unix_map_default_error(err); return;
  263.     }
  264.     PR_SetError(prError, err);
  265. }
  266. void nss_MD_unix_map_listen_error(int err)
  267. {
  268.     nss_MD_unix_map_default_error(err);
  269. }
  270. void nss_MD_unix_map_shutdown_error(int err)
  271. {
  272.     nss_MD_unix_map_default_error(err);
  273. }
  274. void nss_MD_unix_map_socketpair_error(int err)
  275. {
  276.     PRErrorCode prError;
  277.     switch (err) {
  278.     case ENOMEM: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
  279.     default: nss_MD_unix_map_default_error(err); return;
  280.     }
  281.     PR_SetError(prError, err);
  282. }
  283. void nss_MD_unix_map_getsockname_error(int err)
  284. {
  285.     PRErrorCode prError;
  286.     switch (err) {
  287.     case ENOMEM: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
  288.     default: nss_MD_unix_map_default_error(err); return;
  289.     }
  290.     PR_SetError(prError, err);
  291. }
  292. void nss_MD_unix_map_getpeername_error(int err)
  293. {
  294.     PRErrorCode prError;
  295.     switch (err) {
  296.     case ENOMEM: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
  297.     default: nss_MD_unix_map_default_error(err); return;
  298.     }
  299.     PR_SetError(prError, err);
  300. }
  301. void nss_MD_unix_map_getsockopt_error(int err)
  302. {
  303.     PRErrorCode prError;
  304.     switch (err) {
  305.     case EINVAL: prError = PR_BUFFER_OVERFLOW_ERROR; break;
  306.     case ENOMEM: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
  307.     default: nss_MD_unix_map_default_error(err); return;
  308.     }
  309.     PR_SetError(prError, err);
  310. }
  311. void nss_MD_unix_map_setsockopt_error(int err)
  312. {
  313.     PRErrorCode prError;
  314.     switch (err) {
  315.     case EINVAL: prError = PR_BUFFER_OVERFLOW_ERROR; break;
  316.     case ENOMEM: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
  317.     default: nss_MD_unix_map_default_error(err); return;
  318.     }
  319.     PR_SetError(prError, err);
  320. }
  321. void nss_MD_unix_map_open_error(int err)
  322. {
  323.     PRErrorCode prError;
  324.     switch (err) {
  325.     case EAGAIN: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
  326.     case EBUSY: prError = PR_IO_ERROR; break;
  327.     case ENODEV: prError = PR_FILE_NOT_FOUND_ERROR; break;
  328.     case ENOMEM: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
  329.     case ETIMEDOUT: prError = PR_REMOTE_FILE_ERROR; break;
  330.     default: nss_MD_unix_map_default_error(err); return;
  331.     }
  332.     PR_SetError(prError, err);
  333. }
  334. void nss_MD_unix_map_mmap_error(int err)
  335. {
  336.     PRErrorCode prError;
  337.     switch (err) {
  338.     case EAGAIN: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
  339.     case EMFILE: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
  340.     case ENODEV: prError = PR_OPERATION_NOT_SUPPORTED_ERROR; break;
  341.     case ENXIO: prError = PR_INVALID_ARGUMENT_ERROR; break;
  342.     default: nss_MD_unix_map_default_error(err); return;
  343.     }
  344.     PR_SetError(prError, err);
  345. }
  346. void nss_MD_unix_map_gethostname_error(int err)
  347. {
  348.     nss_MD_unix_map_default_error(err);
  349. }
  350. void nss_MD_unix_map_select_error(int err)
  351. {
  352.     nss_MD_unix_map_default_error(err);
  353. }
  354. #ifdef _PR_POLL_AVAILABLE
  355. void nss_MD_unix_map_poll_error(int err)
  356. {
  357.     PRErrorCode prError;
  358.     switch (err) {
  359.     case EAGAIN: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
  360.     default: nss_MD_unix_map_default_error(err); return;
  361.     }
  362.     PR_SetError(prError, err);
  363. }
  364. void nss_MD_unix_map_poll_revents_error(int err)
  365. {
  366.     if (err & POLLNVAL)
  367.         PR_SetError(PR_BAD_DESCRIPTOR_ERROR, EBADF);
  368.     else if (err & POLLHUP)
  369.         PR_SetError(PR_CONNECT_RESET_ERROR, EPIPE);
  370.     else if (err & POLLERR)
  371.         PR_SetError(PR_IO_ERROR, EIO);
  372.     else
  373.         PR_SetError(PR_UNKNOWN_ERROR, err);
  374. }
  375. #endif /* _PR_POLL_AVAILABLE */
  376. void nss_MD_unix_map_flock_error(int err)
  377. {
  378.     PRErrorCode prError;
  379.     switch (err) {
  380.     case EINVAL: prError = PR_BAD_DESCRIPTOR_ERROR; break;
  381.     case EWOULDBLOCK: prError = PR_FILE_IS_LOCKED_ERROR; break;
  382.     default: nss_MD_unix_map_default_error(err); return;
  383.     }
  384.     PR_SetError(prError, err);
  385. }
  386. void nss_MD_unix_map_lockf_error(int err)
  387. {
  388.     PRErrorCode prError;
  389.     switch (err) {
  390.     case EACCES: prError = PR_FILE_IS_LOCKED_ERROR; break;
  391.     case EDEADLK: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
  392.     default: nss_MD_unix_map_default_error(err); return;
  393.     }
  394.     PR_SetError(prError, err);
  395. }
  396. #ifdef HPUX11
  397. void nss_MD_hpux_map_sendfile_error(int err)
  398. {
  399.     nss_MD_unix_map_default_error(err);
  400. }
  401. #endif /* HPUX11 */
  402. void nss_MD_unix_map_default_error(int err)
  403. {
  404.     PRErrorCode prError;
  405.     switch (err ) {
  406.     case EACCES: prError = PR_NO_ACCESS_RIGHTS_ERROR; break;
  407.     case EADDRINUSE: prError = PR_ADDRESS_IN_USE_ERROR; break;
  408.     case EADDRNOTAVAIL: prError = PR_ADDRESS_NOT_AVAILABLE_ERROR; break;
  409.     case EAFNOSUPPORT: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break;
  410.     case EAGAIN: prError = PR_WOULD_BLOCK_ERROR; break;
  411.     case EALREADY: prError = PR_ALREADY_INITIATED_ERROR; break;
  412.     case EBADF: prError = PR_BAD_DESCRIPTOR_ERROR; break;
  413. #ifdef EBADMSG
  414.     case EBADMSG: prError = PR_IO_ERROR; break;
  415. #endif
  416.     case EBUSY: prError = PR_FILESYSTEM_MOUNTED_ERROR; break;
  417.     case ECONNREFUSED: prError = PR_CONNECT_REFUSED_ERROR; break;
  418.     case ECONNRESET: prError = PR_CONNECT_RESET_ERROR; break;
  419.     case EDEADLK: prError = PR_DEADLOCK_ERROR; break;
  420. #ifdef EDIRCORRUPTED
  421.     case EDIRCORRUPTED: prError = PR_DIRECTORY_CORRUPTED_ERROR; break;
  422. #endif
  423. #ifdef EDQUOT
  424.     case EDQUOT: prError = PR_NO_DEVICE_SPACE_ERROR; break;
  425. #endif
  426.     case EEXIST: prError = PR_FILE_EXISTS_ERROR; break;
  427.     case EFAULT: prError = PR_ACCESS_FAULT_ERROR; break;
  428.     case EFBIG: prError = PR_FILE_TOO_BIG_ERROR; break;
  429.     case EINPROGRESS: prError = PR_IN_PROGRESS_ERROR; break;
  430.     case EINTR: prError = PR_PENDING_INTERRUPT_ERROR; break;
  431.     case EINVAL: prError = PR_INVALID_ARGUMENT_ERROR; break;
  432.     case EIO: prError = PR_IO_ERROR; break;
  433.     case EISCONN: prError = PR_IS_CONNECTED_ERROR; break;
  434.     case EISDIR: prError = PR_IS_DIRECTORY_ERROR; break;
  435.     case ELOOP: prError = PR_LOOP_ERROR; break;
  436.     case EMFILE: prError = PR_PROC_DESC_TABLE_FULL_ERROR; break;
  437.     case EMLINK: prError = PR_MAX_DIRECTORY_ENTRIES_ERROR; break;
  438.     case EMSGSIZE: prError = PR_INVALID_ARGUMENT_ERROR; break;
  439. #ifdef EMULTIHOP
  440.     case EMULTIHOP: prError = PR_REMOTE_FILE_ERROR; break;
  441. #endif
  442.     case ENAMETOOLONG: prError = PR_NAME_TOO_LONG_ERROR; break;
  443.     case ENETUNREACH: prError = PR_NETWORK_UNREACHABLE_ERROR; break;
  444.     case ENFILE: prError = PR_SYS_DESC_TABLE_FULL_ERROR; break;
  445. #if !defined(SCO)
  446.     case ENOBUFS: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
  447. #endif
  448.     case ENODEV: prError = PR_FILE_NOT_FOUND_ERROR; break;
  449.     case ENOENT: prError = PR_FILE_NOT_FOUND_ERROR; break;
  450.     case ENOLCK: prError = PR_FILE_IS_LOCKED_ERROR; break;
  451. #ifdef ENOLINK 
  452.     case ENOLINK: prError = PR_REMOTE_FILE_ERROR; break;
  453. #endif
  454.     case ENOMEM: prError = PR_OUT_OF_MEMORY_ERROR; break;
  455.     case ENOPROTOOPT: prError = PR_INVALID_ARGUMENT_ERROR; break;
  456.     case ENOSPC: prError = PR_NO_DEVICE_SPACE_ERROR; break;
  457. #ifdef ENOSR 
  458.     case ENOSR: prError = PR_INSUFFICIENT_RESOURCES_ERROR; break;
  459. #endif
  460.     case ENOTCONN: prError = PR_NOT_CONNECTED_ERROR; break;
  461.     case ENOTDIR: prError = PR_NOT_DIRECTORY_ERROR; break;
  462.     case ENOTSOCK: prError = PR_NOT_SOCKET_ERROR; break;
  463.     case ENXIO: prError = PR_FILE_NOT_FOUND_ERROR; break;
  464.     case EOPNOTSUPP: prError = PR_NOT_TCP_SOCKET_ERROR; break;
  465. #ifdef EOVERFLOW
  466.     case EOVERFLOW: prError = PR_BUFFER_OVERFLOW_ERROR; break;
  467. #endif
  468.     case EPERM: prError = PR_NO_ACCESS_RIGHTS_ERROR; break;
  469.     case EPIPE: prError = PR_CONNECT_RESET_ERROR; break;
  470. #ifdef EPROTO
  471.     case EPROTO: prError = PR_IO_ERROR; break;
  472. #endif
  473.     case EPROTONOSUPPORT: prError = PR_PROTOCOL_NOT_SUPPORTED_ERROR; break;
  474.     case EPROTOTYPE: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break;
  475.     case ERANGE: prError = PR_INVALID_METHOD_ERROR; break;
  476.     case EROFS: prError = PR_READ_ONLY_FILESYSTEM_ERROR; break;
  477.     case ESPIPE: prError = PR_INVALID_METHOD_ERROR; break;
  478.     case ETIMEDOUT: prError = PR_IO_TIMEOUT_ERROR; break;
  479. #if EWOULDBLOCK != EAGAIN
  480.     case EWOULDBLOCK: prError = PR_WOULD_BLOCK_ERROR; break;
  481. #endif
  482.     case EXDEV: prError = PR_NOT_SAME_DEVICE_ERROR; break;
  483.     default: prError = PR_UNKNOWN_ERROR; break;
  484.     }
  485.     PR_SetError(prError, err);
  486. }