home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 200-299 / ff290.lzh / IPC / Sources / Cleaner.c < prev    next >
C/C++ Source or Header  |  1989-12-11  |  3KB  |  102 lines

  1. /*  Cleanup program for IPC 89:11:26 */
  2.  
  3. /***************************************************************
  4.  * This program has two functions:
  5.  *
  6.  *  Invoked without any arguments, it prints a list of all
  7.  *  the IPCPorts currently defined, with the number of
  8.  *  references (Clients or Servers) to each, and any state
  9.  *  flags set.
  10.  *
  11.  *  If you give the name of any currently valid IPCPort
  12.  *  as an argument (multiple args allowed) it will remove
  13.  *  ALL the references to that port, and the port itself.
  14.  *  This is ONLY an "Emergency Recovery" operation!!
  15.  *  It should only be used when a faulty program has
  16.  *  terminated without dropping its reference to the
  17.  *  port.  ALL processes CORRECTLY connected to the
  18.  *  port should be terminated BEFORE using this command.
  19.  *
  20.  **************************************************************/
  21.  
  22.  
  23. #include <stdio.h>
  24. #include "IPCPorts.h"
  25. #include "IPC_proto.h"
  26. #include "IPC.h"
  27.  
  28. #include "exec/memory.h"
  29.  
  30.  
  31. ULONG IPCBase;
  32.  
  33. struct IPCPort *port, *testport;
  34.  
  35. char tportname[]= " CleaNeR  PoRt --";  /* a VERY odd name... */
  36.  
  37. int cleanport(char * portname)
  38. {
  39.     struct IPCMessage *imsg;
  40.         if (!portname || !*portname) return FALSE;
  41.         port = GetIPCPort(portname);
  42.         if (port->ipp_Flags & IPP_SERVED) {
  43.             printf("Shutting port %s\n", portname);
  44.             ShutIPCPort(port);
  45.             while (imsg = (struct IPCMessage *)GetMsg(port)) {
  46.                 imsg->ipc_Flags |= IPC_NOTKNOWN;
  47.                 ReplyMsg(imsg);
  48.             }
  49.         }
  50.         if (port->ipp_Flags & IPP_SHUT) {
  51.             printf("Leaving port %s\n", portname);
  52.             LeaveIPCPort(port);
  53.         }
  54.         printf("dropping %d clients from %s\n",
  55.             CheckIPCPort(port,0), portname);
  56.         while (CheckIPCPort(port,0)) DropIPCPort(port);
  57.         return TRUE;
  58. }
  59.  
  60. void showport(struct Node * np)
  61. {
  62.     struct IPCPort * ip = (struct IPCPort *) np;
  63.     int refs = CheckIPCPort(ip, 0);
  64.     printf("%s: %d reference%s\n", ip->ipp_Name, refs, refs == 1 ? "" : "s");
  65.     if (ip->ipp_Flags)
  66.         printf("  -- marked as %s%s%s%s%s\n",
  67.                 ip->ipp_Flags & IPP_LOADING ? "LOADING " : "",
  68.                 ip->ipp_Flags & IPP_SERVED ? "SERVED " : "",
  69.                 ip->ipp_Flags & IPP_REOPEN ? "REOPEN " : "",
  70.                 ip->ipp_Flags & IPP_SHUT ? "SHUT " : "",
  71.                 ip->ipp_Flags & IPP_NOTIFY ? "NOTIFY " : "");
  72. }
  73.  
  74. void main(int argc, char ** argv)
  75. {
  76.     char **argp, *portname;
  77.     struct Node *np; /* actually an IPCPort (but changed back when needed) */
  78.  
  79.     IPCBase = OpenLibrary("ppipc.library",0);
  80.     if (!IPCBase) {
  81.         puts("couldn't find IPC Library -- TTFN...\n");
  82.         exit(20);
  83.     }
  84.  
  85.     argp = &argv[1];
  86.  
  87.     if (argc > 1)
  88.         while (--argc) cleanport(*argp++);
  89.     else {
  90.         if (FindIPCPort(tportname)) cleanport(tportname); /* just in case */
  91.         testport = GetIPCPort(tportname);   /* now at head of list */
  92.         for (np = (struct Node *)testport->ipp_Port.mp_Node.ln_Succ;
  93.                      /* don't include testport...*/
  94.                 np->ln_Succ; np = np->ln_Succ)
  95.             showport(np);
  96.         DropIPCPort(testport);
  97.     }
  98.     CloseLibrary(IPCBase);
  99. }
  100.  
  101.  
  102.