home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Libraries / GUSI 1.4.1 / GUSI / Examples / GUSIAtlkTest.c next >
Encoding:
C/C++ Source or Header  |  1994-02-25  |  3.9 KB  |  193 lines  |  [TEXT/MPS ]

  1. /*********************************************************************
  2. File        :    GUSI                -    Grand Unified Socket Interface
  3. File        :    GUSIAtlkTest    -    Test appletalk sockets
  4. Author    :    Matthias Neeracher <neeri@iis.ethz.ch>
  5. Language    :    MPW C
  6.  
  7. $Log: GUSIAtlkTest.c,v $
  8. Revision 1.1  1994/02/25  02:46:44  neeri
  9. Initial revision
  10.  
  11. Revision 0.6  1992/10/14  00:00:00  neeri
  12. Fix usage messages
  13.  
  14. Revision 0.5  1992/09/08  00:00:00  neeri
  15. Factor out more common code
  16.  
  17. Revision 0.4  1992/07/31  00:00:00  neeri
  18. Test select()
  19.  
  20. Revision 0.3  1992/07/26  00:00:00  neeri
  21. Rewrote for symbolic adresses and new testing gear.
  22.  
  23. Revision 0.2  1992/05/13  00:00:00  neeri
  24. Adapted for AppleTalk sockets
  25.  
  26. Revision 0.1  1992/04/17  00:00:00  neeri
  27. Handle SIOW activate/update
  28.  
  29. *********************************************************************/
  30.  
  31. #include <GUSI.h>
  32. #include <GUSITest.h>
  33. #include <stdio.h>
  34. #include <fcntl.h>
  35. #include <stdlib.h>
  36. #include <errno.h>
  37. #include <string.h>
  38.  
  39. #include "Events.h"
  40.  
  41. extern int GUSIDefaultSpin(spin_msg, long);
  42.  
  43. sa_constr_atlk    Constr    =    {
  44.     1,
  45.     {
  46.         {
  47.             nil, "\pGUSIAtlkTest"
  48.         },
  49.         {
  50.             nil, ""
  51.         },
  52.         {
  53.             nil, ""
  54.         },
  55.         {
  56.             nil, ""
  57.         }
  58.     }
  59. };
  60.  
  61. void Socket(char, char, const char *)
  62. {
  63.     sock    =    socket(AF_APPLETALK, SOCK_STREAM, 0);
  64.     
  65.     if (sock == -1)    {
  66.         printf("# socket() returned error %s\n", Explain());
  67.         Where();
  68.     }
  69. }
  70.  
  71. void Bind(char ch1, char ch2, const char * cmd)
  72. {
  73.     struct sockaddr_atlk_sym    addr;
  74.     Str63                            obj;
  75.  
  76.     if (sock == -1)    {
  77.         printf("# socket is not open\n");
  78.         Where();
  79.         
  80.         return;
  81.     }
  82.  
  83.     if (sscanf(cmd, "%s", (char *) (obj+1)) == 1) {
  84.         addr.family    =    ATALK_SYMADDR;
  85.         obj[0]    =    strlen((char *) (obj+1));
  86.         NBPSetEntity((Ptr) &addr.name, obj, "\pGUSIAtlkTest", "\p*");
  87.     } else {
  88.         Usage(ch1, ch2);
  89.                 
  90.         return;
  91.     }
  92.  
  93.     if (bind(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_atlk_sym)))    {
  94.         printf("bind(\"%s\") returned error %s\n", (char *) (obj+1), Explain());
  95.         Where();
  96.     }
  97. }
  98.  
  99. void Accept(char, char, const char *)
  100. {
  101.     int                        len;
  102.     struct sockaddr_atlk    addr;
  103.  
  104.     if (sock == -1)    {
  105.         printf("# socket is not open\n");
  106.         Where();
  107.         
  108.         return;
  109.     }
  110.     if (accsock != -1)    {
  111.         printf("# can't accept more than one connection\n");
  112.         Where();
  113.         
  114.         return;
  115.     }
  116.  
  117.     len    =    sizeof(struct sockaddr_atlk);
  118.     sock    =    accept(accsock = sock, (struct sockaddr *) &addr, &len);
  119.     
  120.     if (sock < 0)    {
  121.         printf("# accept() returned error %s\n", Explain());
  122.         sock        =    accsock;
  123.         accsock    =    -1;
  124.     } else
  125.         printf(
  126.             "# accepted connection from [%d]%d:%d\n", 
  127.             addr.addr.aNet, 
  128.             addr.addr.aNode,
  129.             addr.addr.aSocket);
  130.     
  131.     Where();
  132. }
  133.     
  134. void Connect(char, char, const char * cmd)
  135. {
  136.     int                                len;
  137.     struct sockaddr_atlk_sym    symaddr;
  138.     struct sockaddr_atlk            numaddr;
  139.     Str63                                obj;
  140.  
  141.     if (sock == -1)    {
  142.         printf("# socket is not open\n");
  143.         Where();
  144.         
  145.         return;
  146.     }
  147.  
  148.     if (sscanf(cmd, "%s", (char *) (obj+1)) == 1) {
  149.         symaddr.family    =    ATALK_SYMADDR;
  150.         obj[0]    =    strlen((char *) (obj+1));
  151.         NBPSetEntity((Ptr) &symaddr.name, obj, "\pGUSIAtlkTest", "\p*");
  152.  
  153.         if (connect(sock, (struct sockaddr *) &symaddr, sizeof(struct sockaddr_atlk_sym)))    {
  154.             printf("# connect(\"%s\") returned error %s\n", (char *) (obj+1), Explain());
  155.             Where();
  156.         }
  157.     } else {
  158.         len = sizeof(struct sockaddr_atlk);
  159.         
  160.         if (choose(AF_APPLETALK, 0, "Yeah ?", &Constr, 0, &numaddr, &len))    {
  161.             printf("# choose() returned error %s\n", Explain());
  162.             Where();
  163.             
  164.             return;
  165.         }
  166.  
  167.         if (connect(sock, (struct sockaddr *) &numaddr, len))    {
  168.             printf(
  169.                 "# connect([%d]%d:%d) returned error %s\n", 
  170.                 numaddr.addr.aNet, 
  171.                 numaddr.addr.aNode,
  172.                 numaddr.addr.aSocket,
  173.                 Explain());
  174.             Where();
  175.         }
  176.     }
  177. }    
  178.  
  179. main(int argc, char ** argv)
  180. {
  181.     printf("GUSIAtlkTest        MN 14Oct92\n\n");
  182.  
  183.     COMMAND('s', 's', Socket,  "",                 "Create a stream socket");
  184.     COMMAND('a', 'c', Accept,  "",                 "Accept a connection");
  185.     COMMAND('b', 'd', Bind,      "objectname",     "Bind to address");
  186.     COMMAND('c', 'o', Connect, "[objectname]","Connect to address");
  187.     
  188.     AddSocketCommands();
  189.     
  190.     GUSISetEvents(GUSISIOWEvents);
  191.     RunTest(argc, argv);
  192.     CleanupSockets();
  193. }