/* ErrnoCatogory.cc categorizes values of errno maps onto ChanConsts.h. Copyright (C) 2008-2022 Free Software Foundation, Inc. Contributed by Gaius Mulley . 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 . */ #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)); }