home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_progs / prog_c / handler.lzh / HANDLER / IHAND.C < prev    next >
C/C++ Source or Header  |  1991-11-01  |  3KB  |  102 lines

  1. /* ihand.c
  2.  *
  3.  * Install a AmigaDos Handler - ( dependent release 1.2 )
  4.  *
  5.  * 20-SEP-86 - Phillip Lindsay - (C) Commodore 1986  
  6.  *  You may freely distribute this source and use it for Amiga Development -
  7.  *  as long as the Copyright notice is left intact.
  8.  *
  9.  * (! Please don't make using this routine a habit, release 1.2 WORKBENCH
  10.  *    greater than >33.43 offers a new mount command that will allow 
  11.  *    specification of GlobalVec for non-BCPL modules - Thanks to Andy Finkel !)
  12.  * 
  13.  * Example "DEVS:MOUNTLIST" :
  14.  *------------------------------------------------------------------------------
  15.  * MY0:        Handler   = l:my-handler
  16.  *          Stacksize = 5000
  17.  *          Priority  = 5
  18.  *          GlobVec   = 1
  19.  * #
  20.  *------------------------------------------------------------------------------
  21.  */
  22.  
  23.  
  24. #include <exec/types.h>
  25. #include <exec/memory.h>
  26. #include <libraries/dos.h>
  27. #include <libraries/dosextens.h>
  28. #include <libraries/expansion.h>
  29. #include <libraries/filehandler.h>
  30. #include <functions.h>
  31.  
  32. #define OVER         0x02L                 /* BSTR overhead for size+NULL  */
  33.  
  34. #define HANDNAMESIZE (0x0cL+OVER)          /* size of BSTR+NULL            */
  35. #define HANDNAME     "\x0cl:my-handler\0"  /* BSTR format handler name     */
  36.  
  37. #define DEVNAMESIZE  (0x03L+OVER)          /* size of BSTR+NULL            */
  38. #define DEVNAME      "\x03MY0\0"           /* BSTR of device name          */
  39.  
  40. #define PRIORITY    5L
  41. #define STACKSIZE    5000L
  42. #define GLOBALVEC    -1L
  43.  
  44. ULONG ExpansionBase;                        /* for expansion library (1.2) */
  45.  
  46. main()
  47. {
  48.  
  49.  struct DeviceNode *mynode;
  50.  
  51.  UBYTE *handname; 
  52.  
  53.  UBYTE  *devname;
  54.  
  55.  
  56.  handname = AllocMem((ULONG)(HANDNAMESIZE),MEMF_PUBLIC | MEMF_CLEAR);
  57.  if(!handname) 
  58.    exit(TRUE);
  59.  strcpy(handname,HANDNAME);
  60.  
  61.  devname =   AllocMem((ULONG)(DEVNAMESIZE),MEMF_PUBLIC | MEMF_CLEAR);
  62.  if(!devname)
  63.   { 
  64.    FreeMem(handname,(ULONG)(HANDNAMESIZE));
  65.    exit(TRUE);
  66.   }
  67.  strcpy(devname,DEVNAME);
  68.  
  69.  mynode = AllocMem((ULONG)sizeof(*mynode),MEMF_PUBLIC | MEMF_CLEAR); 
  70.  
  71.  if(!mynode) 
  72.   {
  73.    FreeMem(handname,(ULONG)(HANDNAMESIZE));
  74.    FreeMem(devname,(ULONG)(DEVNAMESIZE));
  75.    exit(TRUE);
  76.   }
  77.  
  78.  mynode->dn_Priority     = PRIORITY;
  79.  mynode->dn_StackSize    = STACKSIZE;
  80.  mynode->dn_GlobalVec    = GLOBALVEC;   /* (-1) the trick for non-bcpl module */
  81.  mynode->dn_Name         = (BSTR) ((ULONG)devname  >> 2); /* to BPTR */
  82.  mynode->dn_Handler      = (BSTR) ((ULONG)handname >> 2); /* ""  ""  */
  83.  
  84. /* This will fail if your not 1.2 */
  85.  ExpansionBase = (ULONG) OpenLibrary(EXPANSIONNAME,0L); 
  86.  
  87.  if(!ExpansionBase) 
  88.   {
  89.    FreeMem(handname,(ULONG)(HANDNAMESIZE+2)); 
  90.    FreeMem(devname,(ULONG)(DEVNAMESIZE+2));
  91.    FreeMem(mynode,(ULONG)sizeof(*mynode));
  92.    exit(TRUE);
  93.   }
  94.  
  95.   AddDosNode(0L,0L,mynode);
  96.  
  97.   CloseLibrary(ExpansionBase);  
  98.   
  99. }
  100.  
  101. /* EOF - ihand.c */
  102.