LCOV - code coverage report
Current view: top level - source3/lib - errmap_unix.c (source / functions) Hit Total Coverage
Test: coverage report for master 2f515e9b Lines: 6 8 75.0 %
Date: 2024-04-21 15:09:00 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /*
       2             :  *  Unix SMB/CIFS implementation.
       3             :  *  map unix to NT errors, an excerpt of libsmb/errormap.c
       4             :  *  Copyright (C) Andrew Tridgell 2001
       5             :  *  Copyright (C) Andrew Bartlett 2001
       6             :  *  Copyright (C) Tim Potter 2000
       7             :  *  Copyright (C) Jeremy Allison 2007
       8             :  *
       9             :  *  This program is free software; you can redistribute it and/or modify
      10             :  *  it under the terms of the GNU General Public License as published by
      11             :  *  the Free Software Foundation; either version 3 of the License, or
      12             :  *  (at your option) any later version.
      13             :  *
      14             :  *  This program is distributed in the hope that it will be useful,
      15             :  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
      16             :  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      17             :  *  GNU General Public License for more details.
      18             :  *
      19             :  *  You should have received a copy of the GNU General Public License
      20             :  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
      21             :  */
      22             : 
      23             : #include "includes.h"
      24             : 
      25             : /* Mapping from Unix, to NT error numbers */
      26             : 
      27             : static const struct {
      28             :         int unix_error;
      29             :         NTSTATUS nt_error;
      30             : } unix_nt_errmap[] = {
      31             :         { EAGAIN,       NT_STATUS_NETWORK_BUSY },
      32             :         { EINTR,        NT_STATUS_RETRY },
      33             : #ifdef ENOBUFS
      34             :         { ENOBUFS,      NT_STATUS_INSUFFICIENT_RESOURCES },
      35             : #endif
      36             : #ifdef EWOULDBLOCK
      37             :         { EWOULDBLOCK,  NT_STATUS_NETWORK_BUSY },
      38             : #endif
      39             :         { EPERM,        NT_STATUS_ACCESS_DENIED },
      40             :         { EACCES,       NT_STATUS_ACCESS_DENIED },
      41             :         { ENOENT,       NT_STATUS_OBJECT_NAME_NOT_FOUND },
      42             :         { ENOTDIR,      NT_STATUS_NOT_A_DIRECTORY },
      43             :         { EIO,          NT_STATUS_IO_DEVICE_ERROR },
      44             :         { EBADF,        NT_STATUS_INVALID_HANDLE },
      45             :         { EINVAL,       NT_STATUS_INVALID_PARAMETER },
      46             :         { EEXIST,       NT_STATUS_OBJECT_NAME_COLLISION},
      47             :         { ENFILE,       NT_STATUS_TOO_MANY_OPENED_FILES },
      48             :         { EMFILE,       NT_STATUS_TOO_MANY_OPENED_FILES },
      49             :         { ENOSPC,       NT_STATUS_DISK_FULL },
      50             :         { ENOMEM,       NT_STATUS_NO_MEMORY },
      51             :         { EISDIR,       NT_STATUS_FILE_IS_A_DIRECTORY},
      52             :         { EMSGSIZE,     NT_STATUS_PORT_MESSAGE_TOO_LONG },
      53             : #ifdef EPIPE
      54             :         { EPIPE,        NT_STATUS_CONNECTION_DISCONNECTED},
      55             : #endif
      56             :         { EMLINK,       NT_STATUS_TOO_MANY_LINKS },
      57             :         { ENOSYS,       NT_STATUS_NOT_SUPPORTED },
      58             : #ifdef ELOOP
      59             :         { ELOOP,        NT_STATUS_OBJECT_PATH_NOT_FOUND },
      60             : #endif
      61             : #ifdef EFTYPE
      62             :         { EFTYPE,       NT_STATUS_OBJECT_PATH_NOT_FOUND },
      63             : #endif
      64             : #ifdef EDQUOT
      65             :         { EDQUOT,       NT_STATUS_DISK_FULL }, /* Windows apps need this, not NT_STATUS_QUOTA_EXCEEDED */
      66             : #endif
      67             : #ifdef ENOTEMPTY
      68             :         { ENOTEMPTY,    NT_STATUS_DIRECTORY_NOT_EMPTY },
      69             : #endif
      70             : #ifdef EXDEV
      71             :         { EXDEV,        NT_STATUS_NOT_SAME_DEVICE },
      72             : #endif
      73             : #ifdef EROFS
      74             :         { EROFS,        NT_STATUS_MEDIA_WRITE_PROTECTED },
      75             : #endif
      76             : #ifdef ENAMETOOLONG
      77             :         { ENAMETOOLONG, NT_STATUS_OBJECT_NAME_INVALID },
      78             : #endif
      79             : #ifdef EFBIG
      80             :         { EFBIG,        NT_STATUS_DISK_FULL },
      81             : #endif
      82             : #ifdef EADDRINUSE
      83             :         { EADDRINUSE,   NT_STATUS_ADDRESS_ALREADY_ASSOCIATED},
      84             : #endif
      85             : #ifdef ENETUNREACH
      86             :         { ENETUNREACH,  NT_STATUS_NETWORK_UNREACHABLE},
      87             : #endif
      88             : #ifdef EHOSTUNREACH
      89             :         { EHOSTUNREACH, NT_STATUS_HOST_UNREACHABLE},
      90             : #endif
      91             : #ifdef ECONNREFUSED
      92             :         { ECONNREFUSED, NT_STATUS_CONNECTION_REFUSED},
      93             : #endif
      94             : #ifdef ETIMEDOUT
      95             :         { ETIMEDOUT,    NT_STATUS_IO_TIMEOUT},
      96             : #endif
      97             : #ifdef ECONNABORTED
      98             :         { ECONNABORTED, NT_STATUS_CONNECTION_ABORTED},
      99             : #endif
     100             : #ifdef ECONNRESET
     101             :         { ECONNRESET,   NT_STATUS_CONNECTION_RESET},
     102             : #endif
     103             : #ifdef ENODEV
     104             :         { ENODEV,       NT_STATUS_DEVICE_DOES_NOT_EXIST},
     105             : #endif
     106             : #ifdef ENOATTR
     107             :         { ENOATTR,      NT_STATUS_NOT_FOUND },
     108             : #endif
     109             : #ifdef ECANCELED
     110             :         { ECANCELED,    NT_STATUS_CANCELLED},
     111             : #endif
     112             : #ifdef ENOTSUP
     113             :         { ENOTSUP,      NT_STATUS_NOT_SUPPORTED},
     114             : #endif
     115             : #ifdef ETXTBSY
     116             :         { ETXTBSY,      NT_STATUS_SHARING_VIOLATION },
     117             : #endif
     118             : #ifdef EOVERFLOW
     119             :         { EOVERFLOW,      NT_STATUS_ALLOTTED_SPACE_EXCEEDED },
     120             : #endif
     121             :         { EINPROGRESS,  NT_STATUS_MORE_PROCESSING_REQUIRED },
     122             : #ifdef ERANGE
     123             :         { ERANGE, NT_STATUS_INTEGER_OVERFLOW },
     124             : #endif
     125             : #ifdef ENXIO
     126             :         { ENXIO, NT_STATUS_ILLEGAL_FUNCTION },
     127             : #endif
     128             : };
     129             : 
     130             : /*********************************************************************
     131             :  Map an NT error code from a Unix error code.
     132             : *********************************************************************/
     133             : 
     134     2044649 : NTSTATUS map_nt_error_from_unix(int unix_error)
     135             : {
     136     2044649 :         size_t i = 0;
     137             : 
     138     2044649 :         if (unix_error == 0) {
     139             :                 /* we map this to an error, not success, as this
     140             :                    function is only called in an error path. Lots of
     141             :                    our virtualised functions may fail without making a
     142             :                    unix system call that fails (such as when they are
     143             :                    checking for some handle existing), so unix_error
     144             :                    may be unset
     145             :                 */
     146           0 :                 return NT_STATUS_UNSUCCESSFUL;
     147             :         }
     148             : 
     149             :         /* Look through list */
     150    24765434 :         for (i=0;i<ARRAY_SIZE(unix_nt_errmap);i++) {
     151    24765434 :                 if (unix_nt_errmap[i].unix_error == unix_error) {
     152     2044649 :                         return unix_nt_errmap[i].nt_error;
     153             :                 }
     154             :         }
     155             : 
     156             :         /* Default return */
     157           0 :         return NT_STATUS_ACCESS_DENIED;
     158             : }

Generated by: LCOV version 1.14