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