
/*
 *  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);
}


