/* * This function returns a structure that contains the commands sent from * ARexx... You will need to parse it and return the structure back * so that the memory can be freed... * * This returns NULL if there was no message... */ struct RexxMsg *GetARexxMsg(AREXXCONTEXT RexxContext) { register struct RexxMsg *tmp=NULL; register short flag; if (RexxContext) if (tmp=(struct RexxMsg *)GetMsg(RexxContext->ARexxPort)) { if (tmp->rm_Node.mn_Node.ln_Type==NT_REPLYMSG) { /* * If we had sent a command, it would come this way... * * Since we don't in this simple example, we just throw * away anything that looks "strange" */ flag=FALSE; if (tmp->rm_Result1) flag=TRUE; /* * Free the arguments and the message... */ DeleteArgstring(tmp->rm_Args[0]); DeleteRexxMsg(tmp); RexxContext->Outstanding-=1; /* * Return the error if there was one... */ tmp=flag ? REXX_RETURN_ERROR : NULL; } } return(tmp); }
/** * Set the result variable. * * @param rxmsg the message defining the ARexx context. * @param string the contents of the result */ static void arexx_set_result(struct RexxMsg *rxmsg, CONST_STRPTR string) { if (!string) string = ""; if (rxmsg->rm_Action & (1L << RXFB_RESULT)) { if (rxmsg->rm_Result2) DeleteArgstring((STRPTR)rxmsg->rm_Result2); rxmsg->rm_Result2 = (LONG)CreateArgstring( string,strlen(string)); } }
void SAVEDS handler(void) { struct Process *me = (struct Process *)FindTask(NULL); struct startMsg *smsg; struct MsgPort *port; BOOL res = FALSE; ENTER(); WaitPort(&me->pr_MsgPort); smsg = (struct startMsg *)GetMsg(&me->pr_MsgPort); #if defined(__amigaos4__) port = AllocSysObject(ASOT_PORT, TAG_DONE); #else port = CreateMsgPort(); #endif if(port != NULL) res = localSendRexxMsg(port, smsg->port, smsg->cmd); smsg->res = res; ReplyMsg((struct Message *)smsg); if(res == TRUE) { struct RexxMsg *rxmsg; WaitPort(port); rxmsg = (struct RexxMsg *)GetMsg(port); DeleteArgstring((APTR)rxmsg->rm_Args[0]); DeleteRexxMsg(rxmsg); } if(port != NULL) { #if defined(__amigaos4__) FreeSysObject(ASOT_PORT, port); #else DeleteMsgPort(port); #endif } ObtainSemaphore(&OpenURLBase->libSem); OpenURLBase->rexx_use--; ReleaseSemaphore(&OpenURLBase->libSem); #if !defined(__amigaos4__) // all systems except OS4 should leave this function in forbidden state Forbid(); #endif LEAVE(); }
int commonsendrexx(int komnr,int hasarg) { char rexxCmd[1081]; struct RexxMsg *nikrexxmess, *mess; sendrexxrc = -5; if(!hasarg) { sprintf(rexxCmd, "NiKom:rexx/ExtKom%d %d %d", komnr, nodnr, inloggad); } else { sprintf(rexxCmd, "NiKom:rexx/ExtKom%d %d %d %s", komnr, nodnr, inloggad, argument); } if(!(nikrexxmess = (struct RexxMsg *) CreateRexxMsg( rexxport, "nik", rexxport->mp_Node.ln_Name))) { LogEvent(SYSTEM_LOG, ERROR, "Couldn't allocate a RexxMsg."); return -5; } if(!(nikrexxmess->rm_Args[0] = (STRPTR)CreateArgstring(rexxCmd,strlen(rexxCmd)))) { DeleteRexxMsg(nikrexxmess); LogEvent(SYSTEM_LOG, ERROR, "Couldn't allocate a rexx ArgString."); return -5; } nikrexxmess->rm_Action = RXCOMM | RXFB_TOKEN; if(!SafePutToPort((struct Message *)nikrexxmess, "REXX")) { LogEvent(SYSTEM_LOG, ERROR, "Can't launch ARexx script, REXX port not found."); return -5; } for(;;) { mess = (struct RexxMsg *)WaitPort(rexxport); while(mess = (struct RexxMsg *)GetMsg(rexxport)) { if(mess->rm_Node.mn_Node.ln_Type == NT_REPLYMSG) { DeleteArgstring(nikrexxmess->rm_Args[0]); if(nikrexxmess->rm_Result1) { LogEvent(SYSTEM_LOG, WARN, "Error return code %d from ARexx script: '%s'", nikrexxmess->rm_Result1, rexxCmd); SendString("\r\n\nError executing ARexx script.\r\n\n"); } DeleteRexxMsg(nikrexxmess); if(!rxlinecount) { rxlinecount=TRUE; radcnt = 0; } return sendrexxrc; } handleRexxCommand(mess->rm_Args[0], mess); ReplyMsg((struct Message *)mess); } } if(carrierdropped()) return(-8); return(sendrexxrc); }
/************* * FUNCTION: GetRexxString * VERSION: 0.1 08.03.1995 * DESCRIPTION: Copy the result string returned by SendRexxMsg to user * buffer and/or remove the original string. * INPUT: SourceString * DestString * OUTPUT: none * HISTORY: DATE NAME COMMENT * 08.03.95 ah first release *************/ VOID GetRexxString(STRPTR SourceString,STRPTR DestString) { /* Valid pointer given? */ if(SourceString) { /* Destination memory buffer given? */ if(DestString) strcpy((char *)DestString,(char *)SourceString); /* Deallocate the original string. */ DeleteArgstring((char *)SourceString); } }
/************* * FUNCTION: FreeRexxCommand * VERSION: 0.1 08.03.1995 * DESCRIPTION: Frees the contents of a RexxMsg * INPUT: RexxMessage * OUTPUT: none * HISTORY: DATE NAME COMMENT * 08.03.95 ah first release *************/ VOID FreeRexxCommand(struct RexxMsg *RexxMessage) { /* Valid pointer given? */ if(RexxMessage && RexxMessage->rm_Node.mn_Node.ln_Type == NT_REPLYMSG) { /* Remove argument. */ if(RexxMessage->rm_Args[0]) DeleteArgstring((char *)RexxMessage->rm_Args[0]); /* Free the message. */ DeleteRexxMsg(RexxMessage); } }
/* send a message to an AREXX port. */ static int ADDRESS (const char *hostname, const char *cmd) { struct MsgPort *RexxPort, *ReplyPort; struct RexxMsg *HostMsg, *answer; int result = RC_WARN; if (!stricmp (hostname, "COMMAND")) return SystemTagList(cmd,NULL); if ((RexxPort = (void *)FindPort (hostname))) { if ((ReplyPort = (void *)CreateMsgPort ())) { if ((HostMsg = CreateRexxMsg (ReplyPort, NULL, hostname))) { unsigned int len = strlen (cmd); /* holger: trick for powerup */ if ((HostMsg->rm_Args[0] = CreateArgstring ((char *)cmd, len))) { HostMsg->rm_Action = RXCOMM | RXFF_RESULT; PutMsg (RexxPort, (void*)HostMsg); WaitPort (ReplyPort); while (!(answer = (void *)GetMsg (ReplyPort))); result = answer->rm_Result1; if (result == RC_OK) { if (answer->rm_Result2) { strncpy (RESULT,(char *)answer->rm_Result2, RESULT_LEN); DeleteArgstring ((char *)answer->rm_Result2); } else RESULT[0] = '\0'; } DeleteArgstring (HostMsg->rm_Args[0]); } else strcpy (RESULT, "Can't create argstring!"); DeleteRexxMsg (HostMsg); } else strcpy (RESULT, "Can't create rexx message!"); DeleteMsgPort (ReplyPort); } else strcpy (RESULT, "Can't alloc reply port!"); } else sprintf (RESULT, "Port \"%s\" not found!", hostname); return result; }
/* * This function will send a string to ARexx... * * The default host port will be that of your task... * * If you set StringFile to TRUE, it will set that bit for the message... * * Returns TRUE if it send the message, FALSE if it did not... */ short SendARexxMsg(AREXXCONTEXT RexxContext,char *RString, short StringFile) { register struct MsgPort *RexxPort; register struct RexxMsg *rmsg; register short flag=FALSE; if (RexxContext) if (RString) { if (rmsg=CreateRexxMsg(RexxContext->ARexxPort, RexxContext->Extension, RexxContext->PortName)) { rmsg->rm_Action=RXCOMM | (StringFile ? (1L << RXFB_STRING):0); if (rmsg->rm_Args[0]=CreateArgstring(RString, (LONG)strlen(RString))) { /* * We need to find the RexxPort and this needs * to be done in a Forbid() */ Forbid(); if (RexxPort=FindPort(RXSDIR)) { /* * We found the port, so put the * message to ARexx... */ PutMsg(RexxPort,(struct Message *)rmsg); RexxContext->Outstanding+=1; flag=TRUE; } else { /* * No port, so clean up... */ DeleteArgstring(rmsg->rm_Args[0]); DeleteRexxMsg(rmsg); } Permit(); } else DeleteRexxMsg(rmsg); } } return(flag); }
static BOOL localSendRexxMsg(struct MsgPort *reply, STRPTR rxport, STRPTR rxcmd) { BOOL success = FALSE; struct RexxMsg *rxmsg; ENTER(); if((rxmsg = CreateRexxMsg(reply, NULL, NULL)) != NULL) { rxmsg->rm_Action = RXCOMM|RXFF_STRING|RXFF_NOIO; if((rxmsg->rm_Args[0] = (IPTR)CreateArgstring(rxcmd,strlen(rxcmd))) != 0) { struct MsgPort *port; Forbid(); if((port = FindPort(rxport)) != NULL) { PutMsg(port, (struct Message *)rxmsg); success = TRUE; } Permit(); if(success == FALSE) DeleteArgstring((APTR)rxmsg->rm_Args[0]); } if(success == FALSE) DeleteRexxMsg(rxmsg); } RETURN(success); return success; }
int commonsendrexx(int komnr,int hasarg) { char macronamn[1081],*rexxargs1; int going = TRUE; struct RexxMsg *nikrexxmess,*tempmess; struct MsgPort *rexxmastport; sendrexxrc=-5; if(!hasarg) sprintf(macronamn,"NiKom:rexx/ExtKom%d %d %d",komnr,nodnr,inloggad); else sprintf(macronamn,"NiKom:rexx/ExtKom%d %d %d %s",komnr,nodnr,inloggad,argument); if(!(nikrexxmess=(struct RexxMsg *)CreateRexxMsg(rexxport,"nik",rexxport->mp_Node.ln_Name))) { puttekn("\r\n\nKunde inte allokera ett RexxMsg!\r\n\n",-1); return(-5); } if(!(nikrexxmess->rm_Args[0]=(STRPTR)CreateArgstring(macronamn,strlen(macronamn)))) { DeleteRexxMsg(nikrexxmess); puttekn("\r\n\nKunde inte allokera en ArgString1\r\n\n",-1); return(-5); } nikrexxmess->rm_Action=RXCOMM | RXFB_TOKEN; Forbid(); if(!(rexxmastport=(struct MsgPort *)FindPort("REXX"))) { Permit(); puttekn("\r\n\nRexxMast är inte igång!\r\n\n",-1); return(-5); } PutMsg(rexxmastport,(struct Message *)nikrexxmess); Permit(); while(going) { tempmess = (struct RexxMsg *)WaitPort(rexxport); if(!tempmess) printf("*** Something's fishy around here... ***\n"); while(tempmess=(struct RexxMsg *)GetMsg(rexxport)) { if(tempmess->rm_Node.mn_Node.ln_Type==NT_REPLYMSG) { DeleteArgstring(nikrexxmess->rm_Args[0]); if(nikrexxmess->rm_Result1) { sprintf(outbuffer,"\r\n\nRexx: Return-code %d\r\n\n",nikrexxmess->rm_Result1); puttekn(outbuffer,-1); } DeleteRexxMsg(nikrexxmess); if(!rxlinecount) { rxlinecount=TRUE; radcnt = 0; } return(sendrexxrc); } if(!strnicmp(tempmess->rm_Args[0],"sendstring",10)) rexxsendstring(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"sendserstring",13)) rexxsendserstring(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"getstring",9)) rexxgetstring(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"sendtextfile",12)) sendfile(rexxargs1=hittaefter(tempmess->rm_Args[0])); else if(!strnicmp(tempmess->rm_Args[0],"showtext",8)) rxvisatext(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"showletter",10)) rexxvisabrev(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"lasttext",8)) senastread(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"nikcommand",10)) kommando(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"niknrcommand",12)) niknrcommand(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"edit",4)) rxedit(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"sendbinfile",11)) rexxsendbinfile(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"recbinfile",10)) rexxrecbinfile(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"getchar",7)) rexxgettekn(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"chkbuffer",9)) rexxchkbuffer(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"yesno",5)) rexxyesno(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"whicharea",9)) whicharea(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"whichmeet",9)) whichmeet(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"logout",6)) rxlogout(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"runfifo",7)) rxrunfifo(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"runrawfifo",10)) rxrunrawfifo(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"entermeet",9)) rxentermeet(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"setlinecount",12)) rxsetlinecount(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"extratime",9)) rxextratime(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"gettime",7)) rxgettime(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"sendchar",8)) rxsendchar(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"sendserchar",11)) rxsendserchar(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"setnodeaction",13)) rxsetnodeaction(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"sendrawfile",11)) rxsendrawfile(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"changelatestinfo",16)) rxchglatestinfo(tempmess); else if(!strnicmp(tempmess->rm_Args[0],"getnumber",9)) rxgetnumber(tempmess); else { sprintf(outbuffer,"\r\n\nKan inte hantera: %s\r\n",tempmess->rm_Args[0]); puttekn(outbuffer,-1); tempmess->rm_Result1=5; tempmess->rm_Result2=NULL; } ReplyMsg((struct Message *)tempmess); } } if(carrierdropped()) return(-8); return(sendrexxrc); }
LONG SendRexxCommand(CONST_STRPTR port, CONST_STRPTR Cmd, STRPTR Result, LONG ResultSize) { struct MsgPort *RexxPort; struct MsgPort *ReplyPort = &((struct Process *)FindTask(NULL))->pr_MsgPort; struct Library *RexxSysBase; #ifdef __AMIGAOS4__ struct RexxSysIFace *IRexxSys; #else void *IRexxSys; #endif int rc; *Result = '\0'; if ((RexxSysBase = OpenLibraryInterface("rexxsyslib.library", 36L, &IRexxSys))) { Forbid(); if ((RexxPort = FindPort(port))) { struct RexxMsg *rexxMsg, *Answer; if ((rexxMsg = CreateRexxMsg(ReplyPort, NULL, NULL))) { if ((rexxMsg->rm_Args[0] = (STRPTR)CreateArgstring(Cmd, strlen(Cmd)))) { rexxMsg->rm_Action = RXCOMM | RXFF_RESULT; PutMsg(RexxPort, &rexxMsg->rm_Node); Permit(); do { WaitPort(ReplyPort); Answer = (struct RexxMsg *)GetMsg(ReplyPort); } while (Answer == NULL); if ((rc = (Answer->rm_Result1 == RETURN_OK))) { if (Answer->rm_Result2) { strncpy(Result, (STRPTR)Answer->rm_Result2, ResultSize); DeleteArgstring((STRPTR)Answer->rm_Result2); } } DeleteArgstring((STRPTR)ARG0(Answer)); DeleteRexxMsg(Answer); CloseLibraryInterface(RexxSysBase,IRexxSys); return rc; } else { DeleteRexxMsg(rexxMsg); } } } Permit(); CloseLibraryInterface(RexxSysBase,IRexxSys); } return 0; }