home *** CD-ROM | disk | FTP | other *** search
- ********************************************************************************
- *
- * child.asm --- child process entry point for ExecCommand()
- *
- * Copyright (C) 1991 by Per Bojsen. All Rights Reserved.
- *
- * Permission is granted to any individual or institution to use, copy,
- * modify, and distribute this software, provided that this complete
- * copyright and permission notice is maintained, intact, in all copies
- * and supporting documentation.
- *
- * This software is provided on an "as is" basis without express or
- * implied warranty.
- *
- * Main entry point is `__ChildProcess', referred to as
- * `int _ChildProcess(void)' from C.
- *
- * $Id: child.asm,v 1.2 91/10/12 14:47:06 bojsen Exp Locker: bojsen $
- *
- * $Log: child.asm,v $
- * Revision 1.2 91/10/12 14:47:06 bojsen
- * Changed name of ChildProcess() to _ChildProcess() to avoid possible
- * collisions with client code.
- *
- * Revision 1.1 91/10/12 14:39:53 bojsen
- * Initial revision
- *
-
- INCLUDE 'exec/types.i'
- INCLUDE 'exec/libraries.i'
- INCLUDE 'exec/ports.i'
-
- INCLUDE 'dos/dos.i'
- INCLUDE 'dos/dosextens.i'
- INCLUDE 'dos/dostags.i'
-
- *
- * ChildMsg structure
- *
- * C equivalent:
- *
- * struct ChildMsg
- * {
- * struct Message ExecMsg;
- * char *CmdLine;
- * LONG StackSize;
- * BPTR PathList;
- * ULONG Flags;
- * LONG RC;
- * };
- *
-
- STRUCTURE CHM,MN_SIZE
- APTR CHM_CmdLine ; command line to execute
- LONG CHM_StackSize ; use this stacksize for the child
- BPTR CHM_PathList ; path to install for child
- ULONG CHM_Flags ; various flags
- LONG CHM_RC ; child's return code
- LABEL CHM_Size
-
- BITDEF CHM,PIPE,0
- BITDEF CHM,PATH,1
-
- ABSEXECBASE EQU 4
- LIBVERSION EQU 37
-
- SECTION butility.lib_text,CODE
-
- *
- * Entry point
- *
- * Register usage:
- *
- * A6 Current library
- * A5 Process pointer; process port; Child message pointer
- * A4 CLI pointer
- * A0 scratch
- *
- * D4 Old path list of process
- * D2
-
- xdef __ChildProcess
-
- _LVOOpenLibrary EQU -552
- _LVOCloseLibrary EQU -414
- _LVOFindTask EQU -294
- _LVOForbid EQU -132
- _LVOWaitPort EQU -384
- _LVOGetMsg EQU -372
- _LVOReplyMsg EQU -378
- _LVOSystemTagList EQU -606
- _LVOInput EQU -54
- _LVORead EQU -42
-
- __ChildProcess:
- movem.l D1-D4/A1/A4-A6,-(A7)
- move.l ABSEXECBASE.w,A6
-
- sub.l A1,A1
- jsr _LVOFindTask(A6)
- move.l D0,A5
-
- ; Get CLI pointer
-
- move.l pr_CLI(A5),D3
-
- ; Get startup message
-
- lea.l pr_MsgPort(A5),A5
- move.l A5,A0
- jsr _LVOWaitPort(A6)
-
- move.l A5,A0
- jsr _LVOGetMsg(A6)
- move.l D0,A5
-
- ; Open dos.library
-
- lea DOSLibraryName(PC),A1
- move.l #LIBVERSION,D0
- jsr _LVOOpenLibrary(A6)
- tst.l D0
- bne.s PrepSystem
-
- moveq #-1,D0
- move.l D0,CHM_RC(A5)
- bra FinishUp
-
- PrepSystem:
- ; Switch path if one was passed in
- move.l CHM_Flags(A5),D1
- btst #CHMB_PATH,D1
- bne.s CheckCLI
-
- move.l #0,D3 ; clear CLI pointer so the path is not patched
-
- CheckCLI:
- lsl.l #2,D3 ; convert BPTR to CLI
- move.l D3,A4
- beq.s DoSystem ; was there a CLI?
-
- move.l CHM_PathList(A5),D1
- move.l cli_CommandDir(A4),D4 ; install the path that was passed
- move.l D1,cli_CommandDir(A4) ; in in the startup message
-
- DoSystem:
- ; Build tag list for SystemTagList() on stack
-
- pea TAG_DONE
- move.l CHM_StackSize(A5),-(A7)
- pea NP_StackSize
-
- ; Now call SystemTagList() to run child
-
- move.l A7,D2
- move.l CHM_CmdLine(A5),D1
- move.l D0,A6
- jsr _LVOSystemTagList(A6)
- lea $C(A7),A7
- move.l D0,CHM_RC(A5)
-
- move.l A4,D1 ; did we have a CLI?
- beq.s FlushInput
-
- move.l D4,cli_CommandDir(A4) ; OK, reinstall the old path
-
- FlushInput:
- ; Flush stdin if it's a pipe (look for PIPE flag)
-
- move.l CHM_Flags(A5),D0
- btst #CHMB_PIPE,D0 ; D0 is CHM_Flags(A5) at this point
- beq.s CloseDOS
-
- jsr _LVOInput(A6)
- move.l D0,D4
- beq.s CloseDOS
-
- BUFFERSZ EQU 512
- lea -BUFFERSZ(A7),A7
- move.l A7,D2
- move.l #BUFFERSZ,D3
-
- FlushIn:
- move.l D4,D1
- jsr _LVORead(A6)
- neg.l D0
- bmi.s FlushIn
-
- lea BUFFERSZ(A7),A7
-
- CloseDOS:
- ; Close dos.library
-
- move.l A6,A1
- move.l ABSEXECBASE.w,A6
- jsr _LVOCloseLibrary(A6)
-
- FinishUp:
- jsr _LVOForbid(A6) ; Forbid() so the parent doesn't unload us too early
-
- move.l A5,A1
- jsr _LVOReplyMsg(A6)
-
- move.l #0,D0
- movem.l (A7)+,D1-D4/A1/A4-A6
- rts
-
- DOSLibraryName
- dc.b 'dos.library',0
-
- end
-