home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 4 / FreshFish_May-June1994.bin / useful / dist / disk / cdrom / amicdrom / cdcontrol.c < prev    next >
C/C++ Source or Header  |  1994-01-07  |  5KB  |  200 lines

  1. /* cdcontrol.c:
  2.  *
  3.  * Control program for the AmiCDROM handler.
  4.  *
  5.  * ----------------------------------------------------------------------
  6.  * This code is (C) Copyright 1993,1994 by Frank Munkert.
  7.  * All rights reserved.
  8.  * This software may be freely distributed and redistributed for
  9.  * non-commercial purposes, provided this notice is included.
  10.  */
  11.  
  12. #include <stdlib.h>
  13. #include <stdio.h>
  14.  
  15. #include <clib/dos_protos.h>
  16. #include <clib/exec_protos.h>
  17. #include <clib/utility_protos.h>
  18.  
  19. #include <exec/memory.h>
  20.  
  21. #ifdef AZTEC_C
  22. #include <pragmas/dos_lib.h>
  23. #include <pragmas/exec_lib.h>
  24. #include <pragmas/utility_lib.h>
  25. #endif
  26. #ifdef LATTICE
  27. #include <pragmas/dos_pragmas.h>
  28. #include <pragmas/exec_pragmas.h>
  29. #include <pragmas/utility_pragmas.h>
  30. extern struct Library *DOSBase;
  31. #endif
  32.  
  33. #include "cdcontrol.h"
  34.  
  35. struct Library *UtilityBase = NULL;
  36.  
  37. struct MsgPort *g_device_proc;
  38.  
  39. enum partype {
  40.   PAR_NONE,
  41.   PAR_ANY,
  42.   PAR_ON_OFF
  43. };
  44.  
  45. void Cleanup (void)
  46. {
  47.   if (UtilityBase)
  48.     CloseLibrary (UtilityBase);
  49. }
  50.  
  51. void Send_Packet (int p_cmd, void *p_1, void *p_2)
  52. {
  53.   struct MsgPort *replyport = CreateMsgPort ();
  54.   struct StandardPacket *packet = AllocMem (sizeof (struct StandardPacket),
  55.                           MEMF_CLEAR | MEMF_PUBLIC);
  56.   long res1, res2;
  57.  
  58.   if (!packet || !replyport) {
  59.     fprintf (stderr, "ERROR: cannot send packet\n");
  60.     exit (1);
  61.   }
  62.   
  63.   packet->sp_Msg.mn_Node.ln_Name = (char *) &(packet->sp_Pkt);
  64.   packet->sp_Pkt.dp_Link = &(packet->sp_Msg);
  65.  
  66.   packet->sp_Pkt.dp_Port = replyport;
  67.   packet->sp_Pkt.dp_Type = ACTION_USER;
  68.   packet->sp_Pkt.dp_Arg1 = p_cmd;
  69.   packet->sp_Pkt.dp_Arg2 = (ULONG) p_1;
  70.   packet->sp_Pkt.dp_Arg3 = (ULONG) p_2;
  71.  
  72.   PutMsg (g_device_proc, (struct Message *) packet);
  73.   WaitPort (replyport);
  74.   GetMsg (replyport);
  75.  
  76.   res1 = packet->sp_Pkt.dp_Res1;
  77.   res2 = packet->sp_Pkt.dp_Res2;
  78.   if (res1 == 0)
  79.     PrintFault (res2, (UBYTE *) "ERROR");
  80.  
  81.   FreeMem (packet, sizeof (struct StandardPacket));
  82.   DeleteMsgPort (replyport);
  83. }
  84.  
  85. void Cmd_Lowercase (void *p_1, void *p_2)
  86. {
  87.   Send_Packet (CDCMD_LOWERCASE, p_1, p_2);
  88. }
  89.  
  90. void Cmd_Mactoiso (void *p_1, void *p_2)
  91. {
  92.   Send_Packet (CDCMD_MACTOISO, p_1, p_2);
  93. }
  94.  
  95. void Cmd_Convertspaces (void *p_1, void *p_2)
  96. {
  97.   Send_Packet (CDCMD_CONVERTSPACES, p_1, p_2);
  98. }
  99.  
  100. void Cmd_Showversion (void *p_1, void *p_2)
  101. {
  102.   Send_Packet (CDCMD_SHOWVERSION, p_1, p_2);
  103. }
  104.  
  105. void Cmd_Hfsfirst (void *p_1, void *p_2)
  106. {
  107.   Send_Packet (CDCMD_HFSFIRST, p_1, p_2);
  108. }
  109.  
  110. void Cmd_Dataext (void *p_1, void *p_2)
  111. {
  112.   Send_Packet (CDCMD_DATAEXT, p_1, p_2);
  113. }
  114.  
  115. void Cmd_Resourceext (void *p_1, void *p_2)
  116. {
  117.   Send_Packet (CDCMD_RESOURCEEXT, p_1, p_2);
  118. }
  119.  
  120. struct par {
  121.   char *name;
  122.   char *abbrev;
  123.   enum partype par1;
  124.   enum partype par2;
  125.   void (*func)(void *, void *);
  126. } g_par[] = {
  127.   "lowercase",       "l",  PAR_ON_OFF,    PAR_NONE,    Cmd_Lowercase,
  128.   "mactoiso",       "mi", PAR_ON_OFF,    PAR_NONE,    Cmd_Mactoiso,
  129.   "convertspaces", "cs", PAR_ON_OFF,    PAR_NONE,    Cmd_Convertspaces,
  130.   "showversion",   "sv", PAR_ON_OFF,    PAR_NONE,    Cmd_Showversion,
  131.   "hfsfirst",       "hf", PAR_ON_OFF,    PAR_NONE,    Cmd_Hfsfirst,
  132.   "dataext",       "de", PAR_ANY,    PAR_NONE,    Cmd_Dataext,
  133.   "resourceext",   "re", PAR_ANY,    PAR_NONE,    Cmd_Resourceext,
  134. };
  135.  
  136. void Usage (void)
  137. {
  138.   printf (
  139.     "Usage: cdcontrol device command\n"
  140.     "  Commands & parameters    Abbrev.   Meaning\n"
  141.     "  ---------------------    -------   -------\n"
  142.     "  lowercase [on/off]       l         Convert ISO filenames to lowercase\n"
  143.     "  mactoiso [on/off]        mi        Convert Mac to Amiga characters\n"
  144.     "  convertspaces [on/off]   cs        Convert HFS spaces into underscores\n"
  145.     "  showversion [on/off]     sv        Show version number of ISO filenames\n"
  146.     "  hfsfirst [on/off]        hf        Look for a HFS partition first\n"
  147.     "  dataext <extension>      de        Set extension for HFS data forks\n"
  148.     "  resourceext <extension>  re        Set extension for HFS resource forks\n"
  149.     "Examples:\n"
  150.     "  cdcontrol cd0: showversion on\n"
  151.     "  cdcontrol cd0: sv on\n"
  152.     );
  153.  
  154.   exit (1);
  155. }
  156.  
  157. void main (int argc, char *argv[])
  158. {
  159.   int i;
  160.  
  161.   atexit (Cleanup);
  162.  
  163.   if (argc != 4)
  164.     Usage ();
  165.  
  166.   if (!(UtilityBase = (struct Library *)
  167.          OpenLibrary ((UBYTE *) "utility.library", 37))) {
  168.     fprintf (stderr, "cannot open utility.library\n");
  169.     exit (1);
  170.   }  
  171.  
  172.   g_device_proc = DeviceProc ((UBYTE *) argv[1]);
  173.   if (!g_device_proc) {
  174.     fprintf (stderr, "ERROR: cannot find device \"%s\"\n", argv[1]);
  175.     exit (1);
  176.   }
  177.  
  178.   for (i=0; i < (sizeof (g_par) / sizeof (struct par)); i++) {
  179.     if (Stricmp ((UBYTE *) argv[2], (UBYTE *) g_par[i].name) == 0 ||
  180.         Stricmp ((UBYTE *) argv[2], (UBYTE *) g_par[i].abbrev) == 0) {
  181.       void *a = argv[3];
  182.       void *b = NULL;
  183.  
  184.       if (g_par[i].par1 == PAR_ON_OFF)
  185.         if (Stricmp ((UBYTE *) argv[3], (UBYTE *) "on") == 0)
  186.           a = (void *) 1;
  187.         else if (Stricmp ((UBYTE *) argv[3], (UBYTE *) "off") == 0)
  188.           a = (void *) 0;
  189.     else {
  190.       fprintf (stderr, "ERROR: \"on\" or \"off\" expected\n");
  191.       exit (1);
  192.         }
  193.  
  194.       g_par[i].func (a, b);
  195.       exit (0);
  196.     }
  197.   }
  198.   Usage ();
  199. }
  200.