[alt.sources.amiga] launch -- launch workbench programs from the CLI -- Peter da Silva

amiga-sources@sugar.uu.net (alt.sources.amiga) (09/18/88)

Archive: uunet!~uucp/amiga-sources/launch.shar.Z

: This archive contains the following files...
: 'launch.doc'
: 'launch.c'
: 'wblaunch.c'
: 'wblib.c'
: 'wbcleanup.c'
: 'Makefile'
: To extract them, run the following through /bin/sh
echo x - launch.doc
sed 's/^X//' > launch.doc << '//END'
XLAUNCH -- start a workbench application from the CLI.
X
XThis is an example of how you run a workbench application. As you can see,
Xit's pretty complex... even with the stuff encapsulated like this. However,
Xonce you get it working it works just fine... unlike the CLI. Just ask anyone
Xwho's tried to run a program under the CLI from, say, runback.
X
XUsage: run wbcleanup (only once)
X       launch program [filename]...
X
XLoads and executes program in a workbench environment, then returns to the
XCLI.
X
XUsage: status = launch(msgport, prog, argv, argc)
X
XLoads and executes program, with files in argv/argc stored in workbench 
Xarguments. Replymessage will be found at the message port. You can use
Xthe port FindPort("Workbench.Cleanup") if you don't want to wait.
//END
echo x - launch.c
sed 's/^X//' > launch.c << '//END'
X#include <exec/ports.h>
X#include <stdio.h>
X
Xstruct MsgPort *FindPort();
X
Xmain(ac, av)
Xint ac;
Xchar **av;
X{
X	struct MsgPort *rport;
X
X	if(!(rport = FindPort("Workbench.Cleanup"))) {
X		fprintf(stderr, "Could not find Workbench.Cleanup port.\n");
X		fprintf(stderr, "Are you sure you ran wbcleanup?\n");
X		exit(20);
X	}
X	if(!launch(rport, av[1], &av[1], ac-1)) {
X		fprintf(stderr, "Could not launch %s\n", av[1]);
X		exit(20);
X	}
X	exit(0);
X}
//END
echo x - wblaunch.c
sed 's/^X//' > wblaunch.c << '//END'
X#include <exec/memory.h>
X#include <workbench/startup.h>
X#include <workbench/workbench.h>
X
Xstruct WBStartup *BuildStartup();
X
Xlaunch(rport, name, argv, argc)
Xstruct MsgPort *rport;
Xchar *name;
Xchar **argv;
Xint argc;
X{
X	struct WBStartup *startup;
X
X	if(!rport)
X		return 0;
X
X	startup = BuildStartup(name, argv, argc);
X	if(!startup)
X		return 0;
X
X	startup->sm_Message.mn_ReplyPort = rport;
X	startup->sm_Message.mn_Length = sizeof(struct WBStartup);
X	startup->sm_Message.mn_Node.ln_Type = NT_MESSAGE;
X
X	PutMsg(startup->sm_Process, startup);
X	return 1;
X}
//END
echo x - wblib.c
sed 's/^X//' > wblib.c << '//END'
X#include <exec/memory.h>
X#include <workbench/startup.h>
X#include <workbench/workbench.h>
X
XUBYTE *AllocMem();
XBPTR LoadSeg();
Xstruct MsgPort *CreateProc();
X
XFreeStartup(msg)
Xstruct WBStartup *msg;
X{
X	if(msg->sm_ArgList) {
X		int i;
X		for(i = 0; i < msg->sm_NumArgs; i++) {
X			if(msg->sm_ArgList[i].wa_Lock)
X				UnLock(msg->sm_ArgList[i].wa_Lock);
X			if(msg->sm_ArgList[i].wa_Name)
X				FreeMem(msg->sm_ArgList[i].wa_Name,
X					strlen(msg->sm_ArgList[i].wa_Name)+1);
X		}
X		FreeMem(msg->sm_ArgList,
X			sizeof(struct WBArg) * msg->sm_NumArgs);
X	}
X	if(msg->sm_Segment)
X		UnLoadSeg(msg->sm_Segment);
X	if(msg->sm_ToolWindow)
X		FreeMem(msg->sm_ToolWindow,
X			strlen(msg->sm_ToolWindow)+1);
X	FreeMem(msg, sizeof(struct WBStartup));
X}
X
Xstruct WBStartup *
XBuildStartup(name, argv, argc)
Xchar *name;
Xchar **argv;
Xint argc;
X{
X	ULONG flock;
X	struct WBStartup *msg;
X	char *s, *namep;
X	int i;
X
X	msg = (struct WBStartup *)
X		AllocMem(sizeof(struct WBStartup), MEMF_PUBLIC|MEMF_CLEAR);
X	if(!msg)
X		return 0;
X
X	msg->sm_Segment = LoadSeg(name);
X	if(!msg->sm_Segment) {
X		FreeStartup(msg);
X		return 0;
X	}
X
X	msg->sm_ToolWindow = 0;
X
X	msg->sm_ArgList = (struct WBArg *)
X		AllocMem(sizeof(struct WBArg) * argc, MEMF_PUBLIC | MEMF_CLEAR);
X	if(!msg->sm_ArgList) {
X		FreeStartup(msg);
X		return 0;
X	}
X
X	/* Empty out all args, just in case this aborts, so cleanup
X	 * can clean it up
X	 */
X	msg->sm_NumArgs = argc;
X	for(i = 0; i < argc; i++) {
X		msg->sm_ArgList[i].wa_Lock = 0;
X		msg->sm_ArgList[0].wa_Name = 0;
X	}
X
X	/* Get lock and name for wbargs */
X	for(i = 0; i < argc; i++) {
X		flock = Lock(argv[i]);
X		if(!flock) {
X			FreeStartup(msg);
X			return 0;
X		}
X		msg->sm_ArgList[i].wa_Lock = ParentDir(flock);
X		UnLock(flock);
X		if(!msg->sm_ArgList[i].wa_Lock) {
X			FreeStartup(msg);
X			return 0;
X		}
X
X		namep = argv[i];
X		for(s = argv[i]; *s; s++)
X			if(*s=='/' || *s==':')
X				namep = s+1;
X		msg->sm_ArgList[i].wa_Name =
X			(char *)AllocMem(strlen(namep)+1, MEMF_PUBLIC);
X		if(!msg->sm_ArgList[i].wa_Name) {
X			FreeStartup(msg);
X			return 0;
X		}
X		strcpy(msg->sm_ArgList[i].wa_Name, namep);
X	}
X
X	msg->sm_Process =
X		CreateProc(msg->sm_ArgList[0].wa_Name, 0, msg->sm_Segment, 8192);
X	if(!msg->sm_Process) {
X		FreeStartup(msg);
X		return 0;
X	}
X
X	return msg;
X}
//END
echo x - wbcleanup.c
sed 's/^X//' > wbcleanup.c << '//END'
X#include <exec/memory.h>
X#include <workbench/startup.h>
X#include <workbench/workbench.h>
X
Xstruct MsgPort *rport, *CreatePort();
Xstruct WBStartup *startup, *GetMsg();
X
Xmain()
X{
X	if(!(rport = CreatePort("Workbench.Cleanup", 0))) {
X		printf("Can't create Workbench.Cleanup port.\n");
X		exit(20);
X	}
X	while(1) {
X		WaitPort(rport);
X		startup = GetMsg(rport);
X		FreeStartup(startup);
X	}
X}
X
XFreeStartup(msg)
Xstruct WBStartup *msg;
X{
X	if(msg->sm_ArgList) {
X		int i;
X		for(i = 0; i < msg->sm_NumArgs; i++) {
X			if(msg->sm_ArgList[i].wa_Lock)
X				UnLock(msg->sm_ArgList[i].wa_Lock);
X			if(msg->sm_ArgList[i].wa_Name)
X				FreeMem(msg->sm_ArgList[i].wa_Name,
X					strlen(msg->sm_ArgList[i].wa_Name)+1);
X		}
X		FreeMem(msg->sm_ArgList,
X			sizeof(struct WBArg) * msg->sm_NumArgs);
X	}
X	if(msg->sm_Segment)
X		UnLoadSeg(msg->sm_Segment);
X	if(msg->sm_ToolWindow)
X		FreeMem(msg->sm_ToolWindow,
X			strlen(msg->sm_ToolWindow)+1);
X	FreeMem(msg, sizeof(struct WBStartup));
X}
//END
echo x - Makefile
sed 's/^X//' > Makefile << '//END'
X.SUFFIXES: .c .o .h .x
X
X.c.o:
X	-delete $*.o
X	cc +P -B -DAMIGA $*.c
X
Xall: launch wbcleanup
X
Xlaunch: launch.o wblaunch.o wblib.o
X	-delete launch
X	ln -o launch launch.o wblaunch.o wblib.o -lcl32
X
Xwbcleanup: wbcleanup.o wblib.o
X	-delete wbcleanup
X	ln -o wbcleanup wbcleanup.o wblib.o -lcl32
X
XTEXT= launch.doc launch.c wblaunch.c wblib.c wbcleanup.c Makefile
XBIN=  launch wblaunch
X
Xlaunch.arc: $(TEXT) $(BIN)
X	arc a launch  $(TEXT) $(BIN)
X
Xlaunch.shar: $(TEXT)
X	shar >launch.shar $(TEXT)
//END
: end of archive.
exit 0