|  | /* ErrnoCatogory.cc categorizes values of errno maps onto ChanConsts.h. | 
|  |  | 
|  | Copyright (C) 2008-2022 Free Software Foundation, Inc. | 
|  | Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>. | 
|  |  | 
|  | This file is part of GNU Modula-2. | 
|  |  | 
|  | GNU Modula-2 is free software; you can redistribute it and/or modify | 
|  | it under the terms of the GNU General Public License as published by | 
|  | the Free Software Foundation; either version 3, or (at your option) | 
|  | any later version. | 
|  |  | 
|  | GNU Modula-2 is distributed in the hope that it will be useful, but | 
|  | WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | General Public License for more details. | 
|  |  | 
|  | Under Section 7 of GPL version 3, you are granted additional | 
|  | permissions described in the GCC Runtime Library Exception, version | 
|  | 3.1, as published by the Free Software Foundation. | 
|  |  | 
|  | You should have received a copy of the GNU General Public License and | 
|  | a copy of the GCC Runtime Library Exception along with this program; | 
|  | see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see | 
|  | <http://www.gnu.org/licenses/>.  */ | 
|  |  | 
|  | #include "config.h" | 
|  | #include "ChanConsts.h" | 
|  |  | 
|  | #if defined(HAVE_ERRNO_H) | 
|  | #include "errno.h" | 
|  | #endif | 
|  |  | 
|  | #if defined(HAVE_SYS_ERRNO_H) | 
|  | #include "sys/errno.h" | 
|  | #endif | 
|  |  | 
|  | #include "m2rts.h" | 
|  |  | 
|  | #define EXPORT(FUNC) m2iso ## _ErrnoCategory_ ## FUNC | 
|  | #define M2EXPORT(FUNC) m2iso ## _M2_ErrnoCategory_ ## FUNC | 
|  | #define M2LIBNAME "m2iso" | 
|  |  | 
|  |  | 
|  | /* IsErrnoHard returns true if the value of errno is associated | 
|  | with a hard device error.  */ | 
|  |  | 
|  | extern "C" bool | 
|  | EXPORT(IsErrnoHard) (int e) | 
|  | { | 
|  | #if defined(HAVE_ERRNO_H) || defined(HAVE_SYS_ERRNO_H) | 
|  | return ((e == EPERM) || (e == ENOENT) || (e == EIO) || (e == ENXIO) | 
|  | || (e == EACCES) || (e == ENOTBLK) || (e == ENODEV) || (e == EINVAL) | 
|  | || (e == ENFILE) || (e == EROFS) || (e == EMLINK)); | 
|  | #else | 
|  | return false; | 
|  | #endif | 
|  | } | 
|  |  | 
|  | /* IsErrnoSoft returns true if the value of errno is associated | 
|  | with a soft device error.  */ | 
|  |  | 
|  | extern "C" bool | 
|  | EXPORT(IsErrnoSoft) (int e) | 
|  | { | 
|  | #if defined(HAVE_ERRNO_H) || defined(HAVE_SYS_ERRNO_H) | 
|  | return ((e == ESRCH) || (e == EINTR) || (e == E2BIG) || (e == ENOEXEC) | 
|  | || (e == EBADF) || (e == ECHILD) || (e == EAGAIN) || (e == ENOMEM) | 
|  | || (e == EFAULT) || (e == EBUSY) || (e == EEXIST) || (e == EXDEV) | 
|  | || (e == ENOTDIR) || (e == EISDIR) || (e == EMFILE) || (e == ENOTTY) | 
|  | || (e == ETXTBSY) || (e == EFBIG) || (e == ENOSPC) || (e == EPIPE)); | 
|  | #else | 
|  | return false; | 
|  | #endif | 
|  | } | 
|  |  | 
|  | extern "C" bool | 
|  | EXPORT(UnAvailable) (int e) | 
|  | { | 
|  | #if defined(HAVE_ERRNO_H) || defined(HAVE_SYS_ERRNO_H) | 
|  | return ((e == ENOENT) || (e == ESRCH) || (e == ENXIO) || (e == ECHILD) | 
|  | || (e == ENOTBLK) || (e == ENODEV) || (e == ENOTDIR)); | 
|  | #else | 
|  | return false; | 
|  | #endif | 
|  | } | 
|  |  | 
|  | /* GetOpenResults - maps errno onto the ISO Modula-2 enumerated type, | 
|  | OpenResults.  */ | 
|  |  | 
|  | extern "C" openResults | 
|  | EXPORT(GetOpenResults) (int e) | 
|  | { | 
|  | if (e == 0) | 
|  | return opened; | 
|  | #if defined(HAVE_ERRNO_H) || defined(HAVE_SYS_ERRNO_H) | 
|  | switch (e) | 
|  | { | 
|  | case EPERM: | 
|  | return wrongPermissions; | 
|  | break; | 
|  | case ENOENT: | 
|  | return noSuchFile; | 
|  | break; | 
|  | case ENXIO: | 
|  | return noSuchFile; | 
|  | break; | 
|  | case EACCES: | 
|  | return wrongPermissions; | 
|  | break; | 
|  | case ENOTBLK: | 
|  | return wrongFileType; | 
|  | break; | 
|  | case EEXIST: | 
|  | return fileExists; | 
|  | break; | 
|  | case ENODEV: | 
|  | return noSuchFile; | 
|  | break; | 
|  | case ENOTDIR: | 
|  | return wrongFileType; | 
|  | break; | 
|  | case EISDIR: | 
|  | return wrongFileType; | 
|  | break; | 
|  | case EINVAL: | 
|  | return wrongFlags; | 
|  | break; | 
|  | case ENFILE: | 
|  | return tooManyOpen; | 
|  | break; | 
|  | case EMFILE: | 
|  | return tooManyOpen; | 
|  | break; | 
|  | case ENOTTY: | 
|  | return wrongFileType; | 
|  | break; | 
|  | case ENOSPC: | 
|  | return noRoomOnDevice; | 
|  | break; | 
|  | case EROFS: | 
|  | return wrongPermissions; | 
|  | break; | 
|  |  | 
|  | default: | 
|  | return otherProblem; | 
|  | } | 
|  | #else | 
|  | return otherProblem; | 
|  | #endif | 
|  | } | 
|  |  | 
|  | /* GNU Modula-2 linking fodder.  */ | 
|  |  | 
|  | extern "C" void | 
|  | M2EXPORT(init) (int, char **, char **) | 
|  | { | 
|  | } | 
|  |  | 
|  | extern "C" void | 
|  | M2EXPORT(fini) (int, char **, char **) | 
|  | { | 
|  | } | 
|  |  | 
|  | extern "C" void | 
|  | M2EXPORT(dep) (void) | 
|  | { | 
|  | } | 
|  |  | 
|  | extern "C" void __attribute__((__constructor__)) | 
|  | M2EXPORT(ctor) (void) | 
|  | { | 
|  | m2iso_M2RTS_RegisterModule ("ErrnoCategory", M2LIBNAME, | 
|  | M2EXPORT(init), M2EXPORT(fini), | 
|  | M2EXPORT(dep)); | 
|  | } |