1: #include <sys/types.h>
   2: #include <sys/socket.h>
   3: #include <netinet/in.h>
   4: #include <ctype.h>
   5: #include <netdb.h>
   6: #include "get_tcp_conn.h"
   7: 
   8: extern int  errno;
   9: 
  10: /*
  11: ** Take the name of an internet host in ASCII (this may either be its
  12: ** official host name or internet number (with or without enclosing
  13: ** backets [])), and return the internet address number in 32 bit quantity.
  14: **
  15: ** returns FAIL for failure to find the host name in the local database,
  16: ** or for a bad internet address spec.
  17: */
  18: u_long
  19: name_to_address(host)
  20: register char   *host;
  21: {
  22:     if (host == (char *)NULL)
  23:         return(FAIL);
  24: 
  25:     /*
  26: 	** Is this an ASCII internet address? (either of [10.0.0.78] or
  27: 	** 10.0.0.78).
  28: 	*/
  29:     if (*host == '[' || isdigit(*host)) {
  30:         u_long  host_address;
  31:         char    namebuf[128];
  32:         register char   *cp = namebuf;
  33: 
  34:         /*
  35: 		** strip brackets [] or anything else we don't want.
  36: 		*/
  37:         while(*host && cp < &namebuf[sizeof(namebuf)]) {
  38:             if (isdigit(*host) || *host == '.')
  39:                 *cp++ = *host++;
  40:             else
  41:                 host++;
  42:         }
  43: 
  44:         if ((host_address = inet_addr(namebuf)) == FAIL)
  45:             return(FAIL);   /* malformed internet address spec */
  46:         return(host_address);
  47:     } else {
  48:         struct hostent  *hstp = gethostbyname(host);
  49: 
  50:         if (hstp == NULL)
  51:             return(FAIL);   /* no such host */
  52:         return(*(u_long *)hstp->h_addr);    /* we assume... */
  53:     }
  54: }
  55: 
  56: /*
  57: ** given a host name (either name or internet address) and service name
  58: ** (or port number) (both in ASCII), give us a TCP connection to the
  59: ** requested service at the requested host (or give us FAIL).
  60: */
  61: get_tcp_conn(host,serv)
  62: char    *host;
  63: char    *serv;
  64: {
  65:     u_short port;
  66:     struct in_addr  host_address;
  67: 
  68:     if ((host_address.s_addr = name_to_address(host)) == FAIL) {
  69:         return(NOHOST);
  70:     }
  71: 
  72:     if (isdigit(*serv)) {
  73:         port = htons((u_short)(atoi(serv)));
  74:     } else {
  75:         struct servent  *srvp = getservbyname(serv, "tcp");
  76: 
  77:         if (srvp == NULL) {
  78:             return(NOSERVICE);
  79:         }
  80:         port = (u_short)srvp->s_port;
  81:     }
  82: 
  83:     return(mkconn(&host_address, port, IPPROTO_TCP, SOCK_STREAM));
  84: }
  85: 
  86: /*
  87: ** create a socket and connect it to a remote host on the specified
  88: ** port by the specified protocol. Return FAIL if something goes
  89: ** wrong somewhere. Since these are exclusively system calls,
  90: ** errno will have the correct error in it.
  91: */
  92: mkconn(host_address, port, protocol, proto_type)
  93: struct in_addr  *host_address;
  94: u_short port;
  95: int protocol, proto_type;
  96: {
  97:     register int    skt;
  98:     struct sockaddr_in  sadr;
  99: 
 100:     sadr.sin_family = (u_short)AF_INET; /* Only internet for now */
 101:     sadr.sin_addr.s_addr = host_address->s_addr;
 102:     sadr.sin_port = (u_short)port;
 103: 
 104:     if ((skt = socket(AF_INET, proto_type, protocol)) < 0)
 105:         return(FAIL);
 106: 
 107:     if (connect(skt, &sadr, sizeof(sadr)) < 0) {
 108:         int save = errno;
 109: 
 110:         close(skt);
 111:         errno = save;
 112:         return(FAIL);
 113:     }
 114:     return(skt);
 115: }

Defined functions

get_tcp_conn defined in line 61; used 1 times
mkconn defined in line 92; used 1 times
  • in line 83
name_to_address defined in line 18; used 1 times
  • in line 68
Last modified: 1986-03-21
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1002
Valid CSS Valid XHTML 1.0 Strict