home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 144.lha / asr.c < prev    next >
Text File  |  1986-11-21  |  6KB  |  284 lines

  1. /*
  2. DATE: 1-July-88
  3. Test of ASyncRun by A. Kirk, co-author of AMIC-TERM, author of AMIC-TALK.
  4. Freely distributable if ARC file and this message remains intact.
  5. Revisions, corrections, or extensions welcome. 
  6.  
  7. Leave Email on:
  8. AMIC-2000, 707-579-0523, a. kirk.
  9. BIX                       alkirk.
  10. VOICE      707-546-8532.
  11.  
  12. Compiled with MANX 3.6a
  13.  
  14. cc asr.c
  15. ln asr.o -larp -lc
  16.  
  17. Feel free to use this code for anything.
  18. */
  19.  
  20.   
  21.  
  22. #include <libraries/dosextens.h>
  23. #include <libraries/dos.h>
  24. #include <libraries/filehandler.h>
  25.  
  26. #include <intuition/intuition.h>
  27.  
  28. #include <exec/nodes.h>
  29. #include <exec/lists.h>
  30. #include <exec/exec.h>
  31. #include <exec/types.h>
  32. #include <exec/nodes.h>
  33. #include <exec/devices.h>
  34. #include <exec/memory.h>
  35. #include <exec/ports.h>
  36.  
  37.  
  38. #include <stdio.h>
  39. #include <ctype.h>
  40. #include <fcntl.h>
  41.  
  42. #include <libraries/arpbase.h>
  43. #include <arpfunctions.h>
  44.  
  45. #ifdef NULL
  46. #undef NULL
  47. #endif
  48. #define NULL 0L
  49.  
  50. struct ArpBase             *ArpBase = NULL;
  51. struct ProcessControlBlock *AcB     = NULL;
  52. struct MsgPort             *Myport  = NULL;
  53. struct ZombieMsg           *Zm      = NULL;
  54. struct Library             *IB      = NULL, *DB= NULL;
  55. extern UBYTE               *AllocMem();
  56. extern struct MsgPort      *CreatePort();
  57. struct Library             *OpenLibrary();
  58. extern VOID                *CloseLibrary();
  59. extern long                AsyncRun();  
  60.  
  61. struct UserAnchor {
  62.     struct    AnchorPath    ua_AP;
  63.     BYTE    moremem[255];
  64. };
  65.  
  66. /*
  67. char *cmd[12] = {
  68.                 "ls",
  69.                 "dir",
  70.                 "ls",
  71.                 "dir",
  72.                 "am",
  73.                 "info",
  74.                 "ls",
  75.                 "dir",
  76.                 "ls",
  77.                 "dir",
  78.                 "am",
  79.                 "info",
  80.                 };
  81. */
  82.  
  83.  
  84. VOID doit(i,j)
  85. register char *i,*j; 
  86. {
  87.  
  88.     long cli;
  89.  
  90.     Zm->zm_ExecMessage.mn_ReplyPort = Myport;
  91.     AcB->pcb_StackSize   = 25000L;
  92.     AcB->pcb_Pri         = 0;
  93.     AcB->pcb_LastGasp    = Zm;
  94.     AcB->pcb_Control     = (BYTE)(PRB_SAVEIO);
  95.  
  96.     cli = ASyncRun(i,j,AcB);
  97.         
  98.     if(cli > -1)
  99.        Wait(1L << Myport->mp_SigBit);
  100.     else
  101.        Printf("%s failed, ASyncRun returned %ld\n",i,cli);
  102.  
  103. }
  104.  
  105. main(argc,argv)
  106. SHORT argc;
  107. BYTE **argv;
  108. {
  109.  
  110.     extern    struct FileHandle *Open();
  111.     extern    VOID              Close();
  112.  
  113.     register                    char *s = NULL, *r = NULL;
  114.  
  115.     struct    FileHandle        *redir  = NULL;
  116.  
  117.     struct    UserAnchor        *Anchor = NULL;
  118.  
  119.     LONG                        Result  = 0,    ci = 0;
  120.     char                        temp[255];
  121.     UBYTE                       i;
  122.  
  123.  
  124.     ArpBase = (struct ArpBase *)OpenLibrary(ArpName, ArpVersion);
  125.     IB      = ArpBase->IntuiBase;
  126.     DB      = ArpBase->DosBase;
  127.  
  128.     Myport  = CreatePort("test",0L);
  129.  
  130.     Zm  = (struct ZombieMsg *)ArpAlloc((ULONG)sizeof(struct ZombieMsg));
  131.     AcB = (struct ProcessControlBlock *)ArpAlloc((ULONG)sizeof(struct ProcessControlBlock));
  132.  
  133.     Myport->mp_Node.ln_Type = NT_MSGPORT;
  134.     Myport->mp_Flags        = PA_SIGNAL;
  135.  
  136.     if(!(Zm && Myport && AcB))
  137.        goto out;
  138.  
  139.  
  140.     Puts(" ");
  141.  
  142.     Puts("Error message returned only upon failure.\n");
  143.  
  144.  
  145. t:  temp[0] = '\0';
  146.     Puts("Type '1' <CR>  to check performance of ASuncRun with files in the current Directory.");
  147.     Puts("Type '2' <CR>  to test individual command with ASyncRun and wait for return.");
  148.     Puts("Type 'Control \\' to terminate.\n");
  149.  
  150.     putchar('?');
  151.  
  152.     if(gets(temp) == NULL) 
  153.         goto out;
  154.  
  155.     switch (temp[0])
  156.     {
  157.         case '1': goto a;
  158.         case '2': goto b;
  159.         case '': goto out;
  160.         default : Puts("\nThats not what I need!! Try again.\n");
  161.                   goto t;
  162.     }
  163.  
  164.  
  165. a:  if(Anchor = (struct UserAnchor *)ArpAlloc((ULONG)sizeof( *Anchor )))
  166.     Anchor->ua_AP.ap_Length = 255;
  167.         
  168.     Result = FindFirst( "*", Anchor);
  169.  
  170.     while (Result == 0)
  171.     {
  172.        Puts(Anchor->ua_AP.ap_Buf);
  173.  
  174.        if (Anchor->ua_AP.ap_Info.fib_DirEntryType < 0)
  175.           doit(Anchor->ua_AP.ap_Buf,"\n");
  176.  
  177.        Result = FindNext(Anchor);
  178.     }
  179.  
  180.     FreeAnchorChain(Anchor);
  181.  
  182.     if (Result == ERROR_BUFFER_OVERFLOW)
  183.         Puts("I should have allocated a larger buffer. Sorry!");
  184.     goto out;
  185.  
  186.  
  187.  
  188. /*  Scott: 
  189.  
  190.  
  191.   for(i=0;i<12;i++)
  192.   {
  193.     Zm->zm_ExecMessage.mn_ReplyPort = Myport;
  194.     AcB->pcb_StackSize   = 25000L;
  195.     AcB->pcb_Pri         = 0;
  196.     AcB->pcb_LastGasp    = Zm;
  197.     AcB->pcb_Control     = (BYTE)(PRB_SAVEIO);
  198.  
  199.     ci = ASyncRun(cmd[i],NOCMD,AcB);
  200.         
  201.     if(ci > -1)
  202.        Wait(1L << Myport->mp_SigBit);
  203.     else
  204.        Printf("%s failed, ASyncRun returned %ld\n",temp,ci);
  205.   }
  206.  
  207.   Puts("first test done");  if this hasn't failed, should continue to next 
  208.  
  209.  
  210. *************************************************/
  211.  
  212.   
  213. b:  Puts(" ");
  214.     Puts("Type 'Control \\' to terminate.\n");
  215.     Puts("Redirection nust be:  |command >nnnnn args|\n");
  216.  
  217.     for(;;)        /* THIS SECTION READS INPUT AND PASSES IT TO ASYNCRUN */
  218.     {
  219.        putchar(':');
  220.        
  221.        for(i=0; i<254 ;i++)
  222.            temp[i] = '\0';
  223.           
  224.  
  225.        if(gets(temp) == NULL) 
  226.            break;                               /*  CNTRL \ breaks */
  227.  
  228.        for(s=temp; *s && !isspace(*s); s++)  
  229.            ;
  230.  
  231.        if(s == &temp)                           /*  CR  */
  232.            continue;
  233.  
  234.        *s++ = '\0';
  235.  
  236.        if (*s)
  237.        {
  238.            while(*s && isspace(*s))
  239.               s++;
  240.        }
  241.  
  242.        else 
  243.            s    = "\n";
  244.  
  245.        if(s[0] == '>')
  246.        {
  247.            s++;
  248.            for(r=s; *r && !isspace(*r);r++)
  249.               ;
  250.            *r++ = '\0';
  251.            redir = Open(s,MODE_NEWFILE);
  252.  
  253.            if(!redir)
  254.            {
  255.                Printf("Unable to open redirection file: %s\n",s);
  256.                continue;
  257.            } 
  258.    
  259.            AcB->p_Output = redir;
  260.            while(*r && isspace(*r))
  261.               r++;
  262.  
  263.            if(!*r)
  264.               r = "\n";
  265.  
  266.        }
  267.        else
  268.           r = s;
  269.        
  270.        doit(temp,r);
  271.        AcB->p_Output = NULL;
  272.        s = NULL;   
  273.        r = NULL;
  274.  
  275. /*       if(redir)
  276.           Close(redir);*/  /* should be able todo this, but crashes if we try */
  277.    }
  278.  
  279. out:
  280.     DeletePort(Myport);
  281.     CloseLibrary(ArpBase);
  282.  
  283.  
  284. }