/* Procedures to manage DOS async I/O & find window 87:4:24 */ /* .. adapted from Finkel, Lindsay, and Scheppner -- CBM */ #include #include #include #include #include /* Globals initialized by findWindow() */ struct Window *conWindow; struct ConUnit *conUnit; struct Window * findWindow(file) LONG file; /* inits conWindow and conUnit (global vars) and returns window pointer */ { struct InfoData *id; struct FileHandle *handle; struct MsgPort *conid; LONG myarg, res1; /* Alloc to insure longword alignment */ id = (struct InfoData *)AllocMem(sizeof(struct InfoData), MEMF_PUBLIC|MEMF_CLEAR); if(! id) return(NULL); handle = (struct FileHandle *)(file<<2); if (!handle->fh_Port /*Interactive*/) return(NULL); conid = (struct MsgPort *)handle->fh_Type /* ProcessID (!) */; myarg = ((ULONG)id) >> 2; res1 = (LONG)sendpkt(conid,ACTION_DISK_INFO,&myarg,1); /* degeneralized */ conWindow = (struct Window *)id->id_VolumeNode; conUnit = (struct ConUnit *) /* USE in WB 1.2 ONLY...(but OK to read it!)*/ ((struct IOStdReq *)id->id_InUse)->io_Unit; FreeMem(id,sizeof(struct InfoData)); return(res1 ? conWindow : NULL); } /* sendpkt code - A. Finkel, P. Lindsay, C. Scheppner CBM */ sendpkt(pid,action,args,nargs) /* Lattticeified (default LONG) */ struct MsgPort *pid; /* process indentifier ... (handler's message port ) */ LONG action, /* packet type ... (what you want handler to do ) */ *args, /* a pointer to an argument list */ nargs; /* number of arguments in list */ { struct MsgPort *replyport; struct StandardPacket *packet; LONG *pargs, res1; replyport = (struct MsgPort *) CreatePort(NULL,0); if(!replyport) return(NULL); packet = (struct StandardPacket *) AllocMem((long)sizeof(struct StandardPacket),MEMF_PUBLIC|MEMF_CLEAR); if(!packet) { DeletePort(replyport); return(NULL); } packet->sp_Msg.mn_Node.ln_Name = (char *)&(packet->sp_Pkt); packet->sp_Pkt.dp_Link = &(packet->sp_Msg); packet->sp_Pkt.dp_Port = replyport; packet->sp_Pkt.dp_Type = action; /* copy the args into the packet */ pargs = &(packet->sp_Pkt.dp_Arg1); /* address of first argument */ while (nargs--) /* compacter than original */ *pargs++ = *args++; PutMsg(pid,packet); /* send packet */ WaitPort(replyport); GetMsg(replyport); res1 = packet->sp_Pkt.dp_Res1; FreeMem(packet,(long)sizeof(struct StandardPacket)); DeletePort(replyport); return(res1); }