home *** CD-ROM | disk | FTP | other *** search
/ Fish 'n' More 2 / fishmore-publicdomainlibraryvol.ii1991xetec.iso / fish / programming / aztecarp_436 / src / _main.c < prev    next >
C/C++ Source or Header  |  1990-12-05  |  7KB  |  315 lines

  1. /* Created 11/08/87 by -=+SDB+=- from file _main.c provided by Manx */
  2. /* Copyright (C) 1987 by Scott Ballantyne */
  3. /* May be freely used by ARP users/supporters */
  4. /* Memory is allocated for the MANX device buffers, etc., but the
  5.  * ARP tracking functions are used.
  6.  * tweeked for v39
  7.  * further tweeked to handle v1.4 workbench startup
  8.  */
  9.  
  10. extern long _savsp, _stkbase;
  11.  
  12. extern int errno, Enable_Abort;
  13.  
  14. extern int _argc;
  15. extern char **_argv;
  16. extern struct WBStartup *WBenchMsg;
  17.  
  18. extern struct _dev *_devtab;
  19. extern short _numdev;
  20.  
  21. extern struct ArpBase *ArpBase;
  22. extern void *IntuitionBase, *GfxBase, *DOSBase;
  23.  
  24. extern struct ExecBase *SysBase;
  25.  
  26. /* !!! alot of things here depend on receiving WBenchMsg before opening arp.library */
  27.  
  28. #ifdef DETACH
  29. static long _alen = 0;
  30. #ifdef PARENT
  31. struct Process *_parent_proc = NULL;
  32. #endif /* PARENT */
  33. #endif /* DETACH */
  34.  
  35. struct WBStartup *    GetMsg(struct MsgPort *);
  36. void *            OpenLibrary(char *,LONG);
  37.  
  38. _main(alen, aptr)
  39. long alen;
  40. char *aptr;
  41. {
  42.     register struct Process *pp;
  43.  
  44.     pp = (struct Process *)SysBase -> ThisTask;
  45.  
  46. #ifdef DETACH
  47.  
  48.     /* !!! alen is here because pr_CLI is NULL for bg task, but _alen (hopefully) isn't */
  49.  
  50.     if(!pp -> pr_CLI && !_alen)
  51. #else
  52.     if(!pp -> pr_CLI)
  53. #endif
  54.     {
  55.         WaitPort(&pp -> pr_MsgPort);
  56.         WBenchMsg = (struct WBStartup *)GetMsg(&pp -> pr_MsgPort);
  57.     }
  58.  
  59.     if(!(ArpBase = (struct ArpBase *)OpenLibrary (ArpName,ArpVersion)))
  60.     {
  61.         complain();
  62.         Forbid();
  63.  
  64.         if(WBenchMsg)
  65.             ReplyMsg((struct Message *)WBenchMsg);
  66.  
  67.         return(RETURN_FAIL);
  68.     }
  69.  
  70.     if(!DOSBase)
  71.         DOSBase = ArpBase -> DosBase;
  72.  
  73.     GfxBase        = ArpBase -> GfxBase;
  74.     IntuitionBase    = ArpBase -> IntuiBase;
  75.  
  76. #ifdef DETACH
  77. #ifdef STICKY
  78.     if(Strcmp(&aptr[0],"STICKY"))
  79. #endif /* STICKY */
  80.     {
  81.         void do_detach();
  82.  
  83.         if(!WBenchMsg)
  84.             do_detach(&alen, &aptr);
  85.     }
  86. #ifdef STICKY
  87.     }
  88. #endif /* STICKY */
  89. #endif /* DETACH */
  90.  
  91.     if(!(_devtab = ArpAlloc(_numdev * sizeof(struct _dev))))
  92.     {
  93.         Alert(AG_NoMemory,NULL);
  94.         ArpExit(RETURN_FAIL,ERROR_NO_FREE_STORE);
  95.     }
  96.  
  97.     _devtab[0] . mode = O_RDONLY;
  98.     _devtab[1] . mode = _devtab[2] . mode = O_WRONLY;
  99.  
  100.     _stkbase = _savsp - *((long *)_savsp + 1) + 8;
  101.  
  102.     /* If compiled using the stack overflow checking function,
  103.      * the 'MANX' ID helps _stkchk() to determine if the stack
  104.      * upper bound has been overridden.
  105.      */
  106.  
  107.     *(long *)_stkbase = 'MANX';
  108.  
  109.     if(!WBenchMsg)
  110.     {
  111. #ifdef STICKY
  112.         if(!Strcmp(&aptr[0],"STICKY"))
  113.         {
  114.             _devtab[0].mode |= O_STDIO;    /* shouldn't close if STICKY */
  115.             _devtab[1].mode |= O_STDIO;
  116.  
  117.             alen -= 6;            /* remove STICKY command line argument */
  118.             aptr += 6;
  119.         }
  120. #endif /* STICKY */
  121.  
  122.         _cli_parse(pp, alen, aptr);
  123.         Enable_Abort = 1;
  124.  
  125. #ifndef DETACH
  126.         _devtab[0] . mode |= O_STDIO;        /* shouldn't close if CLI */
  127.         _devtab[1] . mode |= O_STDIO;
  128. #endif /* DETACH */
  129.  
  130.           /* !!! wb 1.4 tweek */
  131.  
  132.         _devtab[0] . fd = Input();
  133.  
  134.         if(_devtab[1] . fd = Output())
  135.             _devtab[2] . fd = Open("*", MODE_OLDFILE);
  136.  
  137.           /* !!! wb 1.4 tweek */
  138.     }
  139.     else
  140.     {
  141.         /* !!! wb 1.4 tweek */
  142.  
  143.         _devtab[0] . mode |= O_STDIO;        /* shouldn't close if WB opened something for us */
  144.         _devtab[1] . mode |= O_STDIO;
  145.         _devtab[2] . mode |= O_STDIO;
  146.  
  147.         /* !!! wb 1.4 tweek */
  148.  
  149.         if(WBenchMsg -> sm_ArgList)
  150.             CurrentDir((BPTR)WBenchMsg -> sm_ArgList -> wa_Lock);
  151.  
  152.         _wb_parse(pp, WBenchMsg);
  153.         _argv = (char **)WBenchMsg;
  154.  
  155.         /* !!! wb 1.4 tweek */
  156.  
  157.         _devtab[0] . fd = Input();
  158.         _devtab[1] . fd = _devtab[2] . fd = Output();
  159.  
  160.         /* !!! wb 1.4 tweek */
  161.     }
  162.  
  163.     exit(main(_argc, _argv));    /* Need to also close files, etc. */
  164. }
  165.  
  166. static
  167. complain()
  168. {
  169.     BPTR output;
  170.     static char complaint1[] = "You need arp.library V39+";
  171.     static char complaint2[] = "\n";
  172.     static struct IntuiText comptext = { AUTOFRONTPEN, 0, JAM1, 30, 15, NULL, (void *)complaint1 };
  173.     static struct IntuiText oktext = { AUTOFRONTPEN, AUTOBACKPEN, AUTODRAWMODE, AUTOLEFTEDGE, AUTOTOPEDGE, NULL, (void *)"Ok" };
  174.     struct Process *pp;
  175.  
  176.     pp = (struct Process *)SysBase -> ThisTask;
  177.  
  178.     if(pp -> pr_CLI && (DOSBase = (void *)OpenLibrary ("dos.library",33L)) && (output = Output()))
  179.     {
  180.         Write(output, complaint1, sizeof(complaint1-1));
  181.         Write(output, complaint2, sizeof(complaint2-1));
  182.     }
  183.     else
  184.     {
  185.         if(IntuitionBase = (void *)OpenLibrary ("intuition.library",33L))
  186.         {
  187.             AutoRequest (NULL,&comptext,NULL,&oktext,0L,0L,320L,72L);
  188.             CloseLibrary ((struct Library *)IntuitionBase);
  189.         }
  190.         else
  191.             Alert(AG_OpenLib | AO_ArpLib, 0L);
  192.     }
  193.  
  194.     if(DOSBase)
  195.     {
  196.         CloseLibrary ((struct Library *)DOSBase);
  197.         DOSBase = NULL;
  198.     }
  199. }
  200.  
  201. #ifdef DETACH
  202. extern long _stack, _priority, _BackGroundIO;
  203. extern char *_procname;
  204. BPTR _Backstdout = 0;
  205. extern BPTR _detach_curdir;
  206. extern char *_detach_name;
  207. static char *_aptr = 0;
  208.  
  209. static void
  210. do_detach(long *alen,char **aptr)
  211. {
  212.     struct Process *pp = (struct Process *)SysBase -> ThisTask;
  213.  
  214.     if(pp -> pr_CLI)                       /* first time through!! */
  215.     {
  216.         register char *cp;
  217.         register struct CommandLineInterface *cli;
  218. #ifdef PARENT
  219.         _parent_proc = pp;
  220. #endif /* PARENT */
  221.  
  222.         CurrentDir(_detach_curdir = CurrentDir(NULL));
  223.  
  224.         _detach_curdir = DupLock(_detach_curdir);
  225.  
  226.         cli = (struct CommandLineInterface *)BADDR(pp -> pr_CLI);
  227.  
  228.         if(!_stack)
  229.             _stack = cli -> cli_DefaultStack * 4;
  230.  
  231.         if(_BackGroundIO)
  232.             _Backstdout = (BPTR)Open("*", MODE_OLDFILE);
  233.  
  234.         _alen = *alen;
  235.  
  236.         if(_aptr = DosAllocMem(_alen))
  237.         {
  238.             CopyMem(*aptr, _aptr, _alen);
  239.  
  240.             cp = (char *)BADDR(cli -> cli_CommandName);
  241.  
  242.             if(_detach_name = DosAllocMem(cp[0] + 1))
  243.             {
  244.                 CopyMem(cp,_detach_name,cp[0] + 1);
  245.  
  246.                 if(CreateProc(_procname,_priority,cli -> cli_Module,_stack))
  247.                 {
  248.                     cli -> cli_Module = NULL;
  249.  
  250.                     ArpExit(0,0);
  251.                 }
  252.  
  253.                 DosFreeMem(_detach_name);
  254.             }
  255.  
  256.             DosFreeMem(_aptr);
  257.         }
  258.  
  259.         ArpExit(20,ERROR_NO_FREE_STORE);
  260.     }
  261.  
  262.         /* !!! why is this strcmp() here???
  263.          *
  264.          * Olsen says: This strcmp succeeds if the detach
  265.          * startup code has successfully created the background
  266.          * process with the name given in '_procname'.
  267.          *
  268.          * There is a nasty pitfall; say '_procname = "foo";' 
  269.          * the resulting program is called 'foo', too, and is
  270.          * called from Workbench. What happens? Bang!
  271.          * pp->pr_CLI is zero and the strcmp succeeds.
  272.          * If 'foo' hasn't crashed yet it will crash on exit.
  273.          *
  274.          * Note that the Arp _main() routine fixes this bug
  275.          * by taking a look on WBenchMsg before calling do_detach.
  276.          */
  277.  
  278.     else
  279.     {
  280.             /* second time */
  281.  
  282.         if(!strcmp(pp -> pr_Task . tc_Node . ln_Name, _procname))
  283.         {
  284.             register long *lp;
  285.             register struct DefaultTracker *tr;
  286.  
  287.             struct DefaultTracker *GetTracker(LONG);
  288.  
  289.             if(tr = GetTracker(TRAK_SEGLIST))
  290.             {
  291.                 lp = (long *)BADDR(pp -> pr_SegList);
  292.  
  293.                 tr -> dt_Object . dt_Resource = (CPTR)lp[3];
  294.             }
  295.  
  296.             if(tr = GetTracker(TRAK_DAMEM))
  297.                 tr -> dt_Object . dt_Resource = (CPTR)_aptr;
  298.  
  299.             if(tr = GetTracker(TRAK_DAMEM))
  300.                 tr -> dt_Object . dt_Resource = (CPTR)_detach_name;
  301.  
  302.             if(tr = GetTracker(TRAK_LOCK))
  303.                 tr -> dt_Object . dt_Resource = (CPTR)_detach_curdir;
  304.  
  305.             CurrentDir(_detach_curdir);
  306.  
  307.             pp -> pr_COS = _Backstdout;
  308.  
  309.             *alen = _alen;
  310.             *aptr = _aptr;
  311.         }
  312.     }
  313. }
  314. #endif /* DETACH */
  315.