home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / monitors / rsys / goodies / tbreak / tbreak.c < prev    next >
C/C++ Source or Header  |  1995-02-27  |  2KB  |  101 lines

  1.  
  2. #include <exec/types.h>
  3. #include <exec/execbase.h>
  4.  
  5. #include <dos/dos.h>
  6. #include <dos/dosextens.h>
  7.  
  8. #include <clib/dos_protos.h>
  9. #include <clib/exec_protos.h>
  10.  
  11. #include <stdio.h>
  12. #include <string.h>
  13.  
  14. #define STRINGEND '\0'
  15.  
  16. char *
  17. B2CStr(char *ret, BSTR inp)
  18. {
  19.    register int i;
  20.    char *help = (char *)BADDR(inp);
  21.  
  22.    for (i = 0; i < *help; i++)
  23.       *(ret + i) = *(help + i + 1);
  24.  
  25.    *(ret + i) = STRINGEND;
  26.  
  27.    return (ret);
  28. }
  29.  
  30. int
  31. main(int argc,char **argv)
  32. {
  33.    struct DOSBase *DOSBase = NULL;
  34.    extern struct ExecBase *SysBase;
  35.    int ret = RETURN_FAIL;
  36.  
  37.    if(DOSBase = (struct DOSBase *)OpenLibrary((STRPTR)"dos.library", 33L))
  38.    {
  39.       struct Node *node,*membernode[200];
  40.       struct CommandLineInterface *CLI;
  41.       char modname[200];
  42.       int i,j,out;
  43.  
  44.       if(argc != 2)
  45.          Printf((STRPTR)"Aufruf: %s <taskname>\n",argv[0]);
  46.       else
  47.       {
  48.          Forbid();
  49.          Disable();
  50.  
  51.          for (node = SysBase->TaskWait.lh_Head;
  52.               node->ln_Succ&& i < 200; node = node->ln_Succ)
  53.             membernode[i++] = node;
  54.  
  55.          for (node = SysBase->TaskReady.lh_Head;
  56.               node->ln_Succ && i < 200; node = node->ln_Succ)
  57.             membernode[i++] = node;
  58.  
  59.          if (i < 200)
  60.             membernode[i++] = &SysBase->ThisTask->tc_Node;
  61.  
  62.          Enable();
  63.  
  64.          out = FALSE;
  65.  
  66.          for (j = 0; j < i && !out && i < 200; j++)
  67.          {
  68.             struct Process *proc = (struct Process *)membernode[j];
  69.  
  70.             if(CLI = (struct CommandLineInterface *)BADDR(proc->pr_CLI))
  71.             {
  72.                B2CStr(modname,CLI->cli_CommandName);
  73.  
  74.                if (!strcmp(argv[1],modname))
  75.                {
  76.                   Signal((struct Task *)proc,
  77.                          SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_D |
  78.                          SIGBREAKF_CTRL_E | SIGBREAKF_CTRL_F);
  79.  
  80.                   out = TRUE;
  81.                }
  82.             }
  83.          }
  84.  
  85.          Permit();
  86.  
  87.          if(out == TRUE)
  88.             Printf((STRPTR)"Task with command \'%s\' signaled...\n",argv[1]);
  89.  
  90.          if(i >= 200)
  91.             PutStr((UBYTE *)"More than 200 tasks read!\n");
  92.  
  93.          ret = RETURN_OK;
  94.       }
  95.  
  96.       CloseLibrary((struct Library *)DOSBase);
  97.    }
  98.  
  99.    return(ret);
  100. }
  101.