home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / mint / mgr / sparcmgr / demo1.zoo / demo / msg / client.c next >
Encoding:
C/C++ Source or Header  |  1989-01-24  |  6.4 KB  |  222 lines

  1. /*    $Header: client.c,v 4.1 88/06/21 14:02:36 bianchi Exp $
  2.     $Source: /tmp/mgrsrc/demo/msg/RCS/client.c,v $
  3. */
  4. static char    RCSid_[] = "$Source: /tmp/mgrsrc/demo/msg/RCS/client.c,v $$Revision: 4.1 $";
  5.  
  6. /*                        Copyright (c) 1987 Bellcore
  7.  *                            All Rights Reserved
  8.  *       Permission is granted to copy or use this program, EXCEPT that it
  9.  *       may not be sold for profit, the copyright notice must be reproduced
  10.  *       on copies, and credit should be given to Bellcore where it is due.
  11.  *       BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
  12.  */
  13. /* sample client for testing server (template only) */
  14.  
  15. #include <stdio.h>
  16. #include <signal.h>
  17. #include "term.h"
  18. #include "do.h"
  19.  
  20. #define MAX    20    /* max # of servers */
  21.  
  22. struct server {
  23.    int id;
  24.    char *name;
  25.    };
  26.  
  27. struct server servers[MAX];
  28. int cnt=0;            /* server count */
  29.  
  30. main(argc,argv)
  31. int argc;
  32. char **argv;
  33.    {
  34.    register int i;
  35.    char *ttyname();
  36.    char *str_save();
  37.    int clean();
  38.    char message[100];
  39.    char line[100];
  40.    char args[100];
  41.    char name[20];
  42.    int id;
  43.  
  44.    ckmgrterm( *argv );
  45.  
  46.    m_setup(M_FLUSH);
  47.    chmod(ttyname(2),0600);        /* this is not gauranteed */
  48.    m_push(P_EVENT|P_FLAGS);        /* save old events and flags */
  49.    signal(SIGTERM,clean);        /* cleanup upon termination */
  50.    signal(SIGINT,clean);
  51.    m_setevent(NOTIFY,"client");        /* my name is "client" */
  52.    m_setevent(ACCEPT,"&%f:%m\r");    /* get messages: &<from>:<message\r */
  53.    m_setevent(BUTTON_1,"D %n");
  54.    m_setevent(BUTTON_2,"X %n is id %w");
  55.    sprintf(message,"%c",C_WHO);
  56.    m_broadcast(message);        /* ask all servers for their id's */
  57.    m_flush();
  58.  
  59.    /* loop, reading lines from keyboard */
  60.  
  61.    while(m_gets(line) != NULL) {
  62.       printf("got: %s",line);
  63.       if (*line == '&') {
  64.          sscanf(line+1,"%d:%s %[^\n]", &id,message,args);
  65.          switch (*message) {
  66.             case S_HI:            /* received server announcement */
  67.                printf("Server %d (%s) started [%s]\n",id,message,args);
  68.                install(args,id);
  69.                break;
  70.  
  71.             case S_BYE:            /* a server died */
  72.                printf("Server %d died\n",id);
  73.                for(i=0;i<cnt;i++)
  74.                   if (servers[i].id == id) {
  75.                      printf("server %s (%d) removed from %d\n",
  76.                             servers[i].name,servers[i].id,i);
  77.                      servers[i].id = 0;
  78.                      free(servers[i].name);
  79.                      break;
  80.                      }
  81.                   if (i+1 == cnt && cnt>0)
  82.                      cnt--;
  83.                break;
  84.  
  85.             case S_REPLY:            /* a server reply message */
  86.                printf("Server %d replied %s\n",id,message);
  87.                switch (message[1]) {
  88.                   case R_WHO:            /* who are you */
  89.                      install(args,id);
  90.                      break;
  91.                   case R_RCVD:            /* received command */
  92.                      printf("Command received\n");
  93.                      break;
  94.                   case R_DO:            /* working on command */
  95.                      printf("Command is executing\n");
  96.                      break;
  97.                   case R_DONE:            /* command completed */
  98.                      printf("Command completed\n");
  99.                      break;
  100.                   case R_BAD:            /* command rejected */
  101.                      printf("Command rejected\n");
  102.                      break;
  103.                   case R_UNKWN:            /* unknown command */
  104.                      printf("Command unknown\n");
  105.                      break;
  106.                   default:
  107.                      printf("Unknown server reply\n");
  108.                   }
  109.                break;
  110.  
  111.             case C_WHO:            /* some other client sent this */
  112.                printf("got a client WHO message\n");
  113.                break;
  114.  
  115.             default:
  116.                printf("non-server message from %d (%s)\n",id,message);
  117.                break;
  118.             }
  119.          }
  120.  
  121.       /* not a message, must be a button hit or kbd */
  122.  
  123.       else {
  124.          switch (*line) {
  125.             case 'L':            /* list servers */
  126.                for(i=0;i<cnt;i++) {
  127.                   if (servers[i].id > 0)
  128.                      printf("%d) server %d is [%s]\n",
  129.                              i,servers[i].id, servers[i].name);
  130.                   }
  131.                break;
  132.  
  133.             case 'S':            /* put file in snarf buffer */
  134.                m_snarf(line+2);
  135.                printf("Putting->snarf buffer: %s\n",line+2);
  136.                break;
  137.  
  138.             case 'D':            /* send command to server */
  139.                sscanf(line,"%*s %s %[^\n]", name,args);
  140.                for(i=0;i<cnt;i++) 
  141.                   if (servers[i].id > 0 && strcmp(servers[i].name,name)==0) {
  142.                      printf("sending [%s] to %s (%d)\n",
  143.                              args,name,servers[i].id);
  144.                      sprintf(message,"%c %s",C_DO,args);
  145.                      m_sendto(servers[i].id,message);
  146.                      break;
  147.                      }
  148.                if (i==cnt)
  149.                   printf("Can't find server [%s]\n",name);
  150.                break;
  151.  
  152.             case '?':            /* list commands */
  153.                printf("L        list servers\n");
  154.                printf("D <server> <command>        do a command\n");
  155.                printf("?        ask for help\n");
  156.                break;
  157.  
  158.             default:
  159.                printf("Not a message: %s\n",line);
  160.             }
  161.          }
  162.       m_flush();
  163.       }
  164.    }
  165.    
  166. /*    Clean up and exit */
  167.  
  168. clean(n)
  169. int n;
  170.    {
  171.    m_popall();
  172.    exit(n);
  173.    }
  174.  
  175. /* save a copy of string s */
  176.  
  177. char *
  178. str_save(s)
  179. char *s;
  180.    {
  181.    char *malloc(), *strcpy();
  182.    return(strcpy(malloc(strlen(s)+1),s)); 
  183.    }
  184.  
  185. /* install a server */
  186.  
  187. int
  188. install(name,id)
  189. char *name;
  190. int id;
  191.    {
  192.    register int i,spot = -1;
  193.  
  194.    for(i=0;i<cnt;i++)
  195.       if (servers[i].id == id) {
  196.          printf("server id %d already installed at %d\n",id,i);
  197.          if (strcmp(name,servers[i].name) != 0) {
  198.             free(servers[i].name);
  199.             servers[i].name = str_save(name);
  200.             }
  201.          return(i);
  202.          }
  203.       else if (spot == -1 && servers[i].id == 0)
  204.          spot = i;
  205.  
  206.  
  207.       if (spot != -1) {
  208.          servers[spot].id = id;
  209.          servers[spot].name = str_save(name);
  210.          printf("server %s (%d) installed at %d\n",
  211.                 name,id,spot);
  212.          }
  213.       else if (cnt < MAX) {
  214.          servers[cnt].id = id;
  215.          servers[cnt].name = str_save(name);
  216.          printf("server %s (%d) installed at %d\n",
  217.                 name,id,cnt);
  218.          cnt++;
  219.          }
  220.    return(i);
  221.    }
  222.