home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 4 / FreshFish_May-June1994.bin / useful / dist / disk / cdrom / amicdrom / device.c < prev    next >
C/C++ Source or Header  |  1994-04-20  |  42KB  |  1,487 lines

  1. /* device.c:
  2.  *
  3.  * Handler for ISO-9660 (+ Rock Ridge) + HFS CDROM filing system.
  4.  * Based on DOSDEV V1.10 (2 Nov 87) by Matthew Dillon.
  5.  *
  6.  * ----------------------------------------------------------------------
  7.  * This code is (C) Copyright 1993,1994 by Frank Munkert.
  8.  * All rights reserved.
  9.  * This software may be freely distributed and redistributed for
  10.  * non-commercial purposes, provided this notice is included.
  11.  * ----------------------------------------------------------------------
  12.  * History:
  13.  *
  14.  * 20-Apr-94   fmu   Improved implementation of ACTION_INHIBIT.
  15.  * 17-Apr-94   fmu   Fixed bug concerning TRACKDISK disk change recognition.
  16.  * 12-Apr-94   fmu   Adapted ACTION_CURRENT_VOLUME to new filehandle
  17.  *             management.
  18.  * 09-Apr-94   fmu   Volume management: locks and filehandles will not
  19.  *                   be forgotten if a CDROM is removed from the drive.
  20.  * 06-Feb-94   dmb   - Full support for ACTION_INHIBIT
  21.  *                   - Change Check_Disk() for trackdisk support
  22.  * 05-Jan-93   fmu   - Retry displaying CD-DA icon if WB is not open.
  23.  *                   - id_UnitNumber of InfoData set to SCSI unit number.
  24.  *                   - Added Make_FSSM().
  25.  * 01-Jan-93   fmu   Support for symbolic links on RockRidge disks.
  26.  * 11-Dec-93   fmu   - ACTION_FLUSH always returns DOSTRUE.
  27.  *                   - ISO volume names are mapped to lowercase if
  28.  *                     the option LOWERCASE has been selected.
  29.  * 26-Nov-93   fmu   Some packets are now handled even if no disk
  30.  *                   is inserted.
  31.  * 21-Nov-93   fmu   - User programmable diskchange check interval.
  32.  *                   - Better support for ACTION_INHIBIT.
  33.  *                   - Handles filenames with ';'.
  34.  * 15-Nov-93   fmu   Missing return value for 'handler' inserted.
  35.  * 14-Nov-93   fmu   Added ACTION_USER packet for 'cdcontrol' program.
  36.  * 15-Oct-93   fmu   Adapted to new VOLUME structure.
  37.  * 10-Oct-93   fmu   - Creates volume node for 'no DOS' disks.
  38.  *             - Volume node now contains the correct volume
  39.  *               creation date.
  40.  * 09-Oct-93   fmu   - New format for mountlist startup field.
  41.  *             - SAS/C support.
  42.  *             - Debug process assembly tag adapted to small
  43.  *               memory model.
  44.  *             - Get_Startup moved to file devsupp.c.
  45.  * 03-Oct-93   fmu   - New buffering options 'S' and 'C'.
  46.  *                   - Fixed bug in cdlock.
  47.  *             - Fixed bug in ACTION_CURRENT_VOLUME.
  48.  * 27-Sep-93   fmu   Added ACTION_SAME_LOCK
  49.  * 25-Sep-93   fmu   - Send 'disk inserted' / 'disk removed' event via
  50.  *                     input.device if disk has been changed.
  51.  *                   - Corrected bug in ACTION_DISK_INFO.
  52.  * 24-Sep-93   fmu   - Added fast memory option 'F'.
  53.  *                   - Added ACTION_IS_FILESYSTEM.
  54.  *                   - Added 'write protected' error for write actions.
  55.  *                   - Added ACTION_CURRENT_VOLUME.
  56.  *                   - Unload handler code after ACTION_DIE.
  57.  *                   - Immediately terminate program if called from CLI.
  58.  *                   - Added library version number.
  59.  *                   - Set volume label to "Unnamed" for disks without name.
  60.  * 16-Sep-93   fmu   Added code to detect whether a lock stems from the
  61.  *                   current volume or from another volume which has
  62.  *                   been removed from the drive.
  63.  */
  64.  
  65. /*
  66.  *  Debugging routines are disabled by simply attempting to open the
  67.  *  file "debugoff", turned on again with "debugon".  No prefix may be
  68.  *  attached to these names (you must be CD'd to TEST:).
  69.  *
  70.  *  See Documentation for a detailed discussion.
  71.  */
  72.  
  73. #include <stdlib.h>
  74. #include <string.h>
  75.  
  76. #if defined(_DCC) && !defined(REGISTERED)
  77. #define abs
  78. #endif
  79.  
  80. #include "device.h"
  81. #include "intui.h"
  82. #include "devsupp.h"
  83. #include "cdcontrol.h"
  84. #include "params.h"
  85. #include "rock.h"
  86.  
  87. /*
  88.  *  Since this code might be called several times in a row without being
  89.  *  unloaded, you CANNOT ASSUME GLOBALS HAVE BEEN ZERO'D!!  This also goes
  90.  *  for any global/static assignments that might be changed by running the
  91.  *  code.
  92.  */
  93.  
  94. PROC    *DosProc;     /* Our Process                        */
  95. DEVNODE *DosNode;     /* Our DOS node.. created by DOS for us            */
  96. DEVLIST *DevList;     /* Device List structure for our volume node       */
  97.  
  98. #if !defined(_DCC) || defined(REGISTERED)
  99. EXECLIB *SysBase;     /* EXEC library base                */
  100. #endif
  101. DOSLIB    *DOSBase;     /* DOS library base for debug process        */
  102. LIB    *UtilityBase; /* Utility library for miscellaneous tasks     */
  103.  
  104. CDROM   *g_cd;
  105. VOLUME  *g_volume;
  106. CDROM_OBJ *g_top_level_obj;
  107. char    *g_vol_name;
  108.  
  109. PORT *g_timer_mp;           /*  timer message port        */
  110. struct timerequest *g_timer_io; /*  timer i/o request        */
  111. ULONG g_timer_sigbit;
  112. ULONG g_dos_sigbit;
  113.  
  114. char    g_device[80];        /* SCSI device name */
  115. short    g_unit;            /* SCSI unit */
  116. short    g_use_rock_ridge;    /* Use Rock Ridge flag 'R' */
  117. short    g_map_to_lowercase;    /* Map to lower case flag 'L' */
  118. int     g_trackdisk;        /* Use trackdisk calls instead of SCSI-direct */
  119.  
  120. int    g_std_buffers;        /* Number of buffers for standard SCSI access */
  121. int    g_file_buffers;        /* Number of buffers for contiguous reads */
  122.  
  123. t_bool    g_show_version_numbers; /* Show version numbers */
  124.  
  125. int    g_scan_interval;    /* Time between successive diskchange checks */
  126.  
  127. t_bool    g_disk_inserted;    /* Is a disk inserted? */
  128.  
  129. char    g_play_cdda_command[80];/* Command invoked if appicon is activated */
  130.  
  131. int    g_inhibited;        /* Number of active INHIBIT(TRUE) packets */
  132.  
  133. struct MsgPort *DosTask;
  134.  
  135. #if !defined(NDEBUG) || defined(DEBUG_SECTORS)
  136.             /*    DEBUGGING            */
  137. PORT *Dbport;        /*    owned by the debug process    */
  138. PORT *Dback;        /*    owned by the DOS device driver    */
  139. short DBDisable;
  140. MSG DummyMsg;        /*    Dummy message that debug proc can use    */
  141. #endif
  142.  
  143. void *dosalloc(ulong);
  144. void dosfree (ulong *);
  145. void btos(LONG, char *);
  146. void *NextNode (NODE *);
  147. void *GetHead (LIST *);
  148. LOCK *cdlock(CDROM_OBJ *, int);
  149. void cdunlock (LOCK *);
  150. CDROM_OBJ *getlockfile (LONG);
  151. char *typetostr (int);
  152. void returnpacket(struct DosPacket *);
  153. int packetsqueued (void);
  154. int Check_For_Volume_Name_Prefix (char *);
  155. void Fill_FileInfoBlock (FIB *, CDROM_INFO *, VOLUME *);
  156. void Mount (void);
  157. void Unmount (int);
  158. int Mount_Check (void);
  159. void Check_Disk (void);
  160. void Send_Timer_Request (void);
  161. void Cleanup_Timer_Device (void);
  162. int Open_Timer_Device (void);
  163. void Send_Event (int);
  164. void Remove_Seglist (void);
  165. BPTR Make_FSSM (void);
  166.  
  167. /*
  168.  *  Don't call the entry point main().  This way, if you make a mistake
  169.  *  with the compile options you'll get a link error.
  170.  */
  171.  
  172. #if defined(LATTICE)
  173. int __saveds handler (void)
  174. #elif defined(_DCC) && !defined(REGISTERED)
  175. int _main (void)
  176. #elif defined(_DCC) && defined(REGISTERED)
  177. __geta4 int handler (void)
  178. #else
  179. int handler (void)
  180. #endif
  181. {
  182.     register PACKET *packet;
  183.     register short   error;
  184.     MSG     *msg;
  185.     ubyte   notdone = 1;
  186.     char    buf[256];
  187.     void    *tmp;
  188.     ULONG   signals;
  189.     ubyte   playing = FALSE;
  190.  
  191.     /*
  192.      *    Initialize all global variables. SysBase MUST be initialized before
  193.      *  we can make Exec calls. The DOS library is opened for the debug
  194.      *  process only.
  195.      */
  196.  
  197. #if !defined(_DCC) || defined(REGISTERED)
  198.     SysBase = *(EXECLIB **) 4L;
  199. #endif
  200.     DosProc = (PROC *) FindTask(NULL);
  201.     if (DosProc->pr_CLI)
  202.       return RETURN_FAIL;
  203.     DOSBase = (DOSLIB *) OpenLibrary ((UBYTE *) "dos.library",37);
  204.     UtilityBase = (LIB *) OpenLibrary ((UBYTE *) "utility.library",37);
  205.  
  206.     BUG2(DBDisable = 0;)                /*  Init. globals    */
  207.     BUG2(Dbport = Dback = NULL;)
  208.     DevList = NULL;
  209.     {
  210.     WaitPort(&DosProc->pr_MsgPort);     /*  Get Startup Packet    */
  211.     msg = GetMsg(&DosProc->pr_MsgPort);
  212.     packet = (PACKET *)msg->mn_Node.ln_Name;
  213.  
  214.     /*
  215.      *  Loading DosNode->dn_Task causes DOS *NOT* to startup a new
  216.      *  instance of the device driver for every reference.    E.G. if
  217.      *  you were writing a CON device you would want this field to
  218.      *  be NULL.
  219.      */
  220.  
  221.         DosNode = BTOC(packet->dp_Arg3);
  222.  
  223.     Init_Intui ();
  224.  
  225.     if (UtilityBase && DOSBase && Get_Startup (packet->dp_Arg2)) {
  226.         packet->dp_Res1 = DOS_TRUE;
  227.          packet->dp_Res2 = 0;
  228.  
  229.       /*
  230.        *  Set dn_Task field which tells DOS not to startup a new
  231.        *  process on every reference.
  232.        */
  233.  
  234.             DosNo