1 /*-
2 * Copyright (c) 1985, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.proprietary.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)bsdtcp.c 8.1 (Berkeley) 06/06/93";
10 #endif /* not lint */
11
12 #include "condevs.h"
13 #include <netdb.h>
14 #include <sys/socket.h>
15 #include <netinet/in.h>
16
17 /*
18 * bsdtcpopn -- make a tcp connection
19 *
20 * return codes:
21 * >0 - file number - ok
22 * FAIL - failed
23 */
24
bsdtcpopn(flds)25 bsdtcpopn(flds)
26 register char *flds[];
27 {
28 struct servent *sp;
29 struct hostent *hp;
30 struct sockaddr_in hisctladdr;
31 int s = -1, port;
32 extern int errno;
33 extern const char *const sys_errlist[];
34
35 sp = getservbyname(flds[F_CLASS], "tcp");
36 if (sp == NULL) {
37 port = htons(atoi(flds[F_CLASS]));
38 if (port == 0) {
39 logent(_FAILED, "UNKNOWN PORT NUMBER");
40 return CF_SYSTEM;
41 }
42 } else
43 port = sp->s_port;
44 DEBUG(4, "bsdtcpopn host %s, ", flds[F_PHONE]);
45 DEBUG(4, "port %d\n", ntohs(port));
46 if (setjmp(Sjbuf)) {
47 bsdtcpcls(s);
48 logent("tcpopen", "TIMEOUT");
49 return CF_DIAL;
50 }
51
52 bzero((char *)&hisctladdr, sizeof (hisctladdr));
53 hp = gethostbyname(flds[F_PHONE]);
54 if (hp == NULL) {
55 logent("tcpopen","UNKNOWN HOST");
56 return CF_DIAL;
57 }
58 signal(SIGALRM, alarmtr);
59 alarm(MAXMSGTIME*2);
60 hisctladdr.sin_family = hp->h_addrtype;
61 #ifdef BSD2_9
62 s = socket(SOCK_STREAM, 0, &hisctladdr, 0);
63 #else BSD4_2
64 s = socket(hp->h_addrtype, SOCK_STREAM, 0);
65 #endif BSD4_2
66 if (s < 0)
67 goto bad;
68 #ifndef BSD2_9
69 if (bind(s, (struct sockaddr *)&hisctladdr, sizeof (hisctladdr)) < 0)
70 goto bad;
71 #endif BSD2_9
72 bcopy(hp->h_addr, (char *)&hisctladdr.sin_addr, hp->h_length);
73 hisctladdr.sin_port = port;
74 #ifdef BSD2_9
75 if (connect(s, (char *)&hisctladdr) < 0)
76 #else BSD4_2
77 if (connect(s, (struct sockaddr *)&hisctladdr, sizeof (hisctladdr)) < 0)
78 #endif BSD4_2
79 goto bad;
80 alarm(0);
81 CU_end = bsdtcpcls;
82 return s;
83 bad:
84 alarm(0);
85 bsdtcpcls(s);
86 DEBUG(5, "tcpopen failed: errno %d\n", errno);
87 logent(sys_errlist[errno], _FAILED);
88 return CF_DIAL;
89 }
90
91 /*
92 * bsdtcpcls -- close tcp connection
93 */
bsdtcpcls(fd)94 bsdtcpcls(fd)
95 register int fd;
96 {
97 DEBUG(4, "TCP CLOSE called\n", 0);
98 if (fd > 0) {
99 close(fd);
100 DEBUG(4, "closed fd %d\n", fd);
101 }
102 }
103