home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 594b.lha / Dautostart / src / loadpath.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-09-11  |  1.6 KB  |  81 lines

  1.  
  2. /*
  3.  *  LOADPATH.C
  4.  *
  5.  *  Load path from global message port, replace any existing path
  6.  *
  7.  *  COMPILE:    DCC loadpath.c -o sys:bin/loadpath -r -proto -mRR
  8.  */
  9.  
  10. #include <exec/types.h>
  11. #include <exec/memory.h>
  12. #include <dos/dos.h>
  13. #include <dos/dosextens.h>
  14. #include <clib/exec_protos.h>
  15. #include <clib/dos_protos.h>
  16. #include <clib/alib_protos.h>
  17. #include <string.h>
  18.  
  19. #define PORTNAME    "SavePath.PORT"
  20.  
  21. typedef struct Process            Process;
  22. typedef struct CommandLineInterface Cli;
  23. typedef struct FileLock         FileLock;
  24. typedef struct MsgPort            MsgPort;
  25. typedef struct Node            Node;
  26.  
  27. typedef struct LockList {
  28.     BPTR    NextPath;
  29.     BPTR    PathLock;
  30. } LockList;
  31.  
  32. _main()
  33. {
  34.     Process *proc = (Process *)FindTask(NULL);
  35.     Cli     *cli = (Cli *)BADDR(proc->pr_CLI);
  36.     MsgPort *port;
  37.  
  38.     Forbid();
  39.     if (port = FindPort(PORTNAME)) {
  40.  
  41.     /*
  42.      *  clear existing path
  43.      */
  44.  
  45.     {
  46.         LockList *lnext;
  47.         LockList *ll;
  48.  
  49.         for (ll = (LockList *)BADDR(cli->cli_CommandDir); ll; ll = lnext) {
  50.         lnext = (LockList *)BADDR(ll->NextPath);
  51.         UnLock(ll->PathLock);       /* XXX breaks forbid */
  52.         FreeMem((long *)ll - 1, ((long *)ll)[-1]);
  53.         }
  54.         cli->cli_CommandDir = 0;
  55.     }
  56.  
  57.     /*
  58.      *  append new path
  59.      */
  60.  
  61.     {
  62.         Node *node;
  63.         LockList *ll;
  64.         BPTR *llast = &cli->cli_CommandDir;
  65.  
  66.         for (node = port->mp_MsgList.lh_Head; node->ln_Succ; node = node->ln_Succ) {
  67.         ll = (void *)((long *)AllocMem(sizeof(LockList) + 4, MEMF_PUBLIC|MEMF_CLEAR) + 1);
  68.         ((long *)ll)[-1] = sizeof(LockList) + 4;
  69.         ll->NextPath = *llast;
  70.         ll->PathLock = DupLock((BPTR)node->ln_Name);
  71.         *llast = MKBADDR(ll);
  72.         llast = &ll->NextPath;
  73.         }
  74.     }
  75.     }
  76.     Permit();
  77.     return(0);
  78. }
  79.  
  80.  
  81.