home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume30 / sendopr / part01 / tcpopen.c < prev   
C/C++ Source or Header  |  1992-06-20  |  2KB  |  83 lines

  1. /*
  2. * $Author: reggers $
  3. * $Date: 1992/06/10 14:02:26 $
  4. * $Header: /usr/src/usr.local/utilities/sendopr/RCS/tcpopen.c,v 1.2 1992/06/10 14:02:26 reggers Exp $
  5. *
  6. * Abstract: open a connection to a host/service
  7. *
  8. * Original work by Reg Quinton; 30 Apr 1991
  9. */
  10.  
  11. #include    <stdio.h>
  12. #include    <signal.h>
  13. #include    <setjmp.h>
  14. #include    <sys/types.h>
  15. #include    <sys/socket.h>
  16. #include    <netinet/in.h>
  17. #include    <netdb.h>
  18.  
  19. #ifndef SIGRET
  20. #define SIGRET  int
  21. #endif
  22.  
  23. #ifndef TIMEOUT
  24. #define TIMEOUT 60
  25. #endif
  26.  
  27. static    jmp_buf    env;    /* for jump back */
  28.  
  29. static
  30. SIGRET    catcher()
  31. {    longjmp(env,1);    }
  32.  
  33. /* open a connection to some service on some host */
  34.  
  35. int    tcpopen(host,service)
  36. char    *service, *host;
  37. {       int     unit;
  38. static  struct  sockaddr_in     sin;
  39. static  struct  servent         *sp;
  40. static  struct  hostent         *hp;
  41.     SIGRET    (*oldsig)();
  42.  
  43.     oldsig=signal(SIGALRM,catcher);
  44.  
  45.     if (setjmp(env))
  46.     {    signal(SIGALRM,oldsig);    alarm(0);
  47.         return(-1);
  48.     }
  49.  
  50.     alarm(TIMEOUT);
  51.  
  52.        /* this is straight line lifting from the 4.2BSD IPC Primer
  53.            example of section 3.5... the famous figure 1 */
  54.  
  55.         if ((sp=getservbyname(service,"tcp")) == NULL)
  56.         {       fprintf(stderr,"Oops ... no such service \"%s\"\n",service);
  57.                 return(-1);
  58.         }
  59.  
  60.         if ((hp=gethostbyname(host)) == NULL)
  61.         {       fprintf(stderr,"Oops ... unknown host \"%s\"\n",host);
  62.                 return(-1);
  63.         }
  64.  
  65.         bzero((char *)&sin, sizeof(sin));
  66.         bcopy(hp->h_addr,(char *)&sin.sin_addr,hp->h_length);
  67.         sin.sin_family=hp->h_addrtype;
  68.         sin.sin_port=sp->s_port;
  69.  
  70.         if ((unit=socket(AF_INET,SOCK_STREAM,0)) < 0)
  71.         {       fprintf(stderr,"Oops ... tcp/ip cannot open socket\n");
  72.                 return(-1);
  73.         }
  74.  
  75.         if (connect(unit,(char *)&sin,sizeof(sin)) < 0)
  76.         {       fprintf(stderr,"Oops ... tcp/ip cannot connect to server\n");
  77.                 return(-1);
  78.         }
  79.  
  80.     signal(SIGALRM,oldsig);    alarm(0);
  81.     return(unit);
  82. }
  83.