home *** CD-ROM | disk | FTP | other *** search
/ Piper's Pit BBS/FTP: ibm 0020 - 0029 / ibm0020-0029 / ibm0028.tar / ibm0028 / INSTALL2.TD0 / SOURCES.LIF / DOSPROB.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-09-27  |  8.1 KB  |  246 lines

  1. /*=============================================================================
  2.  
  3.      The INSTALL program source code, object code, sample  script files,
  4.      executable  program,  and  documentation  are  subject to copyright
  5.      protection under the laws of the United States and other countries.
  6.  
  7.      This software is licensed, not sold, and may only be  redistributed
  8.      in  executable format and only in accordance with the provisions of
  9.      the INSTALL Source Code License Agreement.
  10.  
  11.         INSTALL is Copyright(C) 1987-1990 by Knowledge Dynamics Corp
  12.        Highway Contract 4 Box 185-H, Canyon Lake, TX (USA) 78133-3508
  13.               512-964-3994 (Voice)   512-964-3958 (24-hr FAX)
  14.  
  15.                       All rights reserved worldwide.
  16.  
  17. ===============================================================================
  18.  
  19. FILENAME:
  20.     dosprob.c
  21.  
  22. AUTHOR:
  23.     eric jon heflin
  24.  
  25. PUBLIC FUNCTIONS:
  26.     dosprob() - returns a string containing DOS error information
  27.  
  28. LOCAL FUNCTIONS:
  29.     none
  30.  
  31. DESCRIPTION:
  32.     This file uses the structure errs_s{a,b,c} where a is an unsigned number
  33.     obtained from the int24(), b is a pointer, and c tells what type of
  34.     error it is (e.g. hard disk, file in use, etc.).  The same structure is
  35.     used for both devicemsg[] and dosmsg[] to handle their respective errors.
  36.     If no errors are present, the return is NULL.
  37.  
  38. REVISION HISTORY:
  39.     DATE:    AUTHOR:            DESCRIPTION OF CHANGES:
  40.     891107    allyn jordan    documentation
  41.     900102    ejh                Cosmetic changes.
  42.  
  43. ==============================================================================*/
  44.  
  45. #include "install.h"
  46. /*
  47. #ifdef LATTICE
  48. #undef LATTICE
  49. #include <dos.h>
  50. #define LATTICE
  51. #else
  52. #include <dos.h>
  53. #endif
  54. */
  55. #include <errno.h>
  56. #include <stdlib.h>
  57. #include <string.h>
  58.  
  59. /* the following externs are defined in int24.c */
  60. #if defined(InstantC) || defined(__TURBOC__) || defined(__MICROSOFTC__)
  61. extern short _OSERR;    /* DOS error code */
  62. extern char _OSERC;        /* DOS error class */
  63. extern char _OSERL;        /* DOS error locus */
  64. extern char _OSERA;        /* DOS error action */
  65. extern char _OSCEF;        /* critical error flag */
  66. extern char _OSCEC;        /* critical error code */
  67. extern short _OSCET;    /* critical error type */
  68. #elif defined(LATTICE)
  69. extern char _OSCEC;        /* critical error code */
  70. extern short _OSCET;    /* critical error type */
  71. #endif
  72.  
  73. struct errs_s
  74.     {
  75.     unsigned number;
  76.     byte *text;
  77.     word type;
  78.     } dosmsg[] =
  79.     {
  80.     /* dosprob */
  81.     {0, NULL, UNKNOWN | INTERNAL | SOFT},
  82.     {1, "Invalid function number", INTERNAL | SOFT},
  83.     {2, "File not found", DISK | SOFT},
  84.     {3, "Path not found", DISK | SOFT},
  85.     {4, "Too many files open", ENVIRONMENT | SOFT},
  86.     {5, "Access denied", USER | HARD},
  87.     {6, "Invalid handle", INTERNAL | SOFT},
  88.     {7, "Memory control blocks destroyed", INTERNAL | SOFT},
  89.     {8, "Insufficient memory", ENVIRONMENT | HARD},
  90.     {9, "Invalid memory block address", INTERNAL | SOFT},
  91.     {10, "Invalid environment", ENVIRONMENT | SOFT | INTERNAL},
  92.     {11, "Invalid format", USER | DISK | HARD},
  93.     {12, "Invalid access code", INTERNAL | SOFT},
  94.     {13, "Invalid data", DISK | USER | HARD},
  95.     {14, "Unknown Unit", DISK | SOFT},
  96.     {15, "Invalid disk drive", DISK | USER | HARD},
  97.     {16, "Can't remove current directory", DISK | SOFT},
  98.     {17, "Not same device", DISK},
  99.     {18, "No more files", DISK},
  100.     {19, "Can't write on protected disk", USER | HARD | DISK},
  101.     {20, "Unknown unit", USER | DISK},
  102.     {21, "Drive not ready", USER | HARD | DISK},
  103.     {22, "Unknown command", DISK | SOFT},
  104.     {23, "Data error", HARD | DISK | USER},
  105.     {24, "Bad request structure length", INTERNAL | DISK},
  106.     {25, "Seek error", DISK | HARD | USER},
  107.     {26, "Unknown media type", USER | DISK | HARD},
  108.     {27, "Sector not found", HARD | DISK | USER},
  109.     {28, "Printer out of paper", PRINTER | USER | HARD},
  110.     {29, "Write fault", USER | HARD},
  111.     {30, "Read fault", USER | HARD},
  112.     {31, "General failure", DISK | USER},
  113.     {32, "Sharing violation", DISK | USER},
  114.     {33, "Lock violation", DISK | USER},
  115.     {34, "Invalid disk change", DISK | USER},
  116.     {35, "FCB unavailable", DISK | INTERNAL},
  117.     {36, "Sharing buffer overflow", DISK | USER},
  118.     {37, NULL, UNKNOWN | INTERNAL},
  119.     {38, NULL, UNKNOWN | INTERNAL},
  120.     {39, NULL, UNKNOWN | INTERNAL},
  121.     {40, NULL, UNKNOWN | INTERNAL},
  122.     {41, NULL, UNKNOWN | INTERNAL},
  123.     {42, NULL, UNKNOWN | INTERNAL},
  124.     {43, NULL, UNKNOWN | INTERNAL},
  125.     {44, NULL, UNKNOWN | INTERNAL},
  126.     {45, NULL, UNKNOWN | INTERNAL},
  127.     {46, NULL, UNKNOWN | INTERNAL},
  128.     {47, NULL, UNKNOWN | INTERNAL},
  129.     {48, NULL, UNKNOWN | INTERNAL},
  130.     {49, NULL, UNKNOWN | INTERNAL},
  131.     {50, "Network request not supported", NETWORK | USER},
  132.     {51, "Remote computer not listening", NETWORK | USER},
  133.     {52, "Duplicate name on network", NETWORK | USER},
  134.     {53, "Network name not found", NETWORK | USER},
  135.     {54, "Network busy", NETWORK | USER},
  136.     {55, "Network device no longer exists", NETWORK | USER},
  137.     {56, "NetBIOS command limit exceeded", NETWORK | USER},
  138.     {57, "Network adapter hardware error", NETWORK | USER},
  139.     {58, "Incorrect response from network", NETWORK | USER},
  140.     {59, "Unexpected network error", NETWORK | USER},
  141.     {60, "Incompatible remote adapter", NETWORK | USER},
  142.     {61, "Print queue full", PRINTER | USER},
  143.     {62, "Not enough memory for print file", PRINTER | USER},
  144.     {63, "Print file was deleted", PRINTER | USER},
  145.     {64, "Network name was deleted", NETWORK | USER},
  146.     {65, "Network access denied", NETWORK | USER},
  147.     {66, "Incorrect network device type", NETWORK | USER},
  148.     {67, "Network name not found", NETWORK | USER},
  149.     {68, "Network name limit exceeded", NETWORK | USER},
  150.     {69, "NetBIOS session limit exceeded", NETWORK | USER},
  151.     {70, "File sharing temporarily paused", NETWORK | USER},
  152.     {71, "Network request not accepted", NETWORK | USER},
  153.     {72, "Network print or disk redirection paused", NETWORK | USER},
  154.     {73, NULL, UNKNOWN | INTERNAL},
  155.     {74, NULL, UNKNOWN | INTERNAL},
  156.     {75, NULL, UNKNOWN | INTERNAL},
  157.     {76, NULL, UNKNOWN | INTERNAL},
  158.     {77, NULL, UNKNOWN | INTERNAL},
  159.     {78, NULL, UNKNOWN | INTERNAL},
  160.     {79, NULL, UNKNOWN | INTERNAL},
  161.     {80, "File already exists", SOFT | DISK},
  162.     {81, NULL, UNKNOWN | INTERNAL},
  163.     {82, "Cannot make directory", DISK | SOFT},
  164.     {83, "DOS device error", SOFT | USER},
  165.     {84, "Too many redirections", ENVIRONMENT},
  166.     {85, "Duplicate redirection", ENVIRONMENT},
  167.     {86, "Invalid password", USER},
  168.     {87, "Invalid parameter", INTERNAL},
  169.     {88, "Network device fault", HARD | USER},
  170.     {0, NULL}
  171.     };
  172.  
  173. struct errs_s devicemsg[] =
  174.     {
  175.     {0, "Attempt to write on protected diskette", USER | DISK | HARD},
  176.     {1, "Unknown unit", INTERNAL},
  177.     {2, "Drive not ready", USER | DISK | HARD},
  178.     {3, "Unknown command", INTERNAL},
  179.     {4, "Disk data error", HARD | DISK},
  180.     {5, "Bad request structure length", INTERNAL},
  181.     {6, "Seek error", DISK | HARD | USER},
  182.     {7, "Unknown media type", DISK | HARD | USER},
  183.     {8, "Sector not found", DISK | HARD | USER},
  184.     {9, "Printer out of paper", PRINTER | HARD | USER},
  185.     {10, "Write fault", HARD | USER | DISK},
  186.     {11, "Read fault", HARD | USER | DISK},
  187.     {12, "General failure", HARD | USER | DISK}
  188.     };
  189.  
  190. /* static storage area for str return from dosprob */
  191. byte buf[100];
  192.  
  193. byte *dosprob(type)
  194. word *type;
  195.     {
  196.     if (_OSCEF == 3 || _OSCEF == 1)
  197.         {
  198.         if (_OSERR == 83)
  199.             {
  200.             /* INT 24 error */
  201.             if (!(_OSCET & 0x80))
  202.                 {
  203.                 /* disk error */
  204.                 sprintf(buf, "Disk Error on Drive %c: %s", (_OSCET & 0xF) + 'A',
  205.                     devicemsg[_OSCEC].text);
  206.                 _OSERR = 0;
  207.                 _OSCEF = 0;
  208.                 if (type != NULL)
  209.                     *type = devicemsg[_OSCEC].type;
  210.                 return buf;
  211.                 }
  212.             else 
  213.                 {
  214.                 sprintf(buf, "Device Error: %s", devicemsg[_OSCEC].text);
  215.                 _OSERR = 0;
  216.                 _OSCEF = 0;
  217.                 if (type != NULL)
  218.                     *type = dosmsg[_OSERR].type;
  219.                 return buf;
  220.                 }
  221.             }
  222.         else if (_OSERR <= 88)
  223.             {
  224.             /* non-INT 24 error */
  225.             if (dosmsg[_OSERR].type & UNKNOWN)
  226.                 sprintf(buf, "Unknown DOS error %d", _OSERR);
  227.             else 
  228.                 strcpy(buf, dosmsg[_OSERR].text);
  229.             _OSERR = 0;
  230.             _OSCEF = 0;
  231.             if (type != NULL)
  232.                 *type = dosmsg[_OSERR].type;
  233.             return buf;
  234.             }
  235.         }
  236.     /* no error state currently exists, return such */
  237.     _OSERR = 0;
  238.     _OSCEF = 0;
  239.     if (type != NULL)
  240.         *type = 0;
  241.     return NULL;
  242.     }
  243.  
  244. /* end-of-file */
  245.  
  246.