/*
**  NoClick.c  Version 37.2  (26. September 1993)
**
**  Ein Programm zum an- und abschalten des Klickens von Disketten-
**  laufwerken. Benötigt AmigaOS 2.0 oder höher.
**
**  (c) Copyright 1993 Ralf Seyfarth
**	Alle Rechte vorbehalten
**  
**  Dieses Programm ist FREEWARE, es darf frei weitergegeben werden,
**  solange alle Dateien im original Zustand enthalten sind.
**
**  Aufruf für DICE (2.07.56R) :
**
**  DCC NoClick.c -o NoClick -3.0 -mi -mRR -r
*/


#include <devices/trackdisk.h>
#include <dos/rdargs.h>
#include <exec/execbase.h>
#include <workbench/startup.h>
#include <workbench/workbench.h>

#define   SysBase_DECLARED

#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/icon.h>
#include <proto/utility.h>

#include <stdlib.h>
#include <string.h>

VOID _main(VOID);
VOID NoClick(UWORD);
VOID AllDrives(VOID);
VOID _waitwbmsg(VOID);

IMPORT struct ExecBase  *SysBase;
IMPORT struct WBStartup *_WBMsg;

STATIC const UBYTE VersionsTag[] = "\0$VER: NoClick 37.2 (26.9.93)";
STATIC const UBYTE Toks[]	 = " ,";

BOOL   Toggle;
LONG **ArgA[2];


VOID
_main(VOID)
{
    if (SysBase->LibNode.lib_Version < 36)
	_exit(RETURN_FAIL);

    if (_WBMsg)
    {
	struct DiskObject *DObj;

	CurrentDir(_WBMsg->sm_ArgList[0].wa_Lock);

	if (DObj = GetDiskObject(_WBMsg->sm_ArgList[0].wa_Name))
	{
	    UBYTE *TStr;

	    if (FindToolType(DObj->do_ToolTypes, "TOGGLE"))
		Toggle = TRUE;

	    if (TStr = FindToolType(DObj->do_ToolTypes, "UNIT"))
	    {
		LONG   TVal;
		UBYTE *TArg = strtok(TStr, Toks);

		for (; TArg; TArg = strtok(NULL, Toks))
		{
		     StrToLong(TArg, &TVal);
		     NoClick(TVal);
		}
	    }
	    else
		AllDrives();

	    FreeDiskObject(DObj);
	}
    }
    else
    {
	struct RDArgs *RDArgs;

	if (!(RDArgs = ReadArgs("UNIT/M/N,TOGGLE/S", ArgA, NULL)))
	{
	    PrintFault(IoErr(), NULL);
	    _exit(RETURN_FAIL);
	}

	if (ArgA[1])
	    Toggle = TRUE;

        if (ArgA[0])
	{
	    UWORD i = 0;

	    while (ArgA[0][i])
		   NoClick(*ArgA[0][i++]);
	}
	else
	    AllDrives();

	FreeArgs(RDArgs);
    }

    _exit(RETURN_OK);
    _waitwbmsg();
}


VOID
NoClick(UWORD Unit)
{
    struct IOStdReq *IOReq;
    struct MsgPort  *MsgPort;

    if (MsgPort = CreateMsgPort())
    {
	if (IOReq = CreateIORequest(MsgPort, sizeof(struct IOStdReq)))
	{
	    if (!OpenDevice(TD_NAME, Unit, (struct IORequest *) IOReq, NULL))
	    {
		struct TDU_PublicUnit *PubUnit = IOReq->io_Unit;

		if (Toggle)
		    PubUnit->tdu_PubFlags ^= TDPF_NOCLICK;
		else
		    PubUnit->tdu_PubFlags |= TDPF_NOCLICK;

		CloseDevice((struct IORequest *) IOReq);
	    }

	    DeleteIORequest(IOReq);
	}

	DeleteMsgPort(MsgPort);
    }
}


VOID
AllDrives(VOID)
{
    UWORD i;

    for (i = 0; i < 4; i++)
	 NoClick(i);
}
