/* Copyright(c)1992 by Giuliano C. Peritore - ETI020 */ /* E-Mail mc6040@mclink.it */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define PORTNAME "ETI020-A4091Patch" IMPORT struct ExecBase *SysBase; IMPORT struct DOSBase *DOSBase; #ifdef LATTICE int CXBRK(void) {return(0);} int chkabort(void) {return(0);} #endif UBYTE *VERSTAG="\0$VER: Version 39.2 (7.11.92)"; #define TEMPLATE "BUFSIZE/A/N,PARTITION/A" struct Library *IconBase; struct IntuitionBase *IntuitionBase=0; struct RDArgs *myrda; LONG result[2]; struct MsgPort *patchport; struct Message *message; struct Task *tasktopatch; APTR buffer; ULONG bufsize=0; ULONG *buftol; STRPTR parts=0; VOID disper(char *tit, char *msg, char *but); VOID get_parameters(int pargc,char **pargv) { struct WBStartup *argmsg; struct WBArg *wb_arg; struct DiskObject *dobj; STRPTR appname; char **toolarray; if(pargc==0) { /* WB */ argmsg=(struct WBStartup *)pargv; wb_arg=argmsg->sm_ArgList; appname=wb_arg->wa_Name; if(dobj=GetDiskObject(appname)) { toolarray=(char**)dobj->do_ToolTypes; if(!(buftol=(ULONG*)FindToolType(toolarray,"BUFSIZE"))) disper("A4091Patch","I need a BUFSIZE tooltype","Cancel"); if(!(parts= (char*)FindToolType(toolarray,"PARTITION"))) disper("A4091Patch","I need a PARTITION tooltype","Cancel"); if(!(bufsize=atoi(buftol))) disper("A4091Patch","I need a BufSize greater than 0","Cancel"); FreeDiskObject(dobj); } else disper("A4091Patch","Can't find .icon file","Cancel"); } else { /*CLI*/ FPrintf(Output(),"A4091Patch - Copyright © 1992 Giuliano C. Peritore - ETI020\n"); appname=pargv[0]; if(myrda=(struct RDArgs *)AllocDosObject(DOS_RDARGS,NULL)) { myrda->RDA_Source.CS_Buffer=0; myrda->RDA_Source.CS_Length=0; myrda->RDA_ExtHelp="Help\n"; if(ReadArgs(TEMPLATE,result,myrda)) { bufsize=*((ULONG*)result[0]); parts= (char*)result[1]; FreeArgs(myrda); } else FPrintf(Output(),"Error in command line\n"); } else disper("A4091Patch","Can't allocate RDArgs","Cancel"); FreeDosObject(DOS_RDARGS,myrda); } } VOID main(int argc,char **argv) { if(!(patchport=FindPort(PORTNAME))) { if(IconBase=OpenLibrary("icon.library",39L)) { get_parameters(argc,argv); if(bufsize&&parts) { if(buffer=AllocMem(bufsize,MEMF_24BITDMA)) { if(tasktopatch=FindTask(parts)) { if(patchport=CreateMsgPort()) { patchport->mp_Node.ln_Name=PORTNAME; patchport->mp_Node.ln_Pri =0; AddPort(patchport); Forbid(); dopat(DOSBase,buffer,bufsize,tasktopatch); CacheClearU(); Permit(); WaitPort(patchport); GetMsg(patchport); Forbid(); undopat(DOSBase); Permit(); RemPort(patchport); DeleteMsgPort(patchport); } else disper("A4091Patch","Can't create MsgPort","Cancel"); } else disper("A4091Patch","Can't find partition's task\nCheck letter case","Cancel"); FreeMem(buffer,bufsize); } else disper("A4091Patch","Not enough memory for buffer","Cancel"); } CloseLibrary(IconBase); } else disper("A4091Patch","Can't open icon.library V39","Cancel"); } Forbid(); if(patchport=FindPort(PORTNAME)) { if(message=(struct Message*)AllocMem(sizeof(struct Message),MEMF_PUBLIC|MEMF_CLEAR)) { message->mn_Node.ln_Type=NT_MESSAGE; message->mn_Length =0; disper("A4091Patch","Sending Quit message","Okay"); PutMsg(patchport,message); } } Permit(); } /********************************************************************/ VOID disper(char *tit, char *msg, char *but) { struct EasyStruct warnES={sizeof(struct EasyStruct),0,NULL,"%s",NULL}; if(!IntuitionBase) { if(IntuitionBase=(struct IntuitionBase*)OpenLibrary("intuition.library",37)) { warnES.es_Title=tit; warnES.es_GadgetFormat=but; EasyRequest(0,&warnES,NULL,msg); CloseLibrary(IntuitionBase); IntuitionBase=0; } } }