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