home *** CD-ROM | disk | FTP | other *** search
/ Hall of Fame / HallofFameCDROM.cdr / lant / map104.arc / MAP.C next >
Text File  |  1991-02-21  |  10KB  |  424 lines

  1. /*
  2.  * MAP.C - Utility to display current redirections and server logins
  3.  *         for Artisoft's LANtastic Network Operating System
  4.  *
  5.  * MAP was written in Turbo C++ Version 1.0 but does not use any of the
  6.  * C++ extensions.  It should compile under any version of Turbo C.  I
  7.  * don't know about Microsoft et al; but it should not be difficult to
  8.  * modifiy if it doesn't.
  9.  *
  10.  * The information required to develop this simple program was obtained
  11.  * from the file TECH.DOC which is available from Aritsoft.
  12.  *
  13.  * MAP will tell you the version of the NOS you are running under, display
  14.  * the redirections which are in effect for your machine and also show you
  15.  * all of the servers that you are logged into.
  16.  *
  17.  * If you find this program useful, a contribution would be appreciated.
  18.  *
  19.  * Author:    Ken Cline
  20.  *            4755 Meadow Wood Lane, Suite 202-N
  21.  *            Chantilly, VA  22021-2808
  22.  *
  23.  * Date:    February 12, 1991
  24.  *
  25.  * Added support for group mail.
  26.  *
  27. */
  28.  
  29. #include <stdio.h>
  30. #include <stdlib.h>
  31. #include <string.h>
  32. #include <conio.h>
  33. #include <dos.h>
  34.  
  35. typedef unsigned char    byte;
  36. typedef unsigned int    word;
  37. typedef unsigned long    dword;
  38. typedef word            Date;
  39. typedef word            Time;
  40.  
  41. //
  42. // Queue entry record structure
  43. //
  44.  
  45. typedef struct QE
  46.     {
  47.     byte    QE_status;                // Status of queue entry
  48.     dword    QE_size;                // size of spooled file
  49.     byte    QE_type;                // Type of queue entry
  50.     byte    QE_output_control;        // Control of despooled file
  51.     word    QE_copies;                // Number of copies
  52.     dword    QE_sequence;            // Sequence number of queue entry
  53.     char    QE_spooled_file[48];    // Pathname of spooled file
  54.     char    QE_user[16];            // Username of spooled file owner
  55.     char    QE_machine[16];            // Name of machine of origin
  56.     Date    QE_date;                // Date file was spooled
  57.     Time    QE_time;                // Time file was spooled
  58.     char    QE_destination[17];        // Asciiz device name / username of Target
  59.     char    QE_comment[48];            // Comment field
  60.     } QE;
  61.  
  62. // QE_status values
  63.  
  64. #define QE_status_free            0    // Entry is available
  65. #define QE_status_update        1   // Entry being updated
  66. #define QE_status_hold          2   // Entry is held
  67. #define QE_status_wait          3   // Entry is waiting to be despooled
  68. #define QE_status_active        4   // Entry is being despooled
  69. #define QE_status_cancel        5   // Entry has been cancelled
  70. #define QE_status_file_error    6   // Spooled file could not be accessed
  71. #define QE_status_spool_error   7   // Destination file could not be accessed
  72. #define QE_status_rush          8   // This is a 'rush' job
  73.  
  74. // QE_type values
  75.  
  76. #define QE_type_print            0    // Spooled printer file
  77. #define QE_type_message            1   // Spooled message (mail)
  78. #define QE_type_local_file      2   // Spooled local file
  79. #define QE_type_remote_file     3   // Spooled remote file
  80. #define QE_type_modem           4   // Spooled to remote modem
  81. #define QE_type_batch           5   // Spooled batch processor file
  82.  
  83. // QE_output_control values
  84.  
  85. #define QE_OC_keep             0x40    // Keep after despooling (don't delete)
  86. #define QE_OC_voice            0x20    // For mail - file contains voice mail
  87.  
  88. //
  89. // User Account record structure
  90. //
  91.  
  92. typedef struct UA
  93.     {
  94.     char    UA_name[16];        // Blank padded user name
  95.     byte    UA_reserved[16];    // Reserved
  96.     char    UA_description[32];    // Full user description
  97.     byte    UA_privilege;        // Privilige bits
  98.     byte    UA_concurrent;        // Max concurrent logins
  99.     byte    UA_allowed_times[42];  // 1 bit for each half hour
  100.                                    //       seven days a week
  101.                                    //        begins on Sunday
  102.                                    //        0 means allowed
  103.     word    UA_reserved0[2];     // Reserved
  104.     Time    UA_last_login;        // Time last logged in
  105.     Date    UA_account_expire;    // Account expiration date
  106.     Date    UA_passwrd_expire;    // Password expiration date
  107.                                 //        0 = no expiration date
  108.     byte    UA_passwrd_extend;    // 1-31 number of days to extend extend
  109.                                 //         password after change
  110.     byte    UA_reserved1[5];    // Reserved
  111.     } UA;
  112.  
  113. #define UA_priv_superACL    0x80    // Bypass ACL's
  114. #define UA_priv_superQueue    0x40    // Bypass queue protection
  115. #define UA_priv_peer        0x20    // Treat as local process
  116. #define UA_priv_superMail    0x10    // Bypass mail protection
  117. #define UA_priv_audit        0x08    // Allow creation of audit entry
  118. #define UA_priv_system        0x04    // System manager
  119.  
  120. #define FALSE    0
  121. #define TRUE    !FALSE
  122.  
  123. #define IsRedirector    0x08    // Redir is installed
  124.  
  125. int        NetBIOSExists (void);
  126. byte     InstalledStatus (void);
  127. int        LANOSVersion (int *Major, int *Minor);
  128. int        GetMachineName (char *MachineName, int *NetBIOSNum);
  129. int        GetAccountInfo (char *ServerName, UA *UA_Info);
  130. int        GetRedirection (word *RedirIndex, byte *DevType, byte *DevStatus,
  131.                     char *LocalName,  char *RemoteName);
  132. int        GetLoginEntry (word *ServerIndex, char *ServerName);
  133. int        GetQueueEntry (word *EntryNum, char *ServerName, QE *QueueEntry);
  134. void     main (void);
  135.  
  136. int NetBIOSExists ()
  137. {
  138.     byte    IllegalNcb[64];
  139.     void    interrupt (*int5C) ();
  140.     word    int5Cseg;
  141.     union    REGS    regs;
  142.     int        retc = FALSE;
  143.  
  144.     int5C = getvect (0x5C);
  145.     int5Cseg = FP_SEG (int5C);
  146.  
  147.     if (int5Cseg != 0)
  148.         {
  149.         if (int5Cseg != 0xF000)
  150.             {
  151.             memset (&IllegalNcb, '\0', sizeof (IllegalNcb));
  152.             IllegalNcb [0] = 0x7F;
  153.  
  154.             regs.x.bx = FP_OFF (IllegalNcb);
  155.             regs.h.al = 0;
  156.  
  157.             int86 (0x5C, ®s, ®s);
  158.  
  159.             if (regs.h.al != 0)
  160.                 {
  161.                 retc = TRUE;
  162.                 }
  163.             }
  164.         }
  165.     return (retc);
  166. }
  167.  
  168. byte InstalledStatus ()
  169. {
  170.     union REGS    regs;
  171.  
  172.     regs.x.ax = 0xB800;
  173.  
  174.     int86 (0x2F, ®s, ®s);
  175.  
  176.     if (regs.h.al == 0)
  177.         {
  178.         regs.h.bl = 0;
  179.         }
  180.  
  181.     return (regs.h.bl);
  182. }
  183.  
  184. int    LANOSVersion (int *Major, int *Minor)
  185. {
  186.     union REGS    regs;
  187.  
  188.     regs.x.ax = 0xB809;
  189.  
  190.     int86 (0x2F, ®s, ®s);
  191.  
  192.     *Major = regs.h.ah;
  193.     *Minor = regs.h.al;
  194.  
  195.     return (regs.h.al);
  196. }
  197.  
  198. int    GetMachineName (char *MachineName, int *NetBIOSNum)
  199. {
  200.     union     REGS    regs;
  201.     struct SREGS    sregs;
  202.     int                retc = TRUE;
  203.     char            NetBIOSName[16];
  204.  
  205.     regs.x.ax = 0x5E00;
  206.  
  207.     sregs.ds = FP_SEG (NetBIOSName);
  208.     regs.x.dx = FP_OFF (NetBIOSName);
  209.  
  210.     intdosx (®s, ®s, &sregs);
  211.  
  212.     if (regs.h.ch == 0)
  213.         {
  214.         retc = FALSE;
  215.         }
  216.     else
  217.         {
  218.         strncpy (MachineName, NetBIOSName, 16);
  219.         *NetBIOSNum = regs.h.cl;
  220.         }
  221.  
  222.     return (retc);
  223. }
  224.  
  225. int        GetAccountInfo (char *ServerName, UA *UA_Info)
  226. {
  227.     union     REGS    regs;
  228.     struct SREGS     sregs;
  229.     int                retc = TRUE;
  230.  
  231.     regs.x.ax = 0x5F87;
  232.  
  233.     regs.x.di = FP_OFF (ServerName);
  234.     sregs.es  = FP_SEG (ServerName);
  235.  
  236.     regs.x.si = FP_OFF (UA_Info);
  237.     sregs.ds  = FP_SEG (UA_Info);
  238.  
  239.     intdosx (®s, ®s, &sregs);
  240.  
  241.     if (regs.x.cflag != 0)
  242.         {
  243.         retc = FALSE;
  244.         }
  245.  
  246.     return (retc);
  247. }
  248.  
  249. int    GetRedirection (word *RedirIndex, byte *DevType, byte *DevStatus,
  250.                     char *LocalName,  char *RemoteName)
  251. {
  252.     union     REGS    regs;
  253.     struct SREGS     sregs;
  254.     int                retc = TRUE;
  255.  
  256.     regs.x.ax = 0x5F02;
  257.     regs.x.bx = *RedirIndex;
  258.  
  259.     regs.x.si = FP_OFF (LocalName);
  260.     regs.x.di = FP_OFF (RemoteName);
  261.  
  262.     sregs.ds = FP_SEG (LocalName);
  263.     sregs.es = FP_SEG (RemoteName);
  264.  
  265.     intdosx (®s, ®s, &sregs);
  266.  
  267.     if (regs.x.cflag != 0)
  268.         {
  269.         retc = FALSE;
  270.         *DevType = 0;
  271.         *DevStatus = 1;
  272.         }
  273.     else
  274.         {
  275.         *DevType = regs.h.bl;
  276.         *DevStatus = regs.h.bh & 1;
  277.         }
  278.  
  279.     return (retc);
  280. }
  281.  
  282. int        GetLoginEntry (word *ServerIndex, char *ServerName)
  283. {
  284.     union     REGS    regs;
  285.     struct SREGS     sregs;
  286.     int                retc = TRUE;
  287.  
  288.     regs.x.ax = 0x5F80;
  289.     regs.x.bx = *ServerIndex;
  290.  
  291.     regs.x.di = FP_OFF (ServerName);
  292.     sregs.es  = FP_SEG (ServerName);
  293.  
  294.     intdosx (®s, ®s, &sregs);
  295.  
  296.     if (regs.x.cflag != 0)
  297.         {
  298.         retc = FALSE;
  299.         }
  300.  
  301.     return (retc);
  302. }
  303.  
  304. int    GetQueueEntry (word *EntryNum, char *ServerName, QE *QueueEntry)
  305. {
  306.     union     REGS    regs;
  307.     struct SREGS     sregs;
  308.     int                retc = TRUE;
  309.  
  310.     regs.x.ax = 0x5FA0;
  311.  
  312.     regs.x.di = FP_OFF (ServerName);
  313.     sregs.es  = FP_SEG (ServerName);
  314.  
  315.     regs.x.si = FP_OFF (QueueEntry);
  316.     sregs.ds  = FP_SEG (QueueEntry);
  317.  
  318.     regs.x.bx = *EntryNum;
  319.  
  320.     intdosx (®s, ®s, &sregs);
  321.  
  322.     if (regs.x.cflag)
  323.         {
  324.         retc = FALSE;
  325.         }
  326.     else
  327.         {
  328.         *EntryNum = regs.x.bx;
  329.         }
  330.  
  331.     return (retc);
  332.  
  333.  
  334. }
  335.  
  336. void main ()
  337. {
  338.     byte    NetResources = 0;
  339.     char    MachineName[17];
  340.     int        NetBIOSNum;
  341.     int        Major, Minor;
  342.     int        SpoolMode;
  343.     word    RedirIndex = 0, ServerIndex= 0;
  344.     char    LocalName[17];
  345.     char    ServerName[20];
  346.     char    RemoteName[128];
  347.     byte    DevType, DevStatus;
  348.     word    EntryNum;
  349.     int        MailCount;
  350.     QE        QueueEntry;
  351.     UA        UserAcct;
  352.     char    *astr;
  353.  
  354.     ServerName [0] = '\\';
  355.     ServerName [1] = '\\';
  356.  
  357.     clrscr();
  358.     if (NetBIOSExists () != TRUE)
  359.         {
  360.         puts ("NetBIOS not installed, processing aborted!!");
  361.         exit (1);
  362.         }
  363.  
  364.     NetResources = InstalledStatus ();
  365.     if (!(NetResources & IsRedirector))
  366.         {
  367.         puts ("REDIR.EXE not installed, processing aborted!");
  368.         exit (2);
  369.         }
  370.  
  371.     LANOSVersion (&Major, &Minor);
  372.     printf ("\n\r%15sLANtastic Network Operating System - Version %d.%02d",
  373.             " ", Major, Minor);
  374.  
  375.     memset (MachineName, '\0', sizeof (MachineName));
  376.     GetMachineName (&MachineName[0], &NetBIOSNum);
  377.  
  378.     printf ("\n\n\rMachine Name: %s\n", MachineName);
  379.  
  380.     printf ("\n\r%16s ══ %s\n", "Local Name", "Remote Device");
  381.     while (GetRedirection (&RedirIndex, &DevType, &DevStatus,
  382.                            &LocalName[0], &RemoteName[0]))
  383.         {
  384.         printf ("\n\r%16s ══ %s", LocalName, RemoteName);
  385.         RedirIndex++;
  386.         }
  387.  
  388.     printf ("\n\n\rLogged in to the following servers:\n");
  389.  
  390.     while (GetLoginEntry (&ServerIndex, &ServerName[2]))
  391.         {
  392.         EntryNum = 0;
  393.         MailCount = 0;
  394.         GetAccountInfo (ServerName, &UserAcct);
  395.         while (GetQueueEntry (&EntryNum, ServerName, &QueueEntry))
  396.             {
  397.             if (QueueEntry.QE_type == QE_type_message)
  398.                 {
  399.                 if (stricmp (QueueEntry.QE_destination, UserAcct.UA_name) == 0)
  400.                     {
  401.                     MailCount++;
  402.                     }
  403.                 else
  404.                     {
  405.                     if ((astr = strchr (QueueEntry.QE_destination, '*'))
  406.                         != NULL)
  407.                         {
  408.                         if (strncmp (QueueEntry.QE_destination,
  409.                             UserAcct.UA_name,
  410.                             astr - QueueEntry.QE_destination) == 0)
  411.                             {
  412.                             MailCount++;
  413.                             }
  414.                         }
  415.                     }
  416.                 }
  417.             }
  418.         printf ("\n\r%3s%-20s  as %-20s With %3d Mail Message%c",
  419.                  " ", ServerName, UserAcct.UA_name, MailCount,
  420.                  MailCount == 1 ? ' ' : 's');
  421.         ServerIndex++;
  422.         }
  423. }
  424.