|
|
1.1 root 1: #include <stdio.h>
2: #include <sys/types.h>
3: #include <sys/ioctl.h>
4: #include <time.h>
5: #include <sys/net/in.h>
6: #include <sys/net/inet.h>
7: #include <sys/net/netdb.h>
8: #include <sysexits.h>
9: #include <string.h>
10:
11: extern int ipcdebug;
12:
13: #define htons(x) (x)
14:
15: int
16: tcp_connect(dest, param)
17: char *dest, *param;
18: {
19: struct hostent *hp;
20: char *inet_ntoa();
21: int s, port, i;
22: long l=0;
23: unsigned long addr;
24: char buf[100];
25: char *host, *service;
26:
27: if (ipcdebug)
28: fprintf(stderr, "connecting via tcp `%s'\n", dest);
29:
30: strcpy(buf, dest);
31: host = buf;
32:
33: if ((port = tcp_service(host)) < 0) {
34: ipcabort(EX_UNAVAILABLE, "unknown service");
35: return(-1);
36: }
37:
38: if (ipcdebug)
39: fprintf(stderr, "TCP port number is %d\n", port);
40:
41: if ((addr = inet_addr(host)) != (unsigned long) -1) {
42: if (ipcdebug)
43: fprintf(stderr, "Numeric address: %s %lx\n",
44: host, addr);
45:
46: if((s = s5sockbcon(inet_ntoa(l),port,"/dev/tcp"))>=0)
47: return(s);
48: ipcabort(EX_OSERR, "can't open connection");
49: t_close(s);
50: return -1;
51: }
52:
53: if((hp = gethostbyname(host)) == (struct hostent *)0){
54: ipcabort(EX_NOHOST, "unknown host");
55: return(-1);
56: }
57:
58: memcpy(&l,hp->h_addr,hp->h_length);
59: if (ipcdebug)
60: fprintf(stderr, "Trying address %s\n",inet_ntoa(l));
61:
62: s = s5sockbcon(inet_ntoa(l),port,"/dev/tcp");
63: if(s < 0){
64: ipcabort(EX_OSERR, "can't open connection");
65: } else return(s);
66:
67: t_close(s);
68:
69: ipcabort(EX_NOHOST, "can't connect to host");
70: return -1;
71: }
72:
73: int
74: tcp_service(path)
75: char *path;
76: {
77: struct servent *sp;
78: char *service;
79:
80: if ((service = strchr(path, '!')) == NULL)
81: service = "";
82: else
83: *service++ = '\0';
84:
85: /*
86: * translate service/port name
87: */
88: if(strncmp(service, "tcp.", 4)==0)
89: service += 4;
90: if(strncmp(service, "/cs/", 4)==0)
91: service += 4;
92: if(strcmp(service, "")==0)
93: return 0;
94: else if(atoi(service)!=0)
95: return htons(atoi(service));
96: else if ((sp = getservbyname (service, "tcp")) != NULL)
97: return sp->s_port;
98: return -1;
99: }
100:
101: /*
102: * The following is a fixed version of the inet_addr() routine, since
103: * the one delivered with UTS 5.2.6b has a bug that truncates the
104: * passed string. Sigh !!
105: */
106:
107: int
108: inet_addr(str)
109: {
110: int val;
111: char *b;
112: char *ptr;
113: int byte[4];
114: int nb, bb;
115: char buf[16];
116:
117: strcpy(buf,str);
118: nb = 0;
119: for (b = strtok(buf,"."); b; b = strtok(NULL,".")) {
120: if (nb == 4) return -1;
121: byte[nb++] = strtol(b,&ptr,0);
122: if (ptr == b || *ptr) return -1;
123: }
124: if (nb == 0) return -1;
125: if (nb == 1) return byte[0];
126: val = 0;
127: for (bb = 0; bb < nb-1; bb++) val = (val << 8) | byte[bb];
128: return (val << 8*(4-bb)) | byte[bb];
129: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.