home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 498b.lha / BTNtape_v2.0 / tapemon.c < prev    next >
C/C++ Source or Header  |  1991-04-08  |  5KB  |  163 lines

  1. /**
  2.  *  TapeMon:  a monitor program for the BTNtape handler.
  3.  */
  4. #define MVERSION  "TapeMon V2.0"
  5. /*
  6.  *  (c) Copyright 1990, 1991  Robert Rethemeyer
  7.  *   This software may be freely distributed and redistributed,
  8.  *   for non-commercial purposes, provided this notice is included.
  9.  *------------------------------------------------------------
  10.  *   Run TapeMon from a CLI to receive informational messages
  11.  *   from the BTN-Tape handler process.  To terminate the
  12.  *   monitor program, break the CLI using control-C or BREAK.
  13.  */
  14. #include <exec/types.h>
  15. #include <exec/nodes.h>
  16. #include <exec/lists.h>
  17. #include <exec/ports.h>
  18. #include <exec/tasks.h>
  19. #include <exec/execbase.h>
  20. #include <libraries/dos.h>
  21. #include <stdlib.h>
  22. #include <stdio.h>
  23. #include <string.h>
  24. #include "/tplink.h"
  25.  
  26. #if defined AZTEC_C
  27.   #include <functions.h>
  28. #elif defined LATTICE
  29.   #include <proto/exec.h>
  30.   #include <proto/dos.h>
  31. #endif
  32.  
  33. extern struct DosLibrary *DOSBase;
  34.  
  35. void main(int,char *[]);
  36. void toUPPER(char *);
  37.  
  38. void main(int argc, char *argv[])
  39. {
  40.  struct Task    *tapeproc;
  41.  struct tplink  *linktp;
  42.  char *tapename;
  43.  char *xx;
  44.  ULONG x;
  45.  int   run = 1;
  46.  int   fullsense = 0;
  47.  int   ii;
  48.  BYTE  signum;
  49.  BYTE  oldpri;
  50.  
  51.    printf("*** BTN-Tape Handler & Monitor ***\n(c) Copyright 1990,1991 Robert Rethemeyer\n");
  52.  
  53.    if(argc > 1) {
  54.       tapename = argv[1];
  55.       toUPPER(tapename);
  56.       xx = &tapename[strlen(tapename)-1];
  57.       if(*xx == ':') *xx = '\0';
  58.    }
  59.    else tapename = "TAPE";
  60.  
  61.    if(argc > 2) fullsense = 1;
  62.  
  63.    if (!(tapeproc = FindTask(tapename)))  {
  64.          printf("Process %s not found.\n",tapename);
  65.          exit(30);
  66.    }
  67.    if (!(linktp = (struct tplink *) tapeproc->tc_UserData))  {
  68.          printf("No linkage structure...\n wrong process, or\n handler not active yet?\n");
  69.          exit(31);
  70.    }
  71.    printf("%s: Proc %X DevNode %X\n",tapename,tapeproc,linktp->devnode);
  72.  
  73.    if (strcmp(linktp->keyword,"TapeHandler"))  {
  74.          printf("Process %s doesn't look like BTN-Tape\n",tapename);
  75.          exit(32);
  76.    }
  77.  
  78.    if (linktp->montask)  {
  79.          printf("There is already a TapeMon running\n");
  80.          exit(33);
  81.    }
  82.  
  83.    if (!linktp->handsig) {
  84.           printf("Handler has no signal\n");
  85.           exit(34);
  86.    }
  87.  
  88.    signum = AllocSignal(-1);
  89.    if (signum == -1)  {
  90.          printf("Unable to allocate signal for TapeMon\n");
  91.          exit(35);
  92.    }
  93.    linktp->monsig  = 1UL << signum;      /* give mask to tape handler */
  94.    linktp->montask = FindTask(0);        /* tell it where I am also   */
  95.  
  96.    printf("%s  Unit-%X  LU-%X\n",linktp->driver,*(linktp->unit),
  97.                                                 *(linktp->Lun)>>5);
  98.  
  99.    if(linktp->inquiry[8] != '\0')  printf("Drive: %s\n",linktp->inquiry+8);
  100.    if(linktp->inquiry[0] == 0x01)
  101.         printf("Sequential Access\n");
  102.    else if (linktp->inquiry[0] == 0x10)
  103.         printf("Direct Access\n");
  104.    else if (linktp->inquiry[0] == 0x7f)
  105.         printf("BAD LOGICAL UNIT NUMBER\n");
  106.    else printf("Device type = %X\n",linktp->inquiry[0]);
  107.  
  108.    if(linktp->badparm) printf("ERROR(S) IN STARTUP\n");
  109.  
  110.    if(linktp->sense)
  111.        printf("Last sense= %s, other=%02X,%02X\n",linktp->sense,linktp->xsns1,
  112.          linktp->xsns2);
  113.    printf("Use ^C to terminate TapeMon\n%s\n",linktp->version);
  114.  
  115.    /* Set the monitor priority to the same as that of the handler */
  116.    oldpri = SetTaskPri (linktp->montask, (long)tapeproc->tc_Node.ln_Pri);
  117.  
  118.    /* The main loop.  Wait for a signal from the handler, then print the
  119.       contents of dbb.  Some extra handshaking must then be done to sync
  120.       the two processes and prevent races.  If a control-C occurs during
  121.       a Wait, then finish whatever was in progress before ending the loop.
  122.    */
  123.  
  124.    while(run)  {
  125.      x=Wait(linktp->monsig | SIGBREAKF_CTRL_C);   /* Wait for req from hndlr */
  126.      if  (x & SIGBREAKF_CTRL_C) run = 0;
  127.      if(!(x & linktp->monsig) ) continue;
  128.  
  129.      printf(" %s",linktp->dbb);                   /* print handler's message */
  130.      if(fullsense && linktp->sns) {               /* If sense info           */
  131.         for(ii=0; ii<32; ii++)                    /*   print all sense info  */
  132.             printf(" %02X",linktp->sns[ii]);
  133.         printf("\n");
  134.      }
  135.  
  136.      Signal(tapeproc, linktp->handsig);           /* tell it we are 'done'   */
  137.  
  138.      x=Wait(linktp->monsig | SIGBREAKF_CTRL_C);   /* Wait for ack of 'done'  */
  139.      if  (x & SIGBREAKF_CTRL_C) run = 0;
  140.      if(!(x & linktp->monsig) ) Wait(linktp->monsig);
  141.  
  142.      Signal(tapeproc, linktp->handsig);           /* Ack his ack */
  143.    }
  144.  
  145.    /* Clean up and exit */
  146.  
  147.    SetTaskPri(linktp->montask, (long) oldpri);   /* restore priority */
  148.    linktp->montask = NULL;                      /* break link with handler */
  149.    linktp->monsig  = 0;
  150.    FreeSignal((ULONG)signum);
  151.    printf("TapeMon terminated\n");
  152.    exit(0);
  153. }
  154.  
  155. /**************************************************************************/
  156. /* toUPPER: convert string to upper case */
  157.  
  158. void toUPPER(char *zz)
  159. {
  160.   for(; *zz != '\0'; zz++)  if(*zz >= 'a') *zz -= 0x20;
  161.   return;
  162. }
  163.