wasCSharpSQLite – Rev 1

Subversion Repositories:
Rev:
/*
* TclPosixException.java --
*
*       This file implements the TclPosixException class, used to report posix
*       errors in Tcl scripts.
*
* Copyright (c) 1997 Sun Microsystems, Inc.
*
* See the file "license.terms" for information on usage and
* redistribution of this file, and for a DISCLAIMER OF ALL
* WARRANTIES.
* 
* Included in SQLite3 port to C# for use in testharness only;  2008 Noah B Hart
*
* RCS @(#) $Id: TclPosixException.java,v 1.2 2001/11/22 00:08:36 mdejong Exp $
*
*/
using System;
namespace tcl.lang
{

  /*
  * This class implements exceptions used to report posix errors in Tcl scripts.
  */

  class TclPosixException : TclException
  {

    internal const int EPERM = 1; /* Operation not permitted */
    internal const int ENOENT = 2; /* No such file or directory */
    internal const int ESRCH = 3; /* No such process */
    internal const int EINTR = 4; /* Interrupted system call */
    internal const int EIO = 5; /* Input/output error */
    internal const int ENXIO = 6; /* Device not configured */
    internal const int E2BIG = 7; /* Argument list too long */
    internal const int ENOEXEC = 8; /* Exec format error */
    internal const int EBADF = 9; /* Bad file descriptor */
    internal const int ECHILD = 10; /* No child processes */
    internal const int EDEADLK = 11; /* Resource deadlock avoided */
    /* 11 was EAGAIN */
    internal const int ENOMEM = 12; /* Cannot allocate memory */
    internal const int EACCES = 13; /* Permission denied */
    internal const int EFAULT = 14; /* Bad address */
    internal const int ENOTBLK = 15; /* Block device required */
    internal const int EBUSY = 16; /* Device busy */
    internal const int EEXIST = 17; /* File exists */
    internal const int EXDEV = 18; /* Cross-device link */
    internal const int ENODEV = 19; /* Operation not supported by device */
    internal const int ENOTDIR = 20; /* Not a directory */
    internal const int EISDIR = 21; /* Is a directory */
    internal const int EINVAL = 22; /* Invalid argument */
    internal const int ENFILE = 23; /* Too many open files in system */
    internal const int EMFILE = 24; /* Too many open files */
    internal const int ENOTTY = 25; /* Inappropriate ioctl for device */
    internal const int ETXTBSY = 26; /* Text file busy */
    internal const int EFBIG = 27; /* File too large */
    internal const int ENOSPC = 28; /* No space left on device */
    internal const int ESPIPE = 29; /* Illegal seek */
    internal const int EROFS = 30; /* Read-only file system */
    internal const int EMLINK = 31; /* Too many links */
    internal const int EPIPE = 32; /* Broken pipe */
    internal const int EDOM = 33; /* Numerical argument out of domain */
    internal const int ERANGE = 34; /* Result too large */
    internal const int EAGAIN = 35; /* Resource temporarily unavailable */
    internal const int EWOULDBLOCK = EAGAIN; /* Operation would block */
    internal const int EINPROGRESS = 36; /* Operation now in progress */
    internal const int EALREADY = 37; /* Operation already in progress */
    internal const int ENOTSOCK = 38; /* Socket operation on non-socket */
    internal const int EDESTADDRREQ = 39; /* Destination address required */
    internal const int EMSGSIZE = 40; /* Message too long */
    internal const int EPROTOTYPE = 41; /* Protocol wrong type for socket */
    internal const int ENOPROTOOPT = 42; /* Protocol not available */
    internal const int EPROTONOSUPPORT = 43; /* Protocol not supported */
    internal const int ESOCKTNOSUPPORT = 44; /* Socket type not supported */
    internal const int EOPNOTSUPP = 45; /* Operation not supported on socket */
    internal const int EPFNOSUPPORT = 46; /* Protocol family not supported */
    internal const int EAFNOSUPPORT = 47; /* Address family not supported by
                /*   protocol family */
    internal const int EADDRINUSE = 48; /* Address already in use */
    internal const int EADDRNOTAVAIL = 49; /* Can't assign requested
                /*   address */
    internal const int ENETDOWN = 50; /* Network is down */
    internal const int ENETUNREACH = 51; /* Network is unreachable */
    internal const int ENETRESET = 52; /* Network dropped connection on reset */
    internal const int ECONNABORTED = 53; /* Software caused connection abort */
    internal const int ECONNRESET = 54; /* Connection reset by peer */
    internal const int ENOBUFS = 55; /* No buffer space available */
    internal const int EISCONN = 56; /* Socket is already connected */
    internal const int ENOTCONN = 57; /* Socket is not connected */
    internal const int ESHUTDOWN = 58; /* Can't send after socket shutdown */
    internal const int ETOOMANYREFS = 59; /* Too many references: can't splice */
    internal const int ETIMEDOUT = 60; /* Connection timed out */
    internal const int ECONNREFUSED = 61; /* Connection refused */
    internal const int ELOOP = 62; /* Too many levels of symbolic links */
    internal const int ENAMETOOLONG = 63; /* File name too long */
    internal const int EHOSTDOWN = 64; /* Host is down */
    internal const int EHOSTUNREACH = 65; /* No route to host */
    internal const int ENOTEMPTY = 66; /* Directory not empty */
    internal const int EPROCLIM = 67; /* Too many processes */
    internal const int EUSERS = 68; /* Too many users */
    internal const int EDQUOT = 69; /* Disc quota exceeded */
    internal const int ESTALE = 70; /* Stale NFS file handle */
    internal const int EREMOTE = 71; /* Too many levels of remote in path */
    internal const int EBADRPC = 72; /* RPC struct is bad */
    internal const int ERPCMISMATCH = 73; /* RPC version wrong */
    internal const int EPROGUNAVAIL = 74; /* RPC prog. not avail */
    internal const int EPROGMISMATCH = 75; /* Program version wrong */
    internal const int EPROCUNAVAIL = 76; /* Bad procedure for program */
    internal const int ENOLCK = 77; /* No locks available */
    internal const int ENOSYS = 78; /* Function not implemented */
    internal const int EFTYPE = 79; /* Inappropriate file type or format */



    public TclPosixException( Interp interp, int errno, string errorMsg )
      : base( TCL.CompletionCode.ERROR )
    {

      string msg = getPosixMsg( errno );

      TclObject threeEltListObj = TclList.newInstance();
      TclList.append( interp, threeEltListObj, TclString.newInstance( "POSIX" ) );
      TclList.append( interp, threeEltListObj, TclString.newInstance( getPosixId( errno ) ) );
      TclList.append( interp, threeEltListObj, TclString.newInstance( msg ) );

      interp.setErrorCode( threeEltListObj );

      if ( interp != null )
      {
        interp.setResult( errorMsg );
      }
    }

    public TclPosixException( Interp interp, int errno, bool appendPosixMsg, string errorMsg )
      : base( TCL.CompletionCode.ERROR )
    {

      string msg = getPosixMsg( errno );

      TclObject threeEltListObj = TclList.newInstance();
      TclList.append( interp, threeEltListObj, TclString.newInstance( "POSIX" ) );
      TclList.append( interp, threeEltListObj, TclString.newInstance( getPosixId( errno ) ) );
      TclList.append( interp, threeEltListObj, TclString.newInstance( msg ) );

      interp.setErrorCode( threeEltListObj );

      if ( interp != null )
      {
        if ( appendPosixMsg )
        {
          interp.setResult( errorMsg + ": " + msg );
        }
        else
        {
          interp.setResult( errorMsg );
        }
      }
    }
    private static string getPosixId( int errno )
    // Code of posix error.
    {
      switch ( errno )
      {

        case E2BIG:
          return "E2BIG";

        case EACCES:
          return "EACCES";

        case EADDRINUSE:
          return "EADDRINUSE";

        case EADDRNOTAVAIL:
          return "EADDRNOTAVAIL";
        //case EADV: return "EADV";

        case EAFNOSUPPORT:
          return "EAFNOSUPPORT";

        case EAGAIN:
          return "EAGAIN";
        //case EALIGN: return "EALIGN";

        case EALREADY:
          return "EALREADY";
        //case EBADE: return "EBADE";

        case EBADF:
          return "EBADF";
        //case EBADFD: return "EBADFD";
        //case EBADMSG: return "EBADMSG";
        //case EBADR: return "EBADR";

        case EBADRPC:
          return "EBADRPC";
        //case EBADRQC: return "EBADRQC";
        //case EBADSLT: return "EBADSLT";
        //case EBFONT: return "EBFONT";

        case EBUSY:
          return "EBUSY";

        case ECHILD:
          return "ECHILD";
        //case ECHRNG: return "ECHRNG";
        //case ECOMM: return "ECOMM";

        case ECONNABORTED:
          return "ECONNABORTED";

        case ECONNREFUSED:
          return "ECONNREFUSED";

        case ECONNRESET:
          return "ECONNRESET";

        case EDEADLK:
          return "EDEADLK";
        //case EDEADLOCK: return "EDEADLOCK";

        case EDESTADDRREQ:
          return "EDESTADDRREQ";
        //case EDIRTY: return "EDIRTY";

        case EDOM:
          return "EDOM";
        //case EDOTDOT: return "EDOTDOT";

        case EDQUOT:
          return "EDQUOT";
        //case EDUPPKG: return "EDUPPKG";

        case EEXIST:
          return "EEXIST";

        case EFAULT:
          return "EFAULT";

        case EFBIG:
          return "EFBIG";

        case EHOSTDOWN:
          return "EHOSTDOWN";

        case EHOSTUNREACH:
          return "EHOSTUNREACH";
        //case EIDRM: return "EIDRM";
        //case EINIT: return "EINIT";

        case EINPROGRESS:
          return "EINPROGRESS";

        case EINTR:
          return "EINTR";

        case EINVAL:
          return "EINVAL";

        case EIO:
          return "EIO";

        case EISCONN:
          return "EISCONN";

        case EISDIR:
          return "EISDIR";
        //case EISNAM: return "EISNAM";
        //case ELBIN: return "ELBIN";
        //case EL2HLT: return "EL2HLT";
        //case EL2NSYNC: return "EL2NSYNC";
        //case EL3HLT: return "EL3HLT";
        //case EL3RST: return "EL3RST";
        //case ELIBACC: return "ELIBACC";
        //case ELIBBAD: return "ELIBBAD";
        //case ELIBEXEC: return "ELIBEXEC";
        //case ELIBMAX: return "ELIBMAX";
        //case ELIBSCN: return "ELIBSCN";
        //case ELNRNG: return "ELNRNG";

        case ELOOP:
          return "ELOOP";

        case EMLINK:
          return "EMLINK";

        case EMSGSIZE:
          return "EMSGSIZE";
        //case EMULTIHOP: return "EMULTIHOP";

        case ENAMETOOLONG:
          return "ENAMETOOLONG";
        //case ENAVAIL: return "ENAVAIL";
        //case ENET: return "ENET";

        case ENETDOWN:
          return "ENETDOWN";

        case ENETRESET:
          return "ENETRESET";

        case ENETUNREACH:
          return "ENETUNREACH";

        case ENFILE:
          return "ENFILE";
        //case ENOANO: return "ENOANO";

        case ENOBUFS:
          return "ENOBUFS";
        //case ENOCSI: return "ENOCSI";
        //case ENODATA: return "ENODATA";

        case ENODEV:
          return "ENODEV";

        case ENOENT:
          return "ENOENT";

        case ENOEXEC:
          return "ENOEXEC";

        case ENOLCK:
          return "ENOLCK";
        //case ENOLINK: return "ENOLINK";

        case ENOMEM:
          return "ENOMEM";
        //case ENOMSG: return "ENOMSG";
        //case ENONET: return "ENONET";
        //case ENOPKG: return "ENOPKG";

        case ENOPROTOOPT:
          return "ENOPROTOOPT";

        case ENOSPC:
          return "ENOSPC";
        //case ENOSR: return "ENOSR";
        //case ENOSTR: return "ENOSTR";
        //case ENOSYM: return "ENOSYM";

        case ENOSYS:
          return "ENOSYS";

        case ENOTBLK:
          return "ENOTBLK";

        case ENOTCONN:
          return "ENOTCONN";

        case ENOTDIR:
          return "ENOTDIR";

        case ENOTEMPTY:
          return "ENOTEMPTY";
        //case ENOTNAM: return "ENOTNAM";

        case ENOTSOCK:
          return "ENOTSOCK";
        //case ENOTSUP: return "ENOTSUP";

        case ENOTTY:
          return "ENOTTY";
        //case ENOTUNIQ: return "ENOTUNIQ";

        case ENXIO:
          return "ENXIO";

        case EOPNOTSUPP:
          return "EOPNOTSUPP";

        case EPERM:
          return "EPERM";

        case EPFNOSUPPORT:
          return "EPFNOSUPPORT";

        case EPIPE:
          return "EPIPE";

        case EPROCLIM:
          return "EPROCLIM";

        case EPROCUNAVAIL:
          return "EPROCUNAVAIL";

        case EPROGMISMATCH:
          return "EPROGMISMATCH";

        case EPROGUNAVAIL:
          return "EPROGUNAVAIL";
        //case EPROTO: return "EPROTO";

        case EPROTONOSUPPORT:
          return "EPROTONOSUPPORT";

        case EPROTOTYPE:
          return "EPROTOTYPE";

        case ERANGE:
          return "ERANGE";
        //case EREFUSED: return "EREFUSED";
        //case EREMCHG: return "EREMCHG";
        //case EREMDEV: return "EREMDEV";

        case EREMOTE:
          return "EREMOTE";
        //case EREMOTEIO: return "EREMOTEIO";
        //case EREMOTERELEASE: return "EREMOTERELEASE";

        case EROFS:
          return "EROFS";

        case ERPCMISMATCH:
          return "ERPCMISMATCH";
        //case ERREMOTE: return "ERREMOTE";

        case ESHUTDOWN:
          return "ESHUTDOWN";

        case ESOCKTNOSUPPORT:
          return "ESOCKTNOSUPPORT";

        case ESPIPE:
          return "ESPIPE";

        case ESRCH:
          return "ESRCH";
        //case ESRMNT: return "ESRMNT";

        case ESTALE:
          return "ESTALE";
        //case ESUCCESS: return "ESUCCESS";
        //case ETIME: return "ETIME";

        case ETIMEDOUT:
          return "ETIMEDOUT";

        case ETOOMANYREFS:
          return "ETOOMANYREFS";

        case ETXTBSY:
          return "ETXTBSY";
        //case EUCLEAN: return "EUCLEAN";
        //case EUNATCH: return "EUNATCH";

        case EUSERS:
          return "EUSERS";
        //case EVERSION: return "EVERSION";
        //case EWOULDBLOCK: return "EWOULDBLOCK";

        case EXDEV:
          return "EXDEV";
        //case EXFULL: return "EXFULL";
      }
      return "unknown error";
    }
    internal static string getPosixMsg( int errno )
    // Code of posix error.
    {
      switch ( errno )
      {

        case E2BIG:
          return "argument list too long";

        case EACCES:
          return "permission denied";

        case EADDRINUSE:
          return "address already in use";

        case EADDRNOTAVAIL:
          return "can't assign requested address";
        //case EADV: return "advertise error";

        case EAFNOSUPPORT:
          return "address family not supported by protocol family";

        case EAGAIN:
          return "resource temporarily unavailable";
        //case EALIGN: return "EALIGN";

        case EALREADY:
          return "operation already in progress";
        //case EBADE: return "bad exchange descriptor";

        case EBADF:
          return "bad file number";
        //case EBADFD: return "file descriptor in bad state";
        //case EBADMSG: return "not a data message";
        //case EBADR: return "bad request descriptor";

        case EBADRPC:
          return "RPC structure is bad";
        //case EBADRQC: return "bad request code";
        //case EBADSLT: return "invalid slot";
        //case EBFONT: return "bad font file format";

        case EBUSY:
          return "file busy";

        case ECHILD:
          return "no children";
        //case ECHRNG: return "channel number out of range";
        //case ECOMM: return "communication error on send";

        case ECONNABORTED:
          return "software caused connection abort";

        case ECONNREFUSED:
          return "connection refused";

        case ECONNRESET:
          return "connection reset by peer";

        case EDEADLK:
          return "resource deadlock avoided";
        //case EDEADLOCK: return "resource deadlock avoided";

        case EDESTADDRREQ:
          return "destination address required";
        //case EDIRTY: return "mounting a dirty fs w/o force";

        case EDOM:
          return "math argument out of range";
        //case EDOTDOT: return "cross mount point";

        case EDQUOT:
          return "disk quota exceeded";
        //case EDUPPKG: return "duplicate package name";

        case EEXIST:
          return "file already exists";

        case EFAULT:
          return "bad address in system call argument";

        case EFBIG:
          return "file too large";

        case EHOSTDOWN:
          return "host is down";

        case EHOSTUNREACH:
          return "host is unreachable";
        //case EIDRM: return "identifier removed";
        //case EINIT: return "initialization error";

        case EINPROGRESS:
          return "operation now in progress";

        case EINTR:
          return "interrupted system call";

        case EINVAL:
          return "invalid argument";

        case EIO:
          return "I/O error";

        case EISCONN:
          return "socket is already connected";

        case EISDIR:
          return "illegal operation on a directory";
        //case EISNAM: return "is a name file";
        //case ELBIN: return "ELBIN";
        //case EL2HLT: return "level 2 halted";
        //case EL2NSYNC: return "level 2 not synchronized";
        //case EL3HLT: return "level 3 halted";
        //case EL3RST: return "level 3 reset";
        //case ELIBACC: return "can not access a needed shared library";
        //case ELIBBAD: return "accessing a corrupted shared library";
        //case ELIBEXEC: return "can not exec a shared library directly";
        //case ELIBMAX: return
        //"attempting to link in more shared libraries than system limit";
        //case ELIBSCN: return ".lib section in a.out corrupted";
        //case ELNRNG: return "link number out of range";

        case ELOOP:
          return "too many levels of symbolic links";

        case EMFILE:
          return "too many open files";

        case EMLINK:
          return "too many links";

        case EMSGSIZE:
          return "message too long";
        //case EMULTIHOP: return "multihop attempted";

        case ENAMETOOLONG:
          return "file name too long";
        //case ENAVAIL: return "not available";
        //case ENET: return "ENET";

        case ENETDOWN:
          return "network is down";

        case ENETRESET:
          return "network dropped connection on reset";

        case ENETUNREACH:
          return "network is unreachable";

        case ENFILE:
          return "file table overflow";
        //case ENOANO: return "anode table overflow";

        case ENOBUFS:
          return "no buffer space available";
        //case ENOCSI: return "no CSI structure available";
        //case ENODATA: return "no data available";

        case ENODEV:
          return "no such device";

        case ENOENT:
          return "no such file or directory";

        case ENOEXEC:
          return "exec format error";

        case ENOLCK:
          return "no locks available";
        //case ENOLINK: return "link has be severed";

        case ENOMEM:
          return "not enough memory";
        //case ENOMSG: return "no message of desired type";
        //case ENONET: return "machine is not on the network";
        //case ENOPKG: return "package not installed";

        case ENOPROTOOPT:
          return "bad proocol option";

        case ENOSPC:
          return "no space left on device";
        //case ENOSR: return "out of stream resources";
        //case ENOSTR: return "not a stream device";
        //case ENOSYM: return "unresolved symbol name";

        case ENOSYS:
          return "function not implemented";

        case ENOTBLK:
          return "block device required";

        case ENOTCONN:
          return "socket is not connected";

        case ENOTDIR:
          return "not a directory";

        case ENOTEMPTY:
          return "directory not empty";
        //case ENOTNAM: return "not a name file";

        case ENOTSOCK:
          return "socket operation on non-socket";
        //case ENOTSUP: return "operation not supported";

        case ENOTTY:
          return "inappropriate device for ioctl";
        //case ENOTUNIQ: return "name not unique on network";

        case ENXIO:
          return "no such device or address";

        case EOPNOTSUPP:
          return "operation not supported on socket";

        case EPERM:
          return "not owner";

        case EPFNOSUPPORT:
          return "protocol family not supported";

        case EPIPE:
          return "broken pipe";

        case EPROCLIM:
          return "too many processes";

        case EPROCUNAVAIL:
          return "bad procedure for program";

        case EPROGMISMATCH:
          return "program version wrong";

        case EPROGUNAVAIL:
          return "RPC program not available";
        //case EPROTO: return "protocol error";

        case EPROTONOSUPPORT:
          return "protocol not suppored";

        case EPROTOTYPE:
          return "protocol wrong type for socket";

        case ERANGE:
          return "math result unrepresentable";
        //case EREFUSED: return "EREFUSED";
        //case EREMCHG: return "remote address changed";
        //case EREMDEV: return "remote device";

        case EREMOTE:
          return "pathname hit remote file system";
        //case EREMOTEIO: return "remote i/o error";
        //case EREMOTERELEASE: return "EREMOTERELEASE";

        case EROFS:
          return "read-only file system";

        case ERPCMISMATCH:
          return "RPC version is wrong";
        //case ERREMOTE: return "object is remote";

        case ESHUTDOWN:
          return "can't send afer socket shutdown";

        case ESOCKTNOSUPPORT:
          return "socket type not supported";

        case ESPIPE:
          return "invalid seek";

        case ESRCH:
          return "no such process";
        //case ESRMNT: return "srmount error";

        case ESTALE:
          return "stale remote file handle";
        //case ESUCCESS: return "Error 0";
        //case ETIME: return "timer expired";

        case ETIMEDOUT:
          return "connection timed out";

        case ETOOMANYREFS:
          return "too many references: can't splice";

        case ETXTBSY:
          return "text file or pseudo-device busy";
        //case EUCLEAN: return "structure needs cleaning";
        //case EUNATCH: return "protocol driver not attached";

        case EUSERS:
          return "too many users";
        //case EVERSION: return "version mismatch";
        //case EWOULDBLOCK: return "operation would block";

        case EXDEV:
          return "cross-domain link";
        //case EXFULL: return "message tables full";

        default:
          return "unknown POSIX error";

      }
    }
  } // end TclPosixException class
}