home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 074.lha / Exec / ListPorts.c < prev    next >
C/C++ Source or Header  |  1986-11-20  |  2KB  |  126 lines

  1. /*
  2.  *    ListPorts.c
  3.  *
  4.  *    This program produces a list of message ports on it's standard.
  5.  *    output.
  6.  *
  7.  *    Program        Date        Action
  8.  *    D. Thomas    24 April 1987    v1.0 Initial Coding.
  9.  *
  10.  */
  11.  
  12. #include "exec/execbase.h"
  13. #include "exec/ports.h"
  14. #include "functions.h"
  15.  
  16. extern struct ExecBase *SysBase;    /* Exec's base ptr */
  17.  
  18. static char *flag[] = {
  19.   "Signal",
  20.   "SoftInt",
  21.   "Ignore"
  22. };
  23.  
  24. main ()
  25.  
  26. {
  27.  
  28.   register struct MsgPort *t;       /* ptr to port list */
  29.   register struct List     head;    /* for my copy of the port list */
  30.  
  31.   NewList (&head);
  32.  
  33.   Disable ();
  34.  
  35.   if (getlist (&SysBase->PortList, &head))
  36.     cleanup (&head);
  37.  
  38.   Enable ();
  39.  
  40.   puts ("Action  Signalled Task       Port");
  41.  
  42.   while (t = (struct MsgPort *) RemHead (&head)) {
  43.  
  44.     printf ("%-7.7s %-20.20s %s\n",
  45.       flag[t->mp_Flags & PF_ACTION],
  46.       (t->mp_SigTask ? t->mp_SigTask->tc_Node.ln_Name : "<unset>"),
  47.       (t->mp_Node.ln_Name ? t->mp_Node.ln_Name : "<unset>"));
  48.     FreeMem (t->mp_Node.ln_Name, (long) strlen (t->mp_Node.ln_Name) + 1);
  49.     FreeMem (t, (long) sizeof *t);
  50.  
  51.   }
  52.  
  53.   exit (0L);
  54.  
  55. }
  56.  
  57. freelist (l)
  58.  
  59. struct List *l;
  60.  
  61. {
  62.  
  63.   struct MsgPort *t;
  64.  
  65.   while (t = (struct MsgPort *) RemHead (l)) {
  66.     FreeMem (t->mp_Node.ln_Name, (long) strlen (t->mp_Node.ln_Name) + 1);
  67.     FreeMem (t, (long) sizeof *t);
  68.   }
  69.  
  70. }
  71.  
  72. cleanup (l)
  73.  
  74. struct List *l;
  75.  
  76. {
  77.  
  78.   Enable ();
  79.   freelist (l);
  80.   puts ("Out of Memory!");
  81.   exit (0);
  82.  
  83. }
  84.  
  85. getlist (tl, l)
  86.  
  87. struct List *tl;
  88. struct List *l;
  89.  
  90. {
  91.  
  92.   register struct MsgPort *t;
  93.  
  94.   for (t = (struct MsgPort *) tl->lh_Head;
  95.        t->mp_Node.ln_Succ;
  96.        t = (struct MsgPort *) t->mp_Node.ln_Succ)
  97.     if (onenode (t, l))
  98.       return TRUE;
  99.  
  100.   return FALSE;
  101.  
  102. }
  103.  
  104. onenode (t, l)
  105.  
  106. struct MsgPort *t;
  107. struct List    *l;
  108.  
  109. {
  110.  
  111.   register struct MsgPort *tc;
  112.  
  113.   if (!(tc = (struct MsgPort *) AllocMem ((long) sizeof *t, 0L)))
  114.       return TRUE;
  115.   *tc = *t;
  116.   if (!(tc->mp_Node.ln_Name = (char *) AllocMem ((long) strlen (t->mp_Node.ln_Name) + 1, 0L))) {
  117.     FreeMem (tc, (long) sizeof *tc);
  118.     return TRUE;
  119.   }
  120.   strcpy (tc->mp_Node.ln_Name, t->mp_Node.ln_Name);
  121.   AddTail (l, tc);
  122.  
  123.   return FALSE;
  124.  
  125. }
  126.