home *** CD-ROM | disk | FTP | other *** search
-
- /*
- * LOADPATH.C
- *
- * Load path from global message port, replace any existing path
- *
- * COMPILE: DCC loadpath.c -o sys:bin/loadpath -r -proto -mRR
- */
-
- #include <exec/types.h>
- #include <exec/memory.h>
- #include <dos/dos.h>
- #include <dos/dosextens.h>
- #include <clib/exec_protos.h>
- #include <clib/dos_protos.h>
- #include <clib/alib_protos.h>
- #include <string.h>
-
- #define PORTNAME "SavePath.PORT"
-
- typedef struct Process Process;
- typedef struct CommandLineInterface Cli;
- typedef struct FileLock FileLock;
- typedef struct MsgPort MsgPort;
- typedef struct Node Node;
-
- typedef struct LockList {
- BPTR NextPath;
- BPTR PathLock;
- } LockList;
-
- _main()
- {
- Process *proc = (Process *)FindTask(NULL);
- Cli *cli = (Cli *)BADDR(proc->pr_CLI);
- MsgPort *port;
-
- Forbid();
- if (port = FindPort(PORTNAME)) {
-
- /*
- * clear existing path
- */
-
- {
- LockList *lnext;
- LockList *ll;
-
- for (ll = (LockList *)BADDR(cli->cli_CommandDir); ll; ll = lnext) {
- lnext = (LockList *)BADDR(ll->NextPath);
- UnLock(ll->PathLock); /* XXX breaks forbid */
- FreeMem((long *)ll - 1, ((long *)ll)[-1]);
- }
- cli->cli_CommandDir = 0;
- }
-
- /*
- * append new path
- */
-
- {
- Node *node;
- LockList *ll;
- BPTR *llast = &cli->cli_CommandDir;
-
- for (node = port->mp_MsgList.lh_Head; node->ln_Succ; node = node->ln_Succ) {
- ll = (void *)((long *)AllocMem(sizeof(LockList) + 4, MEMF_PUBLIC|MEMF_CLEAR) + 1);
- ((long *)ll)[-1] = sizeof(LockList) + 4;
- ll->NextPath = *llast;
- ll->PathLock = DupLock((BPTR)node->ln_Name);
- *llast = MKBADDR(ll);
- llast = &ll->NextPath;
- }
- }
- }
- Permit();
- return(0);
- }
-
-
-