home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / disk / Misc / medianotify / Changer.c next >
Encoding:
C/C++ Source or Header  |  1995-05-06  |  2.9 KB  |  133 lines

  1. /*
  2.     written by Daniel Balster, dbalster@uni-paderborn.de
  3. */
  4.  
  5. #include <exec/exec.h>
  6. #include <dos/dos.h>
  7. #include <devices/cd.h>
  8. #include <proto/exec.h>
  9. #include <proto/dos.h>
  10.  
  11. #define AllocStruct(X)    AllocVec(sizeof(struct X),MEMF_CLEAR|MEMF_PUBLIC)
  12. #define FreeStruct(X)    if (X) FreeVec(X)
  13.  
  14. #define CHANGESIGNAL    (1L<<(ULONG)signal)
  15.  
  16. /* get the external assembler-irq code */
  17.  
  18. extern VOID ChangeNotifier (VOID);
  19.  
  20. ULONG signal;
  21.  
  22. #define TEMPLATE "DEVICE/A,UNIT/N/A,INSERT,REMOVE,QUIET/S"
  23.  
  24. struct {
  25.     STRPTR    device;
  26.     ULONG    unit;
  27.     STRPTR    insert;
  28.     STRPTR    remove;
  29.     BOOL    quiet;
  30.     ULONG    pads[11];
  31. } args = {0};
  32.  
  33. int main (void)
  34. {
  35.     struct RDArgs *rdargs;
  36.     struct MsgPort *mp;
  37.     struct IOStdReq *ior;
  38.     struct Interrupt *irq;
  39.     
  40.     ULONG signals;
  41.     BOOL quit = FALSE;
  42.  
  43.     if (!(signal = AllocSignal(-1))) return RETURN_FAIL;    /* we *NEED* a signal */
  44.  
  45.     if (rdargs=ReadArgs(TEMPLATE,(LONG*)&(args),NULL))
  46.     {
  47.         if(!args.quiet) PutStr("MediaNotify 1.0.0 - ©1995 by Daniel Balster\n");
  48.  
  49.         if (irq=AllocStruct(Interrupt))
  50.         {
  51.             if(mp=CreateMsgPort())
  52.             {
  53.                 if(ior=(struct IOStdReq*)CreateIORequest(mp,sizeof(struct IOStdReq)))
  54.                 {
  55.                     if(!OpenDevice(args.device,*(ULONG*)args.unit,ior,0))
  56.                     {
  57.                         if(!args.quiet) PutStr("MediaNotify Handler installed.\n");
  58.  
  59.                         irq->is_Code        = ChangeNotifier;
  60.                         irq->is_Data        = (APTR) FindTask(0);
  61.                         irq->is_Node.ln_Pri    = 10;
  62.                         irq->is_Node.ln_Type    = NT_INTERRUPT;
  63.                         irq->is_Node.ln_Name    = "MediaNotify Handler";
  64.  
  65.                         ior->io_Command    = TD_ADDCHANGEINT;
  66.                         ior->io_Flags    = 0;
  67.                         ior->io_Length    = sizeof(struct Interrupt);
  68.                         ior->io_Data    = (APTR) irq;
  69.                         SendIO(ior);
  70.                         
  71.                         if(!ior->io_Error)
  72.                         {
  73.  
  74.                         while (!quit)
  75.                         {
  76.                             signals = Wait (SIGBREAKF_CTRL_C|CHANGESIGNAL);
  77.                             
  78.                             if (signals&SIGBREAKF_CTRL_C)
  79.                             {
  80.                                 quit=TRUE;
  81.                             }
  82.                             
  83.                             if (signals&CHANGESIGNAL)
  84.                             {
  85.                                 ior->io_Command    = TD_CHANGESTATE;
  86.                                 ior->io_Flags    = IOF_QUICK;
  87.                                 ior->io_Length    = 0;
  88.                                 DoIO(ior);
  89.                             
  90.                                 if (ior->io_Actual)
  91.                                 {
  92.                                     if(!args.quiet) PutStr("Medium was removed.\n");
  93.                                     Execute(args.remove,NULL,NULL);
  94.                                 }
  95.                                 else
  96.                                 {
  97.                                     if(!args.quiet) PutStr("Medium was inserted.\n");                                
  98.                                     Execute(args.insert,NULL,NULL);
  99.                                 }
  100.                             }
  101.                         }
  102.  
  103.                             if(!args.quiet) PutStr("MediaNotify Handler removed.\n");
  104.  
  105.                             ior->io_Command    = TD_REMCHANGEINT;
  106.                             ior->io_Flags    = 0;
  107.                             ior->io_Length    = sizeof(struct Interrupt);
  108.                             ior->io_Data    = (APTR) irq;
  109.                             DoIO(ior);
  110.                         }
  111.                         else PrintFault (IoErr(),0);
  112.                         
  113.                         CloseDevice((struct IORequest*)ior);
  114.  
  115.                     } /* opendev err */
  116.                 
  117.                     DeleteIORequest((struct IORequest*)ior);
  118.                 } /* ioreq err */
  119.  
  120.                 DeleteMsgPort(mp);
  121.             } /* msgport err */
  122.             
  123.             FreeStruct(irq);
  124.         } /* irq node err */
  125.         
  126.         FreeArgs(rdargs);
  127.     } else PrintFault(IoErr(),0);
  128.  
  129.     FreeSignal (signal);
  130.  
  131.     return RETURN_OK;
  132. }
  133.