Metropoli BBS
VIEWER: maperr.c MODE: TEXT (ASCII)
//
// $Header: D:/ext2-os2/RCS/maperr.c,v 1.1 1995/08/11 21:54:23 Willm Exp Willm $
//

// Linux ext2 file system driver for OS/2 2.x and WARP - Allows OS/2 to     
// access your Linux ext2fs partitions as normal drive letters.
// OS/2 implementation : Copyright (C) 1995  Matthieu WILLM
//
// This program 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 2 of the License, or
// (at your option) any later version.
//
// This program 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.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

#define INCL_DOS
#define INCL_DOSERRORS
#include <os2.h>		// From the "Developer Connection Device Driver Kit" version 2.0

#include <linux/errno.h>
#include <os2/types.h>
#include <os2/log.h>

int Linux_to_OS2_err[] = {
			  NO_ERROR,	          // 		0  : No error !
			  ERROR_ACCESS_DENIED,    // EPERM	1  : Operation not permitted
			  ERROR_FILE_NOT_FOUND,   // ENOENT	2  : No such file or directory
			  ERROR_INVALID_PROCID,	  // ESRCH	3  : No such process
			  ERROR_INTERRUPT,	  // EINTR	4  : Interrupted system call
			  ERROR_READ_FAULT,	  // EIO  	5  : I/O error
			  -1,			  // ENXIO	6  : No such device or address
			  -1, 			  // E2BIG 	7  : Arg list too long
			  ERROR_BAD_EXE_FORMAT,   // ENOEXEC	8  : Exec format error
			  ERROR_INVALID_HANDLE,   // EBADF	9  : Bad file number
			  ERROR_NO_CHILD_PROCESS, // ECHILD	10 : No child processes
			  -1, 			  // EAGAIN	11 : Try again
			  ERROR_NOT_ENOUGH_MEMORY, // ENOMEM	12 : Out of memory
			  ERROR_ACCESS_DENIED,    // EACCES	13 : Permission denied
			  ERROR_INVALID_ADDRESS,  // EFAULT	14 : Bad address
			  -1, 			  // ENOTBLK	15 : Block device required
			  ERROR_DEVICE_IN_USE,	  // EBUSY	16 : Device or resource busy
			  ERROR_FILE_EXISTS, 	  // EEXIST	17 : File exists
			  -1, 			  // EXDEV	18 : Cross-device link
			  ERROR_BAD_UNIT, 	  // ENODEV	19 : No such device
			  ERROR_PATH_NOT_FOUND,	  // ENOTDIR	20 : Not a directory
			  ERROR_DIRECTORY,	  // EISDIR	21 : Is a directory
		   	  ERROR_INVALID_PARAMETER, // EINVAL	22 : Invalid argument
			  ERROR_NO_MORE_FILES,    // ENFILE	23 : File table overflow
			  ERROR_NO_MORE_FILES,    // EMFILE	24 : Too many open files
			  -1, 			  // ENOTTY	25 : Not a typewriter
			  -1, 			  // ETXTBSY	26 : Text file busy
			  ERROR_SEEK,             // EFBIG	27 : File too large
			  ERROR_DISK_FULL, 	  // ENOSPC	28 : No space left on device
			  ERROR_SEEK_ON_DEVICE,	  // ESPIPE	29 : Illegal seek
			  ERROR_WRITE_PROTECT,	  // EROFS	30 : Read-only file system
			  -1, 			  // EMLINK	31 : Too many links
			  ERROR_BROKEN_PIPE,	  // EPIPE	32 : Broken pipe
			  -1, 			  // EDOM	33 : Math argument out of domain of func
			  -1, 			  // ERANGE	34 : Math result not representable
			  -1,			  // EDEADLK	35 : Resource deadlock would occur
			  ERROR_FILENAME_EXCED_RANGE, // ENAMETOOLONG	36 : File name too long
			  -1,			  // ENOLCK	37 : No record locks available
			  ERROR_NOT_SUPPORTED,    // ENOSYS	38 : Function not implemented
			  ERROR_DIR_NOT_EMPTY,	  // ENOTEMPTY	39 : Directory not empty
			  ERROR_CIRCULARITY_REQUESTED, // ELOOP	40 : Too many symbolic links encountered
			  -1 			  // EWOULDBLOCK EAGAIN	Operation would block
};

#if 0
#define	ENOMSG		42	/* No message of desired type */
#define	EIDRM		43	/* Identifier removed */
#define	ECHRNG		44	/* Channel number out of range */
#define	EL2NSYNC	45	/* Level 2 not synchronized */
#define	EL3HLT		46	/* Level 3 halted */
#define	EL3RST		47	/* Level 3 reset */
#define	ELNRNG		48	/* Link number out of range */
#define	EUNATCH		49	/* Protocol driver not attached */
#define	ENOCSI		50	/* No CSI structure available */
#define	EL2HLT		51	/* Level 2 halted */
#define	EBADE		52	/* Invalid exchange */
#define	EBADR		53	/* Invalid request descriptor */
#define	EXFULL		54	/* Exchange full */
#define	ENOANO		55	/* No anode */
#define	EBADRQC		56	/* Invalid request code */
#define	EBADSLT		57	/* Invalid slot */
#define	EDEADLOCK	58	/* File locking deadlock error */
#define	EBFONT		59	/* Bad font file format */
#define	ENOSTR		60	/* Device not a stream */
#define	ENODATA		61	/* No data available */
#define	ETIME		62	/* Timer expired */
#define	ENOSR		63	/* Out of streams resources */
#define	ENONET		64	/* Machine is not on the network */
#define	ENOPKG		65	/* Package not installed */
#define	EREMOTE		66	/* Object is remote */
#define	ENOLINK		67	/* Link has been severed */
#define	EADV		68	/* Advertise error */
#define	ESRMNT		69	/* Srmount error */
#define	ECOMM		70	/* Communication error on send */
#define	EPROTO		71	/* Protocol error */
#define	EMULTIHOP	72	/* Multihop attempted */
#define	EDOTDOT		73	/* RFS specific error */
#define	EBADMSG		74	/* Not a data message */
#define	EOVERFLOW	75	/* Value too large for defined data type */
#define	ENOTUNIQ	76	/* Name not unique on network */
#define	EBADFD		77	/* File descriptor in bad state */
#define	EREMCHG		78	/* Remote address changed */
#define	ELIBACC		79	/* Can not access a needed shared library */
#define	ELIBBAD		80	/* Accessing a corrupted shared library */
#define	ELIBSCN		81	/* .lib section in a.out corrupted */
#define	ELIBMAX		82	/* Attempting to link in too many shared libraries */
#define	ELIBEXEC	83	/* Cannot exec a shared library directly */
#define	EILSEQ		84	/* Illegal byte sequence */
#define	ERESTART	85	/* Interrupted system call should be restarted */
#define	ESTRPIPE	86	/* Streams pipe error */
#define	EUSERS		87	/* Too many users */
#define	ENOTSOCK	88	/* Socket operation on non-socket */
#define	EDESTADDRREQ	89	/* Destination address required */
#define	EMSGSIZE	90	/* Message too long */
#define	EPROTOTYPE	91	/* Protocol wrong type for socket */
#define	ENOPROTOOPT	92	/* Protocol not available */
#define	EPROTONOSUPPORT	93	/* Protocol not supported */
#define	ESOCKTNOSUPPORT	94	/* Socket type not supported */
#define	EOPNOTSUPP	95	/* Operation not supported on transport endpoint */
#define	EPFNOSUPPORT	96	/* Protocol family not supported */
#define	EAFNOSUPPORT	97	/* Address family not supported by protocol */
#define	EADDRINUSE	98	/* Address already in use */
#define	EADDRNOTAVAIL	99	/* Cannot assign requested address */
#define	ENETDOWN	100	/* Network is down */
#define	ENETUNREACH	101	/* Network is unreachable */
#define	ENETRESET	102	/* Network dropped connection because of reset */
#define	ECONNABORTED	103	/* Software caused connection abort */
#define	ECONNRESET	104	/* Connection reset by peer */
#define	ENOBUFS		105	/* No buffer space available */
#define	EISCONN		106	/* Transport endpoint is already connected */
#define	ENOTCONN	107	/* Transport endpoint is not connected */
#define	ESHUTDOWN	108	/* Cannot send after transport endpoint shutdown */
#define	ETOOMANYREFS	109	/* Too many references: cannot splice */
#define	ETIMEDOUT	110	/* Connection timed out */
#define	ECONNREFUSED	111	/* Connection refused */
#define	EHOSTDOWN	112	/* Host is down */
#define	EHOSTUNREACH	113	/* No route to host */
#define	EALREADY	114	/* Operation already in progress */
#define	EINPROGRESS	115	/* Operation now in progress */
#define	ESTALE		116	/* Stale NFS file handle */
#define	EUCLEAN		117	/* Structure needs cleaning */
#define	ENOTNAM		118	/* Not a XENIX named type file */
#define	ENAVAIL		119	/* No XENIX semaphores available */
#define	EISNAM		120	/* Is a named type file */
#define	EREMOTEIO	121	/* Remote I/O error */
#define	EDQUOT		122	/* Quota exceeded */
#endif // 0

int map_err(int err) {
    int mapped;

    if (err < 0) {
        err = -err;
    }

    if (err >= sizeof(Linux_to_OS2_err) / sizeof(int)) {
	kernel_printf("map_err() : Linux error %d cannot be mapped to OS/2 error !", err);
        return err;
    }

    if ((mapped = Linux_to_OS2_err[err]) == -1) {
	kernel_printf("map_err() : Linux error %d cannot be mapped to OS/2 error !", err);
	return err;
    }
    return mapped;
}
[ RETURN TO DIRECTORY ]