home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 074.lha / AssignDevice / AssignDev.c < prev    next >
C/C++ Source or Header  |  1986-11-20  |  5KB  |  168 lines

  1. /****************************************************************************
  2. * A S S I G N D E V . C
  3. *
  4. *   Duplicate a device in place--Allowing multiple names to a device.
  5. *
  6. *   Phillip Lindsay (c) 1987 Commodore-Amiga, Inc.
  7. *   Unlimited use granted as long as copyright remains intact.
  8. ****************************************************************************/
  9.  
  10. #include <exec/types.h>
  11. #include <exec/nodes.h>
  12. #include <exec/lists.h>
  13. #include <exec/memory.h>
  14. #include <libraries/dos.h>
  15. #include <libraries/dosextens.h>
  16. #include <libraries/filehandler.h>
  17.  
  18.  
  19. #ifdef AZTEC_C
  20. #include <functions.h>
  21. #include <stdio.h>
  22. #else
  23. #include <lattice/stdio.h>
  24. #endif
  25.  
  26. extern  struct  DosLibrary      *DOSBase;
  27.  
  28.  
  29. /*
  30.  * external functions found in "misc.c"
  31.  */
  32. extern  BSTR    ctob();
  33. extern  char    *allocstr(),
  34.                 *btoc(),
  35.                 *strupper();
  36. extern  BOOL    ourdevnode();
  37. extern  BOOL    finddosnode();
  38. extern  VOID    freedev(),
  39.                 dupdev(),
  40.                 adddosnode(),
  41.                 trunc(),
  42.                 memfill(),
  43.                 memcpy();
  44.                 
  45.  
  46. main(argc,argv)
  47. int argc;
  48. char **argv;
  49. {
  50.     struct              RootNode    *rnode;     /* root node pointer        */
  51.     struct              DosInfo     *dinfo;     /* DOS info pointer         */
  52.     register    struct  DeviceNode  *dnode;     /* device entry pointer     */
  53.     register    struct  DeviceNode  *lastdnode; /* last device pointer      */
  54.     char                            *bname,     /* tmp. ptr to bstr         */
  55.                                     name[32],   /* tmp. for device name     */
  56.                                     *oldname,   /* existing device name     */
  57.                                     *newname;   /* new device name          */
  58.     LONG                            error = 1;  /* flag error - 1 initially */
  59.                                     
  60.  
  61.     if(argc == 3)       /* duplicate given device  */
  62.     {
  63.         newname = argv[1];
  64.         trunc(strupper(newname),':');
  65.         
  66.         if( finddosnode(newname) )
  67.         {
  68.             printf("Error: Device %s: already exists.\n",newname);
  69.             exit(0);
  70.         }
  71.         
  72.         oldname = argv[2];
  73.         trunc(strupper(oldname),':');
  74.  
  75.     }
  76.     else if(argc == 2)  /* try and remove specified device */
  77.     {
  78.         oldname = argv[1];
  79.         trunc(strupper(oldname),':');
  80.         newname = NULL;
  81.     }                                        
  82.     else                /* ??? give them usage info */ 
  83.     {
  84.         printf("Usage: %s [new device] [old device]\n",argv[0]);
  85.         printf("       %s [old device]\n",argv[0]);
  86.         exit(0);
  87.     }        
  88.     
  89.    
  90.     rnode   = (struct RootNode *)  DOSBase->dl_Root;        /* find root node */
  91.     dinfo   = (struct DosInfo  *)  BADDR(rnode->rn_Info);   /* now dos info   */
  92.  
  93. /*
  94.  * Here we search for the given device name and once found we will duplicate
  95.  * the entire device data structure.  Then we add a new device node with
  96.  * the supplied name to the device list. If no "newname" is specified the
  97.  * given device is removed from the device list and free memory for the device
  98.  * node and device name. (normally you only delete nodes you created...I do 
  99.  * take precautions to NOT delete existing system devices...I add a key to
  100.  * the end of the device name to flag the device node as being created by
  101.  * ASSIGNDEV. 
  102.  */
  103.     lastdnode = NULL;
  104.     
  105.     if(!newname) 
  106.         printf("Removing Device %s:\n",oldname);
  107.     else
  108.         printf("Duplicating Device %s: -> %s:\n",oldname,newname);
  109.         
  110.     Forbid();          /* protect ourselves */
  111.     
  112.     for(dnode = (struct DeviceNode *) BADDR(dinfo->di_DevInfo); ( dnode );
  113.       dnode = (struct DeviceNode *) BADDR(dnode->dn_Next))
  114.     {
  115.         if( dnode->dn_Type == DLT_DEVICE )  /* Are dealing with a device? */
  116.         {
  117.             bname = (char *) BADDR(dnode->dn_Name);
  118.             memcpy(bname, name, (ULONG)( bname[0] + 1 ) );
  119.             if( !( strcmp( oldname, strupper(btoc(name)) ) ) )
  120.             {
  121.                 error = FALSE;
  122.                 if( newname )
  123.                     dupdev(dnode,newname);
  124.                 else if( lastdnode )
  125.                 {
  126.                     if( ourdevnode(dnode) )
  127.                     {
  128.                         lastdnode->dn_Next = dnode->dn_Next;
  129.                         freedev(dnode);
  130.                     }
  131.                     else
  132.                         error = 2;
  133.                         
  134.                 }
  135.                 else  
  136.                 {
  137.                     if( ourdevnode(dnode) )
  138.                     {
  139.                         dinfo->di_DevInfo = dnode->dn_Next;
  140.                         freedev(dnode);
  141.                     }
  142.                     else
  143.                         error = 2;
  144.                 }
  145.                 
  146.                 break;
  147.             }   
  148.         }
  149.         
  150.         lastdnode = dnode;
  151.     }
  152.  
  153.     Permit(); 
  154.  
  155. if(error == 1) 
  156.     puts("Error: Device not found.");
  157. else if(error == 2)
  158.     puts("Error: Cannot remove device."); 
  159.      
  160. exit(0);
  161.  
  162. }
  163.  
  164. /* eof */
  165.  
  166.  
  167.